roboforum.ru

Технический форум по робототехнике.

Arduino + Servo + джиттер

Arduino + Servo + джиттер

The_0ne » 11 июн 2012, 16:44

Привет всем!
Я сразу к делу, ладно? :oops:

Итак, собрана система инерциальной навигации на ITG3200 и ADXL345. работает, фильтр Калмана прекрасно справляется со своей задачей. Но важно не это.
К системе должны быть подключены несколько серв, которые будут получать команды в зависимости от положения. Для управления используется Servo.h и writeMicroseconds. Но это, видимо, полная фигня, так как сервы постоянно подергиваются с небольшой амплитудой и частотой раз в пару секунд. Ниже ссылка на видео.
http://youtu.be/scNUV0nbCcI
Так как я в программировании микроконтроллеров могу считать себя новичком, хочу спросить совета. Мне кажется что стандартная Servo.h неточно выдерживает скважность, несмотря на идеальные параметры (фиксированная длительность цикла, значения для управляющих импульсов идеальны). Но ведь есть возможность сформировать ШИМ с заданными параметрами "вручную"? но как это сделать я не могу понять.
Помогите, кто чем может, а? Ато я всю голову себе сломал уже)
Буду благодарен за кусок кода, который рулит сервами без "эффекта подергивания".
Спасиииибооо!

Re: Arduino + Servo + джиттер

=DeaD= » 11 июн 2012, 17:04

Штатная библиотека на таймерах, попробуйте рулить сервами напрямую через железный ШИМ, тут скорее всего ваши таймеры для серв пересекаются с уартом и прочим добром. Вот тут есть библиотека для серв на железном ШИМ: http://arduiniana.org/libraries/pwmservo/

Re: Arduino + Servo + джиттер

The_0ne » 11 июн 2012, 17:19

Я пробовал ее использовать, но результат неидеален, хотя лучше, чем с servo.h.
Просто видел на видеозаписях как у некоторых при той-же конфигурации железа все просто идеально)
Хочется так же)

Re: Arduino + Servo + джиттер

=DeaD= » 11 июн 2012, 17:28

Если у вас с железно-ШИМ-библиотекой неидеально, тогда проблему надо искать или у вас в программе, или в питании серв или еще где-то... удалённо будет проблематично.

Re: Arduino + Servo + джиттер

Myp » 11 июн 2012, 18:17

не, ардуиновская библиотека держит сервы прекрасно в одном положении
дёргания это что-то ещё.

у тебя там вроде бы приёмник воткнут, а передатчик в этот момент включен?
если включен и рядом то от передатчика на близком расстоянии в сервы запросто помехи идут, попробуй отложить его подальше в угол комнаты.

Re: Arduino + Servo + джиттер

The_0ne » 11 июн 2012, 22:05

=DeaD= писал(а):Если у вас с железно-ШИМ-библиотекой неидеально, тогда проблему надо искать или у вас в программе, или в питании серв или еще где-то... удалённо будет проблематично.

Да, я тоже так подумал. Поэтому попробовал питать сервоприводы не от сетевого БП, а от литий-полимерной батареи. Бестолку.
Скорее всего проблема у меня именно в софте.
Myp писал(а):у тебя там вроде бы приёмник воткнут, а передатчик в этот момент включен?
если включен и рядом то от передатчика на близком расстоянии в сервы запросто помехи идут, попробуй отложить его подальше в угол комнаты.

Поведение сервоприводов не зависит от состояния приемника и передатчика. Тоже на это грешил. Но не подтвердилось.
Спасибо за идеи! Буду разбираться с софтом. Может еще подкинете?))

Re: Arduino + Servo + джиттер

=DeaD= » 11 июн 2012, 22:27

Попробуйте отключить в своём софте всё кроме управления сервами - если сервы будут стоять нормально, значит проблема точно в софте.

Re: Arduino + Servo + джиттер

The_0ne » 12 июн 2012, 02:23

Все, исправил. Оказалось что процедура чтения данных с приемника все портила. Ларчик открывался просто)
Вот эта конструкция -
    RC[0] = pulseIn(PPMin1, HIGH, 20000);
все портила. Каким-то образом такой метод портил мне всю малину. Моих знаний пока недостаточно для понимания того как именно, к сожалению.
Кстати, встал еще один вопрос - как читать данные с трех каналов стандартного модельного приемника без PulseIn? Я подозреваю что с помощью таймера, но как именно пока не доходит.
Буду благодарен за рекомендации. А может библиотека какая существует, а я тут велосипед изобретаю?

Re: Arduino + Servo + джиттер

=DeaD= » 12 июн 2012, 11:36

PulseIn подвешивает всё, пока не закончит замерять длину входящего импульса.

Re: Arduino + Servo + джиттер

The_0ne » 13 июн 2012, 01:25

Все, разобрался. Всем спасибо!
PWMServo работает идеально! Правда если смириться с тем что нельзя задать значение в микросекундах - только градусы от 0 до 180. Для моих задачь такой точности зватит только на начальном уровне. Буду колупать библиотеку в целях понимания принципов и создания метода под мои нужды.
Для чтения данных с приемника существует два варианта - поканально в ШИМ или с помощью одной ноги в PPM.
Плотненько покурив интернет и, засев, было за изучение таймеров и прерываний, обнаружил что я и правда велик придумываю.
Добрые люди сделали практически то что мне нужно и выложили в общий доступ (эх, пивка бы этому доброму человеку поставить) - http://forum.rcdesign.ru/f87/thread2405 ... ost3000083
Авось кому пригодится.
Вот только это прошлый век, так как производители начинают переходить на цифру (S-Bus от Футыбы, DSM от Спектрума). надо ориентироваться именно на эти системы, ибо ножек у контроллера катастрофически нехватает, да и не комильфо в цифровой век пользовать старый добрый ШИМ)))
Всем счастья, мира и жвачку!

Re: Arduino + Servo + джиттер

terghalin » 13 июн 2012, 12:46

Можно ли этот код использовать для 6-канального пульта? Я так понимаю, для каждого канала приемника нужен цифровой пин с PWM?

Re: Arduino + Servo + джиттер

The_0ne » 13 июн 2012, 14:15

В том виде, в котором он представлен в библиотеке нельзя. Там лишь четыре канала обрабатыватся. Но ничто и никто не мешает расширить количество. Только для этого надо будет либо с чужим кодом разобраться, либо свое писать. Второе легче и быстрее.

Re: Arduino + Servo + джиттер

terghalin » 13 июн 2012, 15:36

Навыков написания программ на C не хватает. А так бы написал, да... ;)
В любом случае, мне надо 6 каналов, а Arduino Nano может предложить лишь 5 PWM. :(

Re: Arduino + Servo + джиттер

The_0ne » 13 июн 2012, 15:57

5PWM это на выход. А что касается входа, то любой цифровой пин может работать в качестве приемника PWM сигнала. Если я все правильно понял. Сколько их там в Nano?
В инете достаточно информации о том как это реализовать. Если рогами упереться, то понять можно. Изучай работу с прерывааниями и таймерами для атмеги. Я вот через пару недель буду упираться) Но у меня несколько другая задача - мне надо четыре сервопривода подключить, да точность повысить. А может куплю вотт эту штуку и не буду паиться))) http://www.adafruit.com/products/815


Rambler\'s Top100 Mail.ru counter