Вопросы по NRF24L01

Tsepa

✩✩✩✩✩✩✩
22 Июн 2019
18
1
Написал скетч для передачи,и для принятие сигнала.Все компилируется,вроде как все должно работать,но увы не работает,реле работают,нрф модуля тоже,подключено все правильно,пробовал делать передачу сигнала через комп порт,все работает,а вот через джойстик не как,может у кого-то есть скетч готовый,посмотреть что да как,или же может кто-то разобраться в моем,помочь?!

Там еще написан код для сервы,но то не нужно разбирать,только для моторчиков,а моторчики ездят с помощью реле модуля
 

Вложения

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
Не особо вникая в код, вот что нашёл компилятор в "строгом режиме":
строка 55: сравнение указателя с числом (даже если тебе это ни о чём не говорит, присмотрись к этой строке)
строки 69-71: результат constrain-а не используется. constrain не меняет переменную в первом параметре, он возвращает новое, ограниченное, значение.
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
@Пожилой транзистор 1990, странный вывод...
constrain это функция, она возвращает значение. В приведенном скетче (RX1231.ino) значение, возвращаемое функцией constrain никуда не записывается, т.е. её можно смело стереть и работа скетча не изменится. Если автор так и хотел, то всё норм, а если он думал, что строчка
C:
constrain(x, 0, 180);
ограничит значение переменной x диапазоном от 0 до 180, то он не понимает как работают функции.
 

Tsepa

✩✩✩✩✩✩✩
22 Июн 2019
18
1
Это команда чисто для сервопривода,чтобы задать угол,но на прием/передачу данных она не как не влияет,в чем заключается проблема,прием/передача данных не работает?!
 

Tsepa

✩✩✩✩✩✩✩
22 Июн 2019
18
1
В том прикол что данные не принимаются, сейчас кину скриншот,что выводится в компорт
 

Tsepa

✩✩✩✩✩✩✩
22 Июн 2019
18
1
Я погонял,через компорт нрф все получают,все передают,а вот через джойстики не как
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
@Tsepa, ок, значит сами приемо-передатчики работают.

Почитал код твоих скетчей, ошибку вижу, вот тебе наводящие вопросы:
- что возвращает функция sizeof(xxx)? В случае если xxx int. А если int*? А если int[123]?
- что ожидает метод radio.write в первом и втором параметрах? И то же для radio.read
 

Tsepa

✩✩✩✩✩✩✩
22 Июн 2019
18
1
-Ну функция sizeof вычисляет размер массива в байтах,я так понял её не хватает в моем коде.
А что значит ***int и int*,int[123]?
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
@Tsepa, нет, sizeof не вычисляет размер массива в байтах, почитай документацию.
Ну и по указателям в Си почитай чего-нибудь.
 

Tsepa

✩✩✩✩✩✩✩
22 Июн 2019
18
1
Оператор sizeof возвращает количество байт, занимаемых типом переменной, либо количество байт, занимаемых массивом
 

Tsepa

✩✩✩✩✩✩✩
22 Июн 2019
18
1
а что в моем случае?нужно вставить эту функцию в код,я так понимаю
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
@Tsepa, не, мои претензии вообще не в тему, дело в чем-то другом.
Попробуй в скетче передатчика radio.openWritingPipe(address[0]); заменить на radio.openWritingPipe(0xE8E8F0F0E1LL);
и в приемнике соответственно radio.openReadingPipe(1, address[0]); заменить на radio.openReadingPipe(1, 0xE8E8F0F0E1LL);

И скажи, какой пример у тебя работает.
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
@Tsepa, тогда следующая догадка. Добавь в инициализацию радио
C:
  radio.begin();
  radio.setAutoAck(1);// <-- добавь вот эту строчку
  radio.enableAckPayload(); // ну и эту тоже можно
  radio.setRetries(0,15); // да и эта лишней не будет
 

Tsepa

✩✩✩✩✩✩✩
22 Июн 2019
18
1
Вставил все также,не хочет

Может ли быть дело,в отсутствие преобразователя на нрф,и кондеров на питании?
 

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
207
@Tsepa, но при этом примеры работают? Сомнительно. У меня пока больше идей нет, разве что взять готовый пример и по шагам переделывать его в нужный тебе код, на каждом шаге проверяя, не сломалось ли
 

Tsepa

✩✩✩✩✩✩✩
22 Июн 2019
18
1
Я уже думаю вообще съездить на радиорынок,купить драйвер для моторчиков и передалать полностью,ладно буду дальше бороться.спасибо
 

neonid

✩✩✩✩✩✩✩
9 Авг 2018
18
6
Анапа
Есть 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 \\
 
Изменено:
  • Лойс +1
Реакции: Drimmer

Fleshdeck

★★★✩✩✩✩
19 Янв 2019
349
174
Киев
Для того что бы не морочить себе голову лучше возьми библиотеку RF24Network(https://howtomechatronics.com/tutor...eless-network-with-multiple-nrf24l01-modules/).
В примерах кода можно заметить что ардуинка постоянно шлёт инфу, и только при появлении инфы с другого модуля срабатывает цикл while, все работает очень быстро, мной проверено