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

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

  1. Oleg_

    Oleg_ Нуб

    Alex1983,
    В передатчике закоментируйте строчку radio.startListening в сетапе.
     
  2. sslobodyan

    sslobodyan Гик

    Я такой строки не вижу. Она есть в приемнике и должна там быть.
    PS У меня сложилось мнение, что эта библиотека слишком тяжелая в угоду универсальности. В результате работает пока не начинаешь ее настраивать под свои задачи. Мне пришлось писать свой велосипед, основываясь на http://aterlux.ru/index.php?page=article&art=nrf24l01p . Зато компактно, быстро и понятно как работает, но только под мою задачу.
     
  3. sslobodyan

    sslobodyan Гик

    Заметил еще одну особенность в работе модулей. Если для запуска передачи данных (когда буфер ТХ уже заполнен) давать не короткий импульс СЕ (10-15мкс), а просто поднять ногу СЕ и ждать до начала прерывания по опустошению буфера передачи, то данные идут хаотично, некоторые пакеты повторяются, есть сбойные пакеты. Если же четко давать импульс, то все гладко.
     
  4. sslobodyan

    sslobodyan Гик

    Написал свою версию библиотеки по ардуино на атмеле и на стм-ках. Вот такой скетч шлет и принимает данные от второго устройства и занимает чуть более 4К флеша

    Код (C++):
    /****************************************************
    *
    * Тест библиотеки NRF24 от sslobodyan@yandex.ru
    *
    * Определите пины CE_PIN и CSN_PIN.
    *
    * Посылая в терминале s увидите сообщение об отправке
    * и приемке на данном модуле и на удаленном.
    *
    *****************************************************/


    #include <SPI.h>
    #include "NRF24.h"

    #define CE_PIN  8
    #define CSN_PIN 7

    byte adrl[] = {">>>>>"};

    uint8_t rxbuf[32];

    NRF24 radio(CE_PIN, CSN_PIN);

    void RXhandler(uint8_t len){
      rxbuf[len]=0; // на всякий случай ограничим строку
      Serial.print(F("Приняли: "));
      Serial.println( (char*) rxbuf );
    }

    void TXhandler(){
      Serial.println(F("Отправили."));
    }

    void radio_setup(void) {
      radio.local_address=adrl;
      radio.remote_address=adrl;
      radio.channel = 30;
      radio.rx_buffer = rxbuf;
      radio.RX_handler = RXhandler;
      radio.TX_handler = TXhandler;
      if (! radio.begin() ){
        Serial.println("Модуль не отвечает");
        for(;;) ;
      }
    }

    void send_data(){
      byte buf[]="To remote NRF24";
      radio.send_data(buf, sizeof(buf));
    }

    void setup() {
      Serial.begin(230400);
      radio_setup();
      radio.print_registers();
    }

    void loop() {
        if (Serial.available()){
          byte c=Serial.read();
          if (c == 115) { // s
            Serial.print(F("Отправляем... "));
            send_data();
          }
        }
        radio.check();
    }
     
    Если сообщество заинтересуется, могу поделиться. На правах as-is, тапками не бросать.
     
    sergey-fedor и ИгорьК нравится это.
  5. ИгорьК

    ИгорьК Гуру

    Хорощее дело, безусловно. Но в чем смысл? Пробоема этих модулей не в отсутствии библиотек, коих с вашей уже четыре, или боьше, а в их поганой поддельной сущности и плохом взаимодействии подделок от разных поддельщиков. Лечится ли это библиотеками?
     
  6. sslobodyan

    sslobodyan Гик

    Ну вот, я ж просил без тапок :) Смысл в том, что показанный скетч занимает 4К флеша. Сколько занимает примитивный скетч с приемом-отправкой от маньяка? И в устройстве у меня работает обмен (двусторонний) с интервалом посылок 10мс и хоппингом по каналам. Подделки, кстати, тоже работают намного стабильнее, только надо переводить их на 1Мбит, у меня по-умолчанию 250кбит. Стабильнее, потому что я отказался от автоподтверждения и автоповтора передачи. Именно в этих режимах подделки сильно отличаются друг от друга. Кстати, появилась мысль проверить библу на модулях с ВК чипами. Потом отпишусь.
    PS Забыл сказать, что я не использую delay и microseconds, так что в прерываниях все прекрасно работает. Очень удобным оказалось назначить свой обработчик после отправки и после приема пакета. Вешаем IRQ модуля на INT0 или INT1 и получаем автомат, который не надо поллить в главном цикле. Сам принимает, сам отвечает.
    Но я не навязываюсь :)
     
    ИгорьК нравится это.
  7. Oleg_7

    Oleg_7 Гик

    Добрый день! Вопрос про трубы, а их у нас 6. Если инициализированы все трубы в СЕТАПЕ, то может ли приемник принимать сразу от 6ти передатчиков пакеты в эти 6 труб, а потом в цикле их последовательно прочесть? Не будут ли данные в 6трубах накладываться друг на друга?
     
  8. sslobodyan

    sslobodyan Гик

    На сколько я понял, на прием и на передачу буферы в три пакета. Каждый пакет на приеме подписан с какой трубы он пришел. Так что если забирать будете успевать, то ничего не наложится. Естественно, что пакеты не должны транслироваться одновременно. Так что СРАЗУ означает ОЧЕНЬ БЫСТРО ДРУГ ЗА ДРУГОМ. Приемный тракт ведь один, канал один.
     
  9. Oleg_7

    Oleg_7 Гик

    т.е., если приемник получил "письмо" по одной трубе, не прочел / не успел прочесть, ему приходит другое "письмо" во вторую трубу -...и затирает первое "письмо" ? я правильно понял ?
     
  10. ИгорьК

    ИгорьК Гуру

    А что мешает проверить это собственными силами?
     
  11. Oleg_7

    Oleg_7 Гик

    у меня всего две nrf-ки ))) вот и думаю, стоит ли еще покупать или нет.........) (Мое мнение, -если рабочий канал один, то и буфер скорее всего один, = трубы будут затирать друг друга, но это все в теории)
     
  12. ИгорьК

    ИгорьК Гуру

    Ну две. А подумать, и сымитировать ситуацию получения пакетов по всем потокам?
     
  13. Oleg_7

    Oleg_7 Гик

    это как?) мои мысли: чтобы получить пакеты ОДНОВРЕМЕННО по всем потокам - надо послать пакеты сразу по всем потокам ОДНОВРЕМЕННО, а с одного передатчика я не знаю как это сделать)) Могу лишь получать в одну трубу, -не читать, получать в другую трубу, а потом глянуть, что там в первой и во-второй трубе, так надо сделать?! )
     
  14. ИгорьК

    ИгорьК Гуру

    А мысли как послать шесть потоков ОДНОВРЕМЕННО с шести модулей есть? Делитесь.
    А так, порассуждайте, дело не в одновременности, а в скорости обработки. А скорость обработки приемника можно уменьшить и посмотреть что будет.
     
  15. Oleg_7

    Oleg_7 Гик

    пошел делать код)
     
  16. mcureenab

    mcureenab Гуру

    Одновременная отправка пакетов в эфир приведет к коллизии. В лучшем случае дойдет пакет от самого близкого передатчика. Либо приемник обнаружит шум и не примет ничего.

    Наиболее популярный подход к буферизации пакетов - на базе очереди. FIFO.
    Когда все слоты в очереди заполняются драйвер игнорирует новые пакеты. Кому надо, тот еще раз отправит. По мере обслуживания очереди слоты в буфере освобождаются и у драйвера появляется возможность добавлять в конец очереди новые пакеты.
     
  17. Oleg_7

    Oleg_7 Гик

    Интересно!) только надо понять, как программно для NRF это "игнорирование" осуществить.. т.е. если в трубе что-то есть не прочитанное, то игнорить чтение путем radio.stopListening(); по этой трубе ? Попробую пока сделать как ИгорьК говорит: быстро обрабатывать забор из буфера. Возможно это проще всего.
     
  18. sslobodyan

    sslobodyan Гик

    От вас требуется быстрая выборка пришедших пакетов из фифо буфера. Если он переполнится, то модуль сам приостановит прием пока не будет очищен буфер.
     
  19. Oleg_7

    Oleg_7 Гик

    понятно)
     
  20. sergey-fedor

    sergey-fedor Нерд

    поделитесь пожалуйста , интересно глянуть на библиотеку без излишеств и возможно применить в своей домашней автоматизации :)