遥控是小车的一个重要功能,常用的要控制方式有红外,蓝牙,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\"}"); } } |