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

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

  1. Gurf

    Gurf Нуб

    ну при неправильном/неполном подборе параметров инициализации косяк сразу же вылезает, а не как у меня- через икс часов?
     
  2. ИгорьК

    ИгорьК Оракул Модератор

    Вообще, вся логика подсказывает что Вы правы. Но на практике, ПОДПИСЫВАЮСЬ, у меня через пень-колода проходили соединения двух модулей. Я управлял ими через две Малины, терминалом. И это самая задница - в одном случае из пяти соединение устанавливалось и информация передавалась. Хотите верьте - хотите нет.
     
  3. zhenya_alex

    zhenya_alex Нерд

    NRF24L01+ запитаны от DC-DС преобразователей на базе LM2596, вот такие:
    http://cdn.instructables.com/FS8/3LXC/HQ4QH6W4/FS83LXCHQ4QH6W4.MEDIUM.jpg
    Причём изначально оба модуля питались от обычного выхода 3,3В контроллеров, работало, потом оба подключил к DC-DC (каждому отдельный), ничего не изменилось, Leonardo принимает данные, а отправить не может.
     
    Последнее редактирование: 15 янв 2016
  4. ИгорьК

    ИгорьК Оракул Модератор

    А может другая сторона их не может принять?
     
  5. zhenya_alex

    zhenya_alex Нерд

    Тогда получается nano 3.0 с NRF24L01+ полностью верно отрабатывающая скетч scanner не может принять данные? Очень сомневаюсь. Тогда как Leonardo(atmega32u4) с NRF24L01+ даже scanner не отображает, pro micro(atmega32u4) с NRF24L01+ тоже. Абсолютно уверен, был бы под рукой ещё модуль на базе atmega328, всё бы заработало. Всё сводится к вине atmega32u4.
    Ладно, в любом случае спасибо, буду искать дальше. Отпишусь, если что-то получится.
     
    ИгорьК нравится это.
  6. ИгорьК

    ИгорьК Оракул Модератор

    Так, стоятьбояться!
    У меня эта железка работает на Aduino Yun. Так вот, у всех этих Леонардо ISP не выведен на обычные ноги. Вы уверены, что соединение правильное? Там разъем IСSP надо задействовать!
     
  7. zhenya_alex

    zhenya_alex Нерд

    Конечно уверен, в распиновке на Leonardo всё подробно расписано.
     
  8. Шиханов

    Шиханов Нерд

    Всем привет. Собрал пары приемник - передатчик на разных бордах - MEGA и NANO. Такие же затыки с передачей как у всех. Подтягиваюшие резисторы на SPI и конденсаторы по питанию, электролит или тантал и керамика...все по барабану.
    заметил, что при прикосании пальцем к модулю NRF начинается бесперебойная передача ....
    поменял программы модулей на противороложные - перешла и проблемма.
    Сделал вывод что дело в программе. Оказалось правда.
    Лечил так
    Файл RF24.cpp

    void RF24::csn(int mode)
    {
    // Minimum ideal SPI bus speed is 2x data rate
    // If we assume 2Mbs data rate and 16Mhz clock, a
    // divider of 4 is the minimum we want.
    // CLK:BUS 8Mhz:2Mhz, 16Mhz:4Mhz, or 20Mhz:5Mhz
    #ifdef ARDUINO
    SPI.setBitOrder(MSBFIRST);
    SPI.setDataMode(SPI_MODE0);
    SPI.setClockDivider(SPI_CLOCK_DIV4);
    #endif
    digitalWrite(csn_pin,mode);
    delayMicroseconds(100);
    }

    Вставил задержку 100 мкс передачи после установки сигнала CSN.

    После этой доделки программы связь работает даже без дополнительных конденсаторов по питанию и подтягивающих резисторов SPI.
     
    sdim, BGreen и ИгорьК нравится это.
  9. Gurf

    Gurf Нуб

    А объясните логику -почему именно после таких изменений заработало?
     
  10. Шиханов

    Шиханов Нерд

    переходный процесс включения вывода успевает закончится прежде чем уйдет первый бит по SPI..
     
  11. Шиханов

    Шиханов Нерд

    работают даже при 2х присоединённых серводвигателях.
     
  12. avgaz

    avgaz Нерд

    а подскажите плиз как принимать данные с двух и более передатчиков?
    К примеру есть один приемник который слушает трубу, а два передатчика шлют данные в эту трубу, как бы все работает, но через раз то есть приемник зачастую успевает принять данные с одного передатчика только, как решить эту проблему?
     
    Последнее редактирование: 17 янв 2016
  13. suange

    suange Нуб

    Тоже проблемы с запуском на Iskra Neo, клоне Leonardo. Проблема похоже в том, что SS не выведен на свободные пины, на Uno и Mega он на 10 и 53 соответственно.
     
  14. BGreen

    BGreen Нерд

    Передатчики не должны слать постоянно, делайте паузы между посылками. Иначе переполнятся 3 буфера и конец.
    Если труба общая, то иногда будут коллизии.
    Делайте раздельные трубы, мах 5 штук получится.
     
  15. Gurf

    Gurf Нуб

    а какова пауза м.б. (минимально) - миллисекунд 10-30 хватит? У меня просто тоже "затыки" бывают в системе (3 трубы шлют на четвертую), сделал так, что каждая из трех шлет со своим интервалом (первая через 60, вторая через 50 и третья -через 35 мс). Нормально такие интервалы?
     
  16. avgaz

    avgaz Нерд

    У меня и не шлют постоянно, один шлет данные delay(1950); другой delay(1500); а не подскажите как приемнику слушать несколько труб одновременно?
    Суть следующем собрать с нескольких комнат показания в одном месте, дак вот сейчас если с одной комнаты приходят показания, а со второй ещё не пришли код выполняется дальше и не ждет прихода от второй комнаты.
    Код (C++):
      float data[3];
      if (radio.available()){ // проверяем не пришло ли чего в буфер.
        radio.read(&data, sizeof(data)); // читаем данные, указываем сколько байт читать
     
        Serial.print("Room 1: ");
        Serial.println(data[0]);
        Serial.print("Room 1: ");
        Serial.println(data[1]);
        Serial.print("Room 2: ");
        Serial.println(data[2]);
      }
     
  17. BGreen

    BGreen Нерд

    Эм.. странно всё выглядит. Варианты:
    1. для каждой комнаты своя труба. Хватит для 5-комнатной квартиры. Слушаем:
    Код (C++):
    if (radio.available(&NRF_currPipeNum)) {  
        if (radio.getDynamicPayloadSize() > 1) {
          radio.read(&NRF_messageFromSensor, sizeof(NRF_messageFromSensor));    
        }
    2. приемник слушает 1 трубу, куда все отправляют данные. В посылке пишем номер передатчика и данные. Задержки передач ставим в виде простых чисел - таблицы есть в интернете.
     
  18. Okmor

    Okmor Нерд

    Делали с сыном танк на радиоуправлении.
    Для тестирования двусторонней передачи написал такой скетч.
    Замечания:
    1. У меня идентичные модули и потому частичная инициализация.
    2. Пришлось припаять конденсатор 220Мф, а то без него UNO не хотел работать на прием.
    3. Две линии перенес на А0 и А1.
    Слушать через COM порт

    Этот скетч надо залить без изменений на две Ардуинки.
    Код (C++):
    #include<SPI.h>
    #include<nRF24L01.h>
    #include<RF24.h>
    const uint64_t pipe= {0xF0F0F0F0E1LL};
    RF24 radio(A0,A1); //Обратите внимание тут другое подключение
    byte message = 1;
    byte red;
    unsigned long CTime01;
    unsigned long LTime01;
    void setup()
    {
      Serial.begin(9600);
      radio.begin();
      delay(100);
      radio.enableDynamicPayloads();
      radio.openReadingPipe(1,pipe);
      radio.openWritingPipe(pipe); //Открывем трубу для отправки
      radio.startListening();

    }
    void loop()
    {
      if ( radio.available() ) {
           radio.read( &red,sizeof(red) );
           Serial.println(String(red));
          };

        CTime01 = millis();
        if (CTime01 >= (LTime01 +100)) //Периодичность отправки пакетов
        {
           Serial.println("----------write------------");
           radio.stopListening();  //Перестаем слушать
           radio.write(&message, sizeof(message)); // Отправляем ответ
           radio.startListening();
           LTime01 = CTime01;
           message++;
        }
    }
     
    Последнее редактирование: 18 янв 2016
  19. avgaz

    avgaz Нерд

    Что то не фига не понял как пользоваться этим к примеру у меня 2 передатчика вот их адреса у каждого свой
    Код (C++):
    const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба"
    const uint64_t pipe2 = 0xE8E8F0F0E2LL; // идентификатор передачи, "труба"
    у приемника нужно открыват две трубы с разными номерами вот так?
    Код (C++):
    radio.openReadingPipe(1,pipe); // открываем первую трубу с идентификатором "pipe"
      radio.openReadingPipe(2,pipe2);
    Но тогда к примеру при таком коде я постоянно получаю номер первой трубы
    Код (C++):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h> // https://github.com/maniacbug/RF24

    const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба"
    const uint64_t pipe2 = 0xE8E8F0F0E2LL; // идентификатор передачи, "труба"

    RF24 radio(6,7); // CE, CSN
    char buf[80];


    void setup(){
      Serial.begin(9600);
      radio.begin();
      delay(2);
      radio.setChannel(9);
      radio.setDataRate(RF24_1MBPS);
      radio.setPALevel(RF24_PA_HIGH);
      radio.openReadingPipe(1,pipe); // открываем первую трубу с идентификатором "pipe"
      radio.openReadingPipe(2,pipe2);
      radio.startListening(); // включаем приемник, начинаем слушать трубу
    }


    void loop()
    {
      uint8_t pipe_num;
      if ( radio.available(&pipe_num) ) { // проверяем не пришло ли чего в буфер.

        Serial.println(pipe_num);
       
       
      }
    }
     
  20. Gurf

    Gurf Нуб

    У меня номера труб перечислены в массиве - с вашими номерами вот так получится:
    Код (C++):
    const uint64_t pipes[2] = {0xF0F1F2F3F4LL, 0xE8E8F0F0E2LL};
    И, по идее - выводит то, что надо...