· 6·
***********************************************************************/
void BT_SERVO_REDUCE() //舵机左转
{
while(!Serial.available()) //若无指令到来,则循环执行本条程序 {
BT_PWM-=2;
if(BT_PWM<5)BT_PWM=5; //设置最角度值
myservo.write(BT_PWM); //给舵机输送当前角度值 delay(50); //延时50ms } }
void BT_SERVO_ADD() //舵机右转 {
while(!Serial.available()) //原理同上 {
BT_PWM+=2;
if(BT_PWM>150)BT_PWM=150; myservo.write(BT_PWM); delay(50); } }
/***********激光灯开关函数*************/
void LASER_ON_SWITCH() //打开激光灯 {
LASER_Flag=1; //先判断当前激光灯状态,1则当前关 // 闭,0则当前打开 while(!Serial.available()) {
LASER_ON; //打开激光灯
} }
void LASER_OFF_SWITCH() //关闭激光灯,原理同上 {
LASER_Flag=0;
while(!Serial.available()) {
LASER_OFF; } }
/************测距模块工作函数***********/ void MY_DISTANCE() {
·7·
digitalWrite(Triq,LOW); //先向Triq引脚输送一个大于10us的高电平 delayMicroseconds(2); digitalWrite(Triq,HIGH); delayMicroseconds(10);
distance=pulseIn(Echo,HIGH); //检测Echo高电平持续时间,返回单位是us distance=distance*0.018; //由时间转换成距离
Serial.print(\ //串口打印”distance=”这几个字符 Serial.print(distance); //串口打印测得的距离值 Serial.println(\ //串口打印单位cm
}
/************电机转向函数**************/
void turnleft() //通过给(A1,B1,A2,B2)引脚赋值(0,1,1,0),使小车左转 //赋0表示引脚低电平,赋1表示引脚高电平 {
digitalWrite(INT_A1,0); digitalWrite(INT_B1,1); digitalWrite(INT_A2,1); digitalWrite(INT_B2,0); }
void turnright() //通过给(A1,B1,A2,B2)引脚赋值(1,0,01),使小车右转 //赋0表示引脚低电平,赋1表示引脚高电平 {
digitalWrite(INT_A1,1); digitalWrite(INT_B1,0); digitalWrite(INT_A2,0); digitalWrite(INT_B2,1); }
void forward() //通过给(A1,B1,A2,B2)引脚赋值(0,1,0,1),使小车前进 //赋0表示引脚低电平,赋1表示引脚高电平 {
digitalWrite(INT_A1,0); digitalWrite(INT_B1,1); digitalWrite(INT_A2,0); digitalWrite(INT_B2,1); }
void backup() //通过给(A1,B1,A2,B2)引脚赋值(1,0,1,0),使小车后退 //赋0表示引脚低电平,赋1表示引脚高电平
· 8·
{
digitalWrite(INT_A1,1); digitalWrite(INT_B1,0); digitalWrite(INT_A2,1); digitalWrite(INT_B2,0); }
void stopcar() //通过给(A1,B1,A2,B2)引脚赋值(0,0,0,0),使小车停止 //赋0表示引脚低电平,赋1表示引脚高电平 {
digitalWrite(INT_A1,0); digitalWrite(INT_B1,0); digitalWrite(INT_A2,0); digitalWrite(INT_B2,0); }
/***注意赋值可能因为电机的连接方式不同而有所改动,具体可自己试验得出正确赋值***/
/****************避障模式****************/
void BiZhang() {
while(!Serial.available()) {
MY_DISTANCE(); //引用测距函数先测量距离
delay(50);
if(distance>20&&distance<40)turnleft(); //判断距离后指示小车转向或前进或后退 else if(distance<20)backup(); else if(distance>40)forward(); }
}
注意:
程序中多处用到了 while(!Serial.available())这条语句。为的是能够在下一条指令到底前能够循环运行本条指令动作,能够避免程序运行出错。
按照程序定义的引脚,插上各种模块,组装你的小车: 接下来,手机下载SPP蓝牙串口软件:
打开软件,向后滑动切换到“键盘”,软件提供了12个自定义按钮,长按按钮自定义按钮,名称写你要定义的按钮名称,选择发送“字符”,消息就是程序中定义的要发送的字符。如:名称:前进 消息:a。
·9·
图10.12 小车组装效果图 图10.13 SPP蓝牙串口软件
图10.14 自定义按钮界面 图10.15 按钮编辑器
定义完所有按钮之后,点击右上角的“连接”,搜索设备,注意此时蓝牙模块直接插在扩展板的“bluetooth”插槽内,上电后蓝牙指示灯处于快闪状态表明处于配对等待模式,等待片刻手机会搜索到蓝牙,默认名字为H-C-2010-06-01(注意:不同厂家生产的模块可能名字不同)
· 10·
图10.16 编辑好按钮图示 图10.17 搜索附近蓝牙设备
点击蓝牙名字,输入配对密码,默认为“1234”,需要提到的一点是,当点击“测距”按钮小车测量距离后,返回的距离值会显示在SPP软件的“终端”窗口内,向左滑动进入“终端”窗口,就能看到测量到的距离值啦!
图10.18 输入配对密码 图10.19 距离测量值回传演示 好了,到此为止你的手机蓝牙遥控小车就完工啦,享受无线操作的乐趣吧!