Не получается управлять серво приводом
- Войдите на сайт для отправки комментариев
Втр, 15/02/2022 - 11:00
Серво привод как то странно дёргается в момент простоя. Так всё вроде бы работает , может кто знает как убрать эти подёргивания :
#include <Servo.h>
#include <IBusBM.h>
Servo myservo;
IBusBM ibus;
int val;
int readChannel(byte channelInput, int minLimit, int maxLimit, int defaultValue) {
uint16_t ch = ibus.readChannel(channelInput);
if (ch < 100) return defaultValue;
return map(ch, 1000, 2000, minLimit, maxLimit);
}
bool readSwitch(byte channelInput, bool defaultValue) {
int intDefaultValue = (defaultValue) ? 100 : 0;
int ch = readChannel(channelInput, 0, 100, intDefaultValue);
return (ch > 50);
}
void setup() {
myservo.attach(3);
Serial.begin(115200);
ibus.begin(Serial1);
}
void loop() {
val = readChannel(9, -100, 100, 0);
val = map(val, -100, 100, 0, 180);
myservo.write(val);
Serial.println(readChannel(9, -100, 100, 0));
delay(100);
}
вот собственно видео поведения
https://cloud.mail.ru/public/htJS%2FDSYa845Gc
Попробуй убрать из кода вывод в сериал.
Так а значения-то какие печатает в этот момент - одно и то же или разные?
Только отладочная печать (строка 31) не совсем корректна. Т.к. в 28 и 31 строках формально могут быть прочитаны разные значения. Выводить в монитор нужно val, который передаётся серве.
Серво привод как то странно дёргается в момент простоя. Так всё вроде бы работает , может кто знает как убрать эти подёргивания :
Вывести в сериал val. Если оно не меняется, то подергивания действительно "странные". Если val меняется соразмерно подергиваниям, то странного нет, надо разбираться, почему val меняется.
П.С. kalapanga уже ответил
С Servo.h дерганья происходят по одной причине - что-то блокирует прерывания.
Нормальные подергивания для дешевого серво, подключенного соплями.
стандартно с канала должно прилетать по IBUS от 1000 до 2000, у тебя откуда такие значения?
со всеми сервами такое, причём если работать ток с сервой то всё норм
https://cloud.mail.ru/public/cYF4%2FzBhdpFChr если смотреть порт то val стоит на месте , но если померять напряжение то она скачет как и серва https://cloud.mail.ru/public/P9hL%2FydGgHs626
Ты пробовал все что связано с Serial комментировать или нет?
Для наглядности:
#include <Servo.h> #include <IBusBM.h> Servo myservo; IBusBM ibus; int val; int readChannel(byte channelInput, int minLimit, int maxLimit, int defaultValue) { uint16_t ch = ibus.readChannel(channelInput); if (ch < 100) return defaultValue; return map(ch, 1000, 2000, minLimit, maxLimit); } bool readSwitch(byte channelInput, bool defaultValue) { int intDefaultValue = (defaultValue) ? 100 : 0; int ch = readChannel(channelInput, 0, 100, intDefaultValue); return (ch > 50); } void setup() { myservo.attach(3); ibus.begin(Serial1); } void loop() { val = readChannel(9, -100, 100, 0); val = map(val, -100, 100, 0, 180); myservo.write(val); delay(100); }тоже самое .. не могу понять в чём дело. мне там чел написал что нужно не давать сервоприводу команду поворота выполнять , но естественно поможет мне он это сделать за бабло =).. вот думаю сам , наверняка пустяк какой то
https://cloud.mail.ru/public/pmx9%2FhvtxXob9f бред какой то происходит
тож самое
Попробуй в коде жестко задать какое-либо значение val.
Чо там в итоге то?
тоже самое, даже если val жёстко задаёшь,.. заметил пока пульт не включен , рывков нет , как только пульт включаешь и начинается дёргание...
Тогда у меня сильное подозрение, что библиотеки конфликтуют (используют одни и те же ресурсы мк одновременно). Изначально я на сериал «грешил», но похоже дело в ibusbm.
вот что обнаружил
https://cloud.mail.ru/public/icd2%2FUB1viutSQ
А я не понял - что это за значения и в чем вообще суть видео?
это вот это , почему значения скачат от + до - непонятно , нужно ток одно верхнее, почему появляется нижнее с - нусом
Ну может быть переполнение, но я не разбирался в вопросе - просто как предположение.
вам sadman41 четко сказал причину в #4, вы сидите дальше гадаете.
разбираюсь с максимальной возможностью моих мозгов , вы уж извините,.. с ардуино ковыряюсь всего пару дней, тяжело как то понять что к чему при наличии столько блин всего =(((
Сколько всего планируется Серво, и какая Ардуина?
3 сервы. Плата Leonardo. Но впринципи есть и уно и нано и Мега
вот более просто код
#include <IBusBM.h> #include <Servo.h> IBusBM IBus; // IBus object Servo myservo; // create servo object to control a servo void setup() { IBus.begin(Serial1); // iBUS object connected to serial0 RX pin myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop() { int val; val = IBus.readChannel(1); // get latest value for servo channel 1 myservo.writeMicroseconds(val); // sets the servo position delay(20); }всё равно дёргается =((( задрала уже
а не подключая IBUS моросит?
нет
на этом скетче всё шикарно, приёмник по IBUS не подключен
#include <IBusBM.h> #include <Servo.h> IBusBM IBus; // IBus object Servo myservo; // create servo object to control a servo void setup() { IBus.begin(Serial); // iBUS object connected to serial0 RX pin myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop() { int val = 1500; val = IBus.readChannel(1); // get latest value for servo channel 1 myservo.writeMicroseconds(val); // sets the servo position delay(2000); val = 1000; myservo.writeMicroseconds(val); // sets the servo position delay(2000); val = 2000; myservo.writeMicroseconds(val); // sets the servo position delay(2000); }ну серва крутится , скачков нет
Что проверить возможное влияние блокировки прерываний, надо или запустить IBusBM в не блокирующем режиме, или использовать Servo не на прерываниях а на PWM
Т.к. я не знаю проверенной библиотеки Servo на PWM то проще начать с IBusBM
#include <IBusBM.h> #include <Servo.h> IBusBM IBus; // IBus object Servo myservo; // create servo object to control a servo void setup() { //IBus.begin(Serial1); // iBUS object connected to serial0 RX pin IBus.begin(Serial1, IBUSBM_NOTIMER); myservo.attach(9); // attaches the servo on pin 9 to the servo object } void loop() { IBus.loop(); int val; val = IBus.readChannel(1); // get latest value for servo channel 1 myservo.writeMicroseconds(val); // sets the servo position //delay(20); delay(1); }███╗███╗███╗███╗█╗█╗████╗███╗
█╔═╝█╔█║█╔█║█╔═╝█║█║█╔══╝█╔█║
█║──█║█║███║█║──█║█║████╗█║█║
█║──█║█║█╔█║█║──█║█║█╔═█║█║█║
███╗█║█║█║█║███╗███║████║███║
╚══╝╚╝╚╝╚╝╚╝╚══╝╚══╝╚═══╝╚══╝
Работает идеально =))))