В статье рассмотрим работу с радиомодулями NRF24L01.
Ими удобно пользоваться для беспроводной передачи данных. В отличие от ИК приемник не обязан находиться в прямой видимости от передатчика и может работать через стены. Кстати, преимущество этих модулей в том, что каждый из них может выступать и в роли приемника и в роли передатчика.
Для работы вам понадобятся 2 модуля NRF24L01 и 2 Arduino.
У радиомодуля имеется 8 пинов.
Радиомодуль подключается по интерфейсу SPI, поэтому пины MISO, MOSI, SCK подключайте только к указанным портам.
Vcc -> 3,3 v
Gnd -> Gnd
CSN -> pin 8
CE -> pin 7
MOSI -> pin 11
MISO -> pin 12
SCK -> pin 13
IRQ оставляем неподключенным.
Для работы с данными радиомодулями понадобится библиотеку, скачать которую можно здесь. Как обычно, распакуйте ее в папку libraries.
Напишем простую программку, в которой передатчик будет отсылать количество прошедших с запуска секунд, а приемник будет принимать эти значения и выводить их на экран.
Код передатчика:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> // https://github.com/maniacbug/RF24 const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба" RF24 radio(7, 8); // CE, CSN int i = 0; void setup() { Serial.begin(9600); radio.begin(); delay(2); radio.setChannel(9); // канал (0-127) // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS // RF24_250KBPS на nRF24L01 (без +) не работает. // меньше скорость, выше чувствительность приемника. radio.setDataRate(RF24_1MBPS); // мощность передатчика, RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, radio.setPALevel(RF24_PA_HIGH); radio.openWritingPipe(pipe); // открываем трубу на передачу. } void loop() { radio.write(&i, sizeof(i)); // отправляем данные и указываем сколько байт пакет delay(1000); i++; } |
Код приемника:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> // https://github.com/maniacbug/RF24 const uint64_t pipe = 0xF0F1F2F3F4LL; // идентификатор передачи, "труба" RF24 radio(7, 8); // CE, CSN void setup() { Serial.begin(9600); radio.begin(); delay(2); radio.setChannel(9); // канал (0-127) // скорость, RF24_250KBPS, RF24_1MBPS или RF24_2MBPS // RF24_250KBPS на nRF24L01 (без +) не работает. // меньше скорость, выше чувствительность приемника. radio.setDataRate(RF24_1MBPS); // мощность передатчика RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, radio.setPALevel(RF24_PA_HIGH); radio.openReadingPipe(1, pipe); // открываем первую трубу с идентификатором "pipe" radio.startListening(); // включаем приемник, начинаем слушать трубу } void loop() { int data; if (radio.available()) { // проверяем не пришло ли чего в буфер. radio.read(&data, sizeof(data));// читаем данные, указываем сколько байт читать Serial.println(data); } } |
Не забудьте подключить приемник к компьютеру. Также, имейте в виду, что эти модули довольно капризные и запуститься могут не с первого раза. Кроме того, модули работали не на всех китайских аналогах Arduino.
Здравствуйте!!! В инете нашел вот этот вот скетч. Но не могу понять. Как к нему подключить джойстик ардуино? (с шим). Пробовал писать так: transmit_data[2] = map(analogRead(slider), 0, 1023,255,-255); но двигатель при движении джойстика в перед, разгонялся медленно(работал как надо), а при движении джойстика на зад……он был разогнан до предела, а потом останавливался(работал на оборот) Очень прошу Вас помоч мне разобраться с этим. Заранее большое спасибо!!! ПЕРЕДАТЧИК
#include
#include «nRF24L01.h»
#include «RF24.h»
RF24 radio(9, 10); // «создать» модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
byte address[][6] = {«1Node», «2Node», «3Node», «4Node», «5Node», «6Node»}; //возможные номера труб
byte button = 3; // кнопка на 3 цифровом
byte potent = 0; // потенциометр на 0 аналоговом
byte slider = 1; // движковый потенциометр на 1 аналоговом пине
byte transmit_data[3]; // массив, хранящий передаваемые данные
byte latest_data[3]; // массив, хранящий последние переданные данные
boolean flag; // флажок отправки данных
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
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(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.stopListening(); //не слушаем радиоэфир, мы передатчик
}
void loop() {
transmit_data[0] = !digitalRead(button); // инвертированный (!) сигнал с кнопки
transmit_data[1] = map(analogRead(potent), 0, 1023, 0, 180); // получить значение
// в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве
transmit_data[2] = map(analogRead(slider), 0, 1023,0,255);
for (int i = 0; i < 3; i++) { // в цикле от 0 до числа каналов
if (transmit_data != latest_data) { // если есть изменения в transmit_data
flag = 1; // поднять флаг отправки по радио
latest_data = transmit_data; // запомнить последнее изменение
}
}
if (flag == 1) {
radio.powerUp(); // включить передатчик
radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
flag = 0; //опустить флаг
radio.powerDown(); // выключить передатчик
}
}
ПРИЕМНИК (на тот случай, если я не там менял значения)
#include
#include «nRF24L01.h»
#include «RF24.h»
#include
RF24 radio(9, 10); // «создать» модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
byte recieved_data[3]; // массив принятых данных
byte relay = 2; // реле на 2 цифровом
byte servo = 3; // сервопривод на 3 цифровом
byte mosfet = 5; // мосфет на 5 цифровом (ТУТ ЕСТЬ ШИМ!!!)
Servo myservo;
byte address[][6] = {«1Node», «2Node», «3Node», «4Node», «5Node», «6Node»}; //возможные номера труб
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
pinMode(relay, OUTPUT); // настроить пин реле как выход
pinMode(mosfet, OUTPUT); // настроить пин мосфета как выход
myservo.attach(servo);
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1, 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() {
byte pipeNo;
while ( radio.available(&pipeNo)) { // слушаем эфир со всех труб
radio.read( &recieved_data, sizeof(recieved_data) ); // чиатем входящий сигнал
digitalWrite(relay, recieved_data[0]); // подать на реле сигнал с 0 места массива
//то бишь 0 или 1
myservo.write(recieved_data[1]); // повернуть серво на угол 0..180
// значение получено с 1 элемента массива
analogWrite(mosfet, recieved_data[2]); // подать на мосфет ШИМ сигнал
// в соответствии с принятыми данными со 2 места массива, диапазон 0…255
}
}
Вы передаете данные от -255 до 255, а принимающая сторона обрабатывает от 0 до 255 (последний analogWrite)
в скетче автора топика и в скетче алекса гайвера есть одна недоработка. Если ваша машинка ( или катер ) едет от вас и связь обрывается, то она не останавливается, едет и едет и едет … и ваш катер уплывает в турцию… мой так чуть не уплыл… но я на пруду был.:)
так вот. в приемнике после IF нужно поставить else {стоп машина}.
в скетче алекса просто цикл while заменить на if и также добавить else {стоп машина}
.
.
Думаю многим полезно будет !
а, забыл, перед стоп машина, паузу нужно 5-15 млс, знаю плохо это, но без этого не поедет вообще.
*else {delay 10; стоп ходовой двигатель}
Роман. А полностью скетч выложить можете? Я новичок в этом деле. И по этому не до конца понимаю то, что вы мне написали.
Олег, если брать код Гайвера, то вот приемник управление без шим :
#include
#include «nRF24L01.h»
#include «RF24.h»
#include
RF24 radio(9, 10);
byte recieved_data[11];
int AA1 = A0;
int AA2 = A1;
int BB1 = A2;
int BB2 = A3;
int led1=4;
int led2=5;
int led3=6;
int led4=7;
int sig =8;
Servo myservo;
Servo myservo1;
Servo myservo2;
Servo myservo3;
byte address[][6] = {«1Node», «2Node», «3Node», «4Node», «5Node», «6Node»};
void setup() {
Serial.begin(9600);
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(sig, OUTPUT);
pinMode(AA1, OUTPUT); // пин драйвера
pinMode(AA2, OUTPUT); // пин драйвера
pinMode(BB1, OUTPUT); // пин драйвера
pinMode(BB2, OUTPUT); // пин драйвера
myservo.attach(2); // серво пин 2
myservo1.attach(3); // серво пин 3
myservo2.attach(A4); // серво пин A4
myservo3.attach(A5); // серво пин A5
radio.begin(); //активировать модуль
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1, address[0]); //хотим слушать трубу 0
radio.setChannel(0x60); //выбираем канал (в котором нет шумов!)
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика.
radio.setDataRate (RF24_250KBPS); //скорость обмена.
radio.startListening(); //начинаем слушать эфир, мы приёмный модуль
}
void loop() {
byte pipeNo;
if ( radio.available(&pipeNo)) { // слушаем эфир со всех труб
radio.read( &recieved_data, sizeof(recieved_data) ); // чиатем входящий сигнал
digitalWrite(led4, LOW);
if ( recieved_data[1] >=0 && recieved_data[1] =70 && recieved_data[0] 70 && recieved_data[1] =0 && recieved_data[0] =70 && recieved_data[0] <=100 && recieved_data[1] =30)
{ line_speed();}
delay(1);
if (recieved_data[0] >=0 && recieved_data[0] <=30 && recieved_data[1] =30)
{ back_speed();}
delay(1);
if (recieved_data[0] >30 && recieved_data[0] =0 && recieved_data[1] =70 && recieved_data[1] <=100)
{ right_speed();}
delay(1);
myservo.write(recieved_data[4]); // повернуть серво на угол 0..180
myservo1.write(recieved_data[5]); // повернуть серво на угол 0..180
myservo2.write(recieved_data[2]); // potent0 на пульте
myservo3.write(recieved_data[3]); // potent1 на пульте
digitalWrite(led1, recieved_data[6]); // подать на реле сигнал с 0 места массива
digitalWrite(led2, recieved_data[7]); // подать на реле сигнал с 0 места массива
digitalWrite(led3, recieved_data[8]); // подать на реле сигнал с 0 места массива
//digitalWrite(led4, recieved_data[9]); // подать на реле сигнал с 0 места массива
digitalWrite(sig, recieved_data[10]); // подать на реле сигнал с 0 места массива
}
else{
delay(10);
digitalWrite(led4, HIGH);
delay(2);
digitalWrite (AA1, LOW);
digitalWrite (AA2, LOW);
digitalWrite (BB1, LOW);
digitalWrite (BB2, LOW);}
}
//***************************************
//_______движение и повороты__________________
//****************************************
void stop_speed(){
digitalWrite (AA1, LOW);
digitalWrite (AA2, LOW);
digitalWrite (BB1, LOW);
digitalWrite (BB2, LOW);
}
void left_speed(){
digitalWrite (AA1, HIGH);
digitalWrite (AA2, LOW);
digitalWrite (BB1, LOW);
digitalWrite (BB2, HIGH);
}
void right_speed(){
digitalWrite (AA1, LOW);
digitalWrite (AA2, HIGH);
digitalWrite (BB1, HIGH);
digitalWrite (BB2, LOW);
}
void back_speed(){
digitalWrite (AA1, HIGH);
digitalWrite (AA2, LOW);
digitalWrite (BB1, HIGH);
digitalWrite (BB2, LOW);
}
void line_speed(){
digitalWrite (AA1, LOW);
digitalWrite (AA2, HIGH);
digitalWrite (BB1, LOW);
digitalWrite (BB2, HIGH);
}
void left_line(){
digitalWrite (AA1, HIGH);
digitalWrite (AA2, LOW);
digitalWrite (BB1, LOW);
digitalWrite (BB2, LOW);
}
void right_line(){
digitalWrite (AA1, LOW);
digitalWrite (AA2, LOW);
digitalWrite (BB1, HIGH);
digitalWrite (BB2, LOW);
}
а вот передатчик :
#include
#include «nRF24L01.h»
#include «RF24.h»
RF24 radio(9, 10); // «создать» модуль на пинах 9 и 10 Для Уно
byte address[][6] = {«1Node», «2Node», «3Node», «4Node», «5Node», «6Node»};
byte button0 = 4;
byte button1 = 5;
byte button2 = 6;
byte button3 = 7;
byte button4 = 8;
byte JOY_X = A2; // джойстик на 2 аналоговом
byte JOY_Y = A3; // джойстик на 3 аналоговом
byte potent1 = A0; // потенциометр на 0 аналоговом
byte potent0 = A1; // потенциометр на 1 аналоговом
byte JOY2_X = A4; // джойстик на 4 аналоговом
byte JOY2_Y = A5; // джойстик на 5 аналоговом
byte transmit_data[11]; // массив, хранящий передаваемые данные
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
pinMode(button0, INPUT_PULLUP); // настроить пин кнопки
pinMode(button1, INPUT_PULLUP); // настроить пин кнопки
pinMode(button2, INPUT_PULLUP); // настроить пин кнопки
pinMode(button3, INPUT_PULLUP); // настроить пин кнопки
pinMode(button4, INPUT_PULLUP); // настроить пин кнопки
radio.begin(); //активировать модуль
radio.setPayloadSize(32); //размер пакета, в байтах
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); //скорость обмена.//должна быть одинакова на приёмнике и передатчике!
radio.powerUp(); //начать работу
radio.stopListening(); //не слушаем радиоэфир, мы передатчик
}
void loop() {
transmit_data[0] = map(analogRead(JOY_X), 0, 1023, 0, 100);
transmit_data[1] = map(analogRead(JOY_Y), 0, 1023, 0, 100);
transmit_data[2] = map(analogRead(potent0), 0, 1023, 0, 180);
transmit_data[3] = map(analogRead(potent1), 0, 1023, 0, 180);
transmit_data[4] = map(analogRead(JOY2_X), 0, 1023, 0, 180);
transmit_data[5] = map(analogRead(JOY2_Y), 0, 1023, 0, 180);
transmit_data[6] = !digitalRead(button0); // инвертированный (!) сигнал с кнопки
transmit_data[7] = !digitalRead(button1); // инвертированный (!) сигнал с кнопки
transmit_data[8] = !digitalRead(button2); // инвертированный (!) сигнал с кнопки
transmit_data[9] = !digitalRead(button3); // инвертированный (!) сигнал с кнопки
transmit_data[10] = !digitalRead(button4); // инвертированный (!) сигнал с кнопки
radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио
}
led4 в приемнике загорается, когда пропадает связь
А с шимом работает? Как это дописать в этом скетче? У Гайвера скетч был с флагом. Сдесь флаг дописать можно?
ПРИЕМНИК
#include
#include «nRF24L01.h»
#include «RF24.h»
#include
Servo myservo;
const uint64_t pipe = 0xE8E8F0F0E1LL;//byte address[][6] = {«1Node», «2Node», «3Node», «4Node», «5Node», «6Node»}; //возможные номера труб
RF24 radio(9, 10); // «создать» модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
int msg [1];
int data;
int pos;
//Y
int fspeed;
int bspeed;
const int in1 = 2;
const int in2 = 4;
const int ena = 5;
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(ena, OUTPUT);
myservo.attach(3);
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1, pipe ); //хотим слушать трубу 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() {
byte pipeNo;
if ( radio.available(&pipeNo)){radio.read(&msg , sizeof(msg ));
if ( msg [0] -1)data = msg [0], pos = map(data, 0, 126, 7, 177), myservo.write(pos);
if ( msg [0] > 129 && msg [0] 201 && msg [0] 190 && msg [0] < 200)data = msg [0], stop();
}
}
void stop() {
Serial.println("STOP!");
analogWrite(ena, 0);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
void forward(int fspeed)
{
Serial.print("FORWARD");
Serial.println("fspeed");
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(ena, fspeed);
}
// значение получено с 1 элемента массива
void backward (int bspeed)
{
Serial.print("BACWARD");
Serial.println("bspeed");
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(ena, fspeed);
}
ПЕРЕДАТЧИК
#include
#include «nRF24L01.h»
#include «RF24.h»
const uint64_t pipe=0xE8E8F0F0E1LL;
RF24 radio(9, 10); // «создать» модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
//byte address[][6] = {«1Node», «2Node», «3Node», «4Node», «5Node», «6Node»}; //возможные номера труб
//int msg [1];
//int potpin_1 = A1;
//int val_1;
//int potpin_2 = A0;
//int val_2;
//byte button = 3; // кнопка на 3 цифровом
int msg [1];
int potpin_1 = A1;//byte potent = A1; // потенциометр на 0 аналоговом
int val_1;
int potpin_2 = A0; // движковый потенциометр на 1 аналоговом пине
int val_2;
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15);
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openWritingPipe(pipe); //мы — труба 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.stopListening(); //не слушаем радиоэфир, мы передатчик
}
void loop() {radio.write(&msg, sizeof(msg));
val_1 = analogRead(potpin_1), val_1 = map(val_1, 0, 1023, 0, 127), msg [0] =
val_1, radio.write( msg, 1);
val_1 = analogRead (potpin_2), val_2 = map(val_2, 0, 1023, 128, 255), msg [0] =
val_2, radio.write( msg, 1);
}
не правильно написал
ПРИЕМНИК
#include
#include «nRF24L01.h»
#include «RF24.h»
#include
Servo myservo;
const uint64_t pipe = 0xE8E8F0F0E1LL;//byte address[][6] = {«1Node», «2Node», «3Node», «4Node», «5Node», «6Node»}; //возможные номера труб
RF24 radio(9, 10); // «создать» модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
int msg [1];
int data;
int pos;
//Y
int fspeed;
int bspeed;
const int in1 = 2;
const int in2 = 4;
const int ena = 5;
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(ena, OUTPUT);
myservo.attach(3);
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1, pipe ); //хотим слушать трубу 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() {
byte pipeNo;
if ( radio.available(&pipeNo)){radio.read(&msg , sizeof(msg ));
if ( msg [0] -1)data = msg [0], pos = map(data, 0, 126, 7, 177), myservo.write(pos);
if ( msg [0] > 129 && msg [0] 201 && msg [0] 190 && msg [0] < 200)data = msg [0], stop();
}
}
void stop() {
Serial.println("STOP!");
analogWrite(ena, 0);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
void forward(int fspeed)
{
Serial.print("FORWARD");
Serial.println("fspeed");
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(ena, fspeed);
}
// значение получено с 1 элемента массива
void backward (int bspeed)
{
Serial.print("BACWARD");
Serial.println("bspeed");
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(ena, fspeed);
}
ПЕРЕДАТЧИК
#include
#include «nRF24L01.h»
#include «RF24.h»
const uint64_t pipe=0xE8E8F0F0E1LL;
RF24 radio(9, 10); // «создать» модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
int msg [1];
int potpin_1 = A1;//byte potent = A1; // потенциометр на 0 аналоговом
int val_1;
int potpin_2 = A0; // движковый потенциометр на 1 аналоговом пине
int val_2;
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15);
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openWritingPipe(pipe); //мы — труба 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.stopListening(); //не слушаем радиоэфир, мы передатчик
}
void loop() {radio.write(&msg, sizeof(msg));
val_1 = analogRead(potpin_1), val_1 = map(val_1, 0, 1023, 0, 127), msg [0] =
val_1, radio.write( msg, 1);
val_1 = analogRead (potpin_2), val_2 = map(val_2, 0, 1023, 128, 255), msg [0] =
val_2, radio.write( msg, 1);
}
ДА КОПЕЦ БЛИН…..
приемник не весь копируется. пишу еще раз
#include
#include «nRF24L01.h»
#include «RF24.h»
#include
Servo myservo;
const uint64_t pipe = 0xE8E8F0F0E1LL;//byte address[][6] = {«1Node», «2Node», «3Node», «4Node», «5Node», «6Node»}; //возможные номера труб
RF24 radio(9, 10); // «создать» модуль на пинах 9 и 10 Для Уно
//RF24 radio(9,53); // для Меги
int msg [1];
int data;
int pos;
//Y
int fspeed;
int bspeed;
const int in1 = 2;
const int in2 = 4;
const int ena = 5;
void setup() {
Serial.begin(9600); //открываем порт для связи с ПК
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(ena, OUTPUT);
myservo.attach(3);
radio.begin(); //активировать модуль
radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1, pipe ); //хотим слушать трубу 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() {
byte pipeNo;
if ( radio.available(&pipeNo)){radio.read(&msg , sizeof(msg ));
if ( msg [0] -1)data = msg [0], pos = map(data, 0, 126, 7, 177), myservo.write(pos);
if ( msg [0] > 129 && msg [0] 201 && msg [0] 190 && msg [0] < 200)data = msg [0], stop();
}
}
void stop() {
Serial.println("STOP!");
analogWrite(ena, 0);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
}
void forward(int fspeed)
{
Serial.print("FORWARD");
Serial.println("fspeed");
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(ena, fspeed);
}
// значение получено с 1 элемента массива
void backward (int bspeed)
{
Serial.print("BACWARD");
Serial.println("bspeed");
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(ena, fspeed);
}
все равно loop() не копируется полностью копирую отдельно
void loop() {
byte pipeNo;
if ( radio.available(&pipeNo)){radio.read(&msg , sizeof(msg ));
if ( msg [0] -1)data = msg [0], pos = map(data, 0, 126, 7, 177), myservo.write(pos);
if ( msg [0] > 129 && msg [0] 201 && msg [0] 190 && msg [0] < 200)data = msg [0], stop();
}
}
аш бесит отправлю построчно
if ( msg [0] -1)data = msg [0], pos = map(data, 0, 126, 7, 177), myservo.write(pos);
короче с копированием здесь проблема. половину не копирует. просто ответь на вопрос. будет работать с шим? будет ли работать с флагом? как у гайвера