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

Как проверить сервопривод с 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). Если наоборот не доходит до упоров, диапазон можно расширить, но у каждого привода свой предел.

Источники

  1. 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
  2. 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
Страница помогла?

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