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

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

  1. 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);
    }
    Собственно условий тут нет.
     
  2. 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
  3. Faig

    Faig Нерд

    Конечно же так у вас будет каша.
    Во первых реагировать на передачу если удовлетворено условие:
    Код (C++):
    if (radio.available("адрес какойнить переменной "))
    (эта "какаянить" переменная куда, заполнится адрес трубы для которой пришло это соообщение тоесть надо вписать не
    Код (C++):
    receivedPipeNumber
    , а
    Код (C++):
    &receivedPipeNumber
    Я могу ошибаться но, так понимаю что если не проверять на "radio.Available" (это всеголишь флажковая ячейка памяти, в которой "1" если имеется непрочтенная инфа в буфере) то вы прочитаете предыдущее сообщение, еще не удаленое из буфера(не удаленная возможно для экономии времени или изза особенности версии модуля).

    Во вторых читать и печатать прочитанное только если
    Код (C++):
    if (receivedPipeNumber == neededPipeNumber)
    Надеюсь нигде не ошибся.
     
    Последнее редактирование: 18 янв 2018
    Skyline нравится это.
  4. Faig

    Faig Нерд

    1) 250 Кбит работает не на всех (только на "+" версиях) и китайцы часто обанывают говоря что это "+" версия, а на самом деле подсовывают простую.
    2) Попробуйте вместо PA_MAX указать PA_LOW.
    3) И потом у меня ничего не заработало пока я не подсоединил модули через "base module" модуль регулировки питания для передатчиков(он уже подрубается к 5 вольтам , а не к 3.3 как если бы подключали модуль напрямую).
     
  5. Skyline

    Skyline Нуб

    Просто если применять if(radio.available()), то появляются проблемы при последующей передаче. Собственно по адресу трубы я пробовал, прием идеальный, а на передаче проблемы. Хотя может мой косяк.
    Код (C++):
    void loop(){
        if(radio.available(&pipe))
      {                        
            radio.read(&data, sizeof(data));                    
            if(pipe==1)
             {
              }
            if(pipe==2)
             {
             }    
        }
    }
    Если делать по запросу, то с задержками и синхронизацией сложности.
     
  6. Oleg_7

    Oleg_7 Гик

  7. b612

    b612 Нуб

    Спасибо за подсказку, но не очень помогло
    теперь стало вот так
    Код (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     = 0x43
    CONFIG         = 0x0f
    DYNPD/FEATURE     = 0x00 0x00
    Data Rate     = 1MBPS
    Model         = nRF24L01+
    CRC Length     = 16 bits
    PA Power     = PA_LOW
    00000000000000001111111111111111222222222222222233333333333333334444444444444444555555555555555566666666666666667777777777777777
    0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
    5771b3a0cb60276c9c565fa9e8208a179ab1cd56716c8953bb2537191782cb55b6946ad026deb87912d7e758267d0bcead49e9e8d3c6d9a8aa667aea51bd34c2
    41bdbe2c6156ef8846c6a36cd977717d5bb2c1c368e0e8e3dabae658c8364275af56bd6f625302d73962b800559e01522916b64b4895c57dd9c89cfaf9f82b81
    ab5c57ba76aa688821c12bfc8fb12123b804198a6d56ab9f934619d25d37ca367f47ac7e9fa208029137e9e8b68a04ce3ad6184f9abd8a5fb8b3dc7efbbcc979
    fac716b7552a4a8855e78fb612b4f9c597ea47cbeb4158e1c53d4a1eab158e40dd8ad19668fb1ac14b0d5d65896eb36b91ad8050c091f60bd4eca62adfa24428
    1948c931b070a737c3ed44cf7a0084e6c427981c87ee65cf867d2423994a5bf50c243ba4f6ff077056d59a2cd165cbe2cc22dc0a1d6ddc50fd399ccedfd6fb4b
    a9995577148cd4c377a36520603fda5d20338eba0a5caa6d82cd1388b64fb47d6cad1254e7dcd9ebb834192e6cc278f15ddc2e6d186bd8fba289c48acc38048e
    90a018bf1a68083cd6865aac9f93a3c66694a795b5be28c34dd30107654cb68dbf8edeb889d5a1da3d1a9308b0c976857c99b8ef659fceb19d4aaafbc52a83c8
     
     
  8. Faig

    Faig Нерд

    А можно по точнее какого типа у вас проблемы при передаче?
    Код с трубами вы правильно написали (если не ошибаюсь с else if будет быстрее, так как он не будет проверять последующие условия если одно удовлетворено), а вот с каналами я думаю у вас будут пропадать сообщения. Вам надо будет точно расчитать скорость отправки сообщений в соответствии со скоростью считывания каждого канала(1:Задать канал, 2:задать трубу, 3:запустить прослушивание. И только после этого начнется прослушка, а все что пришло пока выполнялись эти операции ведь пропадет).
    Советую отправлять со всех передатчиков простой счетчик (ну - 1,2,3,4,5...), и посмотреть пропадают ли сообщения.
     
    Последнее редактирование: 18 янв 2018
  9. Faig

    Faig Нерд

    Так кто-нибудь продвинулся в статус мониторинге? Вы особо не радуйтесь, если дойдете до практическго использования, а не лабораторных тестов, они у вас могут беспросветно зависать, пока не отрубите питание.
     
  10. Faig

    Faig Нерд

    Похоже у меня такое тоже было, не могу вспомнить изза чего. Проверьте распиновку еще раз. У вас мега или уно? А что выдает модуль без ваших кондеров?
    Вы хотябы найдите в нете схему базового модуля и обвесьте передатчик как надо.
     
  11. Skyline

    Skyline Нуб

    Дочерние узлы принимали информацию не предназначенную им, то есть каждый принимал все три передачи. При использовании каналов этого нет.
     
  12. Faig

    Faig Нерд

    Я запутался или вы? Так проблема при передаче или приеме?
     
  13. Skyline

    Skyline Нуб

    Первое - это про центральный узел, второе про дочерние приемники.
     
  14. Faig

    Faig Нерд

    Напишите сюда весь код контроллера и периферии
     
  15. b612

    b612 Нуб

    у меня про мини. С кондёрами или без, с разными питаниями от AMS1117/33 с обвеской и от аккума 3.9V.
    Разницы не ощущается.

    покупал тут
    все проводочки не более 5 см
    у них ещё распиновка как-бы вниз головой
    Одну сначала запаял не правильно, потом перепаял, заработала, но так же как и те которые сразу правильно паял.
     
    Последнее редактирование: 19 янв 2018
  16. ИгорьК

    ИгорьК Давно здесь

    upload_2018-1-19_14-55-28.png
     
  17. ИгорьК

    ИгорьК Давно здесь

    Но даже в этой теме о них писали.
     
  18. Ozyris

    Ozyris Нуб

    Есть какое-то минимальное расстояние между атмегой и модулем? В очередной раз сталкиваюсь с ситуацией, когда рядом находятся микроконтроллер и NRF-ка и рвется связь, а отставишь модуль на 10см шлейфе и все ок. В нордиковском даташите об этом не сказано, в этой теме была ссылка на решение наоборот по удлинению соединительных проводов SPI (в разрыв 300R или RC фильтр), а есть у кого-то опыт, как быть с короткими проводами?
     
  19. Faig

    Faig Нерд

    Да кстати, у кого есть опыт с экранированием, какие должны быть соблюдены условие чтобы некая поверхность(лист металла например) не пропускала радио волны?

    Есть предположение что клетка фарадея поможет (уложить ардуину внутрь такой клетки) но насколько я знаю она должна быть заземлена.
    Вот википедия https://ru.wikipedia.org/wiki/Клетка_Фарадея
    А вот более подробное и лучшее объяснение: http://electrik.info/main/fakty/1161-chto-takoe-kletka-faradeya.html
    У меня такое впечатление что, статьи в википедии пишут неудачники. Как-то добавил абзац в теме о витой паре (когда преподавал эту тему), так его удалили, хотя это было очень нужное дополнение...

    Пример такого экрана в мобилных телефонах, размер дырок должен быть меньше длины волны (2.4 Ггерц примерно 12-13 см)
    [​IMG]
     
    Последнее редактирование: 21 янв 2018
  20. Ozyris

    Ozyris Нуб

    Обертывал часть с атмегой скотчем и затем сверху фольгой, особой разницы не замечено.
    Однако знаю есть такой передатчик с атмегой и NRF-кой и без дополнительных резисторов и экранировок оно работает по отзывам не менее чем на 50 метров. Хотя может это так хорошо только на передатчиках, а на приемной части есть нюансы.
    [​IMG]