Проблемное поведение сервопривода с NRF24L01
- Войдите на сайт для отправки комментариев
Добрый день, уважаемые ардуинщики. Осваиваю передачу данных по радиомодулю между двумя ардуино. Столкнулся с проблемой, над решением которой бьюсь уже не одну неделю.
Коротко по железу. Радиомодули подключены к адаптерам. Передающим устройством является 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 |
} |
В приёмнике пин 10 используется и радио и сервой, в передатчике показания двух разных потенциометров пихаются в одну переменную. Может и ещё что есть.
В приёмнике пин 10 используется и радио и сервой, в передатчике показания двух разных потенциометров пихаются в одну переменную.
В тесноте, да не в обиде.
Хм, спасибо, в этом направлении я не направлял свои мысли. Поэксперементирую. Хотя в интеренете куча подобных проектов и нигде не встречал ничего похожего.
Что, везде пихают два потенциометра в одну переменную и не парятся?
С передатчиком, наверное, нормально, там переменная в любом случае промежуточная (да их и две я вижу). Единственно, что я не понял, а зачем операторы через запятую писать?
А вот насчет того, что в приемнике одна нога используется дважды - тут вопрос, если вторая нога предназначена для передачи и не используется. то тогда фиг то с ней.
Ну и думаю, самое вероятное - если у Вас софтовый ШИМ, то он может давать бОльшие импульсы, если есть длинные прерывания от других источников - попробуйте аппаратный ШИМ, хотя обычно это не слишком часто происходит.
PS. У Вас значения с двух потенциометров бросаются в один ШИМ - это так и должно быть?
Спасибо всем, кто ответил! Реально помогли ваши мысли расширить рамки поска проблемы. Очевидное было в том, что 10 и 9 пины для серво Мотор Шилд L293 и радиомодуль NRF использовали одновременно. Провел простой эксперимент и убрал из сборки этот Моро Шилд, подключив сервопривод к пину 7 на ардуино. Больше никаких дерганий сервы. Спасибо еще раз за вашу работу и мозговой штурм!!!