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

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

  1. ИгорьК

    ИгорьК Гуру

    Насколько могу ухватить картину с планшетика, последний код не может ничего завешивать. Звер правильные вещи предлагает. Скорее вопрос железа.
    -,------
    Правда, один шут - это не весь код.
    И, стесняюсь спросить: если вы отправляете сигнал одгому и тому же приемнику - зачем вы постоянно передающую трубу открываете?
     
  2. Andy-K

    Andy-K Нуб

    Коллеги, у меня тут созрел вопрос. Делаю устройство, точнее переделываю устройство с XBee на RF24. Все сделал, все более или менее адекватно работает, причем даже без конденсаторов, но я люблю перестраховываться и потому керамика+электролит на месте. Одна из функций устройства - контроль приемником того что передатчик(или передатчики) пропали из канала. Ну к примеру, батарейка села. сломалось, или ещё что то. Идет постоянный опрос раз в несколько секунд, если не ответило в течении нужного интервала времени, то все, сигнал на приемнике сразу об этом. На Xbee все было замечательно и все работало. Простой тест, отключаю передатчик, вижу контрольную индикацию на приемнике, включаю передатчик, через несколько секунд аварийная индикация гаснет.

    Делаю все то же самое на наших модулях. И замечаю одну неприятность, при выключении передатчика из сети и включении снова, приемник не видит исходящие от него сигналы. Отключение и включение приемника возвращает все на свои места, то есть это очень важный момент! Передатчик по питанию перезагрузил и приемник не видит его до того как сам не перезагрузится. Вот сюда мы уже не попадаем на приемнике:
    Код (Text):
    if ( radio.available(&pipe_num) )
    {
        //бла бла бла
    }
    Проверяю вставкой туда кода вызывающего вспышки диода. В нормальном режиме он часто вспыхивает. во время получения данных от передатчика, а в указанной выше ситуации вспышки прекращаются. Никто с таким не сталкивался? Так не должно быть, или... ?

    Кода там много, вот тут выложил то что связано с радиоканалом:

    Код (Text):
    void readBuffer()
    {
      uint8_t pipe_num;    

      radio.startListening();

      if ( radio.available(&pipe_num) )
      {
        radio.read(&tmpIncomingArr ,sizeof(tmpIncomingArr));
        execCommand(pipe_num, tmpIncomingArr[0], tmpIncomingArr[1], tmpIncomingArr[2], tmpIncomingArr[3]);
      }
    }

    void loop()
    {
      readBuffer(); //читаем то что прилетает по радиоканалу
    }
    Скетч не зависает, все функции устройства продолжают работать, но связи с передатчиком уже нет
     
    Последнее редактирование: 14 дек 2014
  3. Кренка, как раз и дает стабильные 3.3 вольта. Ее Специально и припаяли с двумя кондерами.

    С питанием мы разобрались, будем делать дополнительное на всякий случай. Вот с передачаей труба. Любая наводка, код висит и не выполняется. Результат с фольгой дал о себе знать.
     
  4. чтобы lm1117 давала стабильные 3,3 ей нужно минимум 5 вольт на входе, а там вроде полтора вольта съедается из за питания через Vin.
    да и кондер нужен рядом с модулем.
     
  5. Andy-K

    Andy-K Нуб

    Ребят, а мне кто-нибудь ответит? Ну если уж не ошибку покажите, то хоть у себя проведите эксперимент, наверняка же есть уже готовые устройства, или их макеты. При выключении передатчика и работающем на прием приемнике, пойдут ли снова данные при включении передатчика?
     
  6. все поднимается, скорее всего ошибки в коде.
     
  7. geher

    geher Гуру

    У меня идут.
     
  8. Andy-K

    Andy-K Нуб

    Понял, буду искать проблему. В том коде что я выше указал тоже все правильно?
     
  9. зачем каждый раз вызывать radio.startListening(); ?
     
  10. Andy-K

    Andy-K Нуб

    Дело в том, что у меня так организована работа с устройством. Приемник не только принимает, но иногда и отправляет данные. В loop как я выше указал, вызывается чтение из устройства. А по некоторым событиям идет отправка по радиоканалу. Для отправки и приема я сделал две разные функции. И чтобы не следить за тем в каком режиме находится RF24, я просто внутри каждой из этих функций вызываю либо radio.startListening(); если это функция чтения данных, которую вы видели, либо radio.stopListening(); если это отправка.

    Проблем особо нет вроде, потому решил так и оставить. Можно конечно убрать startListening из процедуры чтения, а перенести его в конец процедуры отправки данных, если это на что то влияет, но мне казалось что нет
     
  11. возможно он теряет трубы, если они указаны как radio.openReadingPipe(0,pipe01);
    можно попробовать их явно указать, тобиж
    radio.openReadingPipe(1,pipe01);
    radio.openReadingPipe(2,pipe02);
    итд.
     
  12. Andy-K

    Andy-K Нуб

    не совсем понял, трубы у меня открываются в setup

    Код (Text):
    void setup()
    {
      ......

      radio.begin();
      radio.setChannel(0);
      radio.setRetries(15,15);
      radio.setDataRate(RF24_250KBPS);
      radio.setPALevel(RF24_PA_MAX);
      radio.setAutoAck(1);                

      radio.openWritingPipe(pipes[0]);
      radio.openReadingPipe(1,pipes[1]);
      radio.openReadingPipe(2,pipes[2]);
      radio.openReadingPipe(3,pipes[3]);
      radio.openReadingPipe(4,pipes[4]);
      radio.openReadingPipe(5,pipes[5]);

      .....
    }
    Напомню, в остальном все работает прекрасно
     
  13. Andy-K

    Andy-K Нуб

    В общем, пока сниму вопрос, так как на паре написанных мною ранее тестовых скетчей, без другого кода(только радиообмен тестовый) такого глюка не прослеживается. Буду сравнивать и смотреть что я упустил
     
  14. Я жду ответа от знатоков. Почему при отключении NRF виснут другие части кода????? В коде убрал передачу, оставил только прослушку if (radio.available()) { read...... }. Это функция не работает должным образом. Если радио нету, значит его нету вообще.... А оно типа есть. И все висит. У кого работает, клонюсь в ноги и прошу помощи. Прошу протестить.
     
  15. magic21

    magic21 Нерд

    Если висит, значит ваше устройство неисправно... Зачем задаваться вопросом почему висит, нужно задаваться вопросом как отремонтировать!
    Ни кто же не пытается отсоединить стартер от машины и спрашивать почему не заводится?

    Я конечно не специалист, но меня радует что когда вы дёргаете питание на части вашего устройства, контроллер просто висит, а не горит!

    Ищите другой подход к вашей задаче)
     
  16. Когда у вас на машине, отрубается ESP, Двигатель работает ? Обороты набирает? Машина едете?

    Ардуино это такая же машина. Если бы нормально работала функция radio.available, то ардуине было пофигу бы. Питание на NRF подается отдельно, он не питается от arduino. И на NRF благодаря кренке приходит стабильные 3.3 вольта. Остаются другие каналы MOSI, MISO и т.д. И они не должны плату вешать.

    Вместо того чтобы спорить взяли бы и проверили... Если, что я вам могу дать на тест два модуля NRF.

    Ардуино висит и не только из-за питания, если в момент отправки пропадает связь то она долбит c задержкой и с попытками. radio.setRetries(10,10); при этом остальной код подвисает. Возьмите протестируйте. Я выше написал простой код... У меня 8 модулей NRF, я не думаю, что они не рабочие все. Тем более я строго написал, что если, не отключать питание и связь стабильна, все работает отлично без подвисонов. Проблема только в библиотеке.

    Я надеюсь, что всеми силами мы скоро победим этот модуль раз и навсегда....
     
  17. Andy-K

    Andy-K Нуб

    Пойду проверю
     
  18. походу это бесполезно.

    значит берем даташит, открываем на 21 странице и видим возможные состояния модуля.
    смотрим внимательно на переход из Power Down, в котором модуль находится при включении питания, в Standby-I, если не понятно, для этого надо записать в регистр PWR_UP единицу.
    а еще потом чтобы перейти в режим приема, нужно записать в регистр PRIM_RX единицу и поставить пин CE в 1, а после того уже читать регистр состояния приемника, что делает функция radio.available, нуда онаже ненормально работает, пытается чтото спросить у модуля, который в Power Down. ваще ненармальная.
     
  19. Andy-K

    Andy-K Нуб

    У меня модуль питается от ардуины(при этом все нормально работает). К ардуине подключен гибкими проводами, которые при желании легко отключаются. Простой скетч, не делающий вообще ничего, только отправляет данные.

    Добавил выброску в Serial сообщений, по которым я сужу о том, что скетч не подвис. Открываю монитор порта, все ок, в serial отправляются мои тестовые сообщения вереницами. Отключаю VCC с модуля, все останавливается.... Включаю питание назад, ничего не меняется....

    Но есть одно наблюдение. Если во время отключенного VCC пальцем трогаешь разъем на NF24, либо просто как то рядом пальцем двигаешь и видимо создаются наводки, скетч снова начинает присылать сообщения в Serial, урывками как то, но они приходят. Напомню, что я говорю о тестовых сообщениях о том что loop вообще крутится.

    Так что да, можно сказать подвисает. Но подвисает как я понял не железка, а все же какой то цикл типа while, так как наводки от касаний пальцем иногда вызывают отклики скетча.

    Автор вопроса просил, я проверил :)
     
  20. Поставьте таймер с периодичностью в 1 секунду и выводите в serial. Вы заметите, что таймер при отправке сообщения передатчику, будет прерываться.

    Я больше не буду спорить и спрашивать. Я эту проблему решу сам, а потом выложу нормальный код при котором: Если отрубили питание, ардуино продолжает работать с другим участком кода, если проблемы с отправкой, приемом, то тоже, чтобы ничего не вырубалось. И забудем все об этой проблеме.... Скоро новый год
     
    Andy-K нравится это.