Управление двумя сервами через nRF24L01+
- Войдите на сайт для отправки комментариев
Сб, 08/07/2017 - 14:43
Всем привет!
Задача - управлять двумя сервами, через nRF24L01+ посредствам двух потенциометров.
Спаял всё правельно, протестировал проверочным скетчем, передатчик цифры отправляет, приёмник принемает без ошибок, всё хорошо. А с сервами работать не хочет( Подскажите пожалуйста, где ошибка..
Передатчик: #include <SPI.h> #include "nRF24L01.h" #include "RF24.h" RF24 radio(9, 10); // byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб byte potent0 = 0; // потенциометр на 0 аналоговом byte potent1 = 1; // byte transmit_data[2]; // массив, хранящий передаваемые данные byte latest_data[2]; // массив, хранящий последние переданные данные boolean flag; // флажок отправки данных void setup() { Serial.begin(9600); //открываем порт для связи с ПК radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openWritingPipe(address[0]); //мы - труба 0, открываем канал для передачи данных radio.setChannel(0x5f); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_LOW); //уровень мощности передатчика. На выбор 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[1] = map(analogRead(potent1), 0, 1023, 0, 180); // получить значение // в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве transmit_data[0] = map(analogRead(potent0), 0, 1023, 0, 180); for (int i = 0; i < 3; 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(); // выключить передатчик } }
Приёмник:
#include <SPI.h> #include "nRF24L01.h" #include "RF24.h" #include <Servo.h> RF24 radio(9, 10); // byte recieved_data[2]; // массив принятых данных byte servo = 3; // сервопривод на 3 цифровом byte servo2 = 5; // Servo myservo; byte address[][6] = {"1Node", "2Node", "3Node", "4Node", "5Node", "6Node"}; //возможные номера труб void setup() { Serial.begin(9600); //открываем порт для связи с ПК myservo.attach(servo); myservo.attach(servo2); radio.begin(); //активировать модуль radio.setAutoAck(1); //режим подтверждения приёма, 1 вкл 0 выкл radio.setRetries(0, 15); //(время между попыткой достучаться, число попыток) radio.enableAckPayload(); //разрешить отсылку данных в ответ на входящий сигнал radio.setPayloadSize(32); //размер пакета, в байтах radio.openReadingPipe(1, address[0]); //хотим слушать трубу 0 radio.setChannel(0x5f); //выбираем канал (в котором нет шумов!) radio.setPALevel (RF24_PA_LOW); //уровень мощности передатчика. На выбор 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) ); // чиатем входящий сигнал //то бишь 0 или 1 myservo.write(recieved_data[1]); // повернуть серво на угол 0..180 // значение получено с 1 элемента массива myservo.write(recieved_data[2]); // подать на мосфет ШИМ сигнал // в соответствии с принятыми данными со 2 места массива, диапазон 0...180 } }
Женя7777777, решили проблему? Я предполагаю что у вас не передаются данные потому что в коде передатчика 12 и 13 строки ардуина понимает как цифровые входы.
Замените их на следующие:
Думаю что должно заработать. Я не спец в програмировании может там еще что в коде не так, но это первое что бросилось мне в глаза.