Проблема с модулем радиосвязи nrf24l01.
- Войдите на сайт для отправки комментариев
Вс, 03/12/2017 - 16:00
Доброго времени суток. Задача до боли проста: включение светодиода на одной 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 ); }
"Классику" изучали ? :)
https://www.youtube.com/watch?v=5eCb2Q3iVLY
https://www.youtube.com/watch?v=3-wqQu3AKh0
Спасибо, буду изучать.
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
}
Okmor, благодарю за помощь. Скетчи ещё не заливал. Есть вопрос, куда именно вы подсоединяли коненсатор на 220Мф?
Залил код на обе платы, всё замечательно работает. Буду разбираться с передачей данных с кнопки
Спасибо огромное за помощь, Okmor! Оказывается нужно было просто заменить
RF24 radio(9,10); на
RF24 radio(A0,A1);
Вопрос исчерпан!