Arduino智能小车——蓝牙小车

Arduino智能小车系列教程时空门:

  1. Arduino智能小车——拼装篇 点击跳转
  2. Arduino智能小车——测试篇 点击跳转
  3. Arduino智能小车——调速篇 点击跳转
  4. Arduino智能小车——超声波避障 点击跳转
  5. Arduino智能小车——蓝牙小车 点击跳转
  6. Arduino智能小车——循迹篇 点击跳转
  7. 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,在这里我推荐大家用这款手机蓝牙助手(百度上搜手机蓝牙串口助手就可以搜到,挺好用的)

  如果不想自己去找的话可以到我的百度网盘下载 [点击这里下载](http://pan.baidu.com/s/1pKClRTL)

  下载并安装后打开APP,在这里可能会提示你有新版本请求更新,建议点击以后再说(暂时不更新),以我的经验,一般点击立即更新都会更新失败。

  进入主界面,左上角会提示"蓝牙未连接",这个时候我们可以先对蓝牙助手的界面进行自定义设置。点击右下角的三个点(在我这里是这样的,其他手机可能不同,如果没有这三个点可以试着点击手机的功能键),选择“更多”。   然后选择“地面站设置”进入自定义界面,往下拖动,找到“自定义按键[x]”,在此我们对按键[1][2][3][4][6]进行自定义设置。 **  点击自定义按键[1],将其“显示名称”属性改为“停止”,“点击发送”属性改为“00”,并点击“确定”保存** 同理更改其他按键:

点击自定义按键[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 4int 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 readif(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);}

蓝牙小车测试

  下载程序之后,重新连接蓝牙模块,切换到我们自定义的按键界面,快试试蓝牙遥控小车吧。

可能遇到的问题

  由于大家用的手机蓝牙串口助手可能不同,或者软件版本的不同,很容易出现如下的情况:

  好像看起来并没有什么毛病,但是小车就是不会运转。这种情况是因为手机蓝牙串口助手向手机发送的是[ASCII码](https://baike.baidu.com/item/ASCII/309296?fr=aladdin),虽然打印出来也是0、1、2、3、4,但是在C语言里面这种应该表示为char类型,例如

char cmd = '1';   // ASCII码、字符1
int cmd = 1;   //整型1#define STOP      0        // 程序中的宏定义
#define FORWARD   1
#define BACKWARD  2
#define TURNLEFT  3
#define TURNRIGHT 4

而在程序里面的宏定义中使用的是整型的1,因此才会出现虽然接收到了信号,但是小车不会动的情况,在这种情况下,需要对其进行特殊处理,将loop函数修改成下面这样,其他程序保持不变:

void loop() {// put your main code here, to run repeatedly://usart readif(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点评、交流

Arduino智能小车——蓝牙小车相关推荐

  1. 基于STM32的智能车/平衡小车/蓝牙小车

    硬件支持 MPU6050 OLED 蓝牙模块 直流电机 MPU6050程序 //******************************************************// 承接s ...

  2. Arduino智能小车——循迹篇

    Arduino智能小车--循迹篇 Arduino智能小车系列教程时空门: Arduino智能小车--拼装篇 点击跳转 Arduino智能小车--测试篇 点击跳转 Arduino智能小车--调速篇 点击 ...

  3. Arduino智能小车——测试篇

    Arduino智能小车--测试篇 Arduino智能小车系列教程时空门: Arduino智能小车--拼装篇 点击跳转 Arduino智能小车--测试篇 点击跳转 Arduino智能小车--调速篇 点击 ...

  4. Arduino智能小车——超声波避障

    Arduino智能小车--超声波避障 Arduino智能小车系列教程时空门: Arduino智能小车--拼装篇 点击跳转 Arduino智能小车--测试篇 点击跳转 Arduino智能小车--调速篇 ...

  5. Arduino智能小车——调速篇

    Arduino智能小车--调速篇 Arduino智能小车系列教程时空门: Arduino智能小车--拼装篇 点击跳转 Arduino智能小车--测试篇 点击跳转 Arduino智能小车--调速篇 点击 ...

  6. Arduino智能小车——拼装篇

    Arduino智能小车--拼装篇 Arduino智能小车系列教程时空门: Arduino智能小车--拼装篇 点击跳转 Arduino智能小车--测试篇 点击跳转 Arduino智能小车--调速篇 点击 ...

  7. 基于Arduino开发的智能蓝牙小车

    基于Arduino的智能蓝牙小车 材料准备: Arduino开发板一块.四驱小车底板及相关配件一套.L298N驱动模块一个.HC-05/06蓝牙模块一块,九伏电源一块(用于主板供电).12V锂电池一块 ...

  8. arduino 蓝牙 android 小车,arduino智能蓝牙小车

    大家好!这是小编第二次做小项目~ 小编目前专业是电气自动化的,不搞点硬件方面的东西,不学点控制技术,有点对不起自己所学的专业. 小编这次打算做arduino多功能智能小车~ 首先,为啥选择arduin ...

  9. Arduino智能小车设计(一)

    可接课程设计!!!有需要私聊博主! 这一个月来 距离实验室纳新后,已经过去一个月左右了.听取了学长的建议,这段时间也一直在搞Arduino这个软件,还算不错的认识了这个开源软件.(自我认为..) 但是 ...

最新文章

  1. Gym 环境汇总 (无mojoco版)
  2. 深度学习常见概念解析
  3. jupyter notebook报错Failed to load module appmenu-gtk-module
  4. android 背景图片居中显示文字,Android ImageSpan 给文字设置圆角背景 并且文字居中,背景居中。...
  5. 【转】DBMS_STATS.GATHER_TABLE_STATS详解
  6. JavaScript-12(脚本化CSS)
  7. Mac下SSH Key配置
  8. vmware+player+12+linux,Vmware player 12
  9. TCPIP详解之udp
  10. 【软件工程】——软件需求说明书
  11. PHP实现图片转字符画
  12. 软考答题卡如何填写,这些你都清楚吗?
  13. GIS招聘 | 青海省省直事业单位(含地信、测绘等专业)
  14. 软件工程阶段性总结(二)——软件计划和需求分析
  15. import time python_Python——入门级(import 模块)
  16. 神兵利器——敏感文件发现工具
  17. R语言之一元线性回归xt2.15
  18. 梅科尔工作室-梁嘉莹-鸿蒙笔记4
  19. Android文件读写操作(assets 文件、 raw文件、内部存储文件、外部存储文件)
  20. 猪:原来大数据都是骗“猪”的

热门文章

  1. 计算机人工智能应用,计算机在人工智能中的应用研究
  2. 手机里android文件夹是什么文件夹,安卓手机里的.androidlmage test是什么文件夹?...
  3. java微信公众号短信验证码_解决微信端公众号网页获取短信验证码ajax重复调用两次的问题...
  4. 网站添加百度分享工具的好处
  5. 这次经历给我埋下了学理财的种子
  6. SQL 2008 -数据库的创建与管理
  7. Android SIGABRT的可能原因及开启手机Log日志
  8. Oracle基本认识
  9. ubuntu加了张固态_将ubuntu系统迁移到ssd固态
  10. 那些年踩过的坑-之《Android Q-高通平台UAC(USB Audio Class)调试记录》