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

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

  1. aleksey332

    aleksey332 Нуб

    из данного примера

    /* В дефайнах */
    #include <SPI.h>
    #include "nRF24L01.h"
    #include "RF24.h"
    #include "printf.h"
    RF24 radio(9,10);// Определяем рабочие ножки;
    constuint64_t pipe = 0xE8E8F0F0E1LL;// Определяем адрес рабочей трубы;

    /* В сетапе */
    radio.begin();// Старт работы;
    radio.enableAckPayload(); // Разрешение отправки нетипового ответа передатчику;
    radio.openReadingPipe(1,pipe); // Открываем трубу и
    radio.startListening(); //начинаем слушать;

    /* В лупе */

    uint32_t message =111; //Вот какой потенциальной длины сообщение - uint32_t!
    //туда можно затолкать значение температуры от датчика или еще что-то полезное.
    radio.writeAckPayload(1,&message,sizeof(message));// Грузим сообщение для автоотправки;
    if( radio.available()){//Просто читаем и очищаем буфер - при подтверждении приема
    int dataIn; //передатчику приемник протолкнет ему в обратку наше сообщение;
    bool done =false;
    while(!done){
    done = radio.read(&dataIn,sizeof(dataIn));// Значение dataIn в данном случае
    //не важно. Но его можно использовать и как управляющую команду.
    }
    }
     
  2. aleksey332

    aleksey332 Нуб

    в приемнике нужно вложить свои данные но ничего пока не получается
     
  3. Un_ka

    Un_ka Гик

    Товарищи, может я чего не понимаю, но в формате HEX не должно быть" LL "
    Код (C++):
    0xE8E8F0F0E1LL
     
  4. parovoZZ

    parovoZZ Гуру

    компилятор пропускает так и пофигу. Можно позже в симуляции посмотреть или ЛА на SPI цапануть, если есть сомнения.
     
  5. Red_Lion

    Red_Lion Нуб

    Есть необходимость сделать индикатор качества приёма для общения двух модулей
    Думал запихнуть это в прерывания и реализовать так:
    через каждый n'ный интервал по прерыванию с таймера TX шлёт короткое сообщение, а после получения ответа с RX оценивает время и, например, зажигает красный, жёлтый или зелёный светодиод.
    Слушать эфир и ждать ответ с RX в прерывании я не могу.
    Хочу повесить приём обратного сообщения у TX на прерывание по уровню сигнала с какой-то из ног модуля.
    Т.е. подтянуть её на 2 или 3 пин ардуины. Есть у nrf нога, которая при начале получения данных меняет своё состояние дискретно?

    ps если есть готовый способ получать информацию о качестве сигнала в параллельном процессе буду рад ссылке
     
  6. parovoZZ

    parovoZZ Гуру

    Для nRF24l01 это всё бесполезные потуги.

    нет. Только на стороне передатчика читать счетчик с количеством попыток отправить пакет (автоподтверждение должно быть активировано).

    нет. Только после приема полного пакета и проверки его на целостность с помощью CRC.
     
  7. ImrDuke

    ImrDuke Гик

    Так сделал у себя - считает количество отправленных и полученных.
     
  8. b707

    b707 Гуру

    Что вы пытаетесь определить по времени возврата сигнала? Уж не расстояние ли между модулями? если да - то бросьте, время прохождения сигнала между модулями составляет лишь малую, причем заранее неизвестную, часть от общего времени получения ответа
     
  9. EnselerizeR

    EnselerizeR Нуб

    Добрый день.
    Пытаюсь победить два модуля nrf24l01+. Оба модуля подключены к Arduino Nano, питаются от неё с пина 3V3 (обеспечить модуль нормальным питанием возможности пока нет), на обоих модулях на ноги питания припаян электролит на 10 мкФ. По инструкции из начала топика получаю дебаг-данные с модулей. В одном из модулей вижу вполне устраивающую меня картину:
    Снимок1.PNG

    Второй же модуль даёт пустые значения регистров, модель nrf24l01 без плюса и пустой эфир:
    Снимок2.PNG

    Насколько я понимаю, мне попался кривой модуль. Прошу совета, что с ним делать - выкидывать, либо же есть шансы заставить его работать?
     
  10. ImrDuke

    ImrDuke Гик

    Был модуль с такими же симптомами - ничего сделать не получилось
     
  11. parovoZZ

    parovoZZ Гуру

    без плюса чуть другой. Его надо в обнимку с даташитом иницализировать. Вообще, такие штуки надо в нормальных местах покупать. С алика все битые по РФ части (ни о каких 0дБ даже можно не мечтать). Дальность работы не дальше 5 метров.
     
  12. ИгорьК

    ИгорьК Гуру

    Интересно, кто-нибудь здесь покупал?
     
  13. EnselerizeR

    EnselerizeR Нуб

    Модули внешне абсолютно идентичны, выглядят как типичный nrf24l01+. Покупались одним заказом в одном магазине. Покупались у нас, в РФ, в магазине yourduino. Конечно, подозреваю, что они перекупают у тех же китайцев с Али, но такой подставы не ожидал. Но очевидно, что теперь там модули покупать не буду. Тем не менее, все же были надежды восстановить уже купленный, т.к. покупался он в срочном порядке.

    Тогда такой вопрос: могут ли такие симптомы быть следствием сгоревшего модуля (ввиду моей криворукости) либо неправильного питания? Или же тут 100% дело в самом модуле?
     
  14. parovoZZ

    parovoZZ Гуру

    Я ж говорю - с сайта производителя микросхемы скачать даташит на микру без плюса и в соответствии с ним инициализировать модуль. Более, чем уверен, что он заработает.
    ну не с али, но оттуда.
     
  15. Un_ka

    Un_ka Гик

    случайно где-то нашёл:
     
  16. Здравствуйте, помогите плиз советом -
    Есть 3 Arduino c NRF, все 3 работают на одном канале:
    Arduino1
    openReadingPipe(1, 1Pipe)
    - периодически делает openWritingPipe(3Pipe); radio.write to Arduino3 и принимает от нее в ответ AckPayload
    - периодически делает openWritingPipe(2Pipe); radio.read для получения данных от Arduino2

    Arduino2
    openWritingPipe(1Pipe)
    openReadingPipe(1, 2Pipe)
    -периодически делает radio.write to Arduino1

    Arduino3 (и возможно добавятся еще несколько Arduino аналогичных Arduino3)
    openWritingPipe(1Pipe)
    openReadingPipe(1, 3Pipe)
    - делает writeAckPayload() с Payload для Arduino1
    - периодически делает radio.read для получения данных от Arduino1 и отправки в ответ AckPayload

    Вопрос такой – корректно ли в Arduino1 перед radio.write() менять передающую трубу коммандой openWritingPipe(nPipe);
    И еще непонятна ситуация когда даже в отсутствии Arduino1 я попадаю на Arduino3 в if (radio.Available()==true) в моменты Arduino2 radio.write(). Я думал если 3Pipe<> 1Pipe такого быть не должно? Если же в них поставить разеый WritingPipe, проблема исчезает.
     
  17. parovoZZ

    parovoZZ Гуру

    ну вот и дальше работай на одном канале. Канал в них чисто условный - это всего лишь то, что в других передатчиках называется синхрослово. Если хочется поработать на разных каналах с автоподтверждением, то смотреть картинки в даташите. Но ещё раз - торча в этом нет никакого. Если ещё глубже, то библиотека не даст. Welcome в регистры.
     
  18. "Работают на одном канале" - я имел ввиду radio.setChannel(channel1) - одна частота у все трех модулей. Вопрос не в канале, а в трубах. Я думал труба - это способ аддресации к конкретному модулю, если их несколько на одной частоте. Не так?
     
  19. parovoZZ

    parovoZZ Гуру

    Частота и должна быть одна на всех.
    Труба - да, это способ адресации.
    Как там в библиотеках - не знаю. В даташите по трубам есть картинка. По ней все должно быть понятно.
     
  20. Un_ka

    Un_ka Гик

    А по размеру ответного сообщения в функции autoAsk есть ограничения? У меня от 4 байт пропадает связь. Но и до этого каждая вторая переменная типа байт четырехэлементного массива , изначально равная другому числу становилась равной 16.