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

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

  1. AJIeKcAHDP

    AJIeKcAHDP Нуб

    Всем кто уже победил или почти победил эти модули,доброго времени суток.
    3й день мучаюсь с данными модулями.
    Тему не осилил-много страниц.
    Хочу сделать радиоуправление с обратной связью,модули рабочие.эфир сканируют.
    питание , соединение проверил.
    В общем просьба ткнуть носом в простейшую пару скетчей приема передачи.для проверки.
    В написание скетчей не силен.те которые нахожу в интернете либо не работают,либо работают долю секунды , когда нажимаю сброс на передатчике...
     
  2. b707

    b707 Гуру

    какой еще "сброс"? На НРФ24 нет сброса.
    Может все дело в том. что у вас какой-то особый передатчик?
     
    Последнее редактирование: 21 июл 2021
  3. parovoZZ

    parovoZZ Гуру

    пример pingpong из стандартной поставки библиотеки.
     
  4. AJIeKcAHDP

    AJIeKcAHDP Нуб

    Сброс на самой ардуине,несколько пакетов доходит и тишина
     
  5. b707

    b707 Гуру

    если какие-то пакеты доходят - значит НРФ работает и связывается один с другим.
    Ищите проблему в своем коде
     
  6. ragaban

    ragaban Нерд

    Я делал радиоуправление на arduino. Есть в ютубе канал AlexGyver. Поищи у него на канале про NRF, там есть и видео по настройке и скетчи готовые с обратной связью. Я делал корабль для рыбалки, и по своему опыту могу сказать что обратная связь негативно сказывается на чувствительность управления, особенно на дальних расстояниях.
     
  7. parovoZZ

    parovoZZ Гуру

    Никак она не сказывается на чувствительности, если делать всё грамотно, а не по гиверу.
     
  8. b707

    b707 Гуру

    на чувствительности нет, а на устойчивости и скорости обмена - да.
     
  9. parovoZZ

    parovoZZ Гуру

    сказывается общая радиообстановка. Устойчивость и скорость обмена взаимоисключающие в большинстве случаев.
    В конкретно данном случае (управление чем-либо) подтверждение не нужно абсолютно. Пульт просто безостановочно шлёт данные, а приёмник в случае не принятия команд либо возвращается в исходное состояние, либо выполняет аварийную программу.
     
  10. UdalovPS

    UdalovPS Нуб

    Уважаемые знатоки, пытаюсь настроить передачу с двух ардуинок соединенных с модулем
    nrf24L01 на один общий приемник по разным трубам, но сигнал приходит только по 1 трубе, а по остальным нет. Никак не могу понять в чем дело.
    Скетч Передатчика №1
    Код (C++):
    #include <SPI.h>                        
    #include "nRF24L01.h"                    
    #include "RF24.h"  
                       
    RF24 radio(9, 10);                      
    byte data = 10;
    unsigned long tmp_time = 0;
    //uint8_t  pipe;
                           
    void setup() {
      Serial.begin(9600);                  
      radio.begin();
      radio.setAutoAck(1);
      radio.setRetries(0, 15);
      radio.enableAckPayload();
      radio.setPayloadSize(32);
                             

      radio.openWritingPipe (0xAABBCCDD11LL);
      radio.setChannel(0x60);
                       
      radio.setDataRate (RF24_250KBPS);  
      radio.setPALevel (RF24_PA_MAX);

      radio.powerUp();
      radio.stopListening();
    }
    void loop () {
      if (millis() - tmp_time > 1000) {
        if (radio.write(&data, sizeof(data)) ){
          Serial.print ("OK sent: "); Serial.println(data);
        }
        else {
          Serial.print ("Not sent: "); Serial.println(data);
        }
        tmp_time = millis();
      }
      if (millis() == 0) {
        tmp_time = 0;
      }
    }
    Скетч передатчика №2
    Код (C++):
    #include <SPI.h>                        
    #include "nRF24L01.h"                    
    #include "RF24.h"  
                       
    RF24 radio(9, 10);                      
    byte data = 20;
    unsigned long tmp_time = 0;
    //uint8_t  pipe;
                           
    void setup() {
      Serial.begin(9600);                  
      radio.begin();
      radio.setAutoAck(1);
      radio.setRetries(0, 15);
      radio.enableAckPayload();
      radio.setPayloadSize(32);
                             

      radio.openWritingPipe (0xAABBCCDD22LL);
      radio.setChannel(0x60);
                       
      radio.setDataRate (RF24_250KBPS);  
      radio.setPALevel (RF24_PA_MAX);

      radio.powerUp();
      radio.stopListening();
    }
    void loop () {
      if (millis() - tmp_time > 1000) {
        if (radio.write(&data, sizeof(data)) ){
          Serial.print ("OK sent: "); Serial.println(data);
        }
        else {
          Serial.print ("Not sent: "); Serial.println(data);
        }
        tmp_time = millis();
      }
      if (millis() == 0) {
        tmp_time = 0;
      }
    }
    Скетч прёмника
    Код (C++):
    #include <SPI.h>                        
    #include "nRF24L01.h"                    
    #include "RF24.h"  
                       
    RF24 radio(9, 10);                      
    byte myData;
    unsigned long tmp_time = 0;
    uint8_t  pipe;
                           
    void setup() {
      Serial.begin(9600);                  
      radio.begin();
      radio.setAutoAck(1);
      radio.setRetries(0, 15);
      radio.enableAckPayload();
      radio.setPayloadSize(32);
                             

      radio.openReadingPipe (1, 0xAABBCCDD11LL);
      radio.openReadingPipe (2, 0xAABBCCDD22LL);
      radio.setChannel(0x60);
                       
      radio.setDataRate (RF24_250KBPS);  
      radio.setPALevel (RF24_PA_MAX);

      radio.powerUp();
      radio.startListening();
    }
    void loop () {
      if(radio.available(&pipe)){
        if(pipe==1){
          radio.read( &myData, sizeof(myData) );
          Serial.print("Recieved: "); Serial.println(myData);  
          }      
        if(pipe==2){
          radio.read( &myData, sizeof(myData) );
          Serial.print("Recieved: "); Serial.println(myData);
          }      
        if(pipe==3){
          radio.read( &myData, sizeof(myData) );
          Serial.print("Recieved: "); Serial.println(myData);
          }      
        if(pipe==4){
          radio.read( &myData, sizeof(myData) );
          Serial.print("Recieved: "); Serial.println(myData);
          }
        if(pipe==5){
          radio.read( &myData, sizeof(myData) );
          Serial.print("Recieved: "); Serial.println(myData);
          }
        if(pipe==6){
          radio.read( &myData, sizeof(myData) );
          Serial.print("Recieved: "); Serial.println(myData);
          }
      }
    }
     
  11. Un_ka

    Un_ka Гуру

    Даже когда первая труба не работает? А все nrf24l01 рабочие?
     
  12. Un_ka

    Un_ka Гуру

  13. В программировании далеко не профи, несколько вечеров ковырял модуль, на передачу все ОК, а вот на прием ACK приходят данные, если они не превышают 4байта, что только не читал и не крутил, начал читать постранично данную тему, периодически от Уважаемого parovoZZ были фразы "Завязывайте использовать библиотеки, читайте даташит и делайте все сами, ручками" - золотые слова. Но как я уже писал, в программировании не гуру, до чтения и понимания даташитов и манипуляциями с регистрами я пока не дорос. Нашел информацию что ACK работает только на скорости 1Мбит и выше, АлексГайвер такое пишет в своих работах. Не хочу много расписывать, а могу писать долго и подробно, перейду к сути, дело оказалось в том, что данные просто не успевали прилетать, так как опция у меня стояла так radio.setRetries(0, 15), но благодаря вышеуказанной статье, понял как решить эту проблему.
    Можно ссылку закрепить в теме
     
  14. Un_ka

    Un_ka Гуру

    И как же? Я пока обхожу её через костыли.
     
  15. parovoZZ

    parovoZZ Гуру

    это перевод даташита.
    Более развёрнуто здесь
    https://aterlux.ru/article/nrf24l01p
     
  16. Расскажу какая была ситуация у меня, может и вам поможет.
    Имеется самодельный пульт управления для самодельного вездехода. Для управления передаю структуру с данными, до этого передавал массив, но структуру посчитал удобнее. Передача идет без проблем. Захотелось получать с нее немного телеметрии, заряд батареи, температуру батареи, температуру двигателей, и так как вездеход плавающий и имеет герметичный корпус, разместил в корпусе три датчика протечки воды. На стороне приемника гружу все эти данные в структуру, а ее в ACK автоответ, пробую, не приходит ни чего. До этого пробовал передавать одно int значение заряда батареи, все прекрасно прилетало, но структура в упор не хочет, методом научного тыка выяснил что если в пакет ACK пихать данные больше чем 4 байта, данные не приходят, 4 и менее все приходит, начал читать форумы и все подряд, но конкретно моего случая не нашел, менял размер пакетов, очищал буферы, ( да простит меня parovoZZ))), не дотягиваю я до регистров и даташитов), менял скорость передачи, ни чего не помогало, пока не наткнулся на продвинутое описание по модулю. Там нашел такую информацию - "Максимальная длина полезной нагрузки ACK для разных значений задержек повторной передачи" !!!! Эврика, именно то что у меня и складывалось в голове, но не до конца осознавалась проблема почему приходит не более 4 байт. Приняв информацию и по размыслив, пришел к выводу что модуль физически не успевал передать больше.
    Изначально в сетапе у меня было прописано - radio.setRetries(0, 15);, т.е. времени у него не хватало
    (0, 15) первая цифра "0" это время задержки повторной передачи, рассчитывается как (х+1)*250мкс, т.е. в моем случае было (0+1)*250 = 250мкс

    На данный момент у меня установлено как (5, 15), скорость передачи 250kbps, структура весом в 10 байт передается на ура, значение не финальное, выставлено с запасом.

    Голова болит, соображаю что то сегодня туго, если где ошибся, сильно не пинайте, если что поправлю.
    На всякий случай дублирую ссылку на статейку по модулю.

    http://microsin.net/adminstuff/hardware/nrf24l01-single-chip-24ghz-transceiver.html
     
    Последнее редактирование: 19 сен 2021
    Un_ka нравится это.
  17. +++++ на досуге изучу, такую ценную инфу сохраняю сразу себе на сервер,
     
  18. единственное с CRC пока не могу разобраться, передача идет идет, а потом приемник просто на одном месте останавливается, как я по неграмотности полагаю зацикливается в каком то цикле, и не срабатывает даже моя защита от разрыва связи, буксует гдето в коде так сказать. CRC отключаю, все работает нормально. Но я CRC считаю сам для структуры, приемник пересчитывает, и если все ОК, данные верны и в работу их пускает.
     
  19. Un_ka

    Un_ka Гуру

    Спасибо, попробую.
    Для защиты от зависания рекомендую использовать watchdog, но с ним вроде придётся прошивать только по ISP.

    Можете подробней описать свой проект в разделе "Глядите, что я сделал".