Проблемное поведение сервопривода с NRF24L01

julVern
Offline
Зарегистрирован: 11.02.2016

Добрый день, уважаемые ардуинщики. Осваиваю передачу данных по радиомодулю между двумя ардуино. Столкнулся с проблемой, над решением которой бьюсь уже не одну неделю.

Коротко по железу. Радиомодули подключены к адаптерам. Передающим устройством является NANO, принимающее UNO. К UNO подключен Мотор Шилд, к которому подключен один сервопривод. Управлени серво от джойстика(хотя и пробовал и потенциометр и кнопку). Питание на серво отдельное от 9v через понижающий модуль до 5 V (пробовал и через конденсаторы) Задача просто управлять сервой.

Суть проблемы в следующем. После загрузки скетчей, происходит вибрация сервопривода в такт пульсации светодиода на принимающей плате (RX). На команды джойстика сервопривод отвечает, если только есть delay в loop приемника. Причем заметил, что если ставить delay ниже 500, то серва виснет и не работает,В serial все ок показывает, данные по работе джойстика идут.

 

При  подключении моторчиков к мотор шилд такой проблемы нет, все работает.

Тестировал и кнопку,и джойстик,и потенциометр на одной только UNOбез модуля NRL24L01. Все работает идеально. Серво не пульсирует, не дергается. Сломал голову над догадками, подскажите пожалуйста где копать.

Скетч прилагаю. Помогите советом пожалуйста. Где искать проблему?

01 #include <Servo.h>
02  
03 #include <SPI.h>
04  
05 #include "RF24.h"
06 #include <AFMotor.h>
07 Servo myservo; //даём имена servo
08 RF24 radio(9,10);
09  
10 const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала
11  
12 int msg[1]; //переменная для приёма радио сигнала
13  
14 int data; //переменная для servo
15  
16 int pos;
17 void setup()
18  
19 {
20 Serial.begin(9600);
21  
22 myservo.attach(10);
23  
24  
25  
26 radio.begin();
27  
28 radio.openReadingPipe(1,pipe); // Открываем один из 6-ти каналов приема
29  
30 radio.startListening(); // Начинаем слушать эфир
31 }
32 void loop() {
33  
34 if (radio.available())radio.read(msg, 1);
35  
36 if (msg[0] <128 && msg[0] >-1)data = msg[0], pos = map(data, 0, 127, 7, 177),myservo.write(pos);
37  
38  
39 if (msg[0] >127 && msg[0] <255)data = msg[0], pos = map(data, 128, 254, 9, 177),myservo.write(pos);
40  
41  
42 Serial.println(pos);
43 delay(500);
44 }
01 #include <SPI.h>
02 #include "RF24.h" // Подключаем скачанную библиотеку RF24.
03 RF24 radio(9,10);
04 const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи
05 int msg[1]; //переменная для отправки радио сигнала
06 int potpin_1 = A1; // potentiometer
07  
08 int val_1;
09  
10 int potpin_2 = A2; // potentiometer 2
11  
12 int val_2;
13  
14 void setup(void){
15 pinMode(potpin_1, INPUT);
16 pinMode(potpin_2, INPUT);
17 radio.begin();
18  
19 radio.openWritingPipe(pipe); // Открываем канал передачи
20  
21 }
22  
23 void loop() {
24  
25 val_1 = analogRead(potpin_1),val_1 = map(val_1, 0, 1023, 0, 127),msg[0] = val_1,radio.write(msg, 1);
26  
27 val_2 = analogRead(potpin_2),val_2 = map(val_2, 0, 1023, 128, 255),msg[0] = val_2,radio.write(msg, 1);
28  
29 }

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

В приёмнике пин 10 используется и радио и сервой, в передатчике показания двух разных потенциометров пихаются в одну переменную. Может и ещё что есть.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kalapanga пишет:

В приёмнике пин 10 используется и радио и сервой, в передатчике показания двух разных потенциометров пихаются в одну переменную. 

В тесноте, да не в обиде.

julVern
Offline
Зарегистрирован: 11.02.2016

Хм, спасибо, в этом направлении я не направлял свои мысли. Поэксперементирую. Хотя в интеренете куча подобных проектов и нигде не встречал ничего похожего. 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Что, везде пихают два потенциометра в одну переменную и не парятся?

GarryC
Offline
Зарегистрирован: 08.08.2016

С передатчиком, наверное, нормально, там переменная в любом случае промежуточная (да их и две я вижу). Единственно, что я не понял, а зачем операторы через запятую писать?

А вот насчет того, что в приемнике одна нога используется дважды - тут вопрос, если вторая нога предназначена для передачи и не используется. то тогда фиг то с ней.

Ну и думаю, самое вероятное - если у Вас софтовый ШИМ, то он может давать бОльшие импульсы, если есть длинные прерывания от других источников - попробуйте аппаратный ШИМ, хотя обычно это не слишком часто происходит.

PS. У Вас значения с двух потенциометров бросаются в один ШИМ - это так и должно быть?

julVern
Offline
Зарегистрирован: 11.02.2016

Спасибо всем, кто ответил! Реально помогли ваши мысли расширить рамки поска проблемы. Очевидное было в том, что 10 и 9 пины для серво Мотор Шилд L293 и радиомодуль NRF использовали одновременно. Провел простой эксперимент и убрал из сборки этот Моро Шилд, подключив сервопривод к пину 7 на ардуино. Больше никаких дерганий сервы. Спасибо еще раз за вашу работу и мозговой штурм!!!