Ikremote, криво принимает комманды(рандом) + nrf

Тема в разделе "Arduino & Shields", создана пользователем DQxex, 25 апр 2021.

Метки:
  1. DQxex

    DQxex Нуб

    Пацаны привет. Есть проблема.

    Короче есть у меня 2 штучки NRF24L01+PA+LNA (тобиш с антенной). И вначале они вообще не подключались к друг другу! Не видели в тестовом скетче, но всё решилось когда припоял к выводам по питанию конденсаторы:
    ZEUgA16x5Wg.jpg -n8sdmv7qfE.jpg
    Понимаю что немного не в тему, но вдруг у кого проблемы с такой же диковинкой.
    После подключение прошло на ура. Сигнал правда не очень далёкий, всего метров 250, хотя заявлено на целый 1 км.
    После этого появилась задумка, что бы управлять одной NRF-кой через другую путём подключение ИК датчика. Получается когда я жму на пульту на одну и ту же кнопку, то всё нормалды и появляется этот код:
    WC_aJkU5TpY.jpg

    Но как только одна NRFка связалась с другой, код сразу начинает коверкаться вот в такую дичь!

    TW0_l8sRRcI.jpg

    Я продолжаю жать на одну и ту же кнопку, но код выпадает совершенно рандомный!
    Библиотеки менял. От них ничего не зависит и возникает подобная ерундень, и именно в тот момент когда NRF-ки связались друг с другом.

    Подскажите в чём беда, замаился уже.
     
  2. a1000

    a1000 Гуру

    О необходимости дополнительного конденсатора пишут в любой статье по данному модулю.
    А по вашей беде - выложите для начала код. Будем смотреть.
     
  3. DQxex

    DQxex Нуб

    Один передатчик.

    Код (C++):

    #include <SPI.h>                                          // Подключаем библиотеку  для работы с шиной SPI
    #include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
    #include <RF24.h>                                         // Подключаем библиотеку  для работы с nRF24L01+



    RF24           radio(9, 10);                              // Создаём объект radio   для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
    int            data[2];                                  // Создаём массив для приёма данных
    bool           flag1=0,mode=1;
    uint32_t       myTimer1,myTimer2;

    void setup(){
    pinMode(3,INPUT); // Датчик движения

      Serial.begin(9600);
        delay(1000);
        radio.begin();                                        // Инициируем работу nRF24L01+
        radio.setChannel(66);                                  // Указываем канал приёма данных (от 0 до 127), 5 - значит приём данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
        radio.setDataRate     (RF24_250KBPS);                   // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
        radio.setPALevel      (RF24_PA_MAX);                 // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
        radio.openReadingPipe (1, 0x1234567890LL);            // Открываем 1 трубу с идентификатором 0x1234567890 для приема данных (на ожном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
        radio.openWritingPipe (0x1234567890LL);
        radio.powerUp();
        radio.stopListening   ();
    //  radio.stopListening   ();                             // Выключаем приёмник, если потребуется передать данные

    }
    void loop(){
      upd();
      light();
      movement();

      }




    void movement(){
      if(digitalRead(3)==1){
      radio.stopListening   ();
      data[0] = 1;
      radio.write(data[2], 0);
      radio.startListening  ();
      }
    }

    void light(){
      data[1] = analogRead(0);
      }

    void upd(){
      if(mode==0){
      if (millis() - myTimer1 >= 5000) {
          radio.stopListening   ();
          radio.write(data[2], 0);
          radio.startListening  ();
          myTimer1 = millis();
        }
    }

      if(mode==1){
      if (millis() - myTimer2 >= 500) {
          radio.stopListening   ();
          radio.write(data[2], 0);
          radio.startListening  ();
          myTimer2 = millis();
        }
    }


      if(radio.available()){
        radio.startListening  ();
        radio.read(&data, sizeof(data));
        Serial.println(data[0]);
        Serial.println(data[1]);
        Serial.println(data[2]);
      }

    }

    Второй передатчик

    Код (C++):

    #define SoundPin 3
    #define DelaySound 100

    #include <SPI.h>                                          // Подключаем библиотеку для работы с шиной SPI
    #include <nRF24L01.h>                                     // Подключаем файл настроек из библиотеки RF24
    #include <RF24.h>                                         // Подключаем библиотеку для работы с nRF24L01+
    #include <IRremote.h>


    RF24           radio(9, 10);                              // Создаём объект radio для работы с библиотекой RF24, указывая номера выводов nRF24L01+ (CE, CSN)
    int            data[2],movement=0,svet,ir_code;                                   // Создаём массив для приёма данных
    bool pin=0,flag1=0,mode=0;
    byte irVal = 255;
    const byte IR_PIN = 2;
    uint32_t       myTimer1,myTimer2;

    IRrecv irReciver(IR_PIN);
    decode_results results;

    void setup(){
    pinMode(8 ,OUTPUT); // Светодиод ON
    pinMode(7 ,OUTPUT); // Светодиод LIGHT
    pinMode(6 ,OUTPUT); // Светодиод DANGER
    pinMode(5 ,OUTPUT); // Светодиод ANT
    pinMode(4 ,OUTPUT); // Светодиод ---
    pinMode(3,OUTPUT); // Динамик связи
    pinMode(2,INPUT);

    IrReceiver.begin(IR_PIN, ENABLE_LED_FEEDBACK);

        Serial.begin(9600);
        radio.begin();                                        // Инициируем работу nRF24L01+
        radio.setRetries(20, 45);
        radio.setChannel(66);                                  // Указываем канал передачи данных (от 0 до 127), 5 - значит передача данных осуществляется на частоте 2,405 ГГц (на одном канале может быть только 1 приёмник и до 6 передатчиков)
        radio.setDataRate     (RF24_250KBPS);                    // Указываем скорость передачи данных (RF24_250KBPS, RF24_1MBPS, RF24_2MBPS), RF24_1MBPS - 1Мбит/сек
        radio.setPALevel      (RF24_PA_MAX);                  // Указываем мощность передатчика (RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_HIGH=-6dBm, RF24_PA_MAX=0dBm)
        radio.openWritingPipe (0x1234567890LL);               // Открываем трубу с идентификатором 0x1234567890 для передачи данных (на одном канале может быть открыто до 6 разных труб, которые должны отличаться только последним байтом идентификатора)
        radio.openReadingPipe (1, 0x1234567890LL);
        radio.startListening   ();
        radio.powerUp();
        irReciver.enableIRIn();
        digitalWrite(8,1); // Включение светодиода питания


    }
    void loop(){
      upd();
      IK();
      //IKcode();
      //radio.write(&data, sizeof(data));                     // отправляем данные из массива data указывая сколько байт массива мы хотим отправить. Отправить данные можно с проверкой их доставки: if( radio.write(&data, sizeof(data)) ){данные приняты приёмником;}else{данные не приняты приёмником;}
    }



    void upd(){
      if(radio.available()){
        radio.read(&data, sizeof(data));
        digitalWrite(5,1);
        tone(SoundPin, 400);
        delay(15);
      }
      if(!radio.available()){
        digitalWrite(5,0);
        noTone(SoundPin);
      }
    }


    void IK(){
      if (irReciver.decode(&results)) { // если данные пришли
        Serial.println( results.value, HEX ); // выводим данные
        irReciver.resume(); // принимаем следующую команду
      }
    }
     
    Ну это круто что пишут, вот только обычные NRFки у меня и без кондёров нормально сигналят.
    А насчёт модулей с антенной я вообще ничего не нашёл.
    Причём иногда пишут вообще странную фигню, например что Si24r1(клон NRF) не работает в паре с нормальной NRF.
    Как ни странно у меня работает.
    Получается кому как повезёт с этими модулями.