Arduino智能小车——蓝牙小车

Arduino智能小车——蓝牙小车

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

  1. Arduino智能小车——拼装篇 点击跳转
  2. Arduino智能小车——测试篇 点击跳转
  3. Arduino智能小车——调速篇 点击跳转
  4. Arduino智能小车——超声波避障 点击跳转
  5. Arduino智能小车——蓝牙小车 点击跳转
  6. Arduino智能小车——循迹篇 点击跳转
  7. 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 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);
  }  

蓝牙小车测试

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

可能遇到的问题

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

  好像看起来并没有什么毛病,但是小车就是不会运转。这种情况是因为手机蓝牙串口助手向手机发送的是[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 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点评、交流

  • 271
    点赞
  • 1673
    收藏
    觉得还不错? 一键收藏
  • 131
    评论
### 回答1: Arduino智能小车是一种基于Arduino控制板的小型智能车辆,它可以过编程实现自主移动、避障、跟随等功能。一般来说,它主要由Arduino控制板、电机驱动模块、电机、传感器和外壳组成。 在制作Arduino智能小车时,可以过编程控制电机的转动方向和速度,从而实现小车的前进、后退、左转、右转等运动方式。同时,可以过超声波传感器等感知模块获取周围环境信息,从而实现避障、跟随等功能。 如果你想进一步了解如何制作Arduino智能小车,可以查看一些相关的教程和视频,了解所需硬件和软件,以及如何进行编程。 ### 回答2: Arduino智能小车是一种基于Arduino开发板的智能车辆,它结合了传感器、电机和编程控制,能够实现多种智能功能和自主导航。 首先,Arduino智能小车过搭载各种传感器来感知周围环境。常会使用红外线传感器、超声波传感器、灰度传感器等来检测障碍物、距离和地面颜色等信息。这些传感器可以在遇到障碍物时及时发出信号,避免碰撞,并根据传感器数据做出相应的动作。 其次,Arduino智能小车的动力系统过电机来驱动。它常配备直流电机和舵机,可以实现前进、后退、转弯等动作。借助编程控制,可以根据传感器的反馈信号,实现智能巡线、自动避障等功能。 最后,Arduino智能小车的核心是基于Arduino开发板的编程控制。使用Arduino编程语言,可以编写控制逻辑和算法,对小车的各个功能进行编程。过编程,可以实现自动避障、巡线跟踪、遥控操控、声音和光线控制等多种智能功能。 总结来说,Arduino智能小车是一款结合了传感器、电机和编程控制的智能车辆。它具备感知周围环境、移动驱动和智能控制等功能。这种小车可以在教育、实验和娱乐等领域广泛应用,是学习和体验智能技术的绝佳平台。 ### 回答3: Arduino智能小车是一种基于Arduino控制板的智能机器人小车。它主要由车体、电机、传感器和Arduino板组成。过编写程序,可以实现小车的自主避障、遥控驾驶、跟随等功能。 首先,小车的车体是由底盘、轮子和电机组成。电机Arduino板上的电机驱动模块控制。过编写代码,可以实现小车的前进、后退、左转、右转等动作。 另外,小车上安装了各种传感器,如红外线传感器、超声波传感器和巡线传感器。红外线传感器可以用于检测前方的障碍物,实现自主避障功能。超声波传感器可以测量小车与障碍物的距离,可以在遥控驾驶模式下帮助驾驶员避免碰撞。巡线传感器可以用于检测地面上的黑线,实现小车的自动跟随功能。 在编写程序方面,可以利用Arduino开发环境进行编程。过使用Arduino的库函数和API,可以轻松地控制小车的各种动作和功能。例如,使用Serial库可以实现小车与电脑的串口信,过模拟信号控制小车的运动。 总之,Arduino智能小车是一个具有自主避障、遥控驾驶和跟随功能的智能机器人。过编写合适的程序,可以轻松地实现各种有趣的操作和应用。
评论 131
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值