1

我正在用 2 Arduinos Leonardo 做一个通信系统。为了传输,我必须将字符串转换为位并通过 PWM 引脚发送它们。问题是,我该如何做接收器?

我的想法是在数字引脚中接收数据,因此我可以将 LOW/HIGH 转换为“0”和“1”,将 8 位放入字符串中,转换为 char,然后我就有了最终的字符串。

任何帮助/建议将不胜感激。

编辑:

  • 我使用 PWM 是因为我想实现 FSK 调制,逐位发送;
  • 我有一些硬件可以让通信系统正常工作;
  • 我的物理通信渠道是串行(通过 Arduino 引脚);
  • 在接收器硬件会为我提供 TTL 信号,所以我会有 0V/5V。这就是为什么我认为 digitalRead() 应该起作用的原因;
  • 数据通过 PWM 发送,并以两级信号接收;
  • 我将不得不做一些协议来发送/接收数据,仍然不知道如何.. ;
4

3 回答 3

1

你没有说你的物理沟通渠道是什么。这个很重要。在 Arduino 上,您的主要选择是:

您还可以通过向/从数字引脚写入和读取数据来实现自己的协议,尽管这很可能看起来像 SPI。除非您想发送字符串,否则这些方法都不需要将任何内容转换为字符串。我有点不知所措你是如何通过 PWM 发送数据的:这似乎是一个毫无根据的黑客攻击。

于 2013-03-25T20:48:33.213 回答
1

使用 PWM 是在设备之间进行二进制数据通信的硬方法,它可以代替其他更容易获得的外设,但也是可行的。基本上是 PCM 或脉冲编码调制。最简单的方法是引脚被断言的时间长度,代表数据。例如,伺服系统会发生什么。其中 PWM 重复表示已知位置的相同时间长度,并且伺服的接收器将脉冲的长度转换回位置或数据。

对于 Arduino 用户来说,PWM 的接收并不典型,但 AVR micro 的能力远不止于此。有两种可能的方法来捕捉这种脉冲持续时间。Arduion 的第一个和共同点是PulseIn()函数。此功能不是实时的。它只是对脉冲之间的周期进行时间戳记,并且仅限于几微秒的持续时间。我相信还有其他变化可能会更长。这可以很好地工作。但可能与其他中断有关,例如串行函数和定时器。

另一种方法称为输入捕捉中断。以下 GISTHUB INputCapture.ino是我从另一个来源抢救的此类代码的示例。不是典型的,代码不是作为 Arduino 库编写的。但确实非常准确地捕获了脉冲的长度。简而言之,输入捕获引脚硬件在触发时锁定系统时钟,然后在某个潜在时间可以读取它。

于 2013-03-25T21:45:03.700 回答
0

嗯,这是我写的代码:

void setup() {
  Serial.begin(9600);
  while (!Serial) {;}
}
void loop() {
  char bitPosition = 0;
  String inMessage = 0;
  while (Serial.available() > 0) {
    char outChar;
    boolean digValue = digitalRead(inPin);
    for(bitPosition = 7; bitPosition >= 0;  ){
      if(digValue == LOW){
        bitWrite(outChar, bitPosition, 0);
      }
      if(digValue == HIGH){
        bitWrite(outChar, bitPosition, 1);
      }
    bitPosition--;
    }
  inMessage.concat(outChar);
  if(inMessage != 0){
    Serial.println("Received:  " + inMessage);
  }
 }
}

这不是我所期望的。第一个 digValue 始终为 0。建议?

于 2013-03-26T12:02:25.860 回答