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

动力老男孩发布于 2015-05-18 19:10


目前市面上的电动滑板,大多都是用的车模的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插头直接可以接电脑,另一头则是一些插针用于连接设备。设置蓝牙的话,请按下图连线:
连接之后在电脑上就会发现新硬件,比尔盖子会帮你找到驱动,完事儿之后你会在设备里看到一个新硬件,并映射出一个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板子可以控制好几个软件串口。
接线示意图如下:
遥控器端的代码是这样的:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 11);

void setup()
{
  mySerial.begin(9600);  //设置波特率
}

void loop()
{
  int readValue = 50;  //这里会换成从摇杆得到的读数
  mySerial.write((byte)readValue);

  delay(100);
}

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

#include <SoftwareSerial.h>
SoftwareSerial mySerial(12, 11);

int powerValue = 50;  //摇杆默认位于0~100的中点

void setup()
{
  mySerial.begin(9600);  //设置波特率
}

void loop()
{
    while(mySerial.available()) {
        powerValue = mySerial.read();
    }
    // 此处用powerValue来控制电机
    delay(2500);
}

其中两个主要的函数 mySerial.available() 用于判断当前蓝牙模块是否有数据进来;mySerial.read() 用于读一个字节的数据。
所以蓝牙配对之后,两个设备之间有什么想说的悄悄话,只需要其中一个用Serial.write 写入,另一个就可以用Serial.read 来读取了,真是超级方便!

-----------------------------------
回到目录点这里

 
9479161772017-01-09 21:46:05
和楼上同感
9479161772017-01-09 21:46:03
和楼上同感
❕Mr•Crazy❕2016-07-16 13:44:32
我想知道蓝牙模块具体咋配对啊!!

作者

动力老男孩

北京,海淀

163粉丝 10作品 14随笔
  关注 私信

作者的最新随笔


阅读数: 7854