Проект демонстрирует возможность управления пятью сервоприводами с помощью лишь одного микроконтроллера Atmel AVR ATtiny45 или ATtiny85. Так как готовых подобных решений не было найдено для данных микроконтроллеров и использовать микроконтроллеры с большим количеством выводов не хотелось, автор решил написать собственную библиотеку управления.
Библиотека получила имя Servo8Bit, она поддерживает работу с 5 сервоприводами на микроконтроллере ATtiny45 и ATtiny85, из ресурсов микроконтроллера использует только 8-разрядный таймер. С ее помощью можно генерировать импульсы управления серво длительностью от 512 до 2560 мкс с 8-битным разрешением (256 значений) и, самое главное, данная библиотека очень проста в использовании.
ATtiny85 это 8-выводный не дорогой микроконтроллер с богатой периферией. В сети Интернет имеется несколько решений для управления сервоприводами, однако некоторые имеют недостаточное разрешение, другие рассчитаны на микроконтроллеры с большим количеством выводов и используют в своей работе 16-битный таймер.
Библиотека написана по образцу библиотеки Arduino для управления сервоприводом и имеет идентичный интерфейс. Для компиляции используется WinAVR.
Вот короткий пример программы, демонстрирующий, как использовать библиотеку Servo8Bit.
#include "Servo8Bit.h"
int main()
{
Servo8Bit myServo; //создаем объект myServo
//максимальное количество - 5 сервоприводов
myServo.attach(1); //подключаем серво к порту PB1
//управление сервоприводом
while(1)
{
for(int pos = 0; pos < 180; pos++) // меняем положение от 0 градусов до 180 градусов
{ // с шагом 1 градус
myServo.write(pos); // команда сервоприводу установки штока в позицию 'pos'
delay(15); // ждем 15 мс пока сервопривод отработает команду
}
for(int pos = 180; pos > 1; pos--) // меняем положение шткоа от 180 градусов до 0 градусов
{
myServo.write(pos); // команда сервоприводу установки штока в позицию 'pos'
delay(15); // ждем 15 мс пока сервопривод отработает команду
}
}
}
В данном примере опущено определение функции delay(), которая необходима, т.к. используются временные задержки в тексте программы. В секции загрузок имеется сама библиотека и полная программа-пример для управления серводвигателем.
Библиотека содержит несколько функций. Рассмотрим их назначение.
- функция attach() – функция, назначающая переменной Servo вывод микроконтроллера для управления сервоприводом. Например, myServo.attach(1) – порт микроконтроллера PB1 используется для управления сервоприводом;
- функция write() – запись значения в градусах в сервопривод, соответственно управление исполнительным механизмом сервопривода, т.е. поворот штока сервопривода на заданную величину;
- функция writeMicroseconds() – запись значения в микросекундах в сервопривод, соответственно управление валом сервопривода;
- функция read() - функция предназначена для получения информации о текущем положении вала сервопривода (это значение функция получает с последнего вызова функции write());
- функция attached() – проверяется назначен ли переменной Servo вывод микроконтроллера;
- функция detach() – отключение переменной Servo от вывода микроконтроллера.
Когда назначается вывод микроконтроллера для управления сервоприводом - функция attach(), на этом выводе микроконтроллера начинается генерация управляющего ШИМ сигнала. Функция detach() останавливает генерацию ШИМ сигнала, т.е. после выполнения данной фуннкци указанный в функции порт микроконтроллера не будет использоваться для управления сервоприводом. Для повторного включения потребуется вызов функции attach().
Управляющий сигнал – это импульсный сигнал с ШИМ (широтно-импульсной модуляцией), представляющий собой последовательность прямоугольных импульсов с амплитудой 3 В - 5 В и длительностью от 0.9 до 2.1 мс. Собственно длительность импульса в ШИМ сигнале и определяет положение исполнительного механизма. Минимальное значение – означает разворот в крайнее левое положение, среднее – центральное положение штока, а максимальное значение – крайнее правое положение. Однако существуют некоторых различия управляющих параметров, в зависимости от модели сервопривода.
По умолчанию, это команда сервоприводу для перемещения в среднее положение. Пользователь управляет сервоприводом посредством функции write() с числом в диапазоне от 0 до 180. Это число – положение штока сервопривода в градусах. Микроконтроллер формирует в соответствии с этим значением нужный ШИМ сигнал.
Так как выпускаются различные модели сервоприводов и параметры у них разные, то обязательно потребуется конфигурирование – изменение длительности импульсов ШИМ сигнала. С этой целью возможно использование функции write() с несколькими аргументами: write(pin, min, max), где, pin – вывод микроконтроллера, предназначенный для управления сервоприводом, min – минимальное значение длительности импульса для генерации команды установки штока в положение 0 градусов, max – максимальное значение длительности импульса для генерации команды установки штока в положение 180 градусов. Значения по умолчанию – 544 мкс и 2400 мкс. Кроме того, возможно использование функции writeMicroseconds() для ручной установки длительности импульса.
Ограничение текущей версии библиотеки:
- работает только с микроконтроллером ATtiny45 и ATtiny85. Возможно библиотека будет работать и с другими микроконтроллерами AVR, но автором это проверено не было;
- поддерживается работа только с 5 сервоприводами*;
- работа возможна только при тактовой частоте 8 МГц;
- подключение сервоприводов возможно только на порт B микроконтроллера (это один порт доступный в ATtiny45/85);
- используется 8-битный таймер микроконтроллера Timer0, возможность выбора другого таймера имеется, но слишком затруднена настройка в этом случае.
* драйвер можно легко сконфигурировать для работы с более чем 5 сервоприводами, см. комментарии в тексте программной библиотеки.
В планах:
- поддержка различных тактовых частот;
- поддержка конфигурирования таймера для использования драйвером сервопривода.
Демонстрация работы
Загрузки
Программная библиотека Servo8bit, make-файл, пример программы – скачать