ARDUINO nrf24l01 двухсторонняя связь

09.08.2018
19
6
13
Анапа
#1
Есть Arduino 2шт.
Есть nrf24l01 2шт.
Есть дисплей 16х2
Одна ардуинка работает как пульт, другая на машинке р/у. Решил выводит напряжение аккума на экран в пульте.
Проблема в том, что везде говорят, но не рассказывают как сделать двустороннюю связь. В моем понимание, прием и передача должны работать по очереди.
То есть допустим каждые 2с приемник должен стать передатчиком и отправить сигнал. Но как получить этот сигнал на пульте?

// RX \\

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

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



byte recieved_data[4];
byte thr = 5;
byte thr1 = 6;
byte rudl = 3;
byte rudr = 2;

byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб

void setup() {

pinMode(thr, OUTPUT);
pinMode(thr1, OUTPUT);
pinMode(rudl, OUTPUT);
pinMode(rudr, OUTPUT);



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

radio.openReadingPipe(1, address[0]);
radio.openWritingPipe(address[0]); //ТУТ Я НЕ УВЕРЕН
radio.openReadingPipe(1, address[0]);
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)

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() {
volatile long timer = millis();
byte pipeNo, gotByte;
float voltage = (float)analogRead(0) / 1023 * 5;


while (millis() - timer < 2000) {
while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб
radio.read(&recieved_data, sizeof(recieved_data) );

analogWrite(thr, recieved_data[1]);
analogWrite(thr1, recieved_data[2]);
digitalWrite(rudr, recieved_data[3]);
digitalWrite(rudl, recieved_data[0]);

}
}
while (millis() - timer >2000) {
radio.write(&voltage,sizeof(voltage)); // И ТУТ ТОЖЕ
timer = millis();
}
}

// RX \\


// TX \\

#include <SPI.h> // библиотека для работы с шиной SPI
#include "nRF24L01.h" // библиотека радиомодуля
#include "RF24.h" // ещё библиотека радиомодуля

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

int a;
byte thr = 1;
byte rudr =2;
byte rudl = 3;

boolean flag;
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб
byte transmit_data[4]; // массив, хранящий передаваемые данные


void setup() {

pinMode(rudr, INPUT_PULLUP);
pinMode(rudl, INPUT_PULLUP);
Serial.begin(9600); //открываем порт для связи с ПК

radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1, address[0]); // ТУТ Я НЕ УВЕРЕН
// radio.openWritingPipe(address[0]);//хотим слушать трубу 0
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)

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() {
volatile long timer = millis();
byte pipeNo, gotByte;
float voltage;
transmit_data[1] = rev();
transmit_data[2] = drive();
transmit_data[3] = !digitalRead(rudl);
transmit_data[0] = !digitalRead(rudr);
Serial.println(voltage);
radio.write(&transmit_data, sizeof(transmit_data));


while (millis() - timer >2000) { // Вот тут полная непонятка
while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб
radio.read(&voltage, sizeof(voltage) );


}
}}


int drive(){
int f = map(analogRead(thr),520,1023,0,255);

if(f >= 25){
return f;
delay(50);
} else { return 0;}
}

int rev(){
int f = map(analogRead(thr),515,0,0,255);

if(f >= 25){
return f;
delay(50);
} else { return 0;}
}
// TX \\
 
Последнее редактирование:

Fleshdeck

Проходящий мимо
19.01.2019
151
34
28
Киев
#2
Для того что бы не морочить себе голову лучше возьми библиотеку RF24Network(https://howtomechatronics.com/tutor...eless-network-with-multiple-nrf24l01-modules/).
В примерах кода можно заметить что ардуинка постоянно шлёт инфу, и только при появлении инфы с другого модуля срабатывает цикл while, все работает очень быстро, мной проверено
 

Fleshdeck

Проходящий мимо
19.01.2019
151
34
28
Киев
#4

Старик Похабыч

Проходящий мимо
13.08.2019
261
51
28
Москва
#6
В примере от Гайвер на тест времени как раз 2унаправленная связь. приемник отправляет информацию в ответ на передачу. самый короткий пример что я видел. работает на 1 и 2 мегабодах