电动滑板攻略 – 蓝牙控制原理
由 动力老男孩 发表于 2015/05/19 00:27:50目前市面上的电动滑板,大多都是用的车模的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 来读取了,真是超级方便!
———————————–
回到目录点这里
NB!膜拜大神!
不知动力能不能在讲讲之前提到的多路pwm问题,比如控制个三相的电机需要三路pwm该怎么让他输出~~,专用的pwm路已经用完,只能从一般pin口上找答案。
用 Servo 库可以解决这个问题,看这个帖子:http://www.diy-robots.com/?p=1128
你好 我想问下 滑板上的arduino是如何发出信号 使电机转动的呢?
看这个:http://www.chuangkoo.com/blog/37
另外 想问一下 使用arduino pro mini的话 怎么样才能把代码烧录进去呢 我用的是USBASP 但是不知道应该对应接哪个口?
Arduino Pro Mini不是有专用的烧写器吗?六口的那种,上面都标记了插口名,一目了然,淘宝搜下吧
可是没有说明接arduino pro mini的哪些口 烧录代码的时候 progisp找不到编程器
博主 在蓝牙干扰方面有没有研究啊 我司的蓝牙设备 也只是你用的这个型号 平时连接很稳定 但是 参加展会等等的大型活动 蓝牙设备很多 无人机 机器人 等等 蓝牙设备干扰很严重, 有时候 直接就不能连接了 求指点 , 我是搞软件的 , 公司没有专门弄蓝牙的硬件工程师啊, 所以问一下
请问无刷电机只能恒定转速转,不能变转速,是为什么呢?