Дребезг при работе сервомашинки
- Войдите на сайт для отправки комментариев
И вновь проблемма. Задача прежняя. Две сервомашинки отрабатывают по очереди. Управляю ими с помощью ардуино уно. Ардуно запитанно напрямую от аккумулятора Li ION 7.4 В 1400 мАч. От этого же аккумулятора через стабилизатор L7805 запитанны машинки. При работе программы сервомашинка отрабатывающая горизонталь чудит. А именно при работе вертикальной сервомашинки, горизонтальная дребезжит (дергается) хотя управляющего на ней нет. Система таким макаром с дребезжащей горизонталью отрабатывает четверть цикла и уходит в разнос. Сервы вращаются нерперывно вобщем колапс. Думал дело в питании, но вертикальная сервушка работает на ура а горизонталь чудит. Менял сервушки менял плату результат тот же. От совета товарища maksim не откажусь. Программа ниже:
#include <Servo.h> Servo myservov; // создаём объект для контроля сервы (вертикаль) Servo myservog; // создаём объект для контроля сервы (горизонталь) int posv = 0; // переменная для хранения позиции сервы (вертикаль) int posg = 0; // переменная для хранения позиции сервы (горизонталь) int PhotoPin=9; // переменная для фотопина void setup() { myservog.attach(6); // серва горизонтали подключена у 6-му пину myservov.attach(8); // серва вертикали подключена у 7-му пину pinMode(PhotoPin, OUTPUT); // девятый пин на выход (управление фото) pinMode (13, OUTPUT); /////////////////////установки при включении////////////////////// delay(5000); // задержка при включении ///////////////////////главный цикл///////////////////////////////// myservog.write(10); // горизонтальную серву повернули на 10 градусов delay(1000); // ждем 1 с vertical(); ////////////////////////////////////////////////////////////////// myservog.write(20); // горизонтальную серву повернули на 20 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(30); // горизонтальную серву повернули на 30 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(40); // горизонтальную серву повернули на 40 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(50); // горизонтальную серву повернули на 50 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(60); // горизонтальную серву повернули на 60 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(70); // горизонтальную серву повернули на 70 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(80); // горизонтальную серву повернули на 80 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(90); // горизонтальную серву повернули на 90 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(100); // горизонтальную серву повернули на 100 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(110); // горизонтальную серву повернули на 110 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(120); // горизонтальную серву повернули на 120 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(130); // горизонтальную серву повернули на 130 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(140); // горизонтальную серву повернули на 140 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(150); // горизонтальную серву повернули на 150 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// myservog.write(160); // горизонтальную серву повернули на 160 градусов delay(1000); // ждем 1 с vertical(); //////////////////////////////////////////////////////////////// for(posg = 160; posg>=0; posg-=1) // вернули горизонтальную серву в 0 градусов { myservog.write(posg); delay(50); } digitalWrite (13, HIGH); // зажгли светодиод delay(60000); // горит минуту digitalWrite (13, LOW); // тухнет delay(60000); // ждем минуту } void loop() { } void vertical() { for(posv = 0; posv < 160; posv += 20) // вертикальную серву с шагом 20 прогнали до 160 град { myservov.write(posv); // delay(1000); // ждём 1000 с пока серва займёт новое положение //shoot(); } for(posv = 160; posv>=0; posv-=20) // вернули горизонтальную серву в 0 градусов { myservov.write(posv); delay(50); } } void shoot() { digitalWrite(PhotoPin, HIGH); // включает светодиод delay(1000); // ждет секунду digitalWrite(PhotoPin, LOW); // выключает светодиод delay(1000); digitalWrite(PhotoPin, HIGH); // включает светодиод digitalWrite(PhotoPin, LOW); // выключает светодиод delay(2000); }
Поправка. В разнос система уходить перестала а вот дребезг остался.
> хотя управляющего на ней нет
Вы ошибаетесь. Есть. И серва все время пытается "удерживать заданную позицию". Что-бы его действительно убрать и серва выключилась, нужно сделать myservog.detach();
Ну и, естественно, не забыть потом, опять сделать attach, перед тем как опять ее решим поворачивать.
И еще, немного не понятно. Зачем вы набивали такую простыню стороки 20-98? Почему не циклом? Тем более что в строках 116-121 вы показали что явно знаете "как это делать".
myservog.attach(6);
myservog.write(10); // горизонтальную серву повернули на 10 градусов
delay(1000); // ждем 1 с
myservog.detach();
vertical();
leshak ваш метод возмутителен. Серва отказалась от дальнейшего сотрудничества. )
Вы бы лучше, вместо возмущения, целиком код свой показали. Метод проверен на себе (вообщем-то и нашел такое решение, когда меня самого раздражал звук работающей сервы стоящей в одном положении). Да и на форуме этот совет другим помогал уже не один раз.
Так же было-бы не плохо, если бы вы не заставляли догадыватся что означает "отказалась от дальнейшего сотрудничества". Не выполняет команды дальше? Или вообще "отошла в мир иной с дымом и искрами"?
Все сработало на ура. В мир иной пока отошел только я.
myservog.write(10); // горизонтальную серву повернули на 10 градусов
delay(1000); // ждем 1 с
myservog.detach();
vertical();
leshak ваш метод возмутителен. Серва отказалась от дальнейшего сотрудничества. )
Я так понимаю в цикл ничего не свернули и detach() поставили только на первые 10 градусов.... отсюда и не работает.
leshak вам все правильно говорит - сверните в цикл.
А дергаться она может из-за того что ваша маленькая серва вращает весь вес головки с фотоаппаратом и естественно не может справться с такой инерцией, да еще и к тому же серва аналоговая. И как раз один из способов с этим бороться - это убирать в нужный момент управляющий сигнал detach(), а когда опять нужно повернуть серву включать управляющий сигнал myservog.attach(6), как вам и написал выше leshak.
А можно ли избежать отработки сервы при включении, то есть когда включаешь питание серва немного дергается на пару градусов а потом назад, то возможно ли чтобы при включении серва стояла на месте?
подключайте питание после формирования управляющего сигнала
подключайте питание после формирования управляющего сигнала
Здравствуйте! можно об этом подробнее....
У меня тоже были проблемы с дребезгом сервомотора.
Решил проблему так, прежде чем шевельнуть серву, спроси у нее, совпадает ли ее положение сейчас с новым.
если да, то откючить,если нет то включить и повернуть/
Потом подключить и серва решит, что немного недовернута - дернется. Некоторые даже на температуру реагируют - феном дуешь и она ползти начинает.