从遥控直升机收集协议

时间:2014-03-23 16:44:06

标签: arduino remote-control infrared

我有一架(S107G)迷你直升机和一架Arduino。可能性听起来很有趣。所以我开始寻找使用IR从控制器到直升机的数据传输协议。我用这段代码试图找出它的一些东西。

void setup()
{
    Serial.begin(9600);
    pinMode(12, INPUT_PULLUP); // 12 is IR sensor
}

void loop()
{
    Serial.print(digitalRead(12) ? LOW : HIGH);
    delay(1);
}

显然这有很多缺陷。

  1. delay(1);是任意选择的,我无法知道数据的传输速度。
  2. 它可以是模拟输入。 (虽然我对此表示怀疑,因为我发现大多数红外传感器不支持它)
  3. 我无法知道“数据包”何时开始或结束。
  4. 如果你们中的任何一个人知道如何做到这一点 我很感激。谢谢!

    编辑:我发现this on SO这听起来很不错,但他没有深入了解他是如何做到的,以及他的发现是什么(速度等等)

1 个答案:

答案 0 :(得分:1)

您可以找到完整的代码库here on my GITHUB,您可以在其中找到IRsendDemoHelicopter.ino和IRrecvDump.ino的示例。这些和IRremote.cpp应该回答你的问题。我已经按照我的计划(有时候)在Esplora上实现了发射器。

以下是在https://github.com/mpflaga/Arduino-IRremote/blob/master/IRremoteInt.h#L192

找到的微秒
#define SYMA_UPDATE_PERIOD_CH_A 120 // 0
#define SYMA_UPDATE_PERIOD_CH_B 180 // 1
#define SYMA_HDR_MARK 2000
#define SYMA_HDR_SPACE 2000
#define SYMA_BIT_MARK 320
#define SYMA_ONE_SPACE 687
#define SYMA_ZERO_SPACE 300

这里是R3和R5的位模式。我相信R5是生产中最常见的产品。

union helicopter {
  uint32_t dword;
  struct
  {
     uint8_t Throttle  : 7;    //  0..6   0 - 127
     uint8_t Channel   : 1;    //  7      A=0, B=1
     uint8_t Pitch     : 7;    //  8..14  0(forward) - 63(center) 127(back)
     uint8_t Pspacer   : 1;    // 15      na
     uint8_t Yaw       : 7;    // 16..22  127(left) - 63(center) - 0(right)
  } symaR3;
  struct
  {
     uint8_t Trim      : 7;    //  0..6  127(left) - 63(center) - 0(right)
     uint8_t Tspacer   : 1;    //  7     na
     uint8_t Throttle  : 7;    //  8..14 0 - 127
     uint8_t Channel   : 1;    // 15     A=0, B=1
     uint8_t Pitch     : 7;    // 16..22 0(forward) - 63(center) 127(back)
     uint8_t Pspacer   : 1;    // 23     na
     uint8_t Yaw       : 7;    // 24..30 127(left) - 63(center) - 0(right)
  } symaR5;
};

但他们总是有可能推出新的模式。