树莓派智能车AlphaBot教程4:遥控
遥控是小车的一个重要功能,常用的要控制方式有红外,蓝牙,wifi, NRF等。遥控程序大概类似,就是小车接受到传输过来的命令然后做相应的动作,只是传输的方式不一样而已。本章主要讲解红外以及蓝牙,后面章节讲到wifi.
红外遥控:
小车采用LFN0038K接收头,可以接受红外信号。配套的红外遥控器输出的脉冲信号遵循标准的NEC编码协议。
红外 NEC 协议编码采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的"0";以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1
协议: 上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如下图。
| 引导码 | 用户识别码 |用户识别码反码 | 操作码 | 操作码反码 |
首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是否出错)。然后是8bit 的命令码(也是从低有效位开始发),而后也是8bit 的命令码的反码。
一个命令只发送一次,即使遥控器上的按键一直按着。但是会每110mS发送一次重复码,直到遥控器按键释放。重复码比较简单:一个9mS的AGC脉冲、2.25mS间隔、560uS脉冲。
一次完整的命令脉冲如下图:
蓝牙遥控
蓝牙遥控通常采用蓝牙模块,蓝牙模块一般采用TTL串口控制。配对后即可作为全双工串口使用,无需了解任何蓝牙协议。Alphabot2-Ar留有Xbee接口,可以接入双模蓝牙串口模块。
蓝牙模块发送命令可以是一个字符或者字符串,如下图ardiono程序。单片机接受到字符串是判断是否和已知的命令相匹配,然后做出相应动作。
当命令比较多时,可以采用JSON格式的命令,区分各种命令的类别。JSON格式如下。 {"Forward":"Down"} {"Buzzer":"On"}
JSON格式分表示为键/值对组合,键/值对组合中的键名写在前面并用双引号 "" 包裹,使用冒号 : 分隔,然后紧接着值。上图中"Forward",“Buzzer”为键,对应两种不同命令。"Down","On"为值,表示命令的值。
接收到命令后可以通过JSON库解析对应的键,得到值。例如下面程序。通过arduino的JSON库解析“Forward”键的值,如果是“Down”表示按键按下,小车前进。如果是“Up”表示按键松开。小车停止。
=== cpp代码: ===
aJsonObject *Forward = aJson.getObjectItem(msg, "Forward");
if (Forward)
{
String str = Forward->valuestring;
if(str.equals("Down"))
{
forward();
Serial.println("{\"State\":\"Forward\"}");
}
else if (str.equals("Up"))
{
stop();
Serial.println("{\"State\":\"Stop\"}");
}
}