nRF24L01+ : побеждаем модуль.

Тема в разделе "Проводная и беспроводная связь", создана пользователем ИгорьК, 19 июн 2014.

  1. parovoZZ

    parovoZZ Гуру

    Буфер на 32 байта.
    4 байта - это либо зашумленный канал, либо у передатчика уходит несущая частота.
     
  2. Irinka

    Irinka Нуб

    Здравствуйте.
    Подскажите пожалуйста, почему передатчик не получает ответ
    Код (C++):
    if(radio.isAckPayloadAvailable()) {
    Serial.println("Ок");
    }
    Приёмник сообщение получает и ответ отсылает.

    Ещё:
    Пин CSN подключен к +3,3 Вольт,вместо 9 пина ардуино, иначе приходится перед каждой отправкой делать:
    Код (C++):
    radio.powerUp();
    delay(20);
     
    И ещё:
    Код (C++):
    bool ok=radio.write(&message, sizeof(message));
    Сообщение отправляется, bool ok = 0

    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #define SIG_POWER RF24_PA_MAX
    #define SIG_SPEED RF24_1MBPS
    #define CH_NUM 0x60
    #define ADRESS 0xAABBCCDD11LL

    RF24 radio(9, 10);

    byte address= "0";
    uint32_t message=111;
    uint32_t priem;

    void SettingTX(){
      radio.begin();
      delay(500);
      radio.setAutoAck(true);
      radio.setRetries(15, 15);
      radio.enableAckPayload();
      //radio.setPayloadSize(32);
      radio.enableDynamicPayloads();

      radio.openWritingPipe(ADRESS);
      radio.setChannel(CH_NUM);
      radio.setPALevel (SIG_POWER);
      radio.setDataRate (SIG_SPEED);

      // radio.setCRCLength(RF24_CRC_16);
      //radio.setCRCLength(RF24_CRC_8);
      // radio.setCRCLength(RF24_CRC_DISABLED);

      //radio.powerUp();
      radio.stopListening();//Передатчик
    }


    void setup() {
    Serial.begin(9600);
    SettingTX();
    }




    void loop() {

    bool ok=radio.write(&message, sizeof(message));
    if (ok){
    Serial.println("Send");
    }else{
    Serial.println("Error Send");
    }


    if(radio.isAckPayloadAvailable()) {
    Serial.println("Ок");
    }

    delay(1000);
    }


    Код (C++):

    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #define SIG_POWER RF24_PA_MAX
    #define SIG_SPEED RF24_1MBPS
    #define CH_NUM 0x60
    #define ADRESS 0xAABBCCDD11LL

    RF24 radio(9, 10);

    uint32_t message;
    uint32_t otvet=222;

    void SettingRX(){
      radio.begin();
      delay(500);
      radio.setAutoAck(true);
      radio.setRetries(15, 15);
      radio.enableAckPayload();
      //radio.setPayloadSize(32);
      radio.enableDynamicPayloads();
      radio.openReadingPipe(1,ADRESS);
      radio.setChannel(CH_NUM);
      radio.setPALevel (SIG_POWER);
      radio.setDataRate (SIG_SPEED);
      // radio.setCRCLength(RF24_CRC_16);
      //radio.setCRCLength(RF24_CRC_8);
      // radio.setCRCLength(RF24_CRC_DISABLED);

      //radio.powerUp();
      radio.startListening();//Приёмник
    }


    void setup() {
    Serial.begin(9600);
    SettingRX();
    }




    void loop() {

    if( radio.available()){
      radio.read(&message, sizeof(message) );
      Serial.print("Read:");
      Serial.print(message);
      Serial.println();
      radio.writeAckPayload(1,&otvet, sizeof(otvet));
      Serial.println("Otvet Ok");

    }

    }//loop

     

    Дошла до 30 страницы этой темы, пока что не получилось настроить ответ от приемника.
     
    Последнее редактирование: 29 авг 2019
  3. art161ru

    art161ru Нуб

    Здравствуйте.
    Столкнулся с проблемой связки RPi и NRF24L01. Нет приема на RPi. До этого много работал с NORDIC-ом в связке с ATmega8/16 (не ардуиной, а именно МК).
    Суть проблемы: в эфире висит автономный передатчик, который раз в примерно 5 минут спамит сообщения. Приемником выступает малина, которая должна принять и обработать данные. NRF24+Atmega8 = работают идеально, NRF24+Arduino также идеальная работа. Но вот победить связь на RPi я так и не смог.
    В качестве библиотеки использую http://tmrh20.github.io/RF24/
    Код (C++):
    #include <SPI.h>    
    #include <nRF24L01.h>
    #include <RF24.h>    
    #include <math.h>
    #include <avr/sleep.h>
    #include <avr/wdt.h>
    #include "DHT.h"
    #define pin_read A0
    DHT dht;
    RF24 radio(7,6);

    const uint64_t pipe = 0xF0F0F0F0E1LL; // идентификатор передачи
    float data[4];
    int i;
    float max_v = 4.25;
    float min_v = 2.75;
    float Vbat = 0;
    float Vin = 0;
    int proc_bat = 0;

    /// Watchdog interrupt
    ISR(WDT_vect)
    {
      wdt_disable();  // disable watchdog
    }
    /////////

    /// Watchdog ON
    void WatchdogEnable(const byte interval)
    {
      MCUSR = 0;                          // reset various flags
      WDTCSR |= 0b00011000;               // see docs, set WDCE, WDE
      WDTCSR =  0b01000000 | interval;    // set WDIE, and appropriate delay
      wdt_reset();
      set_sleep_mode (SLEEP_MODE_PWR_SAVE); // SLEEP_MODE_PWR_SAVE или SLEEP_MODE_PWR_DOWN
      sleep_mode();            // now goes to Sleep and waits for the interrupt
    }
    //////////

    /// Настройка
    void setup()
    {
      dht.setup(9); // DHT11 pin 9
      //dht.begin();
      analogReference(INTERNAL); // установка опорного напряжения для аналоговых входов
      radio.begin();       // включаем радио модуль
      radio.setChannel(0x76); // выбираем канал (от 0 до 127)
      radio.setDataRate(RF24_1MBPS); // скорость: RF24_250KBPS, RF24_1MBPS или RF24_2MBPS
      radio.setPALevel(RF24_PA_HIGH); // мощность: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM
      radio.openWritingPipe(pipe);      // открываем трубу на передачу
      radio.stopListening();
    }
    //////////

    /// START
    void loop()
    {
      wdt_disable();
      delay(3000);
      Vbat = (analogRead(pin_read) * 1.1) / 1023;
      delay(1000);
      float del = 0.09; // 1 кОм / (10.07 кОм + 1 кОм)
      Vin = Vbat / del;
      proc_bat = ((Vin - min_v) / (max_v - min_v)) * 100; // уровень заряда в процентах
      data[0] = Vin;
      data[1] = proc_bat;
      delay(dht.getMinimumSamplingPeriod());
      data[2] = float(dht.getTemperature());
      data[3] = float(dht.getHumidity());
      radio.powerUp(); // NRF24 ON
      delay(500);
      radio.write(&data, sizeof(data));
      radio.powerDown(); //NRF24 OFF
      delay(1000);
      //for (i = 0; i <=35; i++) // (i<35) ~ 5 minut OFF ALL
      //{
      //  WatchdogEnable(0b100001);  // 8 seconds
      //}
    }
    ///////////
    // sleep bit patterns:
    //  1 second:  0b000110
    //  2 seconds: 0b000111
    //  4 seconds: 0b100000
    //  8 seconds: 0b100001
    ///////////
     

    Код (C++):

    #include <cstdlib>
    #include <iostream>
    #include <RF24/RF24.h>
    #include <fstream>

    // spi device, spi speed, ce gpio pin
    //RF24 radio(RPI_V2_GPIO_P1_22, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_1MHZ);
    //RF24 radio(RPI_V2_GPIO_P1_22, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_4MHZ);
    RF24 radio(RPI_V2_GPIO_P1_22, BCM2835_SPI_CS0, BCM2835_SPI_SPEED_8MHZ);
    //RF24 radio(22,0);

    void setup(void)
    {
        // init radio for reading
        radio.begin();
        radio.enableDynamicPayloads();
        radio.setPayloadSize(nRF_SEND_LEN);
        radio.setAutoAck(false);
        radio.setRetries(15,15);
        radio.setDataRate(RF24_1MBPS);
        radio.setPALevel(RF24_PA_MAX);
        radio.setChannel(0x76);
        radio.setCRCLength(RF24_CRC_16);
        radio.openReadingPipe(0,0xF0F0F0F0E1LL);
        radio.startListening();
        radio.printDetails();
    }

    int main(int argc, char** argv)
    {
      setup();
        printf("Start listening....\n");
        float data[4];
        while (true)
         {
           if ( radio.available() )
           {
            uint8_t len = radio.getDynamicPayloadSize();
            radio.read( data, len);
            printf("a %f",data[0]);
            printf("b %f",data[1]);
            printf("c %f",data[2]);
            printf("d %f",data[3]);
            delay(1000);
           }
       }
       return 0;
    }
     

    NRF24 - RPi3:
    CE - 22, GPIO25
    SCK - 23, GPIO 11
    MISO - 21, GPIO09
    MOSI - 19, GPIO10
    CSN - 24, GPIO08

    Уже даже емкость припаял на передатчике, хотя и без нее везде все работало у меня всегда.
    SPI включен и проверен. Такое ощущение что radio.available() всегда висит в false или NRF ничего не принимает. Реально передача есть (проверено приемником с ардуиной).
    [​IMG]
     
  4. parovoZZ

    parovoZZ Гуру

    Я в этой теме выкладывал 100% рабочий код для малины.
     
  5. art161ru

    art161ru Нуб

    видел, я без прерывания делаю, но даже адаптировав ваш код тишина в терминале.
     
  6. Irinka

    Irinka Нуб

    Что с моим проектом не так?
     
  7. art161ru

    art161ru Нуб

    я бы для начала соединил все по схема как нужно, у меня все ардуины всегда работали нормально во всевозможных режимах. И чтобы постоянно не писать radio.powerUp(); можно написать отдельную функцию на отправку и вызывать ее, загоняя в нее данные. Вообще паверап пишется в сетапе 1 раз при настройке, у меня в коде выше он в лупе потому что весь блок работает от аккумулятора, радио включается и выключается по команде и заведен таймер на пробуждение процессора, 5 минут сна - 2 сек работы и спать
     
    Последнее редактирование: 30 авг 2019
  8. Irinka

    Irinka Нуб

    Вернула всё на место

    Я это и имела ввиду, что перед каждой отправкой нужно вызывать powerUp();

    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #define SIG_POWER RF24_PA_MAX
    #define SIG_SPEED RF24_1MBPS
    #define CH_NUM 0x60
    #define ADRESS 0xAABBCCDD11LL
    unsigned long TimeOtpr;
    RF24 radio(9, 10);

    uint32_t message=333;
    uint32_t priem;
    bool FlagSend=true;

    void SettingTX(){
      radio.begin();
      delay(500);
      radio.setAutoAck(true);
      radio.setRetries(15, 15);
      radio.enableAckPayload();
      //radio.setPayloadSize(32);
      radio.enableDynamicPayloads();
     
      radio.openWritingPipe(ADRESS);
      radio.setChannel(CH_NUM);
      radio.setPALevel (SIG_POWER);
      radio.setDataRate (SIG_SPEED);
     
      radio.setCRCLength(RF24_CRC_16);
      //radio.setCRCLength(RF24_CRC_8);
      // radio.setCRCLength(RF24_CRC_DISABLED);

      //radio.powerUp();
      radio.stopListening();//Передатчик
      radio.powerUp();
    }

    void SEND(){
       radio.flush_tx();
      //radio.powerUp();
      //delay(20);
      bool ok=radio.write(&message, sizeof(message));
      if (ok){
        Serial.println("Send");
        }else{
        Serial.println("Error Send");
      }


      if(radio.isAckPayloadAvailable()) {
        Serial.println("Ок");
      }

      TimeOtpr=millis();
    }




    void setup() {
      Serial.begin(9600);
      SettingTX();
    }




    void loop() {
     
      if(radio.isAckPayloadAvailable()) {
      Serial.println("OkLoop");
      }

     
      if (FlagSend){
        FlagSend=false;
        SEND();
    }

    if(!FlagSend && millis()-TimeOtpr >= 1000) {
    FlagSend=true;
    }




    }


    Код (C++):
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #define SIG_POWER RF24_PA_MAX
    #define SIG_SPEED RF24_1MBPS
    #define CH_NUM 0x60
    #define ADRESS 0xAABBCCDD11LL

    RF24 radio(9, 10);

    uint32_t message;
    uint32_t otvet=222;

    void SettingRX(){
      radio.begin();
      delay(500);
      radio.setAutoAck(true);
      radio.setRetries(15, 15);
      radio.enableAckPayload();
    // radio.setPayloadSize(32);
      radio.enableDynamicPayloads();
     
      radio.openReadingPipe(1,ADRESS);
      radio.setChannel(CH_NUM);
      radio.setPALevel (SIG_POWER);
      radio.setDataRate (SIG_SPEED);
     
      radio.setCRCLength(RF24_CRC_16);
      //radio.setCRCLength(RF24_CRC_8);
      // radio.setCRCLength(RF24_CRC_DISABLED);


      //radio.powerUp();
    radio.startListening();
    radio.powerUp();
    }


    void setup() {
    Serial.begin(9600);
    SettingRX();
    }




    void loop() {

    if( radio.available()){
      radio.read(&message, sizeof(message) );
      Serial.print("Read:");
      Serial.print(message);
      Serial.println();
      radio.writeAckPayload(1,&otvet, sizeof(otvet));
      Serial.println("Otvet Ok");

    }

    }//loop

    Ответ не приходит
     
  9. parovoZZ

    parovoZZ Гуру

    что пишет начальный экран конфигурации?
    Лучше с прерыванием, т.к. одно из ядер только и будет занято тем, что опросом трансивера...
     
  10. art161ru

    art161ru Нуб

     

    Вложения:

  11. parovoZZ

    parovoZZ Гуру

    Если в приемнике запрещен автоответ, то и в передатчике его тоже надо запретить. Тоже касается и динамической длины пакета.
     
  12. Irinka

    Irinka Нуб

    Это в мой адрес ответ?
     
  13. parovoZZ

    parovoZZ Гуру

    Также нужны скрины начальной загрузки приемника и передатчика
     
  14. Irinka

    Irinka Нуб

    Передатчик:
    Код (C++):
    STATUS         = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1     = 0xaabbccdd11 0xc2c2c2c2c2
    RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
    TX_ADDR         = 0xaabbccdd11
    RX_PW_P0-6     = 0x20 0x00 0x00 0x00 0x00 0x00
    EN_AA         = 0x00
    EN_RXADDR     = 0x02
    RF_CH         = 0x4c
    RF_SETUP     = 0x07
    CONFIG         = 0x0f
    DYNPD/FEATURE     = 0x00 0x00
    Data Rate     = 1MBPS
    Model         = nRF24L01+
    CRC Length     = 16 bits
    PA Power     = PA_MAX
    00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777

    0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

    00000000000000000000000002267777565543200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

    Приёмник
    Код (C++):

    STATUS        = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1    = 0xe7e7e7e7e7 0xaabbccdd11
    RX_ADDR_P2-5    = 0xc3 0xc4 0xc5 0xc6
    TX_ADDR        = 0xe7e7e7e7e7
    RX_PW_P0-6    = 0x00 0x20 0x00 0x00 0x00 0x00
    EN_AA        = 0x00
    EN_RXADDR    = 0x02
    RF_CH        = 0x4c
    RF_SETUP    = 0x07
    CONFIG        = 0x0f
    DYNPD/FEATURE    = 0x00 0x00
    Data Rate    = 1MBPS
    Model        = nRF24L01+
    CRC Length    = 16 bits
    PA Power    = PA_MAX
    00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777

    0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

    00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


     

    На приемнике все каналы якобы пустые

    Заменила плату приемника:
    Код (C++):
    STATUS         = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1     = 0xe7e7e7e7e7 0xaabbccdd11
    RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
    TX_ADDR         = 0xe7e7e7e7e7
    RX_PW_P0-6     = 0x00 0x20 0x00 0x00 0x00 0x00
    EN_AA         = 0x00
    EN_RXADDR     = 0x02
    RF_CH         = 0x4c
    RF_SETUP     = 0x07
    CONFIG         = 0x0f
    DYNPD/FEATURE     = 0x00 0x00
    Data Rate     = 1MBPS
    Model         = nRF24L01+
    CRC Length     = 16 bits
    PA Power     = PA_MAX
    00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777

    0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef

    00100000000000000000000008975422233144360000000000000000000000000000000000000001000010000000000000000000000000000000000000000000
     
    Последнее редактирование: 30 авг 2019
  15. parovoZZ

    parovoZZ Гуру

    только не CSN, а CE. Пин CSN разграничивает посылки по SPI.
     
  16. Irinka

    Irinka Нуб

    Сейчас всё подключено "по умолчанию", приёмник принимает сообщение, отправляет, но передатчик ответа не получает
     
  17. parovoZZ

    parovoZZ Гуру

    с этими настройками и не получит))
     
  18. Irinka

    Irinka Нуб

    Где у меня косяк?
     
  19. parovoZZ

    parovoZZ Гуру

    Я в библиотечных функциях не разбираюсь и разбираться мне в них лень. Вот если с регистрами - другое дело. Мне проще открыть даташит на микросхему и свериться с ним, чем искать документацию на библиотеку и глюки в ней, а потом всё-равно придётся лезть в даташит.
     
  20. Irinka

    Irinka Нуб

    Поняла.
    Я уже столько всего перепробовала...
    В этой теме сколько скетчей просмотрела, на других сайтах, "минимальные" настройоки и всё работает.