Сервопривод — механический привод с автоматической коррекцией состояния через внутреннюю отрицательную обратную связь, в соответствии с параметрами, заданными извне.
Принцип работы сервопривода достаточно прост, он заключается в подаче управляющего напряжения (сигнала) на контроллер (блок управления) сервопривода, который непосредственно управляет работой электродвигателя. Электродвигатель через редуктор передает крутящий момент на исполнительное уст-во. Так-же к контроллеру подключен датчик обратной связи (потенциометр), который отслеживает угол поворота редуктора и как только будет достигнуто установленное положение, контроллер прекратит работу электродвигателя. Движение сервопривода прекратится до появления новых сигналов управления.
Для примера рассмотрим работу сервопривода SG90. Сервопривод SG90 используется в основном для управления небольшими легкими механизмами, угол поворота которых ограничен диапазоном от 0° до 180°.
Технические характеристики сервопривода SG90:
- Диапазон вращения: 180°.
- Рабочее напряжение: 4,8 … 6 В.
- Скорость вращения: 60° за 0,12 сек при 4,8 В.
- Размеры: 22,2 × 11,8 × 31 мм.
- Крутящий момент: 1,8 кгc·см при 4,8 В.
- Масса: 9 г.
- Температура использования: от -30°C до +60°C.
Для управления сервоприводом с удержанием угла необходимо подавать сигнал PDM (Pulse Duration Modulation) — импульсы постоянной частоты и переменной ширины. Для SG90 период следования импульсов составляет 20 мс, а ширина импульсов может меняться от 544 мкс для поворота в 0 ° и до 2400 мкс для поворота в 180 °.
При работе сервопривода SG90 от платы Arduino могут наблюдаться значительные просадки питающего напряжения 5 В, особенно при быстром изменении угла поворота. Поэтому рекомендуется использовать внешнее питание сервопривода или подключить к цепи питания 5 В электролитический конденсатор 470-1000 мкФ.
Для управления сервоприводом на платформе Arduino можно использовать библиотеку Servo, которая значительно облегчает работу с различными сервоприводами, а так же упрощает программный код. Но так же можно управлять сервоприводом без использования библиотек.
Ниже будут показаны два примера, первый пример для медленного поворота угла сервопривода, с использованием библиотеки и без нее, второй пример для быстрого изменения угла поворота сервопривода.
Для всех примеров для управления сервоприводом используется цифровой выход платы Arduino Nano D9.
Медленное изменения угла поворота сервопривода:
#include <Servo.h> Servo myservo; int pos = 0; void setup() { myservo.attach(9); } void loop() { for (pos = 0; pos <= 180; pos += 1) { // in steps of 1 degree myservo.write(pos); delay(30); } for (pos = 180; pos >= 0; pos -= 1) { myservo.write(pos); delay(30); } }
Тоже самое но без библиотеки:
int servoPin = 9; void setup(){ pinMode(servoPin, OUTPUT); } void loop(){ for(int i=0;i<=180;i++){ servoPulse(servoPin, i); delay(30); } delay(100); for(int i=180;i>=0;i--){ servoPulse(servoPin, i); delay(30); } } void servoPulse(int pin, int angle){ int timess; timess = map(angle, 0,180, 544, 2400); digitalWrite(pin, HIGH); delayMicroseconds(timess); digitalWrite(pin, LOW); delayMicroseconds(20000 - timess); }
Быстрое изменения угла поворота сервопривода:
#include <Servo.h> Servo myservo; void setup() { myservo.attach(9); } void loop() { myservo.write(0); delay(1000); myservo.write(90); delay(1000); myservo.write(180); delay(1000); myservo.write(90); delay(1000); }
Тоже самое но без библиотеки:
int servoPin = 9; int val; void setup(){ pinMode(servoPin, OUTPUT); } void loop(){ val = 0; for (int i = 0; i <= 50; i++){servoPulse(servoPin, val);} delay(1000); val = 90; for (int i = 0; i <= 50; i++){servoPulse(servoPin, val);} delay(1000); val = 180; for (int i = 0; i <= 50; i++){servoPulse(servoPin, val);} delay(1000); val = 90; for (int i = 0; i <= 50; i++){servoPulse(servoPin, val);} delay(1000); } void servoPulse(int pin, int angle){ int pulseWidth = map(angle, 0, 180 , 544, 2480); Serial.println(pulseWidth); digitalWrite(pin, HIGH); delayMicroseconds(pulseWidth); digitalWrite(pin, LOW); delayMicroseconds(20000 - pulseWidth); }
Форум — http://forum.rcl-radio.ru/viewtopic.php?id=670
Для Attiny13 — http://forum.rcl-radio.ru/viewtopic.php?pid=10775#p10775