Не могу заставить nRF24l01+ работать

katzz0
Offline
Зарегистрирован: 22.02.2016

Всем, привет!

Может у кого есть успешный опыт использования модулей nRF24l01+. Я хотел их использовать для управления квадрокоптером, но сейчас понимаю что это какой то мусор. Передать хотябы байт ифнормации с одного на другой так и не получилось, при это я уже все перепробовал, что было написано в интернете:

1. Я использовал библиотеку https://github.com/TMRh20/RF24 и самый простой пример GettingStarted

2. Много написано про то, что модули жрут много тока и ардуино просто не может столько дать, я пробовал подключать и к 3.3 В и к 5В и к отдельному стабилизатору 3.3В и отдельному стабилизатору 5В. Лишь в некоторых случаях он пишет что передает данные, но очень-очень медленно, т.е. написано Now Sending и так может висеть долго вплоть пока не выключишь. Так же пробовал во всех режимах питания MAX, LOW и MIN.

3. Даже когда пишет, что что-то передается, то на принимающей стороне он по факту ничего не принимает. Я попробовал заменить код со стандартной временной метки, на икремент числа, которое отправляется, на принимающей стороне естественно 0.

4. Отладочный лог информации о модуле, даже когда подключаешь к ардуино 3.3В выводит нормальную информацию, но адреса почему то он каждый раз выбирает новые. Не знаю связано с чем это или так и должно и быть?

Резюмируя:  мне не удалось модуль стабильно работать в режиме передаче, почти каждый раз он пишет failed. В таком случае про прием еще рано говорить.

Если с этим никто не работал то может кто нибудь знает какие либо аналоги или как вообще лучше наладить беспроводное управление радиомоделью?

Заранее спасибо. 

vvadim
Offline
Зарегистрирован: 23.05.2012
katzz0
Offline
Зарегистрирован: 22.02.2016

vvadim пишет:

внимательно почитайте

http://forum.amperka.ru/threads/nrf24l01-побеждаем-модуль.3205/

Спасибо за ссылку. Но увы мне не помогло, припаял кондеры, 4.7 мкФ и один керамический, разницы не заметил. Один фиг он не хочет данные отправлять. Пробовал менять параметры скорость передачи данных и длинну CRC, в 10% случаев что-то меняется, в остальном он показывает 1МБит и 16 бит для CRC. Почему так происходит я не понял, но пришел к выводу что эти модули не подходят для радиуправления. Может тем, кому не жалко своего времени, они какую то пользу принесут, а я буду искать более адекватное решение. Как что-то найду работающее, то опишу в теме.

pastry777
Offline
Зарегистрирован: 16.01.2014

выкладываю вам свои примеры...они работают у меня в моем проекте...тут даже не просто один отправил,а второй получил,а главный контроллер(мастер) не важно по какому событию,сами придумаете(то ли кнопка нажалась,то ли время подошло то ли еще что)для примера вписал раз в три секунды,отправляет запрос конкретному дочернему устройству(слейву) по номеру...слейв смотрит пакет,если он предназначался ему,то отправляет мастеру ответ,причем тоже с идентификационным номером(просто я делал себе так,что в сети может быть наоборот несколько приемников которые смотрят температуру с одного передатчика)...мастер принимает пакет и тоже смотрит,если ответ для него,то читает его до конца и в данном случае выводит в монитор порта...

там все относительно просто,скетчи небольшие,почитайте внимательно,вдумайтесь..пожалуйста,подключите правильно ваши модули к ардуине!обратите внимание на номера пинов CE CS,они указываются в начале скетча,их можно поменять на другие...

 

мастер-контроллер


#include <SPI.h>
#include <RF24.h> 

#define SLAVE_ADRES_1 1 // номер передатчика,от которого запросим ответ
#define MASTER_ADRES 0  // наш номер,этого модуля
#define NRF_CHANNEL 9
#define NRF_PIPE 0xF0F1F2F3F4LL

const int adres = SLAVE_ADRES_1;

RF24 radio(9, 10); // CE, CSN

void setup(){
  Serial.begin(9600);
  radio.begin();  
  delay(5);
  radio.setChannel(NRF_CHANNEL);
  radio.setDataRate(RF24_250KBPS); 
  radio.setPALevel(RF24_PA_HIGH);   
  radio.openReadingPipe(1,NRF_PIPE); // открываем первую трубу с индитификатором "pipe"
  radio.startListening();            // включаем приемник, начинаем слушать трубу
}
 
void loop()   
{
  int data[2];

  if (millis()%3000 == 0){                 // если наступило событие(в данном случае прошло 3 сек)
      radio.stopListening();               // останавливает приём (нужно перед началом передачи) 
      radio.openWritingPipe(NRF_PIPE);     // открываем трубу на передачу.
      radio.write(&adres, 1);              // отправляем в эфир номер передатчика от которого хотим получить инфу
     
      radio.startListening();          // включаем приемник, начинаем слушать трубу
      delay(10);
      if (radio.available()){          // проверяем не пришло ли чего в буфер.
      radio.read(&data, sizeof(data)); // читаем данные
      if(data[0] == MASTER_ADRES){     // если данные были отправлены для нас
      Serial.print("Recieve data: ");  // выведем в сериал что получили
      Serial.println(data[1]); 
       }
     } 
      radio.stopListening();            // останавливает приём 
  } 
} 

 

слейв-контроллер

 

#include <SPI.h>
#include <RF24.h> 

#define THIS_MODUL_ADRES 1 // номер этого модуля
#define MASTER_ADRES 0     // номер мастера,главного контроллера
const uint64_t pipe = 0xF0F1F2F3F4LL;

RF24 radio(9, 10); // CE, CSN

int example = 12345; // то что передадим для примера

void setup() {
  Serial.begin(9600);
  radio.begin();
  delay(100);
  radio.setChannel(9); 
  radio.setDataRate(RF24_1MBPS);
  radio.setPALevel(RF24_PA_HIGH);
  radio.openReadingPipe(1, pipe);
  radio.startListening();
  radio.openWritingPipe(pipe);
}

void loop()
{ if (radio.available()>0) {
    int val;
    radio.read(&val, sizeof(val)); 
    if (val == THIS_MODUL_ADRES) { // если запрос нам
      Serial.println("recieve request"); // пишем в сериал,что получили запрос
      send_data_radio();
    }
  }
}


void send_data_radio() {
 int data[2];
    radio.stopListening();
    data[0] = MASTER_ADRES; // в первой ячейке указываем какому устройству предназначается пакет данных
    data[1] = example;
    radio.write(&data, sizeof(data));
    Serial.println("send data"); // пишем в сериал,что отправили данные
    radio.startListening();
}

 

pastry777
Offline
Зарегистрирован: 16.01.2014

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

вообще модули не безнадежны,но толкового кода,чтоб работал без сбоя, для них действительно не нашел..в одном пакете за раз можно передать 32 байта,это в одном пакете,никто не запрещает несколько пакетов отсылать..в моим примере мы отсылаем всего два int,в моем коде я и то пять за раз шлю,это я вам для примера урезал..

этот код работает у меня круглосуточно уже несколько недель,но тем не менее на квадрокоптер я бы его не ставил))нужен боле серьезный и тщательный код с пониманием дела...а так,температурки в эфир поотсылать и еще какие подобные данные самое-то..

std
Offline
Зарегистрирован: 05.01.2012

Электролит нужен 100 мкФ.

Также, на сброс ардуины - 47 мкФ.

pastry777
Offline
Зарегистрирован: 16.01.2014

у меня и без кондеров все работает...

katzz0
Offline
Зарегистрирован: 22.02.2016

Всем спасибо! Попробую когда будет свободное время. Пока принял решение заказать пару модулей APC220, так же еще пару модулей nRF24l01+. У меня есть подозрение, что что-нибудь могло повредиться после подключения к 5В. Хотя функция printDetails() выводит вроде бы корректную информацию. У меня сейчас есть три модуля, но поменять параметры скорости передачи получилось только на одном и то не каждый раз это срабатывало. Когда SPI неверно подключен, то функция printDetails() выводит либо нули либо что-то вроде 0xfffffffff.

Вообще судя по информации в интернете, управление моделями идет с помощью PPM сигнала. Но в продаже я видел только пульт и модуль приемник. Что интересно стоит в пультах?