Cubecell AB01 с nRF24L01
Я пытался подключить nRF24L01 к Cubecell AB01 без особой удачи. В большинстве случаев функция radio.available() всегда возвращает true, что приводит к куче мусора. Я понял, что nRF24L01 не хочет правильно настраиваться. С printPrettyDetails() Я могу подтвердить, что настройки не сохранены.
Однако с примером скетча, содержащимся в библиотеке RF24, все работает нормально (подтверждая, что AB01 и nRF24L01 работают нормально). Но как только я меняю тип данных полезной нагрузки приемника на uint8_t, функция radio.available() всегда истинна, что приводит к куче полученных сообщений с мусором. PrintPrettyDetails() также показывает неправильные настройки.
Есть ли у кого-нибудь опыт в этом деле? Я также попробовал пример скетча из Robin2. Это приводит к большому количеству мусора, как описано ранее.
Я использую:
- nRF24L01 с печатной антенной. Я периодически использую esp32, чтобы проверить, что nRF24L01 все еще работает нормально
- heltec AB01. nRF24L01 подключается к интерфейсу spi, а CE -> GPIO3 и CSN - > GPIO2
- Для программирования я использую platformio. Но в отчаянии я также могу использовать Arduino IDE (точно такое же поведение).
RX код: /** * См. Документацию по адресу https://nRF24.github.io/RF24 * См. Информацию о лицензии в корневом каталоге этой библиотеки. * Автор: Брендан Доэрти (2bndy5) */
/**
* A simple example of sending data from 1 nRF24L01 transceiver to another.
*
* This example was written to be used on 2 devices acting as "nodes".
* Use the Serial Monitor to change each node's behavior.
*/
#include <SPI.h>
#include "printf.h"
#include "RF24.h"
// instantiate an object for the nRF24L01 transceiver
RF24 radio(GPIO3, GPIO2); // using pin 7 for the CE pin, and pin 8 for the CSN pin
// Let these addresses be used for the pair
uint8_t address[][6] = {"1Node", "2Node"};
// It is very helpful to think of an address as a path instead of as
// an identifying device destination
// to use different addresses on a pair of radios, we need a variable to
// uniquely identify which address this radio will use to transmit
bool radioNumber = 1; // 0 uses address[0] to transmit, 1 uses address[1] to transmit
// Used to control whether this node is sending or receiving
bool role = false; // true = TX role, false = RX role
// For this example, we'll be using a payload containing
// a single float number that will be incremented
// on every successful transmission
float payload = 0;
void setup() {
Serial.begin(115200);
while (!Serial) {
// some boards need to wait to ensure access to serial over USB
}
pinMode(Vext, OUTPUT);
digitalWrite(Vext, LOW);
delay(10);
// initialize the transceiver on the SPI bus
if (!radio.begin()) {
Serial.println(F("radio hardware is not responding!!"));
while (1) {} // hold in infinite loop
}
// print example's introductory prompt
Serial.println(F("RF24/examples/GettingStarted"));
radioNumber = 1;
Serial.print(F("radioNumber = "));
Serial.println((int)radioNumber);
// Set the PA Level low to try preventing power supply related problems
// because these examples are likely run with nodes in close proximity to
// each other.
radio.setPALevel(RF24_PA_LOW); // RF24_PA_MAX is default.
// save on transmission time by setting the radio to only transmit the
// number of bytes we need to transmit a float
radio.setPayloadSize(sizeof(float)); // float datatype occupies 4 bytes
// set the TX address of the RX node into the TX pipe
radio.openWritingPipe(address[radioNumber]); // always uses pipe 0
// set the RX address of the TX node into a RX pipe
radio.openReadingPipe(1, address[!radioNumber]); // using pipe 1
// additional setup specific to the node's role
if (role) {
radio.stopListening(); // put radio in TX mode
} else {
radio.startListening(); // put radio in RX mode
}
// For debugging info
// printf_begin(); // needed only once for printing details
// radio.printDetails(); // (smaller) function that prints raw register values
radio.printPrettyDetails(); // (larger) function that prints human readable data
} // setup
void loop() {
// This device is a RX node
uint8_t pipe;
if (radio.available(&pipe)) { // is there a payload? get the pipe number that recieved it
uint8_t bytes = radio.getPayloadSize(); // get the size of the payload
radio.read(&payload, bytes); // fetch payload from FIFO
Serial.print(F("Received "));
Serial.print(bytes); // print the size of the payload
Serial.print(F(" bytes on pipe "));
Serial.print(pipe); // print the pipe number
Serial.print(F(": "));
Serial.println(payload); // print the payload's value
}
} // loop
Я пробовал все, что мог придумать, но безуспешно. Любая помощь будет оценена по достоинству!
@Joris Gravesteijn, 👍-1
1 ответ
Оказалось, что это коррумпированная библиотека и несоответствие скорости SPI
- вопрос по трубке nRF24L01
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- Ошибка "collect2.exe: error: ld returned 1 exit status"
- Как подключить NodeMCU к NRF24L01
- Переключение каналов NRF24l01
- Использование функции уровня сигнала модуля nRF24L01
- Как автоматически сбросить nrf24l01+ с кодом?
- NRF24L01+ PA не работает с Arduino Mega (работает с Nano)