Как устроена библиотека Servo (Управляем севомашинкой. Часть 2)

В первой части коротко рассмотрели принципы работы аналоговой сервомашинки.sg90_1

В скетче использовалась библиотека Servo, входящая в состав Arduino IDE. Чрезвычайно любопытно: а что там внутри?..Открываем  C:\Program Files\Arduino\libraries\Servo\src\avr\Servo.cpp и Servo.h (примерно как-то так) и… смотрим.

Напомню, что положение вала двигателя сервомашинки определяется длиной импульса на выводе управления. Типовые значения (например для SG-90):SG-90 _04

Для работы в библиотеке Servo определены несколько методов:

Servo — Класс для управления сервоприводами, подключенными к выводам Arduino.

attach(pin ) — подключение сервомашинки к выводу pin Arduino. На самом деле вызывается более «широкий» метод attach(pin, min, max ), где min = 544, max = 2400.
attach(pin, min, max ) — такое же подключение, но здесь можно указать конкретные значения минимальной и максимальной длины управляющего импульса в микросекундах (по умолчанию min = 544, max = 2400).

write() — устанавливает угол поворота вала сервомашинки в градусах. Примечательно, что если величина аргумента будет больше или равна минимальной длине импульса (544), то аргумент трактуется как длина формируемого на выводе управления импульса в микросекундах.
writeMicroseconds() — практически тоже самое, но тут сразу ставится длина импульса в микросекундах. Надо отметить, что функция проконтролирует аргумент и, если надо, его обрежет. Допустимый диапазон аргумента 544..2400
read() — получить последнее установленное методом write() значение угла поворота в градусах (значение будет в диапазоне 0..180).
readMicroseconds() — практически тоже самое, но значение получаем в микросекундах
attached() — проверка наличия подключения. Возвращает TRUE, если было подключение.
detach() — отключение сервопривода.

Формирование управляющего импульса производится в процедуре обработки прерывания от таймера. Так что разрабатывая программу, стоит обратить внимание на работу с таймером.

Сервопривод активируется путем создания экземпляра класса Servo и назначения вывода управления pin методом attach (). Сервоприводы управляются формируемыми импульсами в фоновом режиме, используя значение длительности (угла), указанного с помощью метода write ().

Обратите внимание, что функция analogWrite() (формирование ШИМ) на контактах, связанных с таймером отключается при подключении первого сервопривода.

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = 0;  // analog pin used to connect the potentiometer
int val;    // variable to read the value from the analog pin

void setup()
{
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() 
{ 
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023) 
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180) 
  myservo.write(val);                  // sets the servo position according to the scaled value 
  delay(15);                           // waits for the servo to get there 
} 

В примере Knob из Arduino IDE, приведенном выше, вал сервомашинки поворачивается пропорционально повороту движка переменного резистора, подключенного к выводу A0 Arduino. Здесь видно как используются методы attach() и write().

Как устроена библиотека Servo (Управляем севомашинкой. Часть 2): 1 комментарий

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

Ваш e-mail не будет опубликован.

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".