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

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

  1. joman

    joman Гик

    2 - добавил. Из лупа убрал все, что касается конфига, в т.ч. radio.powerUp();
    Имею:
    Код (C++):

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


    #define CE_PIN 9      
    #define CSN_PIN 10

    #define CHANEL 5
    const uint64_t readingPipe = 0xE8E8F0F0AALL;
    const uint64_t writingPipe = 0xE8E8F0F0ABLL;
    int out = 556;

    RF24 radio(CE_PIN, CSN_PIN);

    void setup() {
      Serial.begin(9600);
      delay(1000);                  
      radio.begin();                  
      radio.setChannel(CHANEL);              
      radio.setRetries(15,15);
      radio.setPayloadSize(12);
      //radio.enableAckPayload();
      radio.setDataRate(RF24_1MBPS);
      radio.setPALevel(RF24_PA_LOW);
      radio.setCRCLength(RF24_CRC_8);
      //radio.setCRCLength(RF24_CRC_DISABLED);
      radio.setAutoAck(1);

      radio.powerUp();
      //radio.openReadingPipe(1,readingPipe);
      radio.openWritingPipe(writingPipe);
      printf_begin();
      radio.printDetails();
      pinMode(13, OUTPUT);
    }

    void loop()
    {
      delay(5);
      Serial.print("Sending");
      radio.write( &out, sizeof(out) );
      delay(100);
    }

    int serial_putc( char c, FILE * ) {
      Serial.write( c );
      return c;
    }

    void printf_begin(void) {
      fdevopen( &serial_putc, 0 );
    }
    сканер при этом молчит (одни нули).
    После того, как в loop перед delay(5); добавляю radio.powerUp(); сканер показывает картинку как наверху (каналы - не совпадают).
    Ну и скетч приема (в нем также попаравил radio.setCRCLength(RF24_CRC_8);) тоже показывает одни нули.
    radio.available() - кажет нули, собственно, как и данные.

    Не много переписал скетч приёма:
    Код (C++):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <stdint.h>

    #define CE_PIN 9    
    #define CSN_PIN 10
    const uint64_t writingPipe = 0xE8E8F0F0AALL;
    const uint64_t readingPipe = 0xE8E8F0F0ABLL;
    int in;

    RF24 radio(CE_PIN, CSN_PIN);
    byte CHANNEL = 5;
    byte TryCount = 10;
    void setup() {

      delay(2000);              
      Serial.begin(9600);
      radio.begin();                
      radio.setChannel(CHANNEL);            
      radio.setRetries(15,15);
      radio.setPayloadSize(12);
      radio.enableAckPayload();
      radio.powerUp();
      radio.setDataRate(RF24_1MBPS);
      radio.setPALevel(RF24_PA_LOW);
      radio.setCRCLength(RF24_CRC_8);
      radio.setAutoAck(1);            

      radio.openReadingPipe(1,readingPipe);
      radio.openWritingPipe(writingPipe);
      printf_begin();
      radio.printDetails();
      radio.startListening();          
    }

    void loop()
    {
      Serial.print("Ch:");Serial.print(CHANNEL);Serial.print("_");
      for (int i = 0; i< TryCount; i++)
      {
        radio.setChannel(CHANNEL);
        radio.openReadingPipe(1,readingPipe);
        delay(5);
        radio.startListening();
        delay(3);
        if(radio.available()){
          radio.read( &in, sizeof(in) );
          Serial.print(in);Serial.print(" ");
        } else {
          Serial.print("X ");
        }
        delay(100);
      }
      Serial.println();
      if(CHANNEL>0x7F){
        CHANNEL = 0x03;
      } else {
        CHANNEL++;
      }
    }
    int serial_putc( char c, FILE * ) {
      Serial.write( c );
      return c;
    }

    void printf_begin(void) {
      fdevopen( &serial_putc, 0 );
    }
    Теперь он пытается 10 раз принять данные на канале (выводит либо X либо данные, принятые в канале) и переходит к следующему каналу. Так крутит каналы по кругу. Везде показывает X
    Настройки с ардуин:
    upload_2016-3-29_12-7-37.png
    Вроде все правильно
     
    Последнее редактирование: 29 мар 2016
  2. joman

    joman Гик

    Подумал не много, добавил в чтение еще проверку на несущие (как в сканере):
    Код (C++):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <stdint.h>

    #define CE_PIN 9      
    #define CSN_PIN 10
    const uint64_t writingPipe = 0xE8E8F0F0AALL;
    const uint64_t readingPipe = 0xE8E8F0F0ABLL;
    int in;

    RF24 radio(CE_PIN, CSN_PIN);
    byte CHANNEL = 0;
    byte TryCount = 15;
    void setup() {
     
      delay(2000);                
      Serial.begin(9600);
      radio.begin();                  
      radio.setChannel(CHANNEL);              
      radio.setRetries(15,15);
      radio.setPayloadSize(12);
      radio.enableAckPayload();
      radio.powerUp();
      radio.setDataRate(RF24_1MBPS);  
      radio.setPALevel(RF24_PA_LOW);
      radio.setCRCLength(RF24_CRC_8);
      radio.setAutoAck(1);              
     
      radio.openReadingPipe(1,readingPipe);
      radio.openWritingPipe(writingPipe);
      printf_begin();
      radio.printDetails();
      radio.startListening();            
    }

    void loop()
    {
      byte Carr = 0;
      Serial.print("Ch:" + ("00" + String(CHANNEL)).substring(("00" + String(CHANNEL)).length()-3,("00" + String(CHANNEL)).length()) + "_");
      for (int i = 0; i< TryCount; i++)
      {
        radio.setChannel(CHANNEL);
        radio.startListening();
        delayMicroseconds(128);
        if(radio.available()){
          radio.read( &in, sizeof(in) );
          Serial.print(in);Serial.print(" ");
        } else {
          Serial.print("X ");
        }
        radio.stopListening();
        if ( radio.testCarrier() ){
          Carr++;
        }
        delay(50);
      }
       Serial.print("C:" + String(Carr));
      if(CHANNEL%5==4){
        Serial.println();
      } else {
        Serial.print("  ");
      }
      if(CHANNEL>0x7F){
        CHANNEL = 0;
      } else {
        CHANNEL++;
      }
    }
    int serial_putc( char c, FILE * ) {
      Serial.write( c );
      return c;
    }

    void printf_begin(void) {
      fdevopen( &serial_putc, 0 );
    }
    Теперь кажет такое:
    upload_2016-3-29_12-23-46.png
    На канале 55 показал 2 несущих, но данных - нет. Странно.
     
  3. joman

    joman Гик

    Как я понимаю такая штука, это преобразователь 5В => 3В + конденсатор + диод для индикации работы, что эквивалентно отдельному (хорошему) 3В источнику + конденсатору.
     
  4. Roman16

    Roman16 Нуб

    да модули бесовские особенно в сочетании с различными бордами :)
    имеется: 4 модулей NRF24L01+ (чип SI24L1); 1модуль NRF24L01+SMA (чип NRF24L01+ "0" вместо буквы "М")
    ардуины: UNO, Leonardo, Nano.
    провода дюпон(!) у них контакт лучше, особенно с колодками на уно, мега, леонардо. + их можно группировать в 1 разъем заменив кучку одиночных на одну колодку.
    История: взял наны, подключил к ним модули залил тестовые скетчи - не работает :) все перепроверил, посмотрел библиотеку и посмотрел вывод printDetails - толку мало ну да вроде что-то похожее в регистрах. начал гуглить, нашел этот топик и припаял кондеры :) - не работает. залил тестовый скетч и начал наблюдать интересную картину похожую в сообщении только на каналах 0x05-0x13 (цифры 1,2,3), очень быстро выяснил что "несущие" принадлежали домашнему wifi роутеру без него вообще все по нулям, что само по себе странно, но теперь уже понятно что хоть приемная часть вроде как работает, хоть "несущую" видит. да все это было в связке в УНО, и каково же было мое удивление когда я увидел полностью зашумленные все 128 каналов после того как залил тестовый скетч в нану... :) пипец

    но самое смешное ни это, а то что так и не удалось запеленговать передатчик, даже powerup не помогает
     
  5. Aler

    Aler Нерд

    Могу лишь предложить свои простые скетчи, которые у меня заработали:
    Передатчик
    Код (C++):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <stdint.h>

    #define CE_PIN 7          
    #define CSN_PIN 8
    const uint64_t writingPipe = 0xE8E8F0F0AALL;
    int out = 556;

    RF24 radio(CE_PIN, CSN_PIN);

    void setup() {
        delay(2000);                      
        radio.begin();                      
        radio.setChannel(50);                  
        radio.setRetries(15,15);              
        radio.setDataRate(RF24_250KBPS);    
        radio.setPALevel(RF24_PA_HIGH);      
        radio.setAutoAck(1);                
        radio.openWritingPipe(writingPipe);  
                 
    }

    void loop()
    {
    radio.write( &out, sizeof(out) );
    delay(1000);
    }
    приемник
    Код (C++):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <stdint.h>

    #define CE_PIN 7        
    #define CSN_PIN 8
    const uint64_t readingPipe = 0xE8E8F0F0AALL;
    int in;

    RF24 radio(CE_PIN, CSN_PIN);

    void setup() {

       
         delay(2000);                  
         Serial.begin(9600);
         radio.begin();                    
         radio.setChannel(50);                
         radio.setRetries(15,15);            
         radio.setDataRate(RF24_250KBPS);    
         radio.setPALevel(RF24_PA_HIGH);      
         radio.setAutoAck(1);                
         radio.setPayloadSize(32);
         radio.openReadingPipe(1,readingPipe);
         radio.startListening();        
    }

    void loop()
    {
         int in;
        if ( radio.available() ){
            radio.read( &in, sizeof(in) );
            Serial.println(in);
        } else {
            Serial.println("Radio not available");
        }
        delay(1000);
    }
     
  6. joman

    joman Гик

    После перезагрузки пишет Radio not Avalible а потом -1 всё время
    upload_2016-3-30_10-22-22.png
    Поменял модули местами:
    upload_2016-3-30_10-24-59.png
    Странно всё это...
    Сканер - молчит
    В общем, что то мне подсказывает, что все 4 модуля из одной бракованной партии. Сегодня вечером возьму другие, и попробую еще раз.
     
    Последнее редактирование: 30 мар 2016
  7. Roman16

    Roman16 Нуб

    ЗАРАБОТАЛО!!! - сам дурак :)
    в общем проблема была в CE, который я по недосмотру повесил на RST разъема ISP, он только в UNO зашарен с "цифровым" выходам 10, отсюда кстати появился тот странный эффект по 100% зашумлению всех 128 каналов. так же из-за этого printDetails выводил преимущественно 0x7F по многим адресам на что я не сразу обратил внимание.

    да SPI очень не надежная вещь, точнее из-за множества соединительных проводов резко возрастает вероятность косяков и особенно нужно быть внимательным с контактами, лучше использовать дюпон кабели или припаивать. SPI не позволяет идентифицировать устройство и в принципе программа может работать и без подключения модуля выдавая забавные псевдо результаты. После того как все заработало, проверил все модули на исправность приемо/передающих частей, все норм, даже несмотря на то, что один из модулей был по другому недосмотру запитан от 5В.
    после проверки отпаял кондеры еще перепровелил все ок.
    потребление модуля в связке с бордой не превышало 80мА согласно USB вольт-/амперметру, хотя модуль передавал данные с интервалом 0,1сек.
    буду играться со скоростями/мощностью/трубами :)
     
  8. Roman16

    Roman16 Нуб

    а еще забыл сказать, модули запитывались через стабилизатор AMS1117-3.3 (подобные ставят на ардуинах), в свою очередь запитанные от 5В ардуины, штука тоже довольно капризная, несколько раз были ситуации, когда стабилизатор очень сильно нагревался при неизвестных обстоятельствах, вероятно статика, но после передергивания питания он продолжал нормально работать
     
  9. AlexAlex

    AlexAlex Нуб

    Привет всем я понимаю тема заезженная уже до дыр,но прошу помощи со скетчем. Собираю машинку для мелкого на джойстике использую 2 радиомод. nrf24l01+pa+lna (с wifi антенной которые)+nano,конденсаторы 470 мкФ 15v.вот скетч он не сложный,уже почти месяц потратил на связку модулей в ответ тишина....посмотрите пожалуйста может что то не так прописываю.
    Суть в чем 1 джостик 4 положения
    -езда вперед
    -езда назад
    -поворот влево
    -поворот вправо

    ПЕРЕДАТЧИК
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <RF24_config.h>

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

    RF24 radio(9,10);
    const uint64_t pipe = 0xE8E8F0F0AALL;
    int msg[1];
    int potpin_1 = A0;
    int val_1;
    int potpin_2 = A1;
    int val_2;

    void setup(void){
    radio.begin();
    radio.openWritingPipe(pipe);

    }
    void loop() {
    val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[0] = val_1,radio.write(msg, 1);
    val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 255),msg[0] = val_2,radio.write(msg, 1);

    ПРИЁМНИК
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <RF24_config.h>

    #include <Servo.h>
    #include <SPI.h>
    #include "RF24.h"
    Servo servo1;

    RF24 radio(9,10);
    const uint64_t pipe = 0xE8E8F0F0AALL;
    int msg[1];
    int data;
    int pos;
    int fspeed; // forward speed
    int bspeed; // backward speed
    const int in1 = 2; // direction pin 1
    const int in2 = 4; // direction pin 2
    const int ena = 5; // PWM pin to change speed

    void setup()
    {
    pinMode(in1, OUTPUT); // connection to L298n
    pinMode(in2, OUTPUT); // connection to L298n
    pinMode(ena, OUTPUT); // connection to L298n
    servo1.attach(3);
    delay(50);
    radio.begin();
    radio.openReadingPipe(1,pipe);
    radio.startListening();
    }

    void loop()
    {
    if (radio.available())radio.read(msg, 1);
    if (msg[0] <127 && msg[0] >-1)data = msg[0], pos = map(data, 0, 126, 7, 67),servo1.write(pos);
    if (msg[0] >=128 && msg[0] <=189)data = msg[0], bspeed = map(data, 255, 201, 0, 255), backward(bspeed);
    if (msg[0] >=201 && msg[0] <=255)data = msg[0], fspeed = map(data, 189, 128, 0, 255), forward(fspeed);
    if (msg[0] >190 && msg[0] <200)data = msg[0], stop();
    }

    void stop()
    {
    analogWrite(ena, 0);
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    }

    void forward(int fspeed)
    {
    digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    analogWrite(ena, fspeed);
    }

    void backward(int bspeed)
    {
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    analogWrite(ena, bspeed);
    }
     
  10. Aler

    Aler Нерд

    Код нужно спрятать в соответствующий тег. Если модули не стыкуются, стоит начать с простых пректов и отладить сначала приемопередачу. 470мкФ слишком много, нужно от 1 до 10.
    Сам переделываю аппаратуру управления для авто, ваш проект будет работать только с игрушкой.
     
  11. Oleg_7

    Oleg_7 Гик

    Добрый день! Удалось ли Вам наладить безперебойную работу модуля nrf с DUE ? у меня переодически программа виснет на строке

    radio.write( &t, sizeof(int) );
     
  12. radio.write( &t, sizeof(t) );
     
  13. Oleg_7

    Oleg_7 Гик

    Опечатался, прошу прощения... я так и делаю radio.write( &t, sizeof(t) );, и иногда зависает прям на этом участке... и толко на DUE виснет..... в чем может быть дело?
     
  14. Dixberdos

    Dixberdos Нуб

    Здравствуйте!! Никто не подскажет Есть китайские arduino nano на CH340 можно ли при внешнем питании (от батареек) одновременно подключать к USB?
     
  15. Aler

    Aler Нерд

    Подключаю одновременно на макетке и по юсб и через Vin.
     
  16. Dixberdos

    Dixberdos Нуб

    Ок Спасибо!!!
     
  17. AlexAlex

    AlexAlex Нуб

    constuint64_t pipe = 0xE8E8F0F0E1LL;// Определяем адрес рабочей трубы;
    вопрос по поводу этого адреса.....из скетча на первой страницы обратил внимание на такую строку (см. картинку)
    суть вопроса в чем;адрес должен быть какой мне выдает мой нрф или он любой я чтото не пойму...откуда берется этот адрес....
    . 0003.jpg
     
  18. Syberon

    Syberon Нерд

    Всем привет.

    Есть задача у меня связать два модуля (Mega и Nano) посредством модулей NRF24L01+. В принципе связь устанавливается и данные передаются, но есть один странный момент. Для того чтобы передать какой-либо пакет данных от передатчика к приемнику приходится отправлять его два раза. Вернее даже не так - чтобы пакет дошел, нужно предварительно отправить любой другой пакет.

    Выглядит это вот так:
    Код (C++):

    radio.write("1", 1);
    radio.write(&hello, sizeof(hello));
     
    Если я не отправлю первый пакет ("1" или любой другой символ/строку), то до приемника не доходит вообще ничего. В таком же варианте без каких либо перебоев всегда доходит вторая строка.

    Пробовал разные примеры из сети - везде получается такое поведение.

    В чем может быть проблема?

    Код передатчика:
    Код (C++):
    #include <SPI.h>
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <RF24_config.h>

    RF24 radio(9, 53);
    const uint64_t pipe = 0xE8E8F0F0E1LL;

    void setup(void) {
      Serial.begin(9600);
      radio.begin();
      radio.openWritingPipe(pipe);
    }
    void loop(void) {
      char hello[] = "A1A2A3A4";
      radio.write("1", 1);
      radio.write(&hello, sizeof(hello));
      delay(1000);
    }
    Код приемника:
    Код (C++):
    #include <nRF24L01.h>
    #include <RF24.h>
    #include <RF24_config.h>
    #include <SPI.h>


    RF24 radio(9, 10);
    const uint64_t pipe = 0xE8E8F0F0E1LL;

    int len=0;
    char gotmsg[10];

    void setup(void) {
      Serial.begin(9600);
      radio.begin();
      radio.openReadingPipe(1, pipe);
      radio.startListening();
    }
    void loop(void) {
      if (radio.available()){
        len = radio.getDynamicPayloadSize();
        radio.read( &gotmsg, len );  
        Serial.println(gotmsg);
      }

    }
     
  19. Syberon

    Syberon Нерд

    Блин, только написал сообщение и пришла мысль, а не проверить ли что за библиотека у меня используется. Скачал последнюю RF24 и проблема пропала)) Всё работает отлично.
     
  20. joman

    joman Гик

    Ура, победа!
    После подключения модулей через https://arduinobazar.ru/ethernet-gp...-kupit-arduino-moskva-peterburg-dyoshevo.html сканер сразу показал передачу на нормальных каналах (возле 5-го), до этого была чушь как на моих скриншотах вверху.

    Правда проблема с powerUp осталась: если убрать из loop() строки:
    Код (C++):
    radio.powerUp();
    delay(2);
    то сканер опять начинает молчать, так что строки пришлось оставить.
    После этого запустил вместо сканера чтение порта и заработало.
    Как оказалось, 2 из 4-х моделей оказались не много много не работающими, хорошо, что догадался переставлять, пока сканер не показал нормальную картину.