首页 > 解决方案 > RFM69 无线电收发器:Arduino 未注册 Raspberry Pi 发送的传输确认

问题描述

我正在构建一个系统,其中带有 RFM69 无线电芯片的 Arduino Uno 将数据传输到在 Python 中运行脚本的 Raspberry Pi。

我对这两个脚本都使用了 RFM69 库:

Raspberry Pi 成功接收到数据包,并显示它也向发送器发送了一个确认(ACK)。但是,被发送节点没有收到这个 ACK​​。值得注意的是,当这是使用 2 块 Arduino 板实现时,它可以工作,所以它似乎不是硬件问题。

基于树莓派的接收器代码如下:

def receive_loop():
    tick = 0
    retry_window = 0.5

    while True:
        radio.begin_receive()
        # If no packet received, wait retry_window seconds, then retry.
        time_start = time.time()
        while radio.has_received_packet == False:
            if time.time() >= (time_start + retry_window):  
                 return

            for packet in radio.get_packets():
                radio_info = packet.to_dict()

        if radio_info['sender'] > 0:
            tick += 1

            print("Received from node: ", radio_info)
            print("Receive cycle: " + str(tick))

    return


with Radio(FREQ_433MHZ, my_node_id, network_id, isHighPower=False, promiscuousMode=True, auto_acknowledge=True) as radio:

    receive_loop()

处理数据传输的 Arduino 代码片段如下:

bool loop_var = true;
int tock = 0;

while (loop_var == true) {
  if (radio.sendWithRetry(TONODEID, RF_payload, sizeof(RF_payload)+1)) { 
    Serial.print("\nMessage sent.\n___\n\n");
    loop_var = false;
  }

  else {
    if (tock == 0) {
      Serial.print("\nNo ACK received, retrying...\n\n");
      tock++;
    }
  }
}

我的假设是 RFM69 库的两个版本的通信正常存在问题,但是,推断原因超出了我的理解水平。

标签: pythonc++arduinoraspberry-piradio

解决方案


问题源于硬件兼容性。使用的 RFM69 HCW 无线电模块需要消耗至少 40mA 的功率,而 RaspberryPi 3b+ 上的单个 GPIO 引脚只能安全地提供 16mA。

这意味着无线电芯片可以传输,但功率非常低,这意味着范围小于 1 厘米。

为了解决这个问题,可以为您的 Raspberry Pi 构建一个带有连接到 5V 引脚的稳压器的帽子。这增加了无线电芯片可以吸收的功率,同时保持安全的电压供应水平。请参阅下面的使用 LM1117 3.3V 稳压器的上述帽子的电路图:

LM1117 3.3V 稳压器


推荐阅读