Калибровка моих сервоприводов
Компоненты и расходные материалы
| × | 1 | ||||
| × | 1 | ||||
| × | 8 | ||||
| × | 8 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Необходимые инструменты и машины
|
Приложения и онлайн-сервисы
| ||||
|
Об этом проекте
В предыдущем посте на Hackster я писал о том, как я создал установку, чтобы сравнить, как вращаются разные сервоприводы из одной партии, и показал, что отправка одних и тех же сигналов PWM на разные сервоприводы приводит к некоторым значительным различиям - на картинке ниже показаны сервоприводы. все они начинались в крайнем левом положении против часовой стрелки и получали один и тот же ШИМ-сигнал - все они немного различались по поведению.
Почему бы не использовать существующие сервобиблиотеки для Arduino?
Я использую сервопривод Adafruit PWM для управления множеством сервоприводов, и это позволяет мне отправлять разные сигналы PWM на каждый сервопривод. Я мог бы использовать библиотеку Servo, которая встроена в мою установку Arduino, но у меня есть несколько причин не делать этого:
- С помощью сервопривода Adafruit PWM я могу управлять своими сервоприводами, используя всего два контакта через I2C, вместо того, чтобы выделять контакт на моем Arduino для каждого сервопривода.
- С библиотекой сервоприводов Arduino я иногда обнаруживал, что когда я подключаюсь к сервоприводу и отправляю ему сигнал для поворота в положение нулевого градуса, он поворачивается до предела хода и измельчает шестерни внутри сервопривода.
- / li>
Конечно, сервоприводы 9g, которые я использую, дешевы и не рассчитаны на точность, но я думаю, что смогу выжать из них больше пользы. Я хочу использовать их в качестве шагающего робота, и мне нужно, чтобы их поведение было немного более точным и предсказуемым.
Как я могу более точно управлять сервоприводами для хобби?
Подтверждение того, что все мои сервоприводы ведут себя немного по-разному, побудило меня создать устройство, которое позволило бы мне откалибровать сервопривод - какие значения ШИМ мне нужны, чтобы отправить сервопривод для перемещения в положение 0 градусов? Или центральная точка 90 градусов? Как мне избежать отправки значения ШИМ, которое приводит сервопривод в крайнее положение с большим хрустом и шлифованием шестерен?
Я решил объединить пару простых концепций.
- Выровняйте сервопривод с центром простого транспортира, чтобы по мере вращения дворника сервопривода я мог измерить его положение.
- Подключите потенциометр к аналоговому входу Arduino, чтобы я мог контролировать положение дворника сервопривода, регулируя значение PWM, когда я регулирую положение вала потенциометра.
Для этой версии я был счастлив использовать Serial Monitor в моей Arduino IDE, чтобы сообщить мне значение сигнала PWM, которое я могу записать вручную.
Я использовал Autodesk 123D для разработки простой установки, которая могла бы содержать потенциометр, транспортир, один сервопривод, мою Arduino и сервопривод Adafruit PWM вместе с источником питания.
Я хочу продолжать использовать сервопривод Adafruit PWM для моей калибровки, поскольку это то, что я, вероятно, буду использовать в своем последнем проекте. Если бы я собирался управлять сервоприводом непосредственно с штифта на Arduino, я бы скопировал это в устройстве и откалибровал сервопривод по ШИМ от Arduino.
Сборка устройства
Я распечатал каждую из частей и соединил их с помощью болтов M3 и шайб.
Монтажные отверстия в конструкции моего устройства подогнаны под мои компоненты - разные компоненты могут иметь разные диаметры и положения отверстий.
Что касается электроники, я подключил центральный штырь потенциометра к контакту A0 Arduino, а другие контакты - к 0 В и 5 В на Arduino. Я подключил драйвер серводвигателя PWM к Arduino, а затем подключил понижающий преобразователь постоянного тока в постоянный (я настроил преобразование входа источника питания 9 В в выход 5 В). Я подключил сервопривод 9g к первому слоту на щите драйвера сервомотора, а затем загрузил свой эскиз в Arduino.
Конечный результат показан на фотографиях ниже. Поворачивая ручку в верхнем левом углу устройства, я могу контролировать положение сервопривода, а с помощью последовательного монитора в Arduino IDE я могу считывать сигнал ШИМ, отправляемый на серводвигатель для любого заданного угла.
Так что же мне сообщает устройство?
Что касается сервопривода, я повернул его до крайнего предела по часовой стрелке и поместил стеклоочиститель на сервопривод так, чтобы он располагался сразу за отметкой 180 градусов на транспортире моего калибровочного устройства.
Я подключил питание к устройству, а затем повернул ручку потенциометра до тех пор, пока стрелка сервопривода не совместилась с отметкой 0 градусов на транспортире, и отметил значение ШИМ, записанное на последовательный выход моей Arduino IDE. Затем я повернул потенциометр до тех пор, пока игла сервопривода не указала на 10 градусов, и снова записал значение ШИМ. Я продолжал этот процесс каждые 10 градусов, пока не достиг 180 градусов, и представил результаты в таблице ниже.
Я создал график результатов (показан ниже), и, как и следовало ожидать, очевидно, что существует строго линейная зависимость между ШИМ и углом сервопривода.
Теперь у меня есть некоторые значения ШИМ и угла, характерные для этого конкретного сервопривода - другие сервоприводы могут иметь аналогичные характеристики, но они не будут идентичными.
Теперь у меня есть несколько вариантов для более точной работы сервопривода:
- Запишите эти пары значений и сохраните их в массиве в моем эскизе Arduino, и когда я хочу переместить сервоочиститель на 90 градусов (например), просто посмотрите, какое значение PWM относится к этому углу, и отправьте это значение PWM к сервоприводу. У этого есть недостаток, заключающийся в том, что я могу поворачивать только на углы, кратные 10.
- Или, если мне нужен полный контроль над углом, на который я отправляю, я могу использовать линейную регрессию для набора данных, чтобы определить, какая формула связывает угол и значение ШИМ (для этого сервопривода ШИМ =2,35 * Угол + 159,4). Таким образом, я могу передать угол, на который хочу повернуться, в качестве параметра и программно вычислить ШИМ, необходимый для поворота этого конкретного сервопривода в это положение.
В любом случае, я могу управлять этим сервоприводом с большей точностью и уверенностью, чем раньше. Для точной калибровки каждого сервопривода требуется немного больше усилий, но для моего проекта это того стоит из-за дополнительной точности.
Конечно, когда я снимаю сервопривод с устройства, я оставляю сервоочиститель прикрепленным, поскольку измерения связаны с тем, как прикреплен дворник во время калибровки.
Улучшения в следующей версии
После калибровки нескольких сервоприводов я подумал о некоторых улучшениях, которые внесу в следующую версию.
- Сервопривод должен иметь механизм быстрого отсоединения - возможно, закрепить сервопривод на месте с помощью зажима с неодимовыми магнитами, вместо того, чтобы закреплять его болтами M3.
- Я хочу сделать это меньше - возможно, я смогу переориентировать Arduino и блок питания, чтобы добиться этого.
- Мне нужен выключатель питания между батареей 9 В и понижающим преобразователем, поэтому мне не нужно полностью отключать аккумулятор каждый раз, когда я хочу выключить машину.
- Я хотел бы иметь возможность печатать буровую установку меньшим количеством частей.
- Вместо того, чтобы вручную считывать значения с транспортира, было бы лучше, если бы датчик мог определять, когда сервопривод находится в определенных угловых положениях, и передавать их обратно в Arduino - это могло бы устранить некоторую ошибку параллакса.
- Наконец, очень поможет ЖК-дисплей для отображения любых результатов, поскольку мне не нужно будет подключать компьютер к устройству.
Заключение
Вот и все - мои сервоприводы для хобби дешевы и не рассчитаны на точность - и для многих приложений они идеально подходят. Тем не менее, я хотел бы получить от меня немного большей точности и повторяемости, и установка, описанная в этом посте, помогает мне в этом.
Код
- Эскиз сервокалибратора.
Эскиз сервокалибратора C / C ++
#include#define analogIn A0Adafruit_PWMServoDriver pwm =Adafruit_PWMServoDriver (); int inputValue =0; int tmpPwmValue =0; void setup () {Serial.begin (9600); pwm.begin (); pwm.setPWMFreq (60);} void loop () {inputValue =analogRead (аналогВ); // inputValue будет между 0 и 1024 // По наблюдениям, минимальные и максимальные значения ШИМ сервопривода обычно находятся между 100 и 612 // Формула ниже позволяет нам просто преобразовать аналоговый вход в ШИМ int pwmValue =(int) (100 + ( inputValue / 2)); pwm.setPWM (0, 0, pwmValue); // Проверяем, не отображаем ли мы ненужные повторяющиеся данные if (pwmValue! =TmpPwmValue) {Serial.print ("Potentiometer Input ="); Serial.print (inputValue); Serial.print (", ШИМ ="); Serial.println (pwmValue); } tmpPwmValue =pwmValue; задержка (15);}
Изготовленные на заказ детали и корпуса
Репозиторий деталей сервокалибратора
https://github.com/jeremylindsayni/ServoCalibratorПроизводственный процесс
- 3D-печать PLA:все, что вам нужно знать
- Отслеживание лица при панорамировании / наклоне с помощью raspberry pi
- PLA против ABS против нейлона
- Валби, двуногий ходячий
- Роботизированная рука Arduino IoT
- 3D-печать из PLA и ABS:в чем разница?
- Приводы постоянного тока в качестве замены сервоприводов переменного тока
- Является ли PLA перерабатываемым или даже биоразлагаемым?
- Растворяется ли PLA в воде и разлагается ли он?
- Является ли нить PLA проводящей (проводят ли какие-либо нити)?