Перейти к содержанию

Почему сервопривод поворачивается не на 180°?

Обновлено Редакция GAW

Сервопривод не знает градусов. Он получает импульс раз в 20 мс и поворачивает вал в положение, которое его электроника сопоставила с длительностью этого импульса. Какой длительности соответствует какой угол, решает производитель, а библиотека в программе переводит градусы в микросекунды по своей шкале. Если шкалы не совпадают, привод поворачивается не на тот угол.

Шкалы разных приводов

Что0° (или −60°)Центр180° (или +60°)Ход
Arduino Servo по умолчанию544 мкс1500 мкс2400 мкссчитается 180°
Parallax Standard Servo620 мкс1520 мкс2420 мкс180°
Hitec HS-422900 мкс1500 мкс2100 мкс120°

У Parallax на один градус приходится 10 мкс, у HS-422 — тоже (1200 мкс на 120°). Пересчитаем, куда встанет Parallax при командах библиотеки с настройками по умолчанию (наш расчёт):

θ=t−620 мкс10 мкс/∘:544 мкс→−7,6∘,2400 мкс→178∘\theta = \frac{t - 620\ \text{мкс}}{10\ \text{мкс}/^\circ}: \quad 544\ \text{мкс} \to -7{,}6^\circ, \quad 2400\ \text{мкс} \to 178^\circ

Для Parallax это почти полный ход. А HS-422 на тех же импульсах попытался бы уйти далеко за свои ±60° и упёрся бы в ограничитель.

Как откалибровать

  1. Командой writeMicroseconds() найдите длительность, при которой привод стоит в одном крайнем положении без гудения, затем во втором.
  2. Передайте найденные значения в attach(pin, min, max) — тогда write(0) и write(180) дадут именно эти крайние положения.
  3. Не заходите в упоры: привод в упоре гудит и греется, как разобрано в калькуляторе ШИМ для сервопривода.

Если привод вращается непрерывно и не держит угол, это сервопривод постоянного вращения: у него импульс задаёт скорость, а не положение. Подробно об импульсе управления — в словаре, о дрожании вала — в ответе «Почему сервопривод дёргается».

Похожие вопросы

Можно ли выйти за 180°, увеличив длительность импульса?

Немного — до механических упоров, у Parallax это около −10° и 190°. Дальше двигатель упирается, гудит и берёт ток остановки, а пластиковые шестерни могут не выдержать. Расширяйте диапазон шагами и следите, чтобы привод не упирался.

Почему HS-422 поворачивается всего на 120°?

Так он нормирован: Hitec указывает ход ±60° при импульсах 900–2100 мкс. Шире импульс — больше угол, но за пределами спецификации линейность и упоры производитель не гарантирует, поэтому крайние значения подбирают осторожно.

Что передавать в write(): угол или микросекунды?

Оба варианта работают: значения меньше 544 библиотека считает углом, остальные — микросекундами. Для точной настройки удобнее writeMicroseconds(): шаг 1 мкс понятен и не зависит от того, какие min и max переданы в attach().

Источники

  1. Arduino. Servo library, src/Servo.h и src/avr/Servo.cpp (LGPL 2.1) — MIN_PULSE_WIDTH 544 мкс, MAX_PULSE_WIDTH 2400 мкс, DEFAULT_PULSE_WIDTH 1500 мкс; attach(pin, min, max) задаёт крайние длительности; write() — угол 0–180°, значения не меньше MIN_PULSE_WIDTH считаются микросекундами; writeMicroseconds()
  2. Parallax Inc. Parallax Standard Servo (#900-00005) Product Guide, v3.0 — 0–180°; рабочий диапазон импульсов 500–2530 мкс ±20 мкс; 620/1520/2420 мкс — 0°/90°/180°, угол растёт против часовой стрелки; механические упоры около −10° и 190°; проверять, что привод не упирается в упоры
  3. Hitec RCD. HS-422 General Specification, spec sheet v2.2 — ход ±60° при 900–2100 мкс, центр 1500 мкс; зона нечувствительности 5 мкс

Нашли ошибку?