#python #c #arduino #raspberry-pi3
#python #c #arduino #raspberry-pi3
Вопрос:
Я пытался создать проект о NRF24L01 и подключить его к arduino и raspberry pi. Затем я написал код. Он не ответил. Итак, я взял это с веб-сайта, и это сработало. Тем не менее, он отправлял сообщение один раз. Но код там был написан для непрерывной отправки. Итак, я решил вставить последовательную строку в код Arduino, чтобы выяснить, что я делал неправильно. И, как и ожидалось, последовательная строка напечатала «A» один раз. Но я поместил это в цикл! Итак, ребята, у вас есть представление о том, что я делаю неправильно?
Код arduino показан ниже:
//These libraries are fully downloaded.
#include<SPI.h>
#include<RF24.h>
// ce, csn pins, connected properly.
RF24 radio(9, 10) ;
//Here, I set up the stuff needed for the Transciever.
void setup(void){
radio.begin() ;
radio.setPALevel(RF24_PA_MAX) ;
radio.setChannel(0x76) ;
radio.openWritingPipe(0xF0F0F0F0E1LL) ;
radio.enableDynamicPayloads() ;
radio.powerUp() ;
Serial.begin(9600);
}
void loop(void){
const char text[] = "Hello World!" ;
Serial.println("A");
radio.write(amp;text, sizeof(text)) ;
delay(1000) ;
//s
}
И код RPI3 показан ниже:
#The libraries are downloaded.
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()
try:
while(1):
# ackPL = [1]
while not radio.available(0):
time.sleep(1 / 100)
receivedMessage = []
radio.read(receivedMessage, radio.getDynamicPayloadSize())
print("Received: {}".format(receivedMessage))
print("Translating the receivedMessage into unicode characters")
string = ""
for n in receivedMessage:
# Decode into standard unicode set
if (n >= 32 and n <= 126):
string = chr(n)
print("Out received message decodes to: {}".format(string))
except KeyboardInterrupt:
GPIO.cleanup()
Итак, вы видите какую-либо проблему в моем коде? Мне действительно нужно это решить.
Вот ссылка, по которой я их взял:
https://www.google.com.tr/url?sa=tamp;rct=jamp;q=amp;esrc=samp;source=webamp;cd=11amp;cad=rjaamp;uact=8amp;ved=2ahUKEwi-vPCDxo7hAhUKyaYKHZP9DQ8QFjAKegQIAxABamp;url=http://thezanshow.com/electronics-tutorials/raspberry-pi/tutorial-34-35amp;usg=AOvVaw26oek-_CM80ujzcc_PBk0N
И вот скриншот терминала, когда я запускаю код: изображение
Комментарии:
1. Кажется вероятным, что radio.write() не возвращает… Я бы взглянул на этот код и проверил, что в нем происходит.
2. Не могли бы вы, пожалуйста, написать, какой код я должен проверить?
3. Это было бы легко протестировать. Добавьте другой
Serial.println("B");
и посмотрите, выполняется ли он после записи по радио. И после этого я бы объявил свою статическую переменную вне цикла, в Arduino недостаточно памяти, вы не хотите ее заполнять. Это также может быть проблемой с питанием, известно, что Arduino периодически зависает / выходит из строя, если энергопотребление становится чрезмерным. Радио-материал, как правило, высасывает сок как сумасшедший. На сколько ампер рассчитан ваш источник питания?4. Он не записывает данные в порт. Теперь, что мне делать?
5. Спасибо, сэр, но когда я пытаюсь это сделать, он говорит, что я не объявил, что такое «текст».
Ответ №1:
В документации модуля RF24 говорится, что функция записи блокируется до успешного подтверждения получателем: Описание функции записи поэтому я предполагаю, что вы не отправляете никакого подтверждения обратно из своего RPI. Я рекомендую внимательно прочитать документацию и выбрать один из других методов записи. Также взгляните на документацию по Python для lib_nrf24