НС-12 + сервопривод
- Войдите на сайт для отправки комментариев
Здравствуйте, я делаю радиоуправляемую игрушку, в ней есть несколько сервоприводов и мотор, управление пытаюсь осуществлять с помощью двух модулей HC-12
в процессе я столкнулся с проблемой
данные передаю в следующем формате
134 285 374 418 596 ...
где в разряде сотен номер управляемого прибора а десятки и единицы это самоуправление от 00 до 99
+ в конце передачи контрольный подсчет общей суммы чисел команд, для непринятия команд если в передаче ошибка
суть проблемы в следующем
при управлении мотором всё работает хорошо, есть небольшая задержка но с этим видимо ничего не поделать
а вот при управлении сервоприводом - беда
он работает как угодно но не так как нужно, крутится, дергается когда захочет
я подозреваю, что при передечи данных от HC-12 к ардуино как то задействован таймер, и при управлении сервоприводом задействован таймер. Получается какой то конфликт.
Это всё с одним сервоприводом.
Кроме вопроса как победить эту проблему есть вопрос в продолжение, не будут ли мешать друг другу несколько сервоприводов работающих параллельно но независимо друг от друга, подключенных к одной ардуине
Если кто то может помочь, буду очень благодарен.
Схему подключения и скетч в студию!
Servo.h вроде как конфликтует с SoftwareSerial.
Здравствуйте, немного отвлекся
схема думаю не понадобится, там всё просто и понятно
а код вот
передатчик
#include <SoftwareSerial.h> SoftwareSerial mySerial(2, 3); //RX, TX long int Speed; long int J_X; long int J_Y; long int knopka; int pin_Speed = A3; int pin_J_X = A1; int pin_J_Y = A2; int pin_knopka = 12; long int out; void setup() { mySerial.begin(9600); Serial.begin(9600); pinMode(pin_knopka, INPUT); } void loop() { Speed = analogRead(pin_Speed); Speed = map(Speed, 0, 1023, 10, 99); Speed = constrain(Speed, 10, 99); J_X = analogRead(pin_J_X); J_X = map(J_X, 0, 1023, 10, 99); J_X = constrain(J_X, 10, 99); J_Y = analogRead(pin_J_Y); J_Y = map(J_Y, 0, 1023, 10, 99); J_Y = constrain(J_Y, 10, 99); if(digitalRead(pin_knopka) == 0){ knopka = 99;} else{ knopka = 10; } J_X = J_X * 100; J_Y = J_Y * 10000; knopka = knopka * 1000000; out = knopka + J_X + J_Y + Speed; mySerial.println(out); Serial.println(out); delay(100); }приемник
#include <SoftwareSerial.h> #include <Servo.h> SoftwareSerial mySerial(2, 3); // RX, TX long int Speed; long int J_X; long int J_Y; long int knopka; int shim = 9; long int razchet; int razchet2; Servo servo; int servo_pin = 5; long int in; void setup() { pinMode(shim, OUTPUT); mySerial.begin(9600); servo.attach(servo_pin); Serial.begin(9600); } void loop() { if(mySerial.parseInt() > 10000000 && mySerial.parseInt() < 100000000) in = mySerial.parseInt(); razchet = in; //Serial.println(in); Speed = ((razchet % 100)-10)*2.86; razchet = razchet / 100; J_X = razchet % 100; razchet = razchet / 100; J_Y = razchet % 100; razchet = razchet / 100; knopka = razchet % 100; analogWrite(shim, Speed); //Serial.println(Speed); razchet2 = (J_X - 10) * (180 / 89); servo.write(razchet2); Serial.println(razchet2); mySerial.flush(); //delay(20);//delay little for better serial communication }у меня тоже есть подозрение, что происходит конфликт библиотек
подскажите есть решение которое не будет конфликтовать?
конфликт библиотек тут не причем, способ передачи данных кривой... но еще куда ни шло... А вот способ приема абсолютно нерабочий.
В строчке 27 вы дважды вызываете mySerial.parseInt(), явно не подозревая, что эта функция при чтении очищает Сериал. То есть до строчки 28 (где вы эту функцию вызываете в третий раз, хотя никаких данных в порту давно нет) - никакие числа, принятые в строке 27 - дойти не могут В ПРИНЦИПЕ.
Вместо этого при каждом обращении mySerial.parseInt() вы читаете новую посылку от передачика - с соответвующей задержкей. И при этом ваши проверки на диапазон в строке 27 оказываются абсолютно бесполезны. потому что в строке 28 вы читаете в переменную out совершенно новые данные, которые вполне могут не соответвовать условиям проверки в строке выше.
согласен, не корректно написал
поправил так
void loop() { data = mySerial.parseInt(); if(data > 10000000 && data < 100000000) in = data; razchet = in;но это не решило главную проблему, серво дергается
подключена библиотека SoftwareSerial
вот, что про нее пишут
SoftwareSerial при приеме/отправке байта глобально запрещает прерывания, чтобы гарантировать корректные тайминги. Но это так же и замораживает все таймеры, на которых базируется библиотека Servo.
Вы писали, что можно подключить HC-12 без этой библиотеки, можете дать пример кода и схему куда подключать ноги
У вас на приемнике (там где сервы) на аппаратный Сериал что-нибудь подключено?
всё!! получилось!
подключил без библиотеки.
b707 - большое Спасибо!
всё!! получилось!
подключил без библиотеки.
ну и отлично :)
не прошло и года :)
У меня такой же вопрос но я в этом не разбираюсь, скажите кто может помочь ?
Изложите вопрос, иначе ответов не дождетесь.
А если вопрос - "такой же", то воспользуйтесь "таким же ответом" :)
Задача с помощью hc 12 подключить серво привод
Простите, так дело не пойдет. Я из вас подробности вытягивать не собираюсь.
Если хотите разобраться сами - в сообщении #3 этой ветки есть почти готовый код, чуть ниже написано, как его исправить, чтоб заработало. У автора исходного сообщения все получилось.
А если надо, чтобы все сделали за вас - я вам отписал в платном разделе.
Подскажите как перейти в платный раздел ?
да вы уже там были, даже тему свою создали :)
http://arduino.ru/forum/ishchu-ispolnitelya/pomogite-modul-hc-12-podklyuchit-k-servoprivodu