树莓派智能车AlphaBot教程4:遥控

来自丢石头百科


遥控是小车的一个重要功能,常用的要控制方式有红外,蓝牙,wifi, NRF等。遥控程序大概类似,就是小车接受到传输过来的命令然后做相应的动作,只是传输的方式不一样而已。本章主要讲解红外以及蓝牙,后面章节讲到wifi. 红外遥控: 小车采用LFN0038K接收头,可以接受红外信号。配套的红外遥控器输出的脉冲信号遵循标准的NEC编码协议。 红外 NEC 协议编码采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的组合表示二进制的"0";以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的组合表示二进制的"1


105352wozunnltqdoann3o.gif


协议: 上述“0”和“1”组成的32位二进制码经38kHz的载频进行二次调制以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产生红外线向空间发射,如下图。



105352rooo6dhouh8bcoqm.gif

|    引导码    |  用户识别码   |用户识别码反码 |   操作码    |  操作码反码   |

首次发送的是9ms的高电平脉冲,其后是4.5ms的低电平,接下来就是8bit的地址码(从低有效位开始发),而后是8bit的地址码的反码(主要是用于校验是否出错)。然后是8bit 的命令码(也是从低有效位开始发),而后也是8bit 的命令码的反码。

一个命令只发送一次,即使遥控器上的按键一直按着。但是会每110mS发送一次重复码,直到遥控器按键释放。重复码比较简单:一个9mS的AGC脉冲、2.25mS间隔、560uS脉冲。


105352yb0y3lol88bjbize.gif

一次完整的命令脉冲如下图:


105353hgfugg2lg9y4ufg5.png


蓝牙遥控

蓝牙遥控通常采用蓝牙模块,蓝牙模块一般采用TTL串口控制。配对后即可作为全双工串口使用,无需了解任何蓝牙协议。Alphabot2-Ar留有Xbee接口,可以接入双模蓝牙串口模块。


105353dzfki7yhguui7idz.png

蓝牙模块发送命令可以是一个字符或者字符串,如下图ardiono程序。单片机接受到字符串是判断是否和已知的命令相匹配,然后做出相应动作。


105353r4omag6pfawf2gca.png


当命令比较多时,可以采用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\"}");
     }
  }