Сервопривод SG90 (Arduino)

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

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

Для примера рассмотрим работу сервопривода 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

Добавить комментарий

Войти с помощью: