【发布时间】: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