Как проверить сервопривод с Arduino?
Обновлено Редакция GAW
Проверка занимает три провода и один пример. Сигнальный провод привода — к выводу 9, минус — к GND, плюс — к источнику 5 В. Один маленький привод без нагрузки можно на минуту запитать от вывода 5V платы, но по документации Arduino в движении типовой мини-привод берёт до 800 мА, и такой ток с платы брать небезопасно: для настоящей проверки нужен внешний источник, например адаптер 5 В 1 А, с землёй, соединённой с GND Arduino.
Пример Sweep
Загрузите пример из меню File → Examples → Servo → Sweep. Он качает вал от 0 до 180° и обратно шагом в градус с паузой 15 мс:
#include <Servo.h>
Servo myservo; // up to twelve Servo objects on most boards
void setup() {
myservo.attach(9); // signal wire on pin 9
}
void loop() {
for (int pos = 0; pos <= 180; pos++) { // 0 -> 180 degrees
myservo.write(pos);
delay(15); // let the servo reach the position
}
for (int pos = 180; pos >= 0; pos--) { // 180 -> 0 degrees
myservo.write(pos);
delay(15);
}
}
Что происходит внутри: библиотека раз в 20 мс (REFRESH_INTERVAL = 20 000 мкс) выдаёт на вывод импульс, длительность которого задаёт угол, — от 544 мкс для 0° до 2400 мкс для 180°, 1500 мкс сразу после attach(). Почему привод понимает именно длительность, а не частоту, — в словаре: управляющий импульс сервопривода. Нужную длительность для конкретного угла и регистры таймера посчитает калькулятор ШИМ для сервопривода.
Если вал не движется
| Симптом | Вероятная причина | Что сделать |
|---|---|---|
| Не двигается, не гудит | нет питания или сигнала | проверить 5 В на плюсовом проводе, общую землю, attach(9) |
| Дёргается на месте, плата перезагружается | просадка питания | внешний источник, конденсатор по питанию, общая земля |
| Доходит до края и гудит | импульс за механическим упором | сузить диапазон: attach(9, 600, 2300) |
| Поворачивается меньше 180° | у привода свой диапазон импульсов | расширить границы в attach() по даташиту привода |
| Крутится без остановки | привод постоянного вращения | write(90) — стоп, иное — скорость |
Проверить сигнал без осциллографа можно мультиметром: при writeMicroseconds(1500) заполнение равно 1500 / 20 000 = 7,5 %, и вольтметр постоянного тока покажет около 0,38 В на 5-вольтовой плате (наш расчёт). Если привод дрожит, причины и лечение описаны в ответе «Почему сервопривод дёргается», если не доходит до упора — в ответе про 180°. На Uno библиотека занимает Timer1 и отключает analogWrite() на выводах 9 и 10 — см. конфликт Servo и ШИМ. Устройство привода, его ток в покое, в движении и при остановке — в статье о сервоприводах.
Похожие вопросы
Как убедиться, что импульс вообще идёт на сигнальный провод?
Вызовите writeMicroseconds(1500) и измерьте мультиметром постоянное напряжение между выводом 9 и GND: импульс 1500 мкс в периоде 20 мс даёт заполнение 7,5 %, и на 5-вольтовой плате вольтметр покажет около 0,38 В (наш расчёт). Ноль или 5 В означают, что сигнала нет — проверьте номер вывода и вызов attach().
Сервопривод крутится, но Arduino при этом перезагружается — что делать?
Привод берёт больше, чем может отдать стабилизатор платы: по документации Arduino типовой мини-привод в движении потребляет до 800 мА, и брать такой ток с платы небезопасно. Запитайте привод от отдельного источника 5 В, соедините его минус с GND Arduino и поставьте конденсатор по питанию привода.
Что задают write(0) и write(180)?
В библиотеке Servo по умолчанию 0° — импульс 544 мкс, 180° — 2400 мкс. Если на краях привод упирается и гудит, передайте свои границы: attach(9, 600, 2300). Если наоборот не доходит до упоров, диапазон можно расширить, но у каждого привода свой предел.
Источники
- Arduino. Servo library, src/Servo.h и examples/Sweep/Sweep.ino (github.com/arduino-libraries/Servo, LGPL 2.1) — MIN_PULSE_WIDTH 544 мкс, MAX_PULSE_WIDTH 2400 мкс, DEFAULT_PULSE_WIDTH 1500 мкс, REFRESH_INTERVAL 20 000 мкс, SERVOS_PER_TIMER 12; поля min и max объекта хранят поправки к границам шагом 4 мкс; Sweep: attach(9), write(pos) от 0 до 180 и обратно с delay(15), на большинстве плат можно создать двенадцать объектов Servo
- Arduino. Basic servo control (docs.arduino.cc, Learn: Electronics, репозиторий arduino/docs-content) — нужны плата, сервопривод, потенциометр 10 кОм, провода, конденсаторы, источник питания; типовой привод Feetech Mini работает от 4,8–6 В и берёт 5–6 мА в покое, под нагрузкой до 800 мА; такой ток небезопасно брать с платы Arduino — питать от внешнего источника, например адаптера 5 В 1 А; обращать внимание на диапазон напряжения, ток покоя, ток движения и ток остановки; конденсаторы по питанию сглаживают просадки; примеры Knob и Sweep
Нашли ошибку? ·
Смотрите также
- СервоприводыУстройство, импульс и угол, постоянное вращение, ток, питание, Arduino Servo
- ШИМ сервопривода: угол и таймерИмпульс по углу, диапазоны производителей, ICR1/OCR1A и PSC/ARR/CCR
- Управляющий импульс сервоприводаИмпульс раз в 20 мс, длительность которого задаёт угол поворота сервопривода
- Почему сервопривод дёргается?Просадка питания, нет общей земли, импульс дрожит больше зоны нечувствительности
- Почему сервопривод поворачивается не на 180°?Диапазон импульсов библиотеки не совпадает с диапазоном привода
- Почему после Servo или tone() перестал работать analogWrite?Servo забирает Timer1 (выводы 9, 10), tone() — Timer2 (выводы 3, 11)