电动滑板攻略 – 蓝牙控制原理

目前市面上的电动滑板,大多都是用的车模的2.4G遥控器,基本上都是单向控制。在我的改装里,把遥控换成了蓝牙通讯(其实蓝牙的波段也是2.4G,不过是制定了数据通讯协议),改用蓝牙之后有很多好处:

1. 可以双向通讯,滑板可以通知遥控器电量、速度或者未来还可以有载重等信息;
2. 大量的蓝牙设备可以用来当遥控器,最常见的就是手机,还可以有游戏柄、手环、指环,以后没准还可以脑波控制;
3. 开发简单,蓝牙配对之后可以模拟成串口,直接发送数据就可以了;
说起蓝牙,这个名字真是够怪的。它的起名来源是一位国王,据说爱吃蓝莓以至于牙真的是蓝色的,所以有个绰号叫Bluetooth。可能是因为这个家伙比较擅长沟通,所以发明蓝牙的科学家就用它来命名最新的通讯协议了。我们常见的无线通讯协议还有WIFI和ZigBee,分别应用于不同的场景。
蓝牙模块
蓝牙设备都是成对儿使用的,以电动滑板为例,其中一个是主设备,另外一个是从设备。就像相亲一样,总得其中一个主动点儿才能成功配对。
我们选用的蓝牙模块是 HC-05 主从一体的蓝牙模块,也就是同样的一个蓝牙模块,你可以把它设置成主设备,也可以把它设置为从设备。你在淘宝购买的时候,可能会发现长的不一样的蓝牙模块,有的边缘有锯齿,我们一般叫“邮票板”;还有的是带底板的,用插针连出来。
邮票板的每个缺口都是一个引脚,有很多功能其实是我们用不上的。插针板其实就是给邮票板加上了一个底板,一般还会用热缩管套起来。它把我们最常用的一些引脚引出来,方便开发和调试。相对的来说体积就会大一点儿。不管是什么板,大多数蓝牙模块都包含下面的这些引脚:
蓝牙模块

蓝牙模块

其中GND表示电源地;VCC是电源正极,需要看好是3.3V还是5V;TX(Transmit)用于发送数据;RX(Receive)用于接受数据。这4个引脚是所有蓝牙模块都会有的,其他的一些常见的引脚包括:Key(或EN),设置为高电平才能进入AT设置模式;State(或LED),通常用于连接一个闪烁的灯,表示蓝牙的状态。
需要注意的是,不管是蓝牙还是别的什么串口,RX和TX都是对换着接的。例如蓝牙模块的RX需要对应Arduino的TX,蓝牙模块的TX对应Arduino的RX。这也很好理解,一方的发送端肯定是要连到对方的接收端嘛。
AT指令
前面提到了用Key或EN可以让蓝牙进入AT模式,所谓的AT模式是指蓝牙的设置模式,在这个模式下,可以设置蓝牙的名字、密码、配对信息等等。
如果要用电脑调试蓝牙,你需要一个USB转串口的模块(请在某宝搜 USB+串口+UART+模块 ),这种模块一般带有USB插头直接可以接电脑,另一头则是一些插针用于连接设备。设置蓝牙的话,请按下图连线:
usb转串口

usb转串口

连接之后在电脑上就会发现新硬件,比尔盖子会帮你找到驱动,完事儿之后你会在设备里看到一个新硬件,并映射出一个COM端口。
这时候你可以用Arduino的串口监视器来测试AT指令,在输入框输入AT后回车,你会发现蓝牙给你返回了一个OK,这就表示AT指令是可用的。不同厂家的AT指令并不完全相同,所以最好要找卖家要说明文档,不过一些常见的AT指令应该都支持。
其中AT指令包括查询和设置,以蓝牙的名称为例:
AT+NAME=ChuangKoo  这个命令把蓝牙模块的名字设置成ChuangKoo,蓝牙返回OK
AT+NAME? 这个命令蓝牙返回ChuangKoo
还有一些常见的命令包括:
AT+ROLE=M  设置蓝牙为主(Master)模式,等号后面是S的话则表示从(Slave)模式
AT+DEFAULT  还原为默认设置
AT+RESTART  软件复位(重启)
AT+ADDR?    查询本模块的Mac地址
AT+BIND=0002,0a,01eea7   自动绑定对方的Mac地址,只对主模式有效
其中我们主要就是靠AT+BIND来实现遥控器和电滑板的配对的。
Arduino程序
我的遥控器和电滑板上,都各自有一块Arduino Pro Mini和一个蓝牙模块。蓝牙模块设置了自动配对之后,它们只要加了电就会自动连接,这时候它们就进入“透传”状态,也就是说两个Arduino之间就像直接连上了一样。
在硬件上,Arduino有两种方式可以连接蓝牙,一种是直连,就是把Arduino板子上的RX、TX分别和蓝牙模块的TX、RX相连,在代码里用Serial类来操作;
这种方式据说会比较稳定,但是令人烦躁的是,当我们需要烧录程序的时候,需要把Arduino的RX、TX和烧写器相连;一旦接上蓝牙之后,烧程序就没法用了。
另外一种是软件串口的方式,随便选Arduino上的两个数字输出口,例如11和12,用它们来连接蓝牙的RX和TX,在代码里用SoftwareSerial类来操作。
这样烧代码的时候,就不需要把蓝牙拔下来了,而且一个Arduino板子可以控制好几个软件串口。
接线示意图如下:
电动滑板蓝牙连接示意图

电动滑板蓝牙连接示意图

遥控器端的代码是这样的:
  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(12, 11);
  3. void setup()
  4. {
  5. mySerial.begin(9600);  //设置波特率
  6. }
  7. void loop()
  8. {
  9. int readValue = 50;  //这里会换成从摇杆得到的读数
  10. mySerial.write((byte)readValue);
  11. delay(100);
  12. }

mySerial就是软件串口,你可以看到就用简单的 mySerial.write(xxx) 就可以从遥控器向滑板发送数据了。

接收端的代码是这样的:
  1. #include <SoftwareSerial.h>
  2. SoftwareSerial mySerial(12, 11);
  3. int powerValue = 50;  //摇杆默认位于0~100的中点
  4. void setup()
  5. {
  6. mySerial.begin(9600);  //设置波特率
  7. }
  8. void loop()
  9. {
  10. while(mySerial.available()) {
  11. powerValue = mySerial.read();
  12. }
  13. // 此处用powerValue来控制电机
  14. delay(2500);
  15. }

其中两个主要的函数 mySerial.available() 用于判断当前蓝牙模块是否有数据进来;mySerial.read() 用于读一个字节的数据。

所以蓝牙配对之后,两个设备之间有什么想说的悄悄话,只需要其中一个用Serial.write 写入,另一个就可以用Serial.read 来读取了,真是超级方便!
———————————–
回到目录点这里



对 “电动滑板攻略 – 蓝牙控制原理” 的 10 条 评论

  1. lec 说:

    NB!膜拜大神!

  2. gyf900 说:

    不知动力能不能在讲讲之前提到的多路pwm问题,比如控制个三相的电机需要三路pwm该怎么让他输出~~,专用的pwm路已经用完,只能从一般pin口上找答案。

  3. Zoe 说:

    你好 我想问下 滑板上的arduino是如何发出信号 使电机转动的呢?

  4. wei 说:

    博主 在蓝牙干扰方面有没有研究啊 我司的蓝牙设备 也只是你用的这个型号 平时连接很稳定 但是 参加展会等等的大型活动 蓝牙设备很多 无人机 机器人 等等 蓝牙设备干扰很严重, 有时候 直接就不能连接了 求指点 , 我是搞软件的 , 公司没有专门弄蓝牙的硬件工程师啊, 所以问一下

  5. Allen 说:

    请问无刷电机只能恒定转速转,不能变转速,是为什么呢?

发表评论

可以使用下列 XHTML 标签:<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>