Arduino智能小车 | 您所在的位置:网站首页 › 蓝牙系统软件开发 › Arduino智能小车 |
Arduino智能小车——蓝牙小车
Arduino智能小车系列教程时空门: Arduino智能小车——拼装篇 点击跳转Arduino智能小车——测试篇 点击跳转Arduino智能小车——调速篇 点击跳转Arduino智能小车——超声波避障 点击跳转Arduino智能小车——蓝牙小车 点击跳转Arduino智能小车——循迹篇 点击跳转Arduino智能小车——小车测速 点击跳转 文章目录 Arduino智能小车——蓝牙小车蓝牙模块串口通信蓝牙模块连接手机蓝牙助手Arduino代码编写蓝牙小车测试 可能遇到的问题附件上一章我们完成了小车的运动控制,虽然小车已经可以运动,但是不能远程遥控,不够高大上。在这一篇,我们将尝试用手机蓝牙遥控小车。 蓝牙模块蓝牙( Bluetooth® ):是一种无线技术标准,可实现固定设备、移动设备和楼宇个人域网之间的短距离数据交换(使用2.4—2.485GHz的ISM波段的UHF无线电波)。 我们在此使用的蓝牙模块(HC-05)已经在内部实现了蓝牙协议,不用我们再去自己开发调试协议。这类模块一般都是借助于串口协议通信,因此我们只需借助串口将我们需要发送的数据发送给蓝牙模块,蓝牙模块会自动将数据通过蓝牙协议发送给配对好的蓝牙设备。 由于要借助串口实现蓝牙通信功能,所以我们在此要先了解下Arduino的串口通信。 Arduino UNO开发板上的串口为0->RX,1->TX,在开发板内部也已经配置好了串口的功能,我们只需调用函数借口即可。以下列出串口通信里面常用的函数,并加以简单解释,详细用法可在用到时自行查询。 开启串行通信接口并设置通信波特率 Serial.begin(speed);关闭串口通信 Serial.end();判断串口缓冲器是否有数据写入 Serial.available();读取串口数据 Serial.read();返回下一字节(字符)输入数据,但不删除它 Serial.peek();清空串口缓存 Serial.flush();写入字符串数据到串口 Serial.print();写入字符串数据+换行到串口 Serial.println();写入二进制数据到串口 Serial.write();read时触发的事件函数 Serial.SerialEvent();读取固定长度的二进制流 Serial.readBytes(buffer,length);打印接到数据十进制表示的ascii码 Serial.println(incomingByte, DEC); 蓝牙模块连接TX: 接Arduino UNO开发板"RX"引脚 RX: 接Arduino UNO开发板"TX"引脚 GND: 接Arduino UNO开发板"GND"引脚 VCC: 接Arduino UNO开发板"5V"或"3.3V"引脚 想实现手机蓝牙遥控小车,手机APP是必不可少的,目前网上有很多蓝牙串口助手,省去了我们自己写APP的时间,当然如果朋友你有能力或者想自己DIY的话也可以尝试自己写APP,在这里我推荐大家用这款手机蓝牙助手(百度上搜手机蓝牙串口助手就可以搜到,挺好用的) 下载并安装后打开APP,在这里可能会提示你有新版本请求更新,建议点击以后再说(暂时不更新),以我的经验,一般点击立即更新都会更新失败。 点击自定义按键[2],将其“显示名称”属性改为“前进”,“点击发送”属性改为“01”,并点击“确定”保存 点击自定义按键[4],将其“显示名称”属性改为“左转”,“点击发送”属性改为“03”,并点击“确定”保存 点击自定义按键[5],将其“显示名称”属性改为“后退”,“点击发送”属性改为“02”,并点击“确定”保存 点击自定义按键[6],将其“显示名称”属性改为“右转”,“点击发送”属性改为“04”,并点击“确定”保存 以上修改的属性值即为我们点击对应按键之后,蓝牙串口助手自动通过蓝牙发送的数据,与上一篇所定义的小车的几个状态一致,这样方便在Arduino在接收到蓝牙模块的数据后对小车的状态进行控制。 #define STOP 0 #define FORWARD 1 #define BACKWARD 2 #define TURNLEFT 3 #define TURNRIGHT 4修改后属性如下图 下面就来看看我们修改的效果吧,点击“模式切换” 小科普: 蓝牙模块上电(只简单连接"VCC"和"GND"引脚)之后,其他蓝牙设备即可与其连接,一般蓝牙模块默认初始连接密码为"0000"或"1234",如果连接不上蓝牙,请尽快与厂商或者店家联系。蓝牙模块上电后LED指示灯不断闪亮,当有设备连接预期连接之后会隔一段闪两下,蓝牙串口助手也会有相应已连接的提示。 Arduino代码编写新建一个工程,将下面代码复制到工程内 #define STOP 0 #define FORWARD 1 #define BACKWARD 2 #define TURNLEFT 3 #define TURNRIGHT 4 int leftMotor1 = 4; int leftMotor2 = 5; int rightMotor1 = 6; int rightMotor2 = 7; void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(leftMotor1, OUTPUT); pinMode(leftMotor2, OUTPUT); pinMode(rightMotor1, OUTPUT); pinMode(rightMotor2, OUTPUT); } void loop() { // put your main code here, to run repeatedly: //usart read if(Serial.available()>0) { char cmd = Serial.read();//读取蓝牙模块发送到串口的数据 Serial.print(cmd); motorRun(cmd); } } void motorRun(int cmd) { switch(cmd){ case FORWARD: Serial.println("FORWARD"); //输出状态 digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); break; case BACKWARD: Serial.println("BACKWARD"); //输出状态 digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, HIGH); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, HIGH); break; case TURNLEFT: Serial.println("TURN LEFT"); //输出状态 digitalWrite(leftMotor1, HIGH); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, HIGH); break; case TURNRIGHT: Serial.println("TURN RIGHT"); //输出状态 digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, HIGH); digitalWrite(rightMotor1, HIGH); digitalWrite(rightMotor2, LOW); break; default: Serial.println("STOP"); //输出状态 digitalWrite(leftMotor1, LOW); digitalWrite(leftMotor2, LOW); digitalWrite(rightMotor1, LOW); digitalWrite(rightMotor2, LOW); } }朋友们大概也发现了,这个代码和上一篇的代码基本上相同,只不过增加了串口的内容。 ##代码详解 串口初始化函数,想要通过串口的库函数对串口进行操作,必须在void set_up()函数中对其进行初始化。 Serial.begin(9600);在void loop()函数内,加入了检测串口接收内容的函数,并将接收到的命令输入到 void motorRun(int cmd)函数中控制小车运动。 if(Serial.available()>0) { char cmd = Serial.read(); Serial.print(cmd); motorRun(cmd); } 蓝牙小车测试下载程序之后,重新连接蓝牙模块,切换到我们自定义的按键界面,快试试蓝牙遥控小车吧。 可能遇到的问题由于大家用的手机蓝牙串口助手可能不同,或者软件版本的不同,很容易出现如下的情况: ![]() 而在程序里面的宏定义中使用的是整型的1,因此才会出现虽然接收到了信号,但是小车不会动的情况,在这种情况下,需要对其进行特殊处理,将loop函数修改成下面这样,其他程序保持不变: void loop() { // put your main code here, to run repeatedly: //usart read if(Serial.available()>0) { int cmd = Serial.read();//读取蓝牙模块发送到串口的数据 if (cmd != 10) // 10代表是判断接收到的数据是否是换行符,如果是换行符的话就不控制小车运动 { Serial.print(cmd-48); // 48是ASCII吗中字符‘0‘对应的10进制数,'0','1'等每个字符型的数字减去'0'后即可得到整型的0,1等 motorRun(cmd-48); } } } 附件安卓手机蓝牙串口点击下载,也可以复制链接 https://download.csdn.net/download/qq_16775293/11165678 到浏览器下载。 欢迎各位有兴趣的朋友加入Q群1:789127261点评、交流 |
CopyRight 2018-2019 实验室设备网 版权所有 |