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

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

  1. sanik

    sanik Гик

    Как я понимаю это размер массива С массивами у меня некоторое затруднение есть я не совсем понял работу с ним
     
  2. ИгорьК

    ИгорьК Гуру

    Смотрим сюда. В функцию отправляются адрес данных для передачи и длинна этой передачи. Если не понятно - смотрим сюда. А для вашего случая - детально изучаем это.
    Да, не ответил на вопрос. Но удочку дал.
     
  3. sanik

    sanik Гик

    Спасибо! Кстати после прочтения я пробовал записать radio.write( & joystick, sizeof(joystick)); В моем случае не помогло
     
  4. ZAZ-965

    ZAZ-965 Гуру

    Вот еще подозрительная запись
    Код (C++):
    const uint64_t pipe = 0xF0F0F8F110FL; // Define the transmit pipe

    //вроде должно быть так
    const uint64_t pipe = 0xF0F0F8F110LL; // LL  - long long
    На мой взгляд ошибка в
    Код (C++):
    joystick[3] = val_4; // допуспимы индексы 0 1 2
    ИгорьК Массив в функцию передается по указателю, так что здесь все вроде верно.
     
    ИгорьК нравится это.
  5. sanik

    sanik Гик

    На днях придет модуль буду пробовать с подключенным модулем Планирую питать с помощью L7833
     
  6. ИгорьК

    ИгорьК Гуру

    Согласен. Главное чтобы размер массива не превышал возможностей модуля его принять.
     
  7. sanik

    sanik Гик

    :) Подобран опытным путем работает на предыдущем проекте :)
     
  8. ИгорьК

    ИгорьК Гуру

    С такой инициализацией Вы не свяжете модули. Есть время - читайте библиотеку и выписывайте все возможные параметры установки. Скорость ставьте сразу 1 Мбит.
     
  9. ZAZ-965

    ZAZ-965 Гуру

    sanik LL (long long) в конце, а не FL (я такого суффикса-модификатора не знаю, может и существует)
     
  10. ostrov

    ostrov Гуру

    Таки да, все верно, имя массива без аргумента и есть указатель на первый его байт. Получается, мало того что данные записываются в незаконный четвертый элемент массива, так еще и не отправляются, потому что уходят в эфир только законные три.
     
  11. sanik

    sanik Гик

    Я же обьяснил что четвертый не законный на данном этапе закоментирован. Дождусь модуля. подправлю чтоб лишнего не было и испробую с подключеным модулем учитывая ваши рекомендации. Надеюсь заработает хотя на действующем макете тот же геморой только не на передатчике а на приемнике. Коды приведены выше.
     
  12. ostrov

    ostrov Гуру

    Строку:
    Код (C++):
    #include <nRF24L01.h>
    можно выкинуть, Странно что все ее лепят не замечая что она не нужна.
     
  13. sanik

    sanik Гик

    А что тут странного взято из примера от куда новичку знать что она не нужна? Вот и лепим.
     
  14. ostrov

    ostrov Гуру

    Добавлю свои пять копеек. Ввиду нечастых, но обрывов связи, добавил автоматическую перезагрузку модулей в случае если сигнал не приходит или не отправляется в течении некоторого тайм-аута. На моем примере выглядит это так:

    Передатчик:
    Код (C++):
      bool r = radio.write( joystick, sizeof(joystick) );
      if (r) {
        timerPing = millis() + 2000;    // таймаут 2 сек, можно менять
      } else {                          // сигнал не уходит
        if (timerPing < millis()) {
          Serial.println("re-begin");
          radioInit();                  // функция инициализации, куда входит запуск радиоканала
          timerPing = millis() + 2000;
        }
      }
    Приемник:
    Код (C++):
      if ( radio.available() ) {
        while (!done) {
          done = radio.read(joystick, sizeof(joystick));
        }
        Serial.print(joystick[0]);
        Serial.print(" - ");
        Serial.println(joystick[1]);
        analogWrite(6, joystick[0] / 4);
        timerPing = millis() + 2000;      // таймаут
      } else {
        if (timerPing < millis()) {
          Serial.println("re-begin");
          radioInit();                    // перезапуск
          timerPing = millis() + 2000;
        }
      }
    На всякий случай обнародую функции инициализации, при которой мои китайские модули работают.

    Передатчик:
    Код (C++):
    void radioInit() {
      radio.begin();                          // Включение модуля;
      delay(20);
      radio.setChannel(0x60);                 // Установка канала вещания;
      radio.setRetries(15, 15);               // Установка интервала и количества попыток "дозвона" до приемника;
      radio.setDataRate(RF24_250KBPS);        // Установка минимальной скорости;
      radio.setPALevel(RF24_PA_MAX);          // Установка максимальной мощности;
      radio.setAutoAck(0);                    // Установка режима подтверждения приема;
      radio.openWritingPipe(pipe);     // Активация данных для отправки
    }
    Приемник:
    Код (C++):
    void radioInit() {
      radio.begin();                          // Включение модуля;
      delay(20);
      radio.setChannel(0x60);                 // Установка канала вещания;
      radio.setRetries(15, 15);               // Установка интервала и количества попыток "дозвона" до приемника;
      radio.setDataRate(RF24_250KBPS);        // Установка минимальной скорости;
      radio.setPALevel(RF24_PA_MAX);          // Установка максимальной мощности;
      radio.setAutoAck(0);                    // Установка режима подтверждения приема;
      radio.openReadingPipe(1, pipe);  // Активация данных для чтения
      radio.startListening();                 // Слушаем эфир.
    }
    Хочу подчеркнуть, что модули в моем случаю работают в одностороннем режиме (в качестве пульта), для двухстороннего режима алгоритм перезапуска будет несколько другим.

    Да, и еще интересное наблюдение. Ножка CS на МК передатчика почему то не меняет своего состояния в процессе работы. Пока не пойму в чем дело, пойду посмотрю в библиотеке. Подключил ногу модуля напрямую к VCC и все заработало. Странно, но для односторонней связи сойдет.
     
    Последнее редактирование: 21 июн 2016
    MickNich и ИгорьК нравится это.
  15. ИгорьК

    ИгорьК Гуру

    Там ещё есть настройка шифрования. Её тоже надо инициировать. Эта пара модулей может совпадать, но не факт что другая.
    Ножка CS отвечает за выбор модуля и дергаться не должна, если на SPI нет другого модуля.
    Также может для другой пары устанавливать скорость 1Мбит. 250 является иногда проблемной.
     
  16. ostrov

    ostrov Гуру

    Какой другой пары? Пара одна.

    SPI ножка не дергается, лежит себе спокойно в LOW, а должна в HIGH. Почему так?
     
  17. ИгорьК

    ИгорьК Гуру

    Дело вот в чем.
    Вы привели пример кода инициализации, и у Вас заработали два модуля.
    Сейчас кто-то повторит эти же настройки, и встанет в ступор, когда его пара не заработает. (А еще более прикольно - Вы сами через полгода. У меня такое было :) ) И будет считать что его модули неисправны.
    То есть, у Вас все с настройками нормально, но они не полные.
    Есть еще такой параметр как setCRCLength - его тоже надо инициировать. У разных групп модулей ПО УМОЛЧАНИЮ он разный.
    Да и вообще, вот здесь, например есть раздел Optional Configurators. Все что там можно инициализировать - инициализировать нужно (ИМХО, по опыту).

    Объяснение здесь. Chip Select (CS) имеет активный уровень низкий. А так как у Вас на шине одно SPI устройство - нога и не дрыгается.
     
    ostrov нравится это.
  18. ostrov

    ostrov Гуру

    Почему они не дрыгается понятно. Но почему при активном низком уровне передача не идет, а идет она только когда подаю на эту ногу высокий уровень (то есть просто подключаю к +3.3В)?
     
  19. ИгорьК

    ИгорьК Гуру

    ""а вот это науке не известно" :) Левак.
    И это реальное открытие, я серьезно. Еще один опыт в копилку багов. Выношу в заголовок!
     
  20. ostrov

    ostrov Гуру

    Я тоже не шучу, могу снять видео. Убил немало времени пытаясь выяснить почему сообщения не уходят, и нашел причину методом научного тыка, стоило переключить CS с 9 ножки в + и все бодренько заработало, при втыкании обратно (либо в GND) - тишина. Именно на передатчике такой эффект замечен.
     
    ИгорьК нравится это.