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

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

  1. ImrDuke

    ImrDuke Гик

    Основное устройство

    Код (C++):
    #include <SPI.h>
    #include <RF24.h>
    #include <OneWire.h>
    #include <nRF24L01.h>
    #include <ESP8266WiFi.h>

    //--------------------- НАСТРОЙКИ -------------------------------
    #define DeviceID 0              // Номер устройства
    #define CH_NUM    0x44          // Номер канала (должен совпадать с приёмником)
    #define SIG_POWER RF24_PA_MAX   // УРОВЕНЬ МОЩНОСТИ RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
    #define SIG_SPEED RF24_1MBPS    // СКОРОСТЬ ОБМЕНА RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
    //--------------------- НАСТРОЙКИ -------------------------------

    RF24 radio(D4, D8); // CE, CSN
    uint32_t Received_Data[6]; // массив принятых данных;
    uint32_t Transmit_Data[6]; // Массив, хранящий передаваемые данные;
    byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"};

    byte    DevID;     // Номер устройства
    float   Temp;      // Температура
    float   Hum;       // Влажность
    float   Vop;       // Напряжение аккум.
    boolean Alarm;     // Геркон
    boolean Relay;     // Реле

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

    void loop() {
      byte  pipeNo;
      while (radio.available(&pipeNo)) {  // Слушаем эфир со всех труб
        radio.read(&Received_Data, sizeof(Received_Data)); // Чиатем входящий сигнал
        DevID = Received_Data[0];              // Номер устройства
        Temp  = (float)Received_Data[1] / 100; // Температура
        Hum   = (float)Received_Data[2] / 100; // Влажность
        Vop   = (float)Received_Data[3] / 100; // Напряжение аккум.
        Alarm = Received_Data[4];              // Геркон
        Relay = Received_Data[5];              // Реле
      }
      if (условие)
        Transmit(1);
    }

    void RadioSetup() {
      radio.begin();                        // активировать модуль
      radio.setAutoAck(1);                  // режим подтверждения приёма, 1 вкл 0 выкл
      radio.setRetries(0, 15);              // (время между попыткой достучаться, число попыток)
      radio.enableAckPayload();             // разрешить отсылку данных в ответ на входящий сигнал
      radio.setPayloadSize(32);             // размер пакета, в байтах
      radio.openReadingPipe(1, address[0]); // хотим слушать трубу 0
      radio.setChannel(CH_NUM);             // выбираем канал (в котором нет шумов!)
      radio.setPALevel(SIG_POWER);          // УРОВЕНЬ МОЩНОСТИ RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
      radio.setDataRate(SIG_SPEED);         // СКОРОСТЬ ОБМЕНА RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
      radio.powerUp();                      // начать работу
      radio.startListening();               // начинаем слушать эфир, мы приёмный модуль
    }

    void Transmit(boolean _Flag) {
      noInterrupts();
      radio.openWritingPipe(address[0]);                   // мы - труба 0, открываем канал для передачи данных
      radio.stopListening();                               // не слушаем радиоэфир, мы передатчик
      Transmit_Data[0] = DeviceID;                         // Номер устройства
      Transmit_Data[1] = _Flag;                            //
      radio.write(&Transmit_Data, sizeof(Transmit_Data));  // Отправить по радио
      radio.openReadingPipe(1, address[0]);                // хотим слушать трубу 0
      radio.startListening();                              // начинаем слушать эфир, мы приёмный модуль
      interrupts();
    }
     
  2. Eduard-VIII

    Eduard-VIII Нуб

    С Новым Годом всех!
    Когда служил на флоте (1984-1987гг) выходил на связь с магнитной ямы - Бискайского залива - на КВ и с нашими военными кораблями в Средиземке, Чёрном море, с Москвой(узел связи ВМФ) и Севастополем (Черноморский) вообще без проблем.
    Балтику, Северный и ТОФ всегда с Европы слышал и общался, иногда нарушая правила радиообмена. Теперь не могу связаться с собственным гаражом. Из дома, не из Атлантики...
    Возможно Век 21-й наступил внезапно, может длина радиоволны начала измеряться в литрах, фиг его знает.
    С прошлого года делаю дистанционный тумблер Должно быть так. Включаю дома - включился в гараже, выключаю-выключился. Две НРФки и две ардуинки.
    ImrDuke из Рязани посоветовал пример. Спасибо, но убрав всё лишнее понял - библиотека у меня не та. Дофига их одноимённых редактированных в инете.
    Один вариант работает, но не более 15 минут. Передатчик передаёт состояние тумблеров,а приемник первое время принимает, потом выключается. Не пойму почему.
    Где косяк?
     

    Вложения:

    • nRF_per.ino
      Размер файла:
      1,5 КБ
      Просмотров:
      289
    • nrf_pr.ino
      Размер файла:
      1,8 КБ
      Просмотров:
      287
    Последнее редактирование: 4 янв 2019
  3. Eduard-VIII

    Eduard-VIII Нуб

    пробовал заменить "if" на "while" - та же фигня.
    Замена частоты не помогает
     
  4. ImrDuke

    ImrDuke Гик

  5. Никлай

    Никлай Нуб

    У меня все плохо в радио приемо-передачей. Эта железка работаем у меня только на прямой видимости 3 метра (скорость 250 кб/с с максимальной мощностью). Конденсаторы на 10мкФ припаяны, все контакты к Arduino тоже припаял. Через стены не бьет и на прямой видимости более 3х метров не принимает данные. Все очень плохо почему-то. Буду на Wi-Fi переходить.
     
  6. Eduard-VIII

    Eduard-VIII Нуб

    У меня с антенками пробивает нормально, только виснет, сука. Вайфай тоже купил, ещё не пробовал
     
  7. Eduard-VIII

    Eduard-VIII Нуб

    виснет приёмник. Передатчик шпарит без перекуров с прошлого года
     
  8. parovoZZ

    parovoZZ Гуру

    трансивер nRF24 никогда не виснет. В конечном автомате нечему виснуть - цикла нет. Косяк исключительно в коде.
     
    Belkin нравится это.
  9. parovoZZ

    parovoZZ Гуру

    Кто-то обещал больше? Оригинальные с печатными антеннами дальше 10 метров бить не способны. Собственно, эти трансиверы исключительно для мышек, клавиатур, геймпадов и прочих подобных девайсов. Если надо дальше, то меняем антенну или ставим PA+LNA. Но лучше переходить на СТРИЖ или LORA.
     
  10. Eduard-VIII

    Eduard-VIII Нуб

    Я имел ввиду приёмник в сборе. У меня nRFка с антенной, через адаптер 3.3в и ардуино нано на приёмнике и передатчике. Передатчик с прошлого года не выключал - работает без проблем, а приёмник - 3-4 раза поменяю состояние реле и перестаёт принимать, пока не перезагрузишь. Возможно ли в коде прописать условие,например, если в течении 3 секунд if (radio.available()) - пусто - принудительно перезагружать приёмную ардуинку?
     
  11. parovoZZ

    parovoZZ Гуру

    Что такое radio.available я не в курсе. Читай тему с самого начала - там все инструкции есть. Не ленись.
     
  12. Eduard-VIII

    Eduard-VIII Нуб

    Читаю, всем инструкциям следую, но не всегда в ту сторону копаю. Только что дошло, что силовую часть (2 контактора и 2 релюшки управления) нужно вынести подальше от управления. Ардуинку и нрфку лучше в другой коробок смонтировать. Соединить их витой парой, а коробок с контакторами в фольгу завернуть, как рождественского гуся. Только сейчас дошло, что когда контакторы и реле срабатывают, наводят бешеную индукцию
     
  13. parovoZZ

    parovoZZ Гуру

    На Контакты релюх обязательно помехоподавляющие конденсаторы, на катушки диод или варистор. На питающие ноги МК повесить конденсатор 100n. Все линии нагрузить резистором 1к. Все свободные пины перевести на выход.
     
  14. Eduard-VIII

    Eduard-VIII Нуб

    Это как?
     
  15. Eduard-VIII

    Eduard-VIII Нуб

    Вместо обычных реле думаю поставить твердотельные G3MB-202P, а контакторы придётся по-любому ставить.
     
  16. Miller_VA

    Miller_VA Нерд

    Хочу поделиться своими "достижениями" в работе с nrf24l01+. По настоятельной просьбе одного нудиста-заказчика, были куплены Arduino-Nano + 2 платы nRf с внешней антенной. Потом, у другого продавца, ещё Arduino-Nano + 2 платы nRf, но уже без вн. антенны. Результат:
    1. Одна плата без антенны не завелась. В регистрах были 0xFF. Поменял кварц(больше там и не сильно-что поменяешь), завелась и работает по сей день.
    2. Найден пример скетча приёмника и передатчика. После коррекции под себя (назначение портов, ножек и т.д.)
    всё заработало. Была добавлена кнопка в передатчике и св.диод в приёмнике. Протестировано. Св.диод загорался по нажатию кнопки и гас, когда кнопку отпускали.
    3. Работало всё без припайки доп. конденсаторов(на ножки платы), резисторов и т.д.(будем считать, мне повезло). Питание nRf от Arduino. Платы nRf подключались через сокеты(не паялись). Вот там и стояли конденсаторы по питанию(куда-же без них). Прямо на ножках сокета.
    4. При максимальной мощности на передачу, для приёмника и передатчика с внешней антенной, питанием от батареи 5в., на достаточно открытом пространстве(почти сельская местность пригорода, огороды, поля вокруг), была достигнута дальность несколько сот метров. Не километр(не было возможности так далеко отойти), но 200-300 м. точно, а с некоторым ухудшением приёма и около 600 м. Передатчик раз в 1сек. выдавал код на вкл./выкл. св.диода на приёмнике. Визуально контролировалось.
    5. Задача стояла - включить nRf в состав прибора(нудиста-заказчика), без Arduino, на др. процессоре. Переписать библиотеку для своего проекта, ну и написать всё, что там нужно. Уже кое-что осилили.
    6. Есть результаты и для плат nRf без внешней антенны.
    Если кому интересно, могу продолжить. Итак много написал, устал, пойду лучше программку дописывать.
     
  17. parovoZZ

    parovoZZ Гуру

    Там писать-то нечего. Десять строчек на всё про-всё. Главное даташит очень внимательно изучить.
    Это точно nRF? У неё предел 3.6 вольт.
     
  18. Eduard-VIII

    Eduard-VIII Нуб

    Он что, без трусов настоятельно просил :p ? Почему нудист?
     
  19. Miller_VA

    Miller_VA Нерд

    Это когда заказчик пристаёт: "Ну давай это сюда влепим, ну давай, ну будь другом, давай добавим...". Типа так. А тебе не очень хочется, зачем тебе лишний геморой(технический термин) и ты понимаешь, что оно там и не очень нужно, но оНо всё-равно хочет.
    Ещё про результаты с nRf без антенны. В комнате работает 4-5 м. За углом метра(комната 3м., дверной проём, поворот в др. комнату) полтора тоже работает. Дальше - ноль.
     
  20. Eduard-VIII

    Eduard-VIII Нуб

    Ой! А я грешным делом подумал, что этот нудист антенкой от НРФки баловался, приставал...противный...