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

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

  1. Faig

    Faig Нерд

    По какой шине он подключается можно конкретнее? SPI? Если да то вам придется почитать как управлять одновременно подключенными устройствами на одну шину.
    Если нет, то я подключал много чего к ардуине и они нормально сосуществовали , при условии если тока не жрут много, или если ваш NRF24 питается с другого места (в таком случае не забудьте объединить земли доп. питания и вашей ардуины).
     
  2. ORLENOK

    ORLENOK Гик

    Автоответ вообще работает. Он не передает массив из 2х float. Если передавать один, то всё ок. С byte тоже всё ок.

    float принимает и только один, видимо. Он как раз 4 байта.
    А где можно почитать про ограничения? Это сделано в библиотеке или это заложено на уровне железа?
     
  3. Faig

    Faig Нерд

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

    ORLENOK Гик

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

    Эмм, не очень понимаю о чем вы. Новое по сравнению с чем?
    Не хотелось бы делать, контролируемую отправку. Мне, наверное, легче сделать 2 запроса, чем переводить в разные режимы модули. Тем более планируется не одно отвечающее устройство.
     
  5. 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) на одном вздохе не совсем реально.
     
  6. ORLENOK

    ORLENOK Гик

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

    Faig Нерд

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

    ORLENOK Гик

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

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

    Kislotik Нуб

    Подскажите можно ли размещать антенну от nrf24l01 вплотную над платой ардуино? Просто появились не большие глюки в сработке сервоприводов на приемнике, но пока все в приемнике подключено навесным монтажом может дело в этом.
     
  11. 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
  12. ORLENOK

    ORLENOK Гик

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

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

    Skyline Нуб

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

    Skyline Нуб

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

    ORLENOK Гик

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

    Skyline Нуб

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

    ORLENOK Гик

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

    Skyline Нуб

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

    Skyline Нуб

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

    Faig Нерд

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