【问题标题】:Cannot get Raspberry Pi 4 and Arduino to communicate successfully using nRF24L01+ wireless modules使用 nRF24L01+ 无线模块无法让 Raspberry Pi 4 和 Arduino 成功通信
【发布时间】:2020-07-08 13:35:11
【问题描述】:

我在让我的 Raspberry Pi 4 和 Arduino uno 使用 nRF24L01+ 无线模块成功通信时遇到了一些问题。

我尝试了几个不同的 youtube 教程,这是我第三次回到这个项目,结果却失败了。

对于 arduino,我使用的是 TMRH20 RF24 library

我最近学习的教程是one

教程中使用的 arduino 代码是一个基本的仅传输代码:

#include<RF24.h>

//ce,csn pins
RF24 radio(9,10);

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.setPALevel(RF24_PA_MAX);
  radio.setChannel(0x76);
  radio.openWritingPipe(0xF0F0F0F0E1LL);
  radio.enableDynamicPayloads();
  radio.powerUp();

}

void loop() {
  const char text[] = "Hello World";
  radio.write(&text, sizeof(text));
  Serial.println("sent.. ");
  delay(1000);
}

树莓派 4 上的 python 脚本中使用的代码仅接收:

import RPi.GPIO as GPIO
from lib_nrf24 import NRF24
import time
import spidev

GPIO.setmode(GPIO.BCM)

pipes = [[0xE8,0xE8,0xF0,0xF0,0xE1], [0xF0,0xF0,0xF0,0xF0,0xE1]]

radio = NRF24(GPIO, spidev.SpiDev())
radio.begin(0,17)

radio.setPayloadSize(32)
radio.setChannel(0x76)
radio.setDataRate(NRF24.BR_1MBPS)
radio.setPALevel(NRF24.PA_MIN)

radio.setAutoAck(True)
radio.enableDynamicPayloads()
radio.enableAckPayload()

radio.openReadingPipe(1,pipes[1])
radio.printDetails()
radio.startListening()

while True:
 while not radio.available(0):
  time.sleep(1/100)

 receivedMessage = []
 radio.read(receivedMessage, radio.getDynamicPayloadSize())
 print("Received: {}".format(receivedMessage))
 print("Translating our received message into unicode characters...")
 string = ""

 for n in receivedMessage:
  if (n >= 32 and n <= 126):
   string += chr(n)
 print("Our received message decodes to: {}".format(string))

两个程序都编译。

RPi终端输出的详细信息(因为radio.printDetails())是:

/home/pi/nrf24/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     = 0xfdf9f9f9f9 0xfefefefef8
RX_ADDR_P2-5     = 0xf0 0xf1 0xf1 0xf1
TX_ADDR          = 0xfdf9f9f9f9
RX_PW_P0-6       = 0x00 0x08 0x00 0x00 0x00 0x00
EN_AA            = 0x0f
EN_RXADDR        = 0x00
RF_CH            = 0x1d
RF_SETUP         = 0x00
CONFIG           = 0x03
DYNPD/FEATURE    = 0x03 0x01
Data Rate        = 1MBPS
Model            = nRF24L01
CRC Length       = Disabled
PA Power         = PA_MIN

我相当有信心在 RPi 和无线电之间发生通信,因为当我断开无线电并重新运行 python 脚本时,上面显示的十六进制值都变为 0。

我注意到在 youtube 教程中,RX_P_NO 和 TX_FULL 值不同。 此外,RX 和 TX 地址与 Python 脚本中输入的地址不同。

我之前使用过两个 Arduino Uno 进行无线电通信。我认为我对 python 的缺乏经验在这里阻碍了我。

感谢任何帮助。

编辑:在教程中,python 脚本每秒输出一个字符串。我的脚本每秒输出数百次空白字符串。 python代码可能存在错误,因为它应该在while循环中等待直到数据可用。如果不是,则可能是 radio.available() 函数的问题。

【问题讨论】:

  • 你在发射器上试过radio.stopListening();吗?两个模块上是否有 LED?如果是这样,它们是否在闪烁/点亮?
  • 我已经在发件人的设置功能中尝试了radio.stopListening();。不用找了。每个无线电板上都有一个点亮的电源 LED。
  • 您可以在time.sleep(1/100) 上方添加调试print('Waiting for data') 以查看可能发生的情况。并更改为time.sleep(1)
  • 消息"Channel already in use" 也可能暗示板需要在不成功的尝试之间断电。
  • 您可以尝试使用 setCRCLength(0) 禁用发送方的 CRC,因为它在接收方上似乎已禁用......或者在两者上都启用它的 CRC8。

标签: python c++ arduino raspberry-pi


【解决方案1】:

您收到的警告可能与您的问题有关。

printDetails() 输出指示 RPi 和无线电之间的通信问题。例如,RF_CH 应为 0x76 时显示为 0x1d。这表明存在接线或配置问题。

我最好的建议是为 RPi 使用 TMRh20 RF24 Python 包装器。这样您就可以使用积极支持的库,代码库从 Arduino 到 RPi 完全相同,并且包含已知的工作示例。 见http://tmrh20.github.io/RF24/Python.html

注意:您需要先构建 C++ 库,因为它是 C++ 库的 Python 包装器

【讨论】:

  • 我将放弃旧方法,改用这个库。我会让你知道情况如何。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 2022-11-17
相关资源
最近更新 更多