Проблема с модулем радиосвязи 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>04constuint64_t pipe= {0xF0F0F0F0E1LL};05RF24 radio(A0,A1);//Обратите внимание тут другое подключение06bytemessage = 1;07bytered;08unsignedlongCTime01;09unsignedlongLTime01;10voidsetup()11{12Serial.begin(9600);13radio.begin();14delay(100);15radio.enableDynamicPayloads();16radio.openReadingPipe(1,pipe);17radio.openWritingPipe(pipe);//Открывем трубу для отправки18radio.startListening();1920}21voidloop()22{23if( radio.available() ) {24radio.read( &red,sizeof(red) );25Serial.println(String(red));26};2728CTime01 = millis();29if(CTime01 >= (LTime01 +100))//Периодичность отправки пакетов30{31Serial.println("----------write------------");32radio.stopListening();//Перестаем слушать33radio.write(&message,sizeof(message));// Отправляем ответ34radio.startListening();35LTime01 = CTime01;36message++;37}38}Okmor, благодарю за помощь. Скетчи ещё не заливал. Есть вопрос, куда именно вы подсоединяли коненсатор на 220Мф?
Залил код на обе платы, всё замечательно работает. Буду разбираться с передачей данных с кнопки
Спасибо огромное за помощь, Okmor! Оказывается нужно было просто заменить
RF24 radio(9,10); наRF24 radio(A0,A1);Вопрос исчерпан!