Arduino + радиомодуль nrf24

ess.work@yandex.ru
Offline
Зарегистрирован: 06.11.2017

Есть задача - нужно передать команду (сейчас интересует просто факт передачи) с arduino №1 на arduino №2, используя радиомодуль nrf24, однако данные, например число типа int не передается.

Как делал : Arduino№1(Arduino UNO) и Arduino №2(Arduino UNO)соединил следующим образом c радиомодулем nrf24 № 1 и nrf24 №2 соответственно(т.е. Arduino№1(Arduino UNO) + nrf24 №1 и Arduino№2(Arduino UNO) + nrf24 №2):

GND - GND 

3V3 -  3V3

CE - 8

CSN - 7

SCK -  13

MOSI - 11

MISO - 12

Думаю, что радиомодули рабочие и соединил все правильно, т.к. при загрузке следующего кода: 

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

RF24 radio(8,7); // инициализировать модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53);// Для Меги

const uint8_t num_channels = 128;
uint8_t values[num_channels];
void setup(void)
{
  Serial.begin(9600);
  printf_begin();
  radio.begin();
  radio.setAutoAck(false);
  radio.startListening();

  radio.printDetails();  // Вот эта строка напечатает нам что-то, если все правильно соединили.
  delay(5000);              // И посмотрим на это пять секунд.

  radio.stopListening();
  int i = 0;    // А это напечатает нам заголовки всех 127 каналов
  while ( i < num_channels )  {
    printf("%x",i>>4);
    ++i;
  }
  printf("\n\r");
  i = 0;
  while ( i < num_channels ) {
    printf("%x",i&0xf);
    ++i;
  }
  printf("\n\r");
}
const int num_reps = 100;

void loop(void)
{
  memset(values,0,sizeof(values));
  int rep_counter = num_reps;
  while (rep_counter--) {
    int i = num_channels;
    while (i--) {
      radio.setChannel(i);
      radio.startListening();
      delayMicroseconds(128);
      radio.stopListening();
      if ( radio.testCarrier() )
        ++values[i];
    }
  }
  int i = 0;
  while ( i < num_channels ) {
    printf("%x",min(0xf,values[i]&0xf));
    ++i;
  }
  printf("\n\r");
}
int serial_putc( char c, FILE * ) {
  Serial.write( c );
  return c;
}

void printf_begin(void) {
  fdevopen( &serial_putc, 0 );
} 

Результат следующий:

Arduino №1 + nrf24 №1

 

 

Arduino №2 + nrf24 №2

ТЕПЕРЬ САМА ПРОБЛЕМА

Загружаю код на Arduino №1 



#include <SPI.h>
#include <RF24.h>
RF24 radio(8, 7); // можно использовать любые
const uint32_t pipe = 123456789; // адрес
byte massiv[1];

void setup()
{
  Serial.begin(9600);
  printf_begin();
  //radio.setAutoAck(false);
  radio.begin();
  radio.setDataRate(RF24_250KBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS
  radio.openWritingPipe(pipe); // открыть канал на отправку

  radio.printDetails();  // Вот эта строка напечатает нам что-то, если все правильно соединили.
  delay(5000);      
}


void loop()   
{
  massiv[0] = 255;
  radio.write(massiv, 1);
  Serial.println("Отправлено  ");
  Serial.println(massiv[0]);
  delay(500);
  massiv[0] = 155;
  radio.write(massiv, 1);
  Serial.println("Отправлено  ");
  Serial.println(massiv[0]);
  delay(500);
}


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

void printf_begin(void) {
  fdevopen( &serial_putc, 0 );
}

на Arduino №2

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

RF24 radio(8, 7);
const uint32_t pipe = 123456789;

byte massiv[4];

void setup(void)   
{
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  printf_begin();
  //radio.setAutoAck(false);
  radio.begin();
  radio.setDataRate(RF24_250KBPS); // RF24_1MBPS или RF24_2MBPS
  radio.openReadingPipe(0,pipe); // открыть канал на приём
  radio.startListening(); // приём

  radio.printDetails();  // Вот эта строка напечатает нам что-то, если все правильно соединили.
  delay(5000);      
}


void loop()  
{
  if(radio.available())
    {
      radio.read(massiv, 1);
      if(massiv[0] == 255)
        {
          Serial.println(massiv[0]); 
          digitalWrite(13, HIGH);
        }

      if(massiv[0] == 155)
        {
          Serial.println(massiv[0]); 
          digitalWrite(13, LOW);
        }        
     }
}


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

void printf_begin(void) {
  fdevopen( &serial_putc, 0 );
}

 

Результат следующий :

на Arduino №1 

на Arduino №2

Как видно на Arduino №2 нет принятых данных. В чем проблема не знаю. Если у кого есть какие-то предположения буду рад. Зарание спасибо.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Канал не указан по которому работаете. И посмотрите что написано про 0 в openReadingPipe https://maniacbug.github.io/RF24/classRF24.html

ess.work@yandex.ru
Offline
Зарегистрирован: 06.11.2017

Вроде я указал канал  const uint32_t pipe = 123456789; // адрес 

Я изменил трубу(канал) на   :

const uint32_t pipe = 0xF0F0F0F0AA; // адрес

на всякий случай.

Добавил строчку кода на приемной Arduino 

radio.stopListening(); // указал в явном виде тоже на всякий случай

И изменил openReadingPipe(0,pipe) на 1

radio.openReadingPipe(1,pipe); // открыть канал на приём.

Результата по прежнему нет.

Код получилсся следующий:


#include <SPI.h>
#include <RF24.h>
RF24 radio(8, 7); // можно использовать любые
const uint32_t pipe = 0xF0F0F0F0AA; // адрес
byte massiv[1];

void setup()
{
  Serial.begin(9600);
  printf_begin();
  //radio.setAutoAck(false);
  radio.begin();
  radio.setDataRate(RF24_250KBPS); // скорость обмена данными RF24_1MBPS или RF24_2MBPS
  radio.stopListening(); // указал в явном виде на всякий случай
  radio.openWritingPipe(pipe); // открыть канал на отправку

  radio.printDetails();  // Вот эта строка напечатает нам что-то, если все правильно соединили.
  delay(5000);      
}


void loop()   
{
  massiv[0] = 255;
  radio.write(massiv, 1);
  Serial.println("Отправлено  ");
  Serial.println(massiv[0]);
  delay(500);
  massiv[0] = 155;
  radio.write(massiv, 1);
  Serial.println("Отправлено  ");
  Serial.println(massiv[0]);
  delay(500);
}




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

void printf_begin(void) {
  fdevopen( &serial_putc, 0 );
}

 

И :

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

RF24 radio(8, 7);
const uint32_t pipe = 0xF0F0F0F0AA;

byte massiv[4];

void setup(void)   
{
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  printf_begin();
  //radio.setAutoAck(false);
  radio.begin();
  radio.setDataRate(RF24_250KBPS); // RF24_1MBPS или RF24_2MBPS
  radio.openReadingPipe(1,pipe); // открыть канал на приём
  radio.startListening(); // приём

  radio.printDetails();  // Вот эта строка напечатает нам что-то, если все правильно соединили.
  delay(5000);      
}


void loop()  
{
  if(radio.available())
    {
      radio.read(massiv, 1);
      if(massiv[0] == 255)
        {
          Serial.println(massiv[0]); 
          digitalWrite(13, HIGH);
        }

      if(massiv[0] == 155)
        {
          Serial.println(massiv[0]); 
          digitalWrite(13, LOW);
        }        
     }
}


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

void printf_begin(void) {
  fdevopen( &serial_putc, 0 );
}

 

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

В приемнике перед 30 строкой поставьте вывод в сериал, посмотрите что вообще что-то приходит, если приходит то уже надо смотреть что там рид принимает в качестве параметров.

b707
Offline
Зарегистрирован: 26.05.2017

ess.work@yandex.ru пишет:

Вроде я указал канал  const uint32_t pipe = 123456789; // адрес 

Это труба (pipe) , а не канал (channel) . Это разные вещи.

Канал устанавливается так: radio.setChannel(8);

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

Какое расстояние между модулями? - многие китайские NRF24 дальше 2-3х метров не работают.

ess.work@yandex.ru
Offline
Зарегистрирован: 06.11.2017

Условие radio.available(); не выполняется. т.е. приёма  данных нет вообще.

по поводу каналов вечером попробую, спасибо.

расстояние см 15 не больше.

ess.work@yandex.ru
Offline
Зарегистрирован: 06.11.2017

К слжалению, 

radio.setChannel(8);

Не помогло. 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Почитайте про setAutoAck, и о том, что на некоторых китайских nRF этот флаг имеет инвертированное значение. Инициализировать надо вообще всё. На амперке есть хорошая тема по nRF на форуме - лучше там почитайте, там уже все углы обоссаны не по одному разу.

ess.work@yandex.ru
Offline
Зарегистрирован: 06.11.2017

Спасибо, буду вникать