【问题标题】:Troubleshooting Arduino/Pi4 communication using nRF24L01使用 nRF24L01 对 Arduino/Pi4 通信进行故障排除
【发布时间】:2022-10-16 06:46:39
【问题描述】:

我有一个项目需要在没有 WiFi 的情况下进行短距离通信,所以我正在尝试使用一些nRF24L01收发器来实现这一点。

我正在使用 Arduino Uno 来传输数据,并使用 Raspberry Pi 4 来接收该数据,但到目前为止,Pi 还没有收到一条消息。在这一点上,我已经浏览了各种教程和包/库,但绝对没有成功。

我是一位经验丰富的软件开发人员,但对 Arduino 方面的经验并不丰富。

这是配置:

阿杜诺:

nrf24 arduino
Vin 3V3
GND GND
CE Pin 9
CNS Pin 10
MOSI Pin 11
MISO Pin 12
SCK Pin 13
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include "printf.h"

RF24 radio(9, 10);


void setup() {
  printf_begin();
  Serial.begin(9600);
  radio.begin();
  radio.setChannel(0x76);
  const uint64_t address = 0xfd7dfdfdfd;
  radio.setPALevel(RF24_PA_MIN);
  radio.setCRCLength(RF24_CRC_16);
  radio.enableDynamicPayloads();
  radio.enableAckPayload();
  radio.setDataRate(RF24_1MBPS);
  radio.openWritingPipe(address);
  radio.stopListening();
  radio.printDetails();
}

void loop() {
  bool sendResult;

  if (radio.available()){
    Serial.println("Radio is available");
  } else {
    Serial.println("Radio is unavailable");
  }

  char text[32] = "Testeroni";
  sendResult = radio.write(&text, sizeof(text));

  if (sendResult) {
    Serial.println("Message sent");
  } else {
    Serial.println("Message not sent");
  }
  delay(1000);
}

圆周率 4:

使用lib_nrf24 包。

启用 SPI:

$ stat /dev/spidev0.0
  File: /dev/spidev0.0
  Size: 0               Blocks: 0          IO Block: 4096   character special file
Device: 5h/5d   Inode: 420         Links: 1     Device type: 99,0
Access: (0660/crw-rw----)  Uid: (    0/    root)   Gid: (  999/     spi)
Access: 2022-04-02 16:16:46.749999997 -0500
Modify: 2022-04-02 16:16:46.749999997 -0500
Change: 2022-04-02 16:16:46.749999997 -0500
 Birth: -
nrf24 pi/GPIO
Vin Pin 17 / 3V3
GND Pin 20 / GND
CE Pin 22 / GPIO 25
CNS Pin 24 / GPIO 8 / SPI0_CE0_N
MOSI Pin 19 / GPIO 10 / SPI0_MOSI
MISO Pin 21 / GPIO 9 / SPI0_MISO
SCK Pin 23 / GPIO 11 / SPI0_CLK
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
import time
import spidev
from lib_nrf24 import NRF24


radio = NRF24(GPIO, spidev.SpiDev())
radio.begin(0, 7)
radio.setRetries(15, 15)
radio.setChannel(0x76)
radio.setDataRate(NRF24.BR_1MBPS)
radio.setPALevel(NRF24.PA_MIN)
radio.setCRCLength(NRF24.CRC_8)
radio.setAutoAck(True)
radio.enableDynamicPayloads()
radio.enableAckPayload()
radio.openReadingPipe(0, [0xfd, 0x7d, 0xfd, 0xfd, 0xfd])
radio.startListening()
radio.stopListening()
radio.printDetails()
radio.startListening()

c = 1
while True:
    akpl_buf = [c,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8]

    while not radio.available([0]):
        time.sleep(10000/1000000.0)

    recv_buffer = []
    radio.read(recv_buffer, radio.getDynamicPayloadSize())
    if recv_buffer:
        print(f'Received: {recv_buffer}')

    c += 1
    if c&1 == 0:
        radio.writeAckPayload(1, akpl_buf, len(akpl_buf))

    time.sleep(1)

启动

我首先启动 Raspberry Pi 接收器:

$ sudo python library_listener.py
/home/pokeybill/lib_nrf24.py:377: RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  self.GPIO.setup(self.ce_pin, self.GPIO.OUT)
STATUS   = 0x03 RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=1 TX_FULL=1
RX_ADDR_P0-1     =
 0xffdfffffff 0xf87878f8f8
RX_ADDR_P2-5     =
0xf8
0xf9
0xf9
0xf9

TX_ADDR          =
 0xfdfdfdfdfd
RX_PW_P0-6       =
0x81
0x80
0x80
0x80
0x80
0xc0

EN_AA            =
0x8f

EN_RXADDR        =
0xc0

RF_CH            =
0x9f

RF_SETUP         =
0xff

CONFIG           =
0x98

DYNPD/FEATURE    =
0x83
0x81

Data Rate        = 1MBPS
Model            = nRF24L01
CRC Length       = 8 bits
PA Power         = PA_HIGH
Received: [128, 0, 0, 0, 0]

然后我启动了 Arduino Uno,这是串行输出:

STATUS       = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1     = 0xfd7dfdfdfd 0x0104030201
RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
TX_ADDR      = 0xfd7dfdfdfd
RX_PW_P0-6   = 0x20 0x20 0x20 0x20 0x20 0x20
EN_AA        = 0x3f
EN_RXADDR    = 0x03
RF_CH        = 0x76
RF_SETUP     = 0x01
CONFIG       = 0x0a
DYNPD/FEATURE    = 0x3f 0x06
Data Rate    = 1MBPS
Model        = nRF24L01+
CRC Length   = 8 bits
PA Power     = PA_MIN
Radio is unavailable
Message not sent

我立即注意到警告:

RuntimeWarning: This channel is already in use, continuing anyway.  Use GPIO.setwarnings(False) to disable warnings.
  self.GPIO.setup(self.ce_pin, self.GPIO.OUT)

但是,似乎无论我做什么,我总是会收到此警告。我已经尝试多次重启 pi 并明确调用 GPIO.cleanup() 没有任何喜悦。

此外,似乎无论我在 Raspberry Pi 代码中使用什么管道地址,它们都与我看到的接收器配置不匹配。

arduino radio.available() 调用永远不会返回 true,radio.write 调用永远不会被确认。

pi 偶尔会收到随机噪音,但从未收到来自 arduino 的消息。当我在代码中明确将频道设置为0x76 时,pi 似乎也有一个RF_CH=0x1f。对我来说,感觉就像我在 Pi 方面遗漏了一些东西,但我真的没有足够的知识来理解我在这里遗漏了什么。

可能需要了解此问题的信息在无线电详细信息输出中,但我只是不确定在哪里看。我尝试了不同的 CRC 长度、PA 功率和写/读管道地址 - 对这些值没有任何调整。

【问题讨论】:

    标签: python c++ raspberry-pi arduino-uno spi


    【解决方案1】:

    关于日志开头的警告问题,您可以按照以下步骤操作:http://raspi.tv/2013/rpi-gpio-basics-3-how-to-exit-gpio-programs-cleanly-avoid-warnings-and-protect-your-pi 并实现 try:、exception: 和 finally: 结构。它帮助我摆脱了这个警告。

    但是,我担心与我的 arduino 相同的问题 - 覆盆子与 NRF24L01 的链接。确实,我没有实现使用同一个库让它工作。我使用 printDetails 方法返回的配置与我之前配置的不对应。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-02
      • 2011-02-07
      • 2013-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多