Вот программа передатчика:
#include <SPI.h> // библиотека для работы с шиной SPI
#include "nRF24L01.h" // библиотека радиомодуля
#include "RF24.h" // ещё библиотека радиомодуля
RF24 radio(9, 10);
byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера каналов
int transmit_data[6];
int xPin = A0; //1 джойстик
int yPin = A1; //1 джойстик
int x1Pin = A2;//2 джойстик
int y1Pin = A3; //2 джойстик
int x2Pin = A4;//3 джойстик
int y2Pin = A5; //3 джойстик
int D2 = 2; //светодиод
void setup() {
radio.begin(); //активировать модуль
radio.setAutoAck(0); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0, 0); //время между попыткой достучаться, число попыток
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openWritingPipe(address[0]); //мы нулевой канал, открываем канал для передачи данных
radio.setChannel(0x60); //выбираем канал
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика
radio.setDataRate (RF24_1MBPS); //скорость обмена. Скорость должна быть одинакова на приёмнике и передатчике
radio.powerUp(); //начать работу
radio.stopListening(); //не слушаем радиоэфир, мы передатчик
pinMode(xPin, INPUT);
pinMode(yPin, INPUT);
pinMode(x1Pin, INPUT);
pinMode(y1Pin, INPUT);
pinMode(x2Pin, INPUT);
pinMode(y2Pin, INPUT);
pinMode(D2, OUTPUT);
}
void loop() {
digitalWrite(D2, HIGH);
transmit_data[0] = map(analogRead(xPin), 0, 1035, 0, 510); // изменяем значение из 1024 в 510 для управления движения (ШИМ)
transmit_data[1] = map(analogRead(yPin), 0, 1023, 0, 510);
transmit_data[2] = analogRead (x1Pin);
transmit_data[3] = analogRead (y1Pin);
transmit_data[4] = analogRead (x2Pin);
transmit_data[5] = analogRead (y2Pin);
radio.write(&transmit_data, sizeof(transmit_data)); //отправляем получившийся массив
}
А вот приемника:
#include <SPI.h>
#include "nRF24L01.h"
#include "RF24.h"
#include <Servo.h>
Servo servo1, servo2, servo3, servo4;
RF24 radio(9,10);
byte address[][6] = {"1Node","2Node","3Node","4Node","5Node","6Node"}; //возможные номера каналов
int recieved_data[6];
int ENA = 5;
int in1 = 7;
int in2 = 4;
int ENB = 6;
int degree1 = 0; // DEL SERVO 1 DEGREES
int degree2 = 0; // DEL SERVO 2 DEGREES
int degree3 = 0; // DEL SERVO 1 DEGREES
int degree4 = 0; // DEL SERVO 2 DEGREES
void setup(){
pinMode(ENA, OUTPUT);
pinMode(ENB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
servo1.attach (8);
servo2.attach (3);
servo3.attach (2);
servo4.attach (A5);
radio.begin(); //активировать модуль
radio.setAutoAck(0); //режим подтверждения приёма, 1 вкл 0 выкл
radio.setRetries(0,15); //(время между попыткой достучаться, число попыток)
radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал
radio.setPayloadSize(32); //размер пакета, в байтах
radio.openReadingPipe(1,address[0]); //хотим слушать нулевой канал
radio.setChannel(0x60); //выбираем канал
radio.setPALevel (RF24_PA_MAX); //уровень мощности передатчика.
radio.setDataRate (RF24_1MBPS); //скорость обмена
radio.powerUp(); //начать работу
radio.startListening(); //начинаем слушать эфир, мы приёмный модуль
}
void loop() {
byte pipeNo;
while( radio.available(&pipeNo)){ // слушаем эфир со всех каналов
radio.read( &recieved_data, sizeof(recieved_data) ); //читаем присланный массив
if (recieved_data[1] > 255){
analogWrite(ENA, recieved_data[1] - 255);
analogWrite(ENB, recieved_data[1] - 255);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
//digitalWrite(in3, HIGH);
//digitalWrite(in4, LOW);
} else if (recieved_data[1] < 255)
{ analogWrite(ENA, 255-recieved_data[1]);
analogWrite(ENB, 255-recieved_data[1]);
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
}
else if (recieved_data[0] > 255){
analogWrite(ENB, recieved_data[0] - 255);
digitalWrite(in2, HIGH);
digitalWrite(in1, LOW);
}
else if (recieved_data[0] < 255){
analogWrite(ENA, 255 - recieved_data[0]);
digitalWrite(in2, LOW);
digitalWrite(in1, HIGH);
}
else if (recieved_data[0]==255 && recieved_data[1]==255){
digitalWrite(in2, LOW);
digitalWrite(in1, LOW);
delay(10);
}
// INCREASE MOTOR1 DEGREES
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
if ( (recieved_data[2] > 550 ) && (recieved_data[2] <= 1023) ) // INCREASE DEGREES WHEN THE X-AXIS READING IS HIGHER THAN 550
{
degree1 = degree1 + 1;
}
// DECREASE MOTOR1 DEGREES
if ( (recieved_data[2] >= 0 ) && (recieved_data[2] < 480 )) // DECREASE DEGREES WHEN THE X-AXIS READING IS LOWER THAN 480
{
degree1 = degree1 - 1;
}
else // KEEP THE DEGREE VALUE STABLE MEANWHILE YOU ARE NOT USING THE JOYSTICK
{
degree1 = degree1;
}
// INCREASE MOTOR 2 DEGREES
if ( (recieved_data[3] > 550 ) && (recieved_data[3] <= 1023) ) // INCREASE THE DEGREES WHEN THE X-AXIS READING IS HIGHER THAN 550
{
degree2 = degree2 + 1;
}
// DECREASE MOTOR 2 DEGREES
if ( (recieved_data[3] >= 0 ) && (recieved_data[3] < 480) ) // DECREASE THE DEGREES WHEN THE X-AXIS READING IS LOWER THAN 480
{
degree2 = degree2 - 1;
}
else // KEEP THE DEGREE VALUE STABLE MEANWHILE YOU ARE NOT USING THE JOYSTICK
{
degree2 = degree2;
}
/////////////////////////////////////////////////////////////////////////////
if ( (recieved_data[4] > 550 ) && (recieved_data[4] <= 1023) ) // INCREASE DEGREES WHEN THE X-AXIS READING IS HIGHER THAN 550
{
degree3 = degree3 + 1;
}
// DECREASE MOTOR1 DEGREES
if ( (recieved_data[4] >= 0 ) && (recieved_data[4] < 480 )) // DECREASE DEGREES WHEN THE X-AXIS READING IS LOWER THAN 480
{
degree3 = degree3 - 1;
}
else // KEEP THE DEGREE VALUE STABLE MEANWHILE YOU ARE NOT USING THE JOYSTICK
{
degree3 = degree3;
}
// INCREASE MOTOR 2 DEGREES
if ( (recieved_data[5] > 550 ) && (recieved_data[5] <= 1023) ) // INCREASE THE DEGREES WHEN THE X-AXIS READING IS HIGHER THAN 550
{
degree4 = degree4 + 1;
}
// DECREASE MOTOR 2 DEGREES
if ( (recieved_data[5] >= 0 ) && (recieved_data[5] < 480) ) // DECREASE THE DEGREES WHEN THE X-AXIS READING IS LOWER THAN 480
{
degree4 = degree4 - 1;
}
else // KEEP THE DEGREE VALUE STABLE MEANWHILE YOU ARE NOT USING THE JOYSTICK
{
degree4 = degree4;
}
/////////////////////////////////////////////////////////////////////////////
servo1.write (degree1); // SEND THE DEGREES TO SERVO 1
servo2.write (degree2); // SEND THE DEGREES TO SERVO 2
servo3.write (degree3); // SEND THE DEGREES TO SERVO 1
servo4.write (degree4); // SEND THE DEGREES TO SERVO 2
delay (15);
}
}
Для экономии места я убрал все отступления. Заранее извиняюсь за код если кому будет глаза резать.
Теперь о проблемах с которыми я столкнулся:
Значение на джойстиках было никак не 0 - 1024. На каждом джойстике было разное. По этому с помощью функции map значение переводились не совсем корректно и достаточно плавного изменения скорости я не добился. Так же я не решил проблему с питанием. Запитал устройство от блока питания на 12 v через драйвер двигателя, с 12 вольт подключил так же Ардуино. Далее с клеммы 5 v отдельно подключил 4 серво. Так же у меня не хватало пинов чтобы управлять серво. Насколько я понял что серво ими лучше управлять через пины в которых есть шим но большинство пинов было занято радиомодулем и драйвером. При таком подключении все работало и потом узнал что аналоговые пины тоже можно использовать как цифровые. Серво в итоге пульсировали хотя контакты я припаял напрямую к плате. Если подскажете в чем проблема то буду очень благодарен. Ну и в конце демонстрация того что получилось.