Как определить минимальный и максимальный угол для дешевых сервоприводов?

У меня есть несколько дешевых сервоприводов KY66 (кажется, клон SG90).

Когда я поворачиваю их на 0°, сервопривод пытается двигаться и двигаться, но фактически не достигает 0°. Я читал, что они достигают конечной точки, но встроенный потенциометр показывает 0.

Изменив код и поэкспериментировав с углом, я обнаружил, что минимум для одного конкретного сервопривода составляет 25°.

Сейчас я пытаюсь понять, как Arduino может автоматически определить это значение. я пробовал

servo.write(0);
delay(3000);
int direction = servo.read();

и ожидал получить значение около 25, но вместо этого было 0. Таким образом, результат read() выглядит не как фактическое чтение, а скорее как "последнее известное" заданное значение.

Я также пытался расслабить сервопривод, прежде чем читать:

servo.write(0);
delay(3000);
int direction = servo.read();

без лучшего результата.

Мне нравится вычислять минимальный и максимальный угол сервопривода

  • потому что мне не нравится, когда сервопривод издает много шума (на самом деле это звучит нездорово)
  • без необходимости пользователю самостоятельно разбираться и перепрограммировать Arduino.

Я знаю, что эти дешевые сервоприводы имеют только 3 контакта. 2 контакта предназначены только для питания, поэтому остался только 1 контакт.

Мои вопросы:

  • Является ли вывод данных однонаправленным (выход ШИМ от Arduino к сервоприводу)?
  • Удастся ли когда-нибудь реализовать то, что я хочу, без дополнительного оборудования?
  • Как люди решают эту проблему? Имеют ли более дорогие сервоприводы лучшую калибровку для фактического перехода от 0 ° до 180 °, или они позволяют считывать показания потенциометра с помощью другого штифта?

, 👍2


2 ответа


Лучший ответ:

1

Является ли вывод данных однонаправленным (выход ШИМ от Arduino к сервоприводу)?

Как вы узнали, стандартные сервоприводы имеют только три контакта. И да, два из них обеспечивают землю и питание, а третий — однонаправленный сигнал.

Этот сигнал обычно представляет собой импульс длительностью от 1 мс до 2 мс, повторяющийся каждые 20 мс.

Поэтому

servo.read() может возвращать только последнее значение, заданное servo.write().

Удастся ли когда-нибудь реализовать то, что я хочу, без дополнительного оборудования?

Я так не думаю.

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

Как люди решают эту проблему? Имеют ли более дорогие сервоприводы лучшую калибровку для фактического перехода от 0° до 180°, или они позволяют считывать показания потенциометра с помощью другого штифта?

Поскольку сервоприводы используются как закрытая (под)система, я не думаю, что они открыты для считывания показаний их потенциометра. И даже если вы это сделаете, вы можете повлиять на внутреннюю работу сервопривода.

Несмотря на то, что я построил несколько моделей самолетов с конца 70-х годов и использовал разные сервоприводы, у меня нет никакого представления о калибровке дешевых или дорогих сервоприводов. IIRC в некоторых таблицах данных задокументировал диапазоны всего +/- 45 °.

Поэтому значения от 0 до 180 для servo.write() — это просто сопоставление от 1 мс до 2 мс.

Короче говоря, я понятия не имею, как люди решают эту проблему.

Вы можете ограничить свой диапазон некоторыми "здоровыми" значениями или попросить пользователя помочь с калибровкой. Результаты калибровки можно сохранить в EEPROM, перепрограммировать Arduino не нужно.

Если вам нужно, чтобы голова робота поворачивалась от 0 ° до 180 °, рассмотрите возможность использования некоторого механизма, чтобы сервоприводу нужно было просто перемещаться, скажем, от 30 ° до 150 °. Так идут моделисты.

,

1

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

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

Я хотел, чтобы робот смотрел влево и вправо, что составляет 0° или 180°.

Возможно, вы сможете компенсировать ограниченный угловой ход сервопривода соединением между ним и платформой камеры.

,

На самом деле я хотел, чтобы робот смотрел влево и вправо, что составляет 0° или 180°. 25° это совсем немного. Но, кажется, мне нужно подумать об этом., @Thomas Weller