用arduino制作蓝牙遥控小车
- 格式:doc
- 大小:2.72 MB
- 文档页数:10
·1·
现如今是智能手机的天下,很多手机性能已经能够媲美PC了,那么用智能机遥控一台
小车自然不在话下了。这里我们用arduino uno开发板配合HC-05蓝牙透传模块制作一辆手
机控制的小车,使小车能够发射激光,控制舵机,测量距离并回传到手机,体验一下无线
操控的乐趣吧。
首先,手头准备好以下材料:
图10.1 arduino uno板一块 图10.2 arduino sensor sheild v5.0传感器扩展板,带蓝牙直插接口,方便
组装模块
图10.3 L9110电机驱动板一块
(注意:这种是两路电机驱动板,相对于L298N更为小巧,但不支持pwm调速,如果
需要驱动四个电机需要两块,这里我们就用两轮驱动)
图10.4 HC-05主从一体蓝牙透传模块 图10.5 超声波测距模块
·2·
图10.6 普通模拟舵机 图10.7 小车轮胎(带直流电机) 图10.8 激光灯
首先,我们来简单了解一下HC-05蓝牙模块的引脚。
图10.9 HC-05的引脚图示
表10.1 HC-05的引脚定义
1 VCC
电源(3.3v~5v)
2 GND
接地
3 TXD
模块串口发送脚,接uno的RX引脚。
4 RXD
模块串口接收脚,接uno的TX引脚。
5 KEY
用于进入AT指令状态,可直接悬空不做设置。
6 LED
配对状态输出;配对成功输出高电平,未配对则输出低电平。
这里我们只需要连接1、2、3、4引脚,5、6悬空即可。
模块上电后指示灯快闪则表示模块等待配对,用手机搜索蓝牙能搜索到
“H-C-2010-06-01”,默认初始密码为1234,连接后指示灯慢闪开始工作。
注意此模块不需任何程序,与arduino直接连接就能用。
为了使小车能够进入避障模式自动工作,我们使用了US100超声波测距模块,下面简
单介绍一下此模块。
·3·
正面图 背面图
图10.10 US100超声波测距模块
此模块分串口工作模式和电平触发工作模式。串口模式下向模块发送0x55,则返回探
测到的距离,发送0x50则返回当前温度。电平模式下通过向Triq引脚发送一个大于10us
的高电平,模块开始测距,超声波在空中传播的时间就是Echo引脚高电平持续的时间,所
以通过检测Echo引脚的高电平持续时间,由公式:(检测的时间*340m/s)/2得出距离。
注意:由于Arduino Uno只有一个串口,所以超声波模块和蓝牙模块共用一个串口时易
发生冲突,所以我们在这里采用电平触发模式。
我们可以使用舵机l连续的摆动摇动一面小红旗,也可以在舵机上加一个小毛刷让小车
能够边走边扫地,那么下面就简单介绍一下普通模拟舵机的控制原理。
图10.11 模拟舵机
图为市面上常见的模拟舵机,之所以称为模拟舵机,是因为它是通过输入pwm波这种
模拟量来控制角度的。舵机每20ms接收一次信号脉冲,高电平范围在0.5ms~2.5ms内舵机
响应。
Arduino自带舵机函数库,通过调
数:
1、attach(接口)——设定舵机的接口,uno上只有带‘#’号的引脚具备pwm输出功
能
2、write(角度)——用于设定舵机旋转角度的语句,模拟舵机可设定的角度范围是0°
到180°,数码舵机角度不受限制。
3、read()——用于读取舵机角度的语句,可理解为读取最后一条write()命令中的值。
·4·
4、attached()——判断舵机参数是否已发送到舵机所在接口。
5、detach()——使舵机与其接口分离,该接口可继续被用作PWM接口。
下面我们开始编写程:
#include
//*****************************************************************************
#define SERVO 3 //定义3引脚接一个舵机
/******************************************************************************
********电机模块引脚定义,电机1的转动方向取决于A1 B1引脚 *****
********的状态,其中(A1,B1)赋值(1,0)为正转,赋值(0,1) *****
********为反转,赋值(1,1)或(0,0)则不转 *****
******************************************************************************/
#define INT_A1 9
#define INT_B1 8
#define INT_A2 11
#define INT_B2 10
/****************************************************************************
*****US100超声波测距模块引脚定义,拔去短路帽后为电平触发模式, *****
*****只需要在Trig/TX管脚输入一个10US以上的高电平,系统便可发出8个 *****
*****40KHZ的超声波脉冲,然后检测回波信号。当检测到回波信号后, 模块 *****
*****还要进行温度值的测量,然后根据当前温度对测距结果进行校正, *****
*****将校正后的结果通过Echo/RX管脚输出。 *****
*****在此模式下,模块将距离值转化为340m/s时的时间值的2倍, *****
*****通过Echo端输出一高电平,可根据此高电平的持续时间来计算距离值。 *****
*****即距离值为:(高电平时间*340m/s)/2。 *****
*****************************************************************************/
#define Triq 5
#define Echo 4
#define LASER 6 //定义激光灯在12引脚
#define LASER_ON digitalWrite(LASER,1) //简化程序,方便操作
#define LASER_OFF digitalWrite(LASER,0)
Servo myservo; //定义舵机名称
float distance; //定义测量的距离值
byte BT_COM; //定义蓝牙接收到的参数值
byte BT_PWM=75; //定义输入舵机的角度值
byte LASER_Flag; //判断激光开关的标志值
/***************初始化*******************/
void setup()
{
pinMode(Triq,OUTPUT); //设置Triq引脚为输出模式
pinMode(Echo,INPUT); //设置Echo引脚为输入模式
·5·
pinMode(LASER,OUTPUT); //设置激光灯引脚为输出模式
myservo.attach(3); //在引脚3上添加一个舵机
Serial.begin(38400); //蓝牙模块的默认传输速率
}
/**************主函数*******************/
void loop()
{
if(Serial.available()) //判断串口是否接收到数据
{
BT_COM=Serial.read(); //读蓝牙串口的数据
switch(BT_COM) //数据选择
{
case'a': forward(); //发送’a’,小车前进
break;
case'b': turnright(); //发送’b’,小车右转
break;
case'c': backup(); //发送’c’,小车后退
break;
case'd': turnleft(); //发送’d’,小车左转
break;
case'e': stopcar(); //发送’e’,小车停止
break;
case'f': BT_SERVO_REDUCE(); //发送’f’,舵机左转
break;
case'g': BT_SERVO_ADD(); //发送’g’,舵机右转
break;
case'h': BiZhang(); //发送’h’,小车进入避障模式自动工作
break;
case'i': MY_DISTANCE(); //发送’i’,小车测距并返回给手机距离值
break;
case'j': if(LASER_Flag==0)LASER_ON_SWITCH();
else if(LASER_Flag==1)LASER_OFF_SWITCH();
break; //发送’j’,先判断当前激光灯是否亮起,若
//亮起则关闭激光灯,若不亮则打开激光灯
}
}
}
/***********************************************************************
**********舵机转动函数,由于蓝牙每次接收的是字符,无法直接给 ***********
**********舵机输入的pwm值赋值,所以通过下面两个舵机的左右转向***********
**********函数使舵机连续转动。再通过停止命令结束转动,从而使 ***********
**********舵机转动到任意角度 ***********