Есть скеч для танка, но он поворачивает одной гусиницей, а нужно двумя. Передачик: Код (C++): #include <SPI.h> #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"}; //возможные номера труб #define aX A0 #define aY A1 #define aX1 A5 boolean butt_flag = 0; // часть обработки значения с кнопки (начало) boolean butt; boolean led_flag = 0; unsigned long last_press; unsigned long last_press1; boolean butt_flag2 = 0; boolean butt2; boolean led_flag2 = 0; // часть обработки значения с кнопки (конец) byte B2; // переменая хранящая значения кнопки byte x; //переменая для направления вращения гусеницы byte x1; //переменая для направления вращения гусеницы byte y; //переменая для направления вращения гусеницы byte y1; //переменая для направления вращения гусеницы int BL; //переменая для направления вращения башни int BR; //переменая для направления вращения башни int aBL; int aBR; int ENA; //переменая для хранения величини скорости мотора правой гусеницы int ENB; //переменая для хранения величини скорости мотора правой гусеницы boolean butt_flag1 = 0; boolean butt1; boolean led_flag1 = 0; byte transmit_data[8]; // массив, хранящий передаваемые данные byte latest_data[8];// массив, хранящий последние переданные данные boolean flag; // флажок отправки данных void setup() { Serial.begin(9600); pinMode(17, INPUT_PULLUP); pinMode(18, INPUT_PULLUP); pinMode(15, 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() { butt = !digitalRead(17); //кнопка смени режима butt1 = !digitalRead(18); // кнопка поворота башни влево butt2 = !digitalRead(15); // кнопка поворота башни вправо int Xa = analogRead(aX); //читаем значение из оси джостика int Ya = analogRead(aY); //читаем значение из оси джостика int X1a = analogRead(aX1); //читаем значение из оси джостика int X; int Y; int X1; int R; X = map(Xa, 0, 1023, 0, 510); constrain(X, 0, 510); Y = map(Ya, 0, 1023, 0, 510); constrain(Y, 0, 510); X1 = map(X1a, 0, 1023, 0, 510); constrain(X1, 0, 510); ////////////////////////////////////////////////////////////////////////////////////// if (butt == 1 && butt_flag == 0 && millis() - last_press > 50) { butt_flag = 1; B2 = !B2; last_press = millis(); // смена режима из одной } // оси (джостика), на другую if (butt == 0 && butt_flag == 1) { // X1 или X butt_flag = 0; } if(B2 == 1) { R = X1; } //тут можно поменять перемение Х и Х1 на которое будет if(B2 == 0) { R = X; } //менятся (замикатся) переменая R // R = Х или R = X1 /////////////////////////////////////////////////////////////////////////////////// if (butt1 == 1 && butt_flag1 == 0 && millis() - last_press > 50) { butt_flag1 = 1; aBL = 1; aBR = 0; last_press = millis(); // поворот башни влево } if (butt1 == 0 && butt_flag1 == 1) { butt_flag1 = 0; aBL = 0; } /////////////////////////////////////////////////////////////////////////////////// if (butt2 == 1 && butt_flag2 == 0 && millis() - last_press1 > 50) { butt_flag2 = 1; aBR = 1; aBL = 0; last_press = millis(); // поворот башни вправо } if (butt2 == 0 && butt_flag2 == 1) { butt_flag2 = 0; aBR = 0; } /////////////////////////////////////////////////////////////////////////////////// Serial.print("A X "); // Вывод даних в монитор порта ПК по оси Х Serial.print(X); Serial.print(" A Y "); // по оси Y Serial.print(Y); Serial.print(" A X1 "); // по оси Х1 Serial.print(X1); Serial.print(" ENA "); // значение переменой ENA (правой гусеници) Serial.print(ENA); Serial.print(" ENB "); // значение переменой ENВ (левой гусеници) Serial.print(ENB); Serial.print(" BR "); // включен ли мотор башни в правую сторону Serial.print(aBR); Serial.print(" BL "); // включен ли мотор башни в левую сторону Serial.println(aBL); int abc; int z; if( R > 300) // танк едет вперед { x=1; x1=0; y=1; y1=0; ENA = R-255; ENB = R-255; int abc = R-255; int z = 0; } if( R < 200 ) // танк едет назад { x=0; x1=1; y=0; y1=1; ENA = 255-R; ENB = 255-R; int abc = 0; int z = 205-R; } if(R < 300 && R > 200) // танк стоит { x=0; x1=0; y=0; y1=0; ENA = 0; ENB = 0; int abc = 0; int z = 0; } /////////////////////////////////////////////////////// if(Y > 300 && R > 350) //влево, во время движения танка вперед { x=1; x1=0; y=0; y1=0; ENA + abc; } if(Y > 300 && R < 350 && R > 150) //влево, когда танк стоит на месте { x=1; x1=0; y=0; y1=0; ENA = Y-255; } if(Y > 300 && R < 150) // влево, если танк едет назад { x=0; x1=1; y=0; y1=0; ENA - z; } ////////////////////////////////////////////////////////// if(Y < 200 && R > 350) //вправо, во время движения танка вперед { x=0; x1=0; y=1; y1=0; ENB + abc; } if(Y < 200 && R < 350 && R > 150) //вправо, когда танк стоит на месте { x=0; x1=0; y=1; y1=0; ENB = 255-Y; } if(Y < 200 && R < 150) // вправо, если танк едет назад { x=0; x1=0; y=0; y1=1; ENB - z; } //////////////////////////////////////////////////////////////// transmit_data[0] = x ; //2 in1 transmit_data[1] = x1 ; //3 in2 transmit_data[2] = y ; //4 in3 transmit_data[3] = y1 ; //7 in4 transmit_data[4] = ENA ; //5 ENA transmit_data[5] = ENB; //6 ENB transmit_data[6] = aBR; //8 transmit_data[7] = aBL; //0 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// for (int i = 0; i < 8 ; i++) { // в цикле от 0 до числа каналов if (transmit_data[i] != latest_data[i]) { // если есть изменения в transmit_data flag = 1; // поднять флаг отправки по радио latest_data[i] = transmit_data[i]; // запомнить последнее изменение } } if (flag == 1) { radio.powerUp(); // включить передатчик radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио flag = 0; //опустить флаг radio.powerDown(); // выключить передатчик }}
Приёмник: Код (C++): #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9, 10); byte recieved_data[8]; // массив принятых данных #define in1 15 // номер 2 порта ардуино, который подключать надо к драйверу #define in2 16 // номер 3 порта ардуино, который подключать надо к драйверу #define in3 17 // номер 4 порта ардуино, который подключать надо к драйверу #define in4 18 // номер 7 порта ардуино, который подключать надо к драйверу #define ENA 3 // номер 5 порта ардуино, который подключать надо к драйверу #define ENB 5 // номер 6 порта ардуино, который подключать надо к драйверу #define BL 8 // номер 8 порта ардуино, который подключать надо к драйверу #define BR 0 // номер 0 порта ардуино, который подключать надо к драйверу byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб void setup() { pinMode(in1, OUTPUT); // к пину in1 драйвера L298N pinMode(in2, OUTPUT); // к пину in2 драйвера L298N pinMode(in3, OUTPUT); // к пину in3 драйвера L298N pinMode(in4, OUTPUT); // к пину in4 драйвера L298N pinMode(ENA, OUTPUT); // к пину ENA драйвера L298N pinMode(ENB, OUTPUT); // к пину ENB драйвера L298N pinMode(BL, OUTPUT); // к пину 1 драйвера для башни pinMode(BR, OUTPUT); // к пину 2 драйвера для башни 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(in1, recieved_data[0]); //pin 2 in1 digitalWrite(in2, recieved_data[1]); //pin 3 in2 digitalWrite(in3, recieved_data[2]); //pin 4 in3 digitalWrite(in4, recieved_data[3]); //pin 7 in4 analogWrite(ENA , recieved_data[4]); //pin 5 ENA analogWrite(ENB, recieved_data[5]); //pin 6 ENB digitalWrite(BL, recieved_data[6]); //pin 8 к драйверу мотора для башни 1 digitalWrite(BR, recieved_data[7]); //pin 0 к драйверу мотора для башни 2 }}