NRF24L01+ Ошибка подтверждения начала работы

Я следовал многочисленным руководствам и учебным пособиям, чтобы модули NRF24L01+ работали с Arduino Uno. Я заменил на настоящую Arduino и попробовал 4 разных модуля NRF. Все без везения.

Я пытаюсь заставить работать самый простой пример из Простая демонстрация трансивера nRF24L01+ 2,4 ГГц.

Подключение оборудования: Аппаратные подключения

Простой тестовый код TX:

// SimpleTx - мастер или передатчик

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>


#define CE_PIN   9
#define CSN_PIN 10

const byte slaveAddress[5] = {'R','x','A','A','A'};



RF24 radio(CE_PIN, CSN_PIN); // Создаем радио

char dataToSend[10] = "Message 0";
char txNum = '0';


unsigned long currentMillis;
unsigned long prevMillis;
unsigned long txIntervalMillis = 1000; // отправляем раз в секунду


void setup() {

    Serial.begin(9600);

    Serial.println("SimpleTx Starting");

    radio.begin();
    radio.setDataRate( RF24_250KBPS );
    radio.setRetries(3,5); // задержка, счет
    radio.openWritingPipe(slaveAddress);
}

//=====================

void loop() {
    currentMillis = millis();
    if (currentMillis - prevMillis >= txIntervalMillis) {
        send();
        prevMillis = millis();
    }
}

//=====================

void send() {

    bool rslt;
    radio.stopListening();
    rslt = radio.write( &dataToSend, sizeof(dataToSend) );
        // Всегда используйте sizeof(), так как он дает размер как количество байтов.
        // Например, если бы dataToSend был int, sizeof() правильно возвращал бы 2

    Serial.print("Data Sent ");
    Serial.print(dataToSend);

    if (rslt) {
        Serial.println("  Acknowledge received");
        updateMessage();
    }
    else {
        Serial.println("  Tx failed");
    }
}

//================

void updateMessage() {
        // чтобы вы могли видеть, что отправляются новые данные
    txNum += 1;
    if (txNum > '9') {
        txNum = '0';
    }
    dataToSend[8] = txNum;
}

Последовательный монитор:

Использование radio.printDetails(); возвращает:

Пожалуйста, дайте мне знать, что мне не хватает.

, 👍0

Обсуждение

Не могли бы вы загрузить немодифицированный пример PingPair и посмотреть, работает ли он?, @Avamander

Где код принимающей стороны? Если получателя нет, отправитель не получит обратно пакет ACK, и вы получите сообщение об ошибке «TX failed»., @Gerben

Что это: uint8_t slaveAddress[5] = {0xF0F0F0F0A1LL, 0XF0F0F0F0B1LL, 0XF0F0F0F0C1LL, 0XF0F0F0F0D1LL, 0XF0F0F0F0E1LL};? Как вы ожидаете, что такие большие значения поместятся в uint8_t??? Компилятор интерпретирует это как uint8_t slaveAddress[5] = {0xA1, 0xB1, 0xC1, 0xD1, 0xE1};. Это то, что вы хотели? Думаю, нет. Также посмотрите здесь https:///github.com/nRF24/RF24/blob/master/RF24.h#L246 как должен формироваться адрес., @AnT

@AnT Я пытался сделать то же самое, что и один из ответов здесь: https://arduinoprosto.ru/q/65249/nrf24l01-tmrh20-library-receiver-gets-blank-data, прежде чем вы также прокомментировали это. Спасибо, обновили вопрос и код., @Jak

Большое спасибо всем вам. Не уверен, почему я ожидал, что функция radio.write вернет True без принимающей стороны. Работает., @Jak

Как вы получили RF_CH=0x76? Это не радиоканал по умолчанию при включении питания, поэтому вы не показываете полную версию кода?, @MichaelT


1 ответ


1

Arduino 3V3 не обеспечивает достаточного тока. Чтобы устранить это как источник вашей проблемы, вы можете использовать керамический конденсатор емкостью 100 мкФ между контактами VCC и GND модуля nRF24L01+ или купить Понижающий преобразователь 5V в 3V3, специально разработанный для nRF24L01.

,