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