В первой части коротко рассмотрели принципы работы аналоговой сервомашинки.
В скетче использовалась библиотека Servo, входящая в состав Arduino IDE. Чрезвычайно любопытно: а что там внутри?..Открываем C:\Program Files\Arduino\libraries\Servo\src\avr\Servo.cpp и Servo.h (примерно как-то так) и… смотрим.
Напомню, что положение вала двигателя сервомашинки определяется длиной импульса на выводе управления. Типовые значения (например для SG-90):
Для работы в библиотеке 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().
Благодарю! Интересно написано 🙂