nrf24l01 radio.available() всегда true

S_o_l123
Offline
Зарегистрирован: 14.09.2014

Не могу понять что не так.

Arduino mini pro. Модуль nrf24l01. Код самый простой:

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
#include <printf.h>

// Your chosen radio CE,CS pins
RF24 radio(7,8);

uint64_t addresses[] = {0xABABABABABLL, 0xC3C3C3C3C3LL};

/****** Configure this for sender or receiver *****/
int send_role = 1;
int receive_role = 0;
boolean sender = receive_role; // Change this from 0 to 1 to switch between sending or receiving sketch

void setup() {
  
  Serial.begin(57600);
  radio.begin(); 
  
  if(sender == 0){
    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
    radio.startListening();
  }else{
    radio.openWritingPipe(addresses[0]);    //*Edit to correct address assignments
    radio.openReadingPipe(1,addresses[1]);
    radio.stopListening(); 
  }
  
  Serial.println("Setup complete");
}

char myArray[] = "This is not a test";

void loop() {
    
  if(sender == 0){
      if(radio.available()){
        char tmpArray[19];                                               // This generally should be the same size as the sending array
        radio.read(&tmpArray,sizeof(tmpArray));  // Reading 19 bytes of payload (18 characters + NULL character)
        Serial.println("data");                                   // Prints only the received characters because the array is NULL terminated        
      }    
  }else{  
      Serial.println("Sender loop start");
      bool ok = radio.write(&myArray,sizeof(myArray));
      if(ok){ Serial.println("Transfer OK");
      }else { Serial.println("Transfer Fail"); 
      }
      delay(1000);
      Serial.println("Send loop");
  }
}

 

Режим отправки вроде бы корректно отправляет ("Ок" и "Фейлед" если отключить получателя).

Но в логе получателя одни "data". Не могу понять почему radio.available всегда true :(

Подключение модуля согласно  картинкеКартинка

S_o_l123
Offline
Зарегистрирован: 14.09.2014

Библиотека ипользуется форк nrf24 maniacbug'а https://github.com/tmrh20/RF24

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

S_o_l123 пишет:

Библиотека ипользуется форк nrf24 maniacbug'а https://github.com/tmrh20/RF24


Он ее сто лет не обновляет. Нужно новые версии брать у других.

alexvs
Offline
Зарегистрирован: 22.07.2014

А Ардуина у Вас какая, 3,3V или 5V?

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

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

При каждом удачном принятие сообщения, в сериал порт приемника печатается "data".

Если передатчик отключите, у вас "data" писаться не будет...

И еще. У вас myArray - 18 байт, а tmpArray - 19 байт. Несостыковочка.

 

 

 

S_o_l123
Offline
Зарегистрирован: 14.09.2014

Puhlyaviy пишет:
Он ее сто лет не обновляет. Нужно новые версии брать у других.

:) Используется форк. Не оригинальная либа. Гляньте ссылочку.

S_o_l123
Offline
Зарегистрирован: 14.09.2014

roman2712@mail.ru пишет:

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

При каждом удачном принятие сообщения, в сериал порт приемника печатается "data".

Если передатчик отключите, у вас "data" писаться не будет...

И еще. У вас myArray - 18 байт, а tmpArray - 19 байт. Несостыковочка.


Этот код был приведен в качестве простейшего пример. Что касается 19 символа, то в комментариях кода указано, что 19-й символ NULL

radio.read(&tmpArray,sizeof(tmpArray));  // Reading 19 bytes of payload (18 characters + NULL character)

Проблема в том, что отсылка сигнала происходит раз в секунду, а radio.available() всегда true. То есть по теории (если я правильно понимаю логику) data должен выкидываться тоже раз в секунду (не чаще во всяком случае). А он выкидывает лог при каждой итерации loop. При этом выкидывает пустой (так как инициализированный массив пустой изначально). Может данные он и получает, но засечь это в сериал аутпуте не получилось (т.к. забивается пустотой).

S_o_l123
Offline
Зарегистрирован: 14.09.2014

alexvs пишет:

А Ардуина у Вас какая, 3,3V или 5V?

Arduino mini pro 3.3 mega328. Питание раздается правильно от отдельного 3.3в блока.

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

Логику правильно понимаете

Что вы имеете ввиду, когда говорите "При этом выкидывает пустой". В вашем скетче, когда выбрана роль приемника, он либо должен писать "data", либо вообще ничего не писать. От инициализации "массива" это не зависит.

Если код не полный, весь код приведите...

S_o_l123
Offline
Зарегистрирован: 14.09.2014

roman2712@mail.ru пишет:

Логику правильно понимаете

Что вы имеете ввиду, когда говорите "При этом выкидывает пустой". В вашем скетче, когда выбрана роль приемника, он либо должен писать "data", либо вообще ничего не писать. От инициализации "массива" это не зависит.

Если код не полный, весь код приведите...

Сожалею, что ввел в заблуждение. Изначально был вывод массива в сериал. Я заменил его выводом "data" когда понял, что забивающийся пустотой сериал не то что я ждал и хотел понять что там вообще происходит.

Тогда вопрос в силе. Куда смотреть? Код вроде простой, отправка работает (вроде), кривое подключение? Вечером попробую наверное инициализировать массив изначально и после read смотреть есть или нет изменения, но это только укажет на то есть ли получение вообще, на проблему с available == true оно не укажет.

S_o_l123
Offline
Зарегистрирован: 14.09.2014

Эксперименты результата не принесли.

      if(radio.available()){
        char tmpArray[19] = "aaaaaaaaaaaaaaaaaa";                                               // This generally should be the same size as the sending array
        Serial.println(tmpArray);
        radio.read(tmpArray,sizeof(tmpArray));  // Reading 19 bytes of payload (18 characters + NULL character)
        Serial.println("Received data");                                   // Prints only the received characters because the array is NULL terminated        
        delay(300);
        Serial.println(tmpArray);
      }    

Выдает:

"aaaaaaaaaaaaaaaaaa

Received data
 
"
Т.е. принятия нет, но массив сбрасывается.
Если никто с этой библиотекой не работает, может укажете еще какую-то? С простым примером. :(
Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Принятие есть просто у мини в память не лезет. Сделайте пересылку int и все будет работать.

S_o_l123
Offline
Зарегистрирован: 14.09.2014

Сделал пересылку трех интов, но это ничего не изменил. Сендер - отправляет раз в секунду, получатель - получает постоянно. Сендер отправляет "10,10,10", массив получатель всегда ноль.

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <RF24_config.h>
#include <printf.h>

// Your chosen radio CE,CS pins
RF24 radio(7,8);

uint64_t addresses[] = {0xABABABABABLL, 0xC3C3C3C3C3LL};

/****** Configure this for sender or receiver *****/
int send_role = 1;
int receive_role = 0;
boolean sender = send_role; // Change this from 0 to 1 to switch between sending or receiving sketch

void setup() {
  
  Serial.begin(57600);
  radio.begin(); 
  
  if(sender == 0){
    radio.openWritingPipe(addresses[1]);
    radio.openReadingPipe(1,addresses[0]);
    radio.startListening();
  }else{
    radio.openWritingPipe(addresses[0]);    //*Edit to correct address assignments
    radio.openReadingPipe(1,addresses[1]);
    radio.stopListening(); 
  }
  
  Serial.println("Setup complete");
}

int myArray[] = {10,10,10};

void loop() {
    
  if(sender == 0){
      if(radio.available()){
        int tmpArray[4] = {0,0,0};                                               // This generally should be the same size as the sending array
        Serial.println(tmpArray[0]);
        radio.read(&tmpArray,sizeof(tmpArray));  // Reading 19 bytes of payload (18 characters + NULL character)
        Serial.println("Received data");                                   // Prints only the received characters because the array is NULL terminated        
        delay(300);
        Serial.println(tmpArray[0]);
      }    
  }else{  
      Serial.println("Sender loop start");
      bool ok = radio.write(&myArray,sizeof(myArray));
      if(ok){ 
        Serial.println("Transfer OK");
        Serial.println(myArray[0]);
      }else { Serial.println("Transfer Fail"); 
      }
      delay(1000);
      Serial.println("Send loop");
  }
}

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Я популярно обьясняю для невежд.
Пошлите просто int. Не масив, не пачку и не полный совок блох. А один, отдельный int.

roman2712@mail.ru
Offline
Зарегистрирован: 16.01.2014

на самом деле код верный... проверте подключение... или модуль... может сам модуль сума так сходит...

пример pingpair.pde из библиотеки rf24 у вас работает ? 

trembo
trembo аватар
Онлайн
Зарегистрирован: 08.04.2011

Кондёры на пины питания  НРФ напаяли?

http://i61.tinypic.com/2rc75zn.jpg

http://forum.arduino.cc/index.php?PHPSESSID=i94m7u66j8vcri8m1t9ej77bl5&t...

 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Да не в кондерах дело. А в памяти и разрядности. Кривости некоторых вариантов библиотек. Мы когда мини и это радио использовали, тоже такое имели, но было лень разбирается и тупо переделали все посылки через int.

trembo
trembo аватар
Онлайн
Зарегистрирован: 08.04.2011

С кондёров надо начинать.

Это закон: купил НРФ- запаяй кондёр! 

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

S_o_l123
Offline
Зарегистрирован: 14.09.2014

Извиняюсь за задержку с ответом. Проблема решена.

Большое спасибо trembo за напоминание о питании. nrfl питалась от vcc mini pro, коий при подключении к программатору выдавал 5в, вместо положенных 3.3. Проверил тестером. :( Вторая нрфл корректно питалась от 3.3 источника и поэтому была активной.

Второе спасибо уходит roman2712@ma который напомнил мне про тестовую программу в библиотеке. Собственно именно после того, как эта тестовая программа выдала нули по адресам нрфл, я и понял, что нрфл не видится и косяки в подключении.

Почетное третье спасибо Puhlyaviy за участие :)

P.S. Интересно, что рабочая (автономно питающаяся нрфл) все таки выдавала "ОК" на отправку, что наталкивало на мысли, что проблема в коде. Так как при отключении второй нрфл от сети отправка начинала давать "Fail". А radio.available() == true вызывало мысли о багах где-то в другом месте.

P.P.S. Пошел распаковывать bluetoth HC-05 :)

выручил GettingStarted из библиотеки (форк nrf24). Код приводить не буду. Вот линк https://github.com/stanleyseow/RF24/blob/master/examples/GettingStarted/GettingStarted.ino

ardu11
Offline
Зарегистрирован: 16.11.2018

Пчему же при отключенном передатчике available приемника тараторит true? Почему возятся с этим аурдино? Кругом глюки