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

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

  1. Обязательно сделаю, после того как все доделаю)))))
     
  2. Un_ka

    Un_ka Гуру

    Ага, о ней же @parovoZZ , при вас говорил, две недели назад, а вы только сейчас на неё наткнулись.:)
     
    parovoZZ нравится это.
  3. скорее всего я ее посмотрел, и вообще ни чего в коде не понял, а там же все на битовых операциях, на тот момент я вообще в них не понимал, вот в голове и не отложилось, а недавно подтянул знания по битовым операциям и работе с регистрами, наткнулся на статью и она заиграла новыми красками.)))
     
  4. parovoZZ

    parovoZZ Гуру

    я пробовал. Работа с регистрами напрямую рядом не лежала с библиотеками.
     
    Un_ka нравится это.
  5. Ara

    Ara Нуб

    Приветствую, надеюсь я смогу получить ответ здесь. Моя проблема здесь уже обсуждалась (целых 2 раза), но конкретный ответ так и никто не смог дать и соответственно проблема не решилась.

    Ситуация такая:
    Имеем arduino nano и nrf24l01 (+ модуль питания для него). При инициализации скетча GettingStarted, выводит такой результат (который не является здоровым судя по обзорам, скриншотам и тд). Как и ожидалось от такого результата, обмениваться с точно такой же ардуинкой и скетчем(где такая же проблема) он не захотел (проходил только 1 пакет и дальше ошибки). Прослушка воздуха работает, ловит все помехи вокруг.

    нрфка подключена к 9(CE), 10(CSN), 13(SCK), 11(MOSI), 12(MISO) портам.

    Что пытался сделать:
    припаивал конденсатор 470 мкф (результат не изменился)
    покупал новые модули (результат не изменился)

    Вопрос:
    Чем вызвана данная проблема и что поможет её исправить?
    upload_2021-12-3_17-25-14.png
     

    Вложения:

  6. DuranBuldog

    DuranBuldog Нуб

    Здравствуйте, форумчане. Может есть у кого ссылка на продавца с Али, который вышлет нормальную пару без танцев? Твои все безнадёжно и мы все обречены на страдания?
     
  7. b707

    b707 Гуру

    NRF24 ,без танцев называется HC-12. Об этом сам ИгорьК (автор и зачинатель этой темы) пишет где-то примерно на 10странице. Я тогда его послушал и ни разу не пожалел.
    Спасибо, Игорь!
     
  8. parovoZZ

    parovoZZ Гуру

    Lcsc.com
     
  9. Un_ka

    Un_ka Гуру

    Но, там насколько я понимаю только чипы.
     
  10. parovoZZ

    parovoZZ Гуру

    Я там покупал модули. Приехали все абсолютно рабочие.
     
  11. Un_ka

    Un_ka Гуру

    Распянные на платах?
     
  12. DuranBuldog

    DuranBuldog Нуб

    Я так понимаю, вариантов на Али нет?
     
  13. Zap.ck

    Zap.ck Нуб

    Здравствуйте. Я тоже осваиваю этот модуль, для проекта в котором нужно передать показания тензодатчиков(веса).

    Столкнулся с проблемой. Взял пример Gyver«простой приём передача» все ок работает, один шлёт другой принимает и выводит в монитор порта. Но если изменить в коде TXзадержку (в конце loop) с 10 мкс на 20мкс, то все приемник RXнечего не получает.

    Подскажите пожалуйста, как это исправить? Мне надо отправлять показания тензодатчика, а они формируются дольше чем 10 мкс
    Код (C++):
    /*  
        by AlexGyver 2016
     
                      - - TX - -
    */


    #include <SPI.h>          // библиотека для работы с шиной SPI
    #include "nRF24L01.h"     // библиотека радиомодуля
    #include "RF24.h"         // ещё библиотека радиомодуля

    RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
    //RF24 radio(9,53); // для Меги

    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

    int counter;

    void setup() {
      Serial.begin(9600);         // открываем порт для связи с ПК

      radio.begin();              // активировать модуль
      radio.setAutoAck(1);        // режим подтверждения приёма, 1 вкл 0 выкл
      radio.setRetries(1, 35);    // (время между попыткой достучаться, число попыток)
      radio.enableAckPayload();   // разрешить отсылку данных в ответ на входящий сигнал
      radio.setPayloadSize(32);   // размер пакета, в байтах

      radio.openWritingPipe(address[0]);  // мы - труба 0, открываем канал для передачи данных
      radio.setChannel(0x60);             // выбираем канал (в котором нет шумов!)

      radio.setPALevel (RF24_PA_MAX);   // уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
      radio.setDataRate (RF24_1MBPS); // скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
      //должна быть одинакова на приёмнике и передатчике!
      //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

      radio.powerUp();        // начать работу
      radio.stopListening();  // не слушаем радиоэфир, мы передатчик
    }

    void loop() {
      Serial.print("Sent: ");
      Serial.println(counter);
      radio.write(&counter, sizeof(counter));
      counter++;
      delay(20);
    }
    Код (C++):
    /*
        by AlexGyver 2016

           - - RX - -
    */


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

    RF24 radio(9, 10);  // "создать" модуль на пинах 9 и 10 Для Уно
    //RF24 radio(9,53); // для Меги

    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

    void setup() {
      Serial.begin(9600);         // открываем порт для связи с ПК
      radio.begin();              // активировать модуль
      radio.setAutoAck(1);        // режим подтверждения приёма, 1 вкл 0 выкл
      radio.setRetries(1, 35);    // (время между попыткой достучаться, число попыток)
      radio.enableAckPayload();   // разрешить отсылку данных в ответ на входящий сигнал
      radio.setPayloadSize(32);   // размер пакета, в байтах

      radio.openReadingPipe(1, address[0]);   // хотим слушать трубу 0
      radio.setChannel(0x60);     // выбираем канал (в котором нет шумов!)

      radio.setPALevel (RF24_PA_MAX);   // уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
      radio.setDataRate (RF24_1MBPS); // скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
      //должна быть одинакова на приёмнике и передатчике!
      //при самой низкой скорости имеем самую высокую чувствительность и дальность!!

      radio.powerUp();        // начать работу
      radio.startListening(); // начинаем слушать эфир, мы приёмный модуль
    }

    void loop() {
      byte pipeNo;
      int gotByte;
      while (radio.available(&pipeNo)) {        // слушаем эфир со всех труб
        radio.read(&gotByte, sizeof(gotByte));  // чиатем входящий сигнал
        Serial.print("Recieved: ");
        Serial.println(gotByte);
      }
    }
     
  14. b707

    b707 Гуру

    попробуйте поставить задержку не 20 мс, а 200
     
  15. Zap.ck

    Zap.ck Нуб

    попробовал:
    с 200 мс не принимает
    с 15 мс не принимает
    с 12 принимает с потерями
    с 10 мс принимает
    с 5 мс принимает
    изменил число попыток достукивания с 15 до 35 и увеличил время между попытками в «radio.setRetries(1, 35);» не помогло.

    Где б еще покопать?
     
  16. parovoZZ

    parovoZZ Гуру

    Все должно работать с любыми периодами между посылками. Где-то косяк в коде.
    Впрочем, где-то в своих темах рассказывал как эффективно работать с этими трансиверами.
     
  17. Zap.ck

    Zap.ck Нуб

    код приема и передачи взял у AlexGyver(простой приём передача), вроде всё просто настройка модуля и передача числа генерируемого счётчиком,
    но только увеличую задержку к конце кода TX - перестает принимать ардуинка та что RX
     
  18. parovoZZ

    parovoZZ Гуру

    Пример пинг понг из библиотеки прекрасно работает без всяких гайверов. Задержки там в принципе ни на что не влияют.
     
  19. parovoZZ

    parovoZZ Гуру

    enableAckPayload - зачем оно включено, если в ответе никаких данных не передаётся?

    setPayloadSize(32) - надо указывать актуальную длину пакета, а не взятую с потолка. Либо же включать переменную длину пакета.