大家好!这是小编第二次做小项目~
小编目前专业是电气自动化的,不搞点硬件方面的东西,不学点控制技术,有点对不起自己所学的专业。
小编这次打算做arduino多功能智能小车~
首先,为啥选择arduino电路板?
这个是由于小编还没学过单片机啊~还没有弄过其他的,比如stm32单片机。因为这些学习起来,对于初学者来说,比较困难,需要花时间。而arduino入门确实简单,特别适合初学者,而且arduino源码开源的,特别的人性化。其实,arduino也是单片机,但是它是经过二次开发的,有很多的库函数。
1.所需材料
底盘2个 电机4个 轮胎4个 arduino uno板1个
电机驱动板1个 杜邦线若干 电池盒1个 5号电池4节
USB数据线1根 蓝牙模块 USB 转TTL数据线
如果这是读者第一次做,没有什么DIY经验的话,可以自己在网上买套装元件,网上关于这些东西很多,可以满足我们的制作材料的要求。当然,对于有一定基础的读者,会设计原理图,完全可以用AltiumDesigner软件,绘制一个属于自己的PCB板,这样对于自己有很大的提高。我在网上看的意大利进口PCB板,感觉挺精致的,奈何出于经济原因,就买了套件。
2.编程软件
本人使用官方的免费IDE编程环境,下载地址与安装教程见官网
这个软件的详细教程参考地址arduino IDE教程
3.制作过程
首先,小编先介绍一下小车的结构:
1.电机驱动模块:这是控制小车电机转动的模块,在模块的电源部分,有VMS、VCC(5v)、GND3个接口。电源正极接VMS,电源负极接GND,这样就给电机驱动模块上电了。MotorA和MotorB的四个接口,分别接电机的线。ENA和ENB分别是使能端,接Arduino的PWM接口,用于电机的调速。IN1、IN2、IN3和IN4分别接Arduino的数字接口。
2.Arduino单片机:可以说是智能小车的“大脑”,也就是说这是小车的核心。在后面,我们要将我们编好的程序导入到arduino中,就可以控制小车了~
在我制作小车的时候,我在网上了解到arduino单片机供电方式,这里就不在阐述了 ,具体见网址:
3.蓝牙模块:这是通信模块,控制着手机与arduino单片机之间的通信。蓝牙模块上共有6个引脚,我们在这里要用到4个引脚,分别是RX、TX、VCC和GND,蓝牙模块的RX接arduino的TX,蓝牙模块的TX接arduino的RX,VCC接VCC,GND接GND。当然,蓝牙模块在使用之前,需要进行调试,我们需要下载串口调试助手,进行以下操作:(蓝牙模块的初始密码为1234)
给蓝牙模块命名,将串口波特率改成115200
然后根据指令,测试一下蓝牙的通信状况。
4.电源模块:其实就是四节电池,主要是给arduino单片机和电机驱动模块供电。
详见图片:
4.代码展示
首先,说一下编程思路:
setup()函数里主要配置一些小车的参数。
loop()函数里,先接收手机通过蓝牙发出的指令,并通过传参调用小车电机驱动函数,实现蓝牙控制功能。
#define STOP 0x03
#define FORWARD 0x02
#define BACKWARD 0x08
#define TURN_LEFT 0x06
#define TURN_RIGHT 0x07
int PWMLeft = 3;//左轮速度
int PWMRight = 5;//右轮速度
int MotorLeft1 = 7;//左前轮方向
int MotorLeft2 = 8;//左后轮方向
int MotorRight1 = 12;//右前轮方向
int MotorRight2 = 13;//右后轮方向
void setup()
{
Serial.begin(115200);
pinMode(PWMLeft, OUTPUT);
pinMode(PWMRight, OUTPUT);
pinMode(MotorLeft1, OUTPUT);
pinMode(MotorLeft2, OUTPUT);
pinMode(MotorRight1, OUTPUT);
pinMode(MotorRight2, OUTPUT);
delay(10);
}
void loop(){
if(Serial.available()>0)
{
char cmd=Serial.read();
Serial.print(cmd);
motorRun(cmd);
delay(10);
}
}
void motorRun(int cmd)
{
switch(cmd){
case FORWARD:
Serial.println("FORWARD");
analogWrite(PWMLeft, 180); //PWM调速
analogWrite(PWMRight, 200); //PWM调速
digitalWrite(MotorLeft1,HIGH);
digitalWrite(MotorLeft2,LOW);
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,HIGH);
break;
case BACKWARD:
Serial.println("BACKWARD");
analogWrite(PWMLeft, 180); //PWM调速
analogWrite(PWMRight, 200); //PWM调速
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,HIGH);
digitalWrite(MotorRight1,HIGH);
digitalWrite(MotorRight2,LOW);
break;
case TURN_LEFT:
Serial.println("TURN_LEFT");
analogWrite(PWMLeft, 0); //PWM调速
analogWrite(PWMRight, 240); //PWM调速
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,HIGH);
delay(500);
analogWrite(PWMLeft, 0); //PWM调速
analogWrite(PWMRight, 0); //PWM调速
break;
case TURN_RIGHT:
Serial.println("TURN_RIGHT");
analogWrite(PWMLeft, 200); //PWM调速
analogWrite(PWMRight, 0); //PWM调速
digitalWrite(MotorLeft1,HIGH);
digitalWrite(MotorLeft2,LOW);
delay(500);
analogWrite(PWMLeft, 0); //PWM调速
analogWrite(PWMRight, 0); //PWM调速
break;
case STOP:
Serial.println("STOP");
analogWrite(PWMLeft, 0); //PWM调速
analogWrite(PWMRight, 0); //PWM调速
}
}
5.功能演示
功能:通过蓝牙控制(手机APP)小车的前进、后退、左转、右转等相关指令的执行。
这里,有点不好意思,我也不知道为啥格式工厂不好弄分辨率更大的视频转GIF功能,总是出错~
在这里,小编再推荐蓝牙控制手机APP软件,在应用市场里搜索蓝牙智能小车
蓝牙手机APP控制界面:
软件说明:
6.代码分析
电机驱动函数:
void motorRun(int cmd)
{
switch(cmd){
case FORWARD:
Serial.println("FORWARD");
analogWrite(PWMLeft, 180); //PWM调速
analogWrite(PWMRight, 200); //PWM调速
digitalWrite(MotorLeft1,HIGH);
digitalWrite(MotorLeft2,LOW);
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,HIGH);
break;
case BACKWARD:
Serial.println("BACKWARD");
analogWrite(PWMLeft, 180); //PWM调速
analogWrite(PWMRight, 200); //PWM调速
digitalWrite(MotorLeft1,LOW);
digitalWrite(MotorLeft2,HIGH);
digitalWrite(MotorRight1,HIGH);
digitalWrite(MotorRight2,LOW);
break;
case TURN_LEFT:
Serial.println("TURN_LEFT");
analogWrite(PWMLeft, 0); //PWM调速
analogWrite(PWMRight, 240); //PWM调速
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,HIGH);
delay(500);
analogWrite(PWMLeft, 0); //PWM调速
analogWrite(PWMRight, 0); //PWM调速
break;
case TURN_RIGHT:
Serial.println("TURN_RIGHT");
analogWrite(PWMLeft, 200); //PWM调速
analogWrite(PWMRight, 0); //PWM调速
digitalWrite(MotorLeft1,HIGH);
digitalWrite(MotorLeft2,LOW);
delay(500);
analogWrite(PWMLeft, 0); //PWM调速
analogWrite(PWMRight, 0); //PWM调速
break;
case STOP:
Serial.println("STOP");
analogWrite(PWMLeft, 0); //PWM调速
analogWrite(PWMRight, 0); //PWM调速
}
}
这里,小车前进、后退、左转、右转和停止分别用FORWARD、BACKWARD、TURN_LEFT、TURN_RIGHT和STOP来定义。用switch条件选择语句来表示小车的五种状态,这里小编以小车前进为例,加以分析。
Serial.println("FORWARD");这一句是将FORWARD打印在串口监视器上。我们在前期测试手机与蓝牙的通信时,如果测试结果正确地出现在串口监视器上,表明通信成功。
如何调节电机转速?
analogWrite(PWMLeft, 180);
analogWrite(PWMRight, 200);
这两句时PWM调速语句。何为PWM(脉冲宽度调制)?简单来说,就是改变脉冲方波的占空比,比如一个5V的电源,怎么获得3v的电压,传统的观点是我们串联1个可调电阻进行分压。但,我们现在可以在单位时间内,3/5的时间里输出高电平,2/5的时间里输出低电平,这样就可以得到3v的电压了~这里PWM数值取0~255之间。
有读者会问了,怎么左轮和右轮的PWM的数值不一样。这是因为,每个电机的性能有些差异,虽然都是一起买来的。大家可以根据实际情况调节小车的PWM的数值。
如何调节电机的转向?
digitalWrite(MotorLeft1,HIGH);
digitalWrite(MotorLeft2,LOW);
digitalWrite(MotorRight1,LOW);
digitalWrite(MotorRight2,HIGH);
这里,我还是要强调一下电机的接线,电机驱动模块有4个电机接口,每一个接口接其中一个电机的上面接口和另外一个电机的下面一个接口。这样只要通过1个电机驱动模块就可以控制四个电机了~如果你觉得这样不好,那你可以用两个电机驱动模块,来控制四个电机。
蓝牙部分:
if(Serial.available()>0)
{
char cmd=Serial.read();
Serial.print(cmd);
motorRun(cmd);
delay(10);
}
Serial.available() 的意思是:返回串口缓冲区中当前剩余的字符个数。一般用这个函数来判断串口的缓冲区有无数据,当Serial.available()>0时,说明串口接收到了数据,可以读取;
Serial.read()指从串口的缓冲区取出并读取一个Byte的数据,比如有设备通过串口向Arduino发送数据了,我们就可以用Serial.read()来读取发送的数据。
定义与初始化部分:
#define STOP 0x03
#define FORWARD 0x02
#define BACKWARD 0x08
#define TURN_LEFT 0x06
#define TURN_RIGHT 0x07
这个宏定义是为了蓝牙通信的,具体见手机APP说明,通过蓝牙发送1个字符,arduino就可以接收到相应的数据。
int PWMLeft = 3;//左轮速度
int PWMRight = 5;//右轮速度
int MotorLeft1 = 7;//左前轮方向
int MotorLeft2 = 8;//左后轮方向
int MotorRight1 = 12;//右前轮方向
int MotorRight2 = 13;//右后轮方向
这个是定义小车PWM调速端接口和电机接口的。arduino单片机上有"~"字样的接口是PWM信号接口,其他的是数字接口。
void setup()
{
Serial.begin(115200);
pinMode(PWMLeft, OUTPUT);
pinMode(PWMRight, OUTPUT);
pinMode(MotorLeft1, OUTPUT);
pinMode(MotorLeft2, OUTPUT);
pinMode(MotorRight1, OUTPUT);
pinMode(MotorRight2, OUTPUT);
delay(10);
}
蓝牙的串口波特率从初始值9600调整为115200,然后定义小车PWM调速端接口和电机接口为输出端。 delay(10);起缓冲作用。
7.制作小车过程中遇到的问题
在小车制作前,自己没有DIY经验,只知道一些电子元件方面的基础知识,在编程方面,自己在大学学过C语言的课程,仅此而已。以下小编将从组装,接线,编程3个方面来阐述制作过程中的问题:
在小车组装方面,我们要有安装的次序,首先应该先将电机的接线接线接好,然后再将电机固定在底盘上,这样电机上的线容易接。还有,我要提醒的是如果你想做其他功能的小车,例如避障小车,应该先将舵机固定在底盘上一层上,然后再安装,这样容易拧螺丝。arduino单片机和电机驱动模块都放在上面一层。自己当时没有经验,拆拆装装,挺耗时间的。
接线时,尽量排布整齐一些,这样既让接线变得清晰明了,又使得小车美观大方。而小编自己在排线方面也没有做到很好。
编程方面,其实arduino开源代码很多,可以借鉴性学习。当时,我的问题出在蓝牙接收数据方面,原因是蓝牙串口调试时,没有设置好波特率,总是接收不到数据。当然,后来找了实验室的学长,才弄好的。