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

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

  1. Faig

    Faig Нерд

    Интересное начинается именно тут. Библиотка написана под оригинальный NRF24, и размеры там стоят под физические буферы эталонного модуля. Однако в китайских может что-то и не совпасть, советую перекопать библиотеку (все же придется когда-нибудь) и выставить для эксперимента свои размеры на переменные.
    Откройте оба файла rf24.h и rf24.cpp там все с коментами, удобно читать. Да и нововведения подмечены. Кстати вы заметили как, по новому, работает "if(radio.available)"?
    Если не охота или не получится, то поменяйте свой код на контролируемую ответную отправку по запросу, вместо неконтролируемого автоответа
     
  2. ORLENOK

    ORLENOK Гик

    Открывал. Если не очень понятные функции, типо _BV(). Насколько я понял она делает логический сдвиг влево. Чтобы понять для чего - нужно время)) Размер буфера я так вообще не увидел. Размеры буфера для приёма/отправки и для автоответа разные? На счёт отправки, я так понимаю, можно передавать до 32 байт, это явно больше 4х))

    Эмм, не очень понимаю о чем вы. Новое по сравнению с чем?
    Не хотелось бы делать, контролируемую отправку. Мне, наверное, легче сделать 2 запроса, чем переводить в разные режимы модули. Тем более планируется не одно отвечающее устройство.
     
  3. Faig

    Faig Нерд

    вот вы сами и придумали потенциальное решение :)

    а по библиотеке могу сказать:
    (Обратите внимение на подчеркнутый текст)
    @see enableAckPayload()
    * @see enableDynamicPayloads()
    * @warning Only three of these can be pending(3 чего может быть в ожидании? я так понимаю автоответы для трех "pipe" одновременно) at any time as there are only 3 FIFO buffers.<br> Dynamic payloads must be enabled.
    * @note Ack payloads are handled automatically by the radio chip when a payload is received. Users should generally
    * write an ack payload as soon as startListening()(заполнить "ack" дополнительно в "setup()", а иначе первый ваш запрос останется без автоответа) is called, so one is available when a regular payload is received.
    * @note Ack payloads are dynamic payloads. This only works on pipes 0&1 by default. Call
    * enableDynamicPayloads() to enable on all pipes
    (если вы юзаете атоответ на отличных от 0 и1 трубах включите "enableDynamicPayloads()" в начале).
    *
    * @param pipe Which pipe# (typically 1-5) will get this response.
    * @param buf Pointer to data that is sent (интересный момент, размер и тип переменной в библиотеке не указывается однако далее)
    * @param len Length of the data to send, up to 32 bytes max. Not affected
    * by the static payload set by setPayloadSize().
    (тоесть чтобы юзать больший буфер автоответа необходимо его задать в ручную вот этим методом "setPayloadSize()")

    Вот надеюсь это вам поможет.
    By the way, не люблю я слово up to обычно так пишут если максимальная цифра достигается только при лабораторных условиях, что и понятно, отправить по воздуху 32 байта (как по UDP) на одном вздохе не совсем реально.
     
  4. ORLENOK

    ORLENOK Гик

    Спасибо за инфу!
    payloadSize - полезная нагрузка - не обязательно автоответ. Обычная отправка данных тоже payload, если я ничего не путаю.
    Да и когда я передавал массив, я проверял текущий размер payload, всегда писалось 32.
     
  5. Faig

    Faig Нерд

    может надо "payloadSize" указать явно и тогда будет и автоответ того же размера? Потому что цитату о "payloadSize" я скопировал именно из коментариев к методу "writeAckPayload()".
    У меня есть любимая поговорка: То что должно быть и что оказывается на самом деле - это разные вещи.
     
  6. ORLENOK

    ORLENOK Гик

    Нет, явно указать - тоже не помогло.
    Помогло увеличение dataRate
    Подробнее тут (не реклама): https://forum.arduino.cc/index.php?topic=272143.15

    Сделал так:
    Код (C++):
    radio.setDataRate(RF24_2MBPS);
    Теперь нормально пересылает массив из 4х float. Т.е. 16 байт. Возможно с расстоянием это значение уменьшится.
     
  7. С питанием проблем нет. Источник внешний, земли общие, мощности хватает на все и еще останется.
    И то, и то SPI, причем четырехразрядный индикатор пробовал двух видов:
    http://amperka.ru/product/troyka-quad-display
    и
    http://wiki.amperka.ru/продукты:troyka:quad-display
    И для NRF24 и для индикаторов библиотеки от Амперки. По отдельности работает все очень стабильно.
    Значит проблемы в совместной работе библиотек.
    Подскажите, пожалуйста, как реализовать эту задачу.
     
  8. Kislotik

    Kislotik Нуб

    Подскажите можно ли размещать антенну от nrf24l01 вплотную над платой ардуино? Просто появились не большие глюки в сработке сервоприводов на приемнике, но пока все в приемнике подключено навесным монтажом может дело в этом.
     
  9. Skyline

    Skyline Нуб

    Доброго дня! Спасибо за тему, очень много полезной информации.
    Столкнулся с вопросом, имеется центральный модуль, 3 передатчика и 3 приемника, на 6 разных каналах, все хорошо, уверенно принимает, передает, пока все передатчики дочерние в работе, стоит 1 выключить и в массивах центрального узла бардак, данные в неиспользуемом массиве забиваются инфой с другого канала. Пробовал применять чистку буфера, то ли не верно, то ли не помогает:
    Код (C++):
    radio.flush_rx();
    radio.flush_tx();
    Применял последовательно команды перед отправкой, тоже без результатно:
    Код (C++):
    radio.stopListening();
    radio.startListening();
    Код прикладываю, наверняка кривой, но тем не менее, в чем косяк не пойму.
    Код (C++):
    void loop() {
      radio.setChannel(30);
      radio.startListening();
      radio.read(&data2, sizeof(data2));
      lcd.setCursor(0, 0);
      lcd.print(data2[0]);
      delay(500);
      radio.stopListening();

      radio.setChannel(40);
      radio.startListening();
      radio.read(&data, sizeof(data));
      lcd.setCursor(5, 1);
      lcd.print(data[0]);
      delay(500);
      radio.stopListening();

      radio.setChannel(50);
      radio.startListening();
      radio.read(&data3, sizeof(data3));
      lcd.setCursor(10, 0);
      lcd.print(data3[0]);
      delay(500);
      radio.stopListening();


      radio.setChannel(60);
      radio.write(&data2, sizeof(data2));
      delay(100);

      radio.setChannel(70);
      radio.write(&data, sizeof(data));
      delay(100);

      radio.setChannel(80);
      radio.write(&data3, sizeof(data3));
      delay(100);
    }
     
    Последнее редактирование: 14 янв 2018
  10. ORLENOK

    ORLENOK Гик

    Попробуйте приём обернуть в
    Код (C++):
    if(radio.available())
    Подробнее о методе тут: https://maniacbug.github.io/RF24/classRF24.html#ace7dd139fabc16b77cb8325faa07620f

    Сейчас получается, что у вас в любом случае считываются данные, не важно, доступны они или нет. Возможно есть помехи, и из-за этого принимаются данные с других каналов. Кроме каналов есть ещё pipe - трубы. Попробуйте с ними связать.
    Я, если честно, не очень понимаю, в чем их смысл, но они есть))
     
  11. Skyline

    Skyline Нуб

    С трубами пробовал, не работает, так как надо) Решил каналы использовать. if(radio.available()) попробую применить.
     
  12. Skyline

    Skyline Нуб

    Не работает, видимо if(radio.available()) используется только с трубами
     
  13. ORLENOK

    ORLENOK Гик

    Тогда советую поменять, и всё таки использовать трубы. Потому что с radio.available() больше контроля. Сейчас вы не видите, кто принял сообщение, а кто прислал. Сейчас просто читаете и пишите в эфир. Я думаю лучше всё таки использовать pipe, available, enableAckPayload. Будет намного больше контроля ситуации.
     
  14. Skyline

    Skyline Нуб

    При использовании труб, а не каналов, они начинают друг другу мешать, при передаче с центра на дочерние приемники, собственно из-за этого и использую каналы.
     
  15. ORLENOK

    ORLENOK Гик

    Тогда попробуйте комбинировать. Менять и трубу и канал.
    Сам я ещё не подключал несколько устройств. Никак руки не дойдут, но два в режиме вопрос-ответ нормально работают.
     
    Skyline нравится это.
  16. Skyline

    Skyline Нуб

    Да, два узла прием/передача, работает без нареканий. То есть к каналу, добавить еще и адресацию каждому свою? Надо попробовать.
     
  17. Skyline

    Skyline Нуб

    Попробовал добавить адресацию, результат тот же. Забивает все массивы и все тут.
     
  18. Faig

    Faig Нерд

    А как вы добавили адресацию? Код в студию. Особоенно то место где у вас условие выдергивает именно нужный канал и трубу. Предпологаю что вы считываете номер трубы но не фильтруете передачю по этому номеру.
     
  19. Skyline

    Skyline Нуб

    А при переходе на другой канал, разве прочтения адреса не будет?
    Код (C++):
    void loop() {
      radio.setChannel(30);
      radio.openReadingPipe (1, 0xAAAAAAAAAALL);
      radio.startListening();
      radio.read(&data2, sizeof(data2));
      lcd.setCursor(0, 0);
      lcd.print(data2[0]);
      delay(500);
      radio.stopListening();

      radio.setChannel(40);
      radio.openReadingPipe (1, 0xBBBBBBBBBBLL);
      radio.startListening();
      radio.read(&data, sizeof(data));
      lcd.setCursor(5, 1);
      lcd.print(data[0]);
      delay(500);
      radio.stopListening();

      radio.setChannel(50);
      radio.openReadingPipe (1, 0xCCCCCCCCCCLL);
      radio.startListening();
      radio.read(&data3, sizeof(data3));
      lcd.setCursor(10, 0);
      lcd.print(data3[0]);
      delay(500);
      radio.stopListening();

      radio.setChannel(60);
      radio.write(&data2, sizeof(data2));
      delay(100);

      radio.setChannel(70);
      radio.write(&data, sizeof(data));
      delay(100);

      radio.setChannel(80);
      radio.write(&data3, sizeof(data3));
      delay(100);
    }
    Собственно условий тут нет.
     
  20. b612

    b612 Нуб

    Добрый день, уважаемые.
    Подскажите, пожалуйста, что не так ?
    Стоит керамика на 0.47 и электролит на 100мк
    перед инициализацией модуля пауза 2 секунды
    Результаты теста ниже
    Картина одинаковая на двух модулях из одной партии и на двух ардуинках про мини
    Питать пробовал и от отдельного ams1117 и от регулируемого Б/П и ещё от аккума 3.8
    Код (Text):
    STATUS         = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
    RX_ADDR_P0-1     = 0xe8e8f0f0ab 0xe8e8e8e8e8
    RX_ADDR_P2-5     = 0xc3 0xc4 0xc5 0xc6
    TX_ADDR         = 0xe8e8f0f0ab
    RX_PW_P0-6     = 0x20 0x20 0x00 0x00 0x00 0x00
    EN_AA         = 0x3f
    EN_RXADDR     = 0x02
    RF_CH         = 0x00
    RF_SETUP     = 0x67
    CONFIG         = 0x0f
    DYNPD/FEATURE     = 0x00 0x00
    Data Rate     = 250KBPS
    Model         = nRF24L01+
    CRC Length     = 16 bits
    PA Power     = PA_MAX
    00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777
    0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
    44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
    44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
    44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
    44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
    44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
    44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
    44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
    44444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
     
     
    Последнее редактирование: 17 янв 2018