У меня возникли некоторые проблемы с тем, чтобы мои Raspberry Pi 4 и Arduino uno успешно общались с помощью беспроводных модулей nRF24L01 +.
Я пробовал несколько различных учебных пособий по YouTube, и уже в третий раз я возвращаюсь к этому проекту, но меня ждет неудача.
Для arduino я использую библиотеку TMRH20 RF24
Самым последним учебным пособием является one .
Код, используемый в учебнике для Arduino, является базовым c кодом только для передачи:
#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);
}
Код, используемый в сценарии python на Raspberry Pi 4, - получение только:
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, шестнадцатеричные значения, показанные выше всех go до 0.
Я заметил, что в учебнике YouTube RX_P_NO отличается, как и значение TX_FULL. Кроме того, адреса RX и TX не совпадают с адресами, введенными в сценарий python.
У меня был рад ios, который раньше общался с помощью двух Arduino Uno. Я думаю, что моя неопытность с python мешает мне здесь.
Любая помощь приветствуется.
Редактировать: В учебнике скрипт python выводит строку каждую секунду. Мой скрипт выводит пустые строки несколько сотен раз в секунду. Возможно, в коде python произошла ошибка, так как он должен ждать в течение времени l oop, пока данные не станут доступны. Если нет, то это может быть проблема с функцией radio.available ().