Проблема с модулем радиосвязи nrf24l01.

Павел.Tech
Offline
Зарегистрирован: 20.02.2017

Доброго времени суток. Задача до боли проста: включение светодиода на одной Arduino, при нажатии кнопки на другой. В качестве приёма и предачи данных использую nrf24l01 без антенны (подключены напрямую с конденсатором на 0.47 мкФ на пинах питания). На передающей части кнопка подключена к 3 пину. На приёмной светодид 13 пина.
Код передающей части:



#include "nRF24L01.h" 
#include "RF24.h" 
RF24 radio(9, 10); // "создать" модуль на пинах 9 и 10 Для Уно
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte transmit_data[0]; // массив данных для передачи
byte button = 3; // кнопка
void setup() { 
  pinMode(button, INPUT_PULLUP); 
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0, 15);    //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openWritingPipe(address[0]);   //мы - труба 0, открываем канал для передачи данных
  radio.setChannel(0x6e);  //канал без шумов
  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
 
  radio.powerUp(); //начать работу
  radio.stopListening();  //не слушаем радиоэфир, мы передатчик
}

void loop() {
  transmit_data[0] = !digitalRead(button); // записываем данные с кнопки в массив для передачи
  radio.write(&transmit_data, sizeof(transmit_data)); // отправляем массив
  
  }

Код приёмной части:
 

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

RF24 radio(9,10); // "создать" модуль на пинах 9 и 10 Для Уно

byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"};  //возможные номера труб
byte recieved_data[0]; // массив для приёма данных
byte led = 13; // светодиод

void setup(){
  pinMode(led, OUTPUT);
  radio.begin(); //активировать модуль
  radio.setAutoAck(1);         //режим подтверждения приёма, 1 вкл 0 выкл
  radio.setRetries(0,15);     //(время между попыткой достучаться, число попыток)
  radio.enableAckPayload();    //разрешить отсылку данных в ответ на входящий сигнал
  radio.setPayloadSize(32);     //размер пакета, в байтах

  radio.openReadingPipe(1,address[0]);      //хотим слушать трубу 0
  radio.setChannel(0x6e);  //выбираем канал (в котором нет шумов!)

  radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика. На выбор RF24_PA_MIN, RF24_PA_LOW, RF24_PA_HIGH, RF24_PA_MAX
  radio.setDataRate (RF24_250KBPS); //скорость обмена. На выбор RF24_2MBPS, RF24_1MBPS, RF24_250KBPS
  //должна быть одинакова на приёмнике и передатчике!
  //при самой низкой скорости имеем самую высокую чувствительность и дальность!!
  
  radio.powerUp(); //начать работу
  radio.startListening();  //начинаем слушать эфир, мы приёмный модуль
}

void loop() { 
      if(radio.available()){                                      // если в буфере обмена есть изменения
      radio.read(&recieved_data, sizeof(recieved_data));         // чиатем входящий сигнал и записываем его в  массив recieved_data
      digitalWrite(led, recieved_data[0]);
      }
}

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

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

RF24 radio(9,10); // инициализировать модуль на пинах 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 );
}
trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
Павел.Tech
Offline
Зарегистрирован: 20.02.2017

Спасибо, буду изучать.

Okmor
Okmor аватар
Offline
Зарегистрирован: 16.10.2015
Для тестирования двусторонней передачи написал такой скетч.
Замечания:
1. У меня идентичные модули и потому частичная инициализация.
2. Пришлось припаять конденсатор 220Мф, а то без него UNO не хотел работать на прием.
3. Две линии перенес на А0 и А1.
Слушать через COM порт
 
Этот скетч надо залить без изменений на две Ардуинки.
01 #include<SPI.h>
02 #include<nRF24L01.h>
03 #include<RF24.h>
04 const uint64_t pipe= {0xF0F0F0F0E1LL};
05 RF24 radio(A0,A1); //Обратите внимание тут другое подключение
06 byte message = 1;
07 byte red;
08 unsigned long CTime01;
09 unsigned long LTime01;
10 void setup()
11 {
12   Serial.begin(9600);
13   radio.begin();
14   delay(100);
15   radio.enableDynamicPayloads();
16   radio.openReadingPipe(1,pipe);
17   radio.openWritingPipe(pipe); //Открывем трубу для отправки
18   radio.startListening();
19  
20 }
21 void loop()
22 {
23   if ( radio.available() ) {
24        radio.read( &red,sizeof(red) );
25        Serial.println(String(red));
26       };
27  
28     CTime01 = millis();
29     if (CTime01 >= (LTime01 +100)) //Периодичность отправки пакетов
30     {
31        Serial.println("----------write------------");
32        radio.stopListening();  //Перестаем слушать
33        radio.write(&message, sizeof(message)); // Отправляем ответ
34        radio.startListening();
35        LTime01 = CTime01;
36        message++;
37     }
38 }

 

 

Павел.Tech
Offline
Зарегистрирован: 20.02.2017

Okmor, благодарю за помощь. Скетчи ещё не заливал. Есть вопрос, куда именно вы подсоединяли коненсатор на 220Мф?

 

Павел.Tech
Offline
Зарегистрирован: 20.02.2017

Залил код на обе платы, всё замечательно работает. Буду разбираться с передачей данных с кнопки

 

Павел.Tech
Offline
Зарегистрирован: 20.02.2017

Спасибо огромное за помощь, Okmor! Оказывается нужно было просто заменить RF24 radio(9,10); на RF24 radio(A0,A1);
Вопрос исчерпан!