Управление множеством сервомашинок с PIC16F628A

Управление сервоприводами с ПК

Сервоприводы (часть 3)

В предыдущих статьях было рассмотрено устройство сервопривода и управление одним сервоприводом с помощью контроллера. Но ранее рассмотренным способом можно управлять одним – двумя сервомашинками, при большем их количестве это уже будет трудно, тем более, если контроллер выполняет и другие задачи. В этой статье будет рассмотрено, как управлять множеством сервомашинок с одного МК при помощи таймера TMR1. Также этими сервоприводами будем управлять с компьютера.

2 подключенных сервопривода

2 подключенных сервопривода

Идея

Идея в следующем: таймер отсчитывает такты на высокой частоте, при каждом такте переменная T увеличивается на 1 (подсчитывает такты). Эти такты формируют посылки для управления сервоприводами. В начале каждой посылки T=0 и на всех вывода, которые идут на сервомашинки, установлен высокий уровень сигнала. При каждом «тике таймера» значение переменной T сверяется с максимальным количеством тактов в посылке и со значениями количества тактов позиций всех сервоприводов, на совпавших приводах будет установлен низкий уровень сигнала. По достижению конца посылки, T обнулиться и на всех выходах будет установлен высокий уровень сигнала, т.е. текущая посылка будет завершена и начнётся всё с начала.

Посылки для сервоприводов

Посылки для сервоприводов

Все эти действия происходят в обработчике прерываний (по прерываниям от таймера), в фоне, и не мешают выполнению главной функции.

Посылка через COM порт

Вид посылки через COM

Вид посылки через COM порт

В примере в главной функции разместилась связь с компьютером через USART. Для облегчения работы и уменьшению размера посылки, но в небольшой ущерб количеству позиций валов сервоприводов, была выбрана одно байтовая посылка через COM порт. 6 младших бит в этом байте отвечают за положение вала, всего 64 позиции, старшие 2 бита отвечают за выбор одного из 4-х сервоприводов. 64 позиции – это 2,8 градуса для сервопривода со 180 градусным ходом вала, соответственно для 90 градусного шаг составит 1,4 градуса, для большинства задач этого вполне достаточно. Также в качестве индикации о приходе байта будет мигать светодиод.

Примечание: в статье применялись одни сервоприводы, у вас могу быть совершенно другие, и не факт, что они будут совершенно одинаково работать – так что для каждого сервопривода будет свой рабочий интервал, его нужно будет задать в контроллере или учесть при управлении с компьютера.

Прошивка

В главной функции разместилась обработка посылки с последовательного порта.

if(RCIF)			//	Ожидание прихода байта
{
temp=getch_Usart();	//	Чтение байта
temp2=temp%64+20;	//	Вычисление положение вала (первые 6 разрядов)
switch(temp/64)		//	Выбор сервопривода (старшие 2 разряда)
{
case 0:T1=temp2;break; 	//Запись позиции вала 1 сервопривода
case 1:T2=temp2;break;
case 2:T3=temp2;break;
case 3:T4=temp2;break;
}
LED=40;				//	Мигнём светодиодом
LED_on();
}

Установки регистров для таймера выглядит следующим образом:

INTCON=0b10100000;//Глобальные прерывания и от TMR0 разрешены.
OPTION=0b00001000;

В обработчике прерываний обрабатываются прерывания только от таймера TRM0. Происходящее здесь было описано выше.

void interrupt isr(void)			//	Обработчик прерываний
{
if(T0IF)			//	Произошло прерывание по таймеру
{
T++;			//Увеличение счётчика
if(T==T1) 		//Сработка 1 сервопривода
{
ClrBit(BUF,7);//Низкий уровень сигнала на 1 серве
}
if(T==T2) 		//Сработка 2 сервопривода
{
ClrBit(BUF,6); //Низкий уровень сигнала на 2 серве
}
if(T==T3) 		//Сработка 3 сервопривода
{
ClrBit(BUF,5); //Низкий уровень сигнала на 3 серве
}
if(T==T4) 		 //Сработка 4 сервопривода
{
ClrBit(BUF,4); //Низкий уровень сигнала на 4 серве
}

if(T==600) 		//Конец посылки
{
BUF|=0xF0; 	//Высокие уровень логического сигнала на всех сервах
T=0; 		//Обнуление счётчика
}
PORTB=BUF; 	//Запись в порт
TMR0=180; 		//Установка начального значения 0 таймера
T0IF=0; 		//Обнуление флага
}
}

Программа на ПК

Для управлениями сервами с компьютера была написана небольшая программа.

Программа для управления сервами

Программа для управления сервами

Программа позволяет управлять положением валов сервоприводов, как с помощью ползунков, так и выставлять их вручную, также предусмотрено управление с клавиатуры, с джойстика и «автопилот». Из настроек только выбор COM порта.

Перейти к программе

Небольшое видео, демонстрирующее работу. К сожалению всего 2 сервопривода в наличие.

Видео

Плата

Схема

Схема

Питание платы производиться стабилизированными 5 вольтами. В схеме применена развязка цепи контроллера от сервоприводов с помощью диода шотки D1 и сглаживающего конденсатора C1. Плата при работе сервоприводов может потреблять ток до 0,8 А и больше, в зависимости от используемых сервоприводов и их количества. При больших токах ёмкость входного конденсатора C2 следует увеличить.

Печатка

Печатка

Печатная плата содержит микроконтроллер PIC16F628A, MAX232 и разъём DB-9M для согласования уровней USART для связи с компьютером через COM порт и обвязку. Для связи с компьютером нужен 0-модемный кабель. Можно подключить по USB, для этого понадобиться COM-USB переходник.

Одно из возможных применений данной конструкции – управление камерой.

Существую и другие алгоритмы управления множеством сервоприводов с одного контроллера, мной же был реализован такой.

Скачать исходник, прошивку и печатку

Статья обновлена 30.07.2011

24 комментария »

Alex_EXE | 31.05.2011 | Робототехника | 25 176 просмотров

24 комментария на « Управление множеством сервомашинок с PIC16F628A»

  1. В пишет 31.05.2011 в 16:38 #

    еще неплохо указать, что первоначально идея была озвучена (по крайней мере я видел около года назад, наверное) на изиэлектрониксе… так, для порядка… 😉

  2. Alex_EXE пишет 01.06.2011 в 20:55 #

    Эта тема не нова. Видел ту статью. Не только она послужила толчком для начала работы с сервоприводами, большее впечатление оказали видео ролики на youtube 6-ти ногих роботов жуков.
    По сравнению со статьей на easyelectronics тут использован другой метод управления сервоприводами.

  3. Иван пишет 26.09.2011 в 02:21 #

    Отлично то что нужно, соберем опробуем. Спасибо)

  4. Иван пишет 29.09.2011 в 05:49 #

    Привет. Собрал ваше устройство работает отлично, но заметил такую штуку, что сервомашинки не до конца выкручиваются, как это можно побороть? Спасибо.

  5. Alex_EXE пишет 30.09.2011 в 08:28 #

    К сожалению, у сервомашинок, тем более, если они дешевые китайские, могут немного отличаться крайние положения вала.
    Придётся перекомпилировать исходники под себя, нужно будет подправить некоторые значения, которые отвечают за крайние положения валов. В выходные постараюсь обновить исходники, что бы нужные константы легче было задавать.

  6. Alex_EXE пишет 04.10.2011 в 11:06 #

    Подредактировал исходник – скачать . Константы MIN и MAX отвечают за крайние положения вала.

  7. Дмитрий пишет 05.10.2011 в 16:48 #

    Приветствую. Очень понравилась ваша работа. Подскажите пожалуйста, можно ли настроить управление сервомашинками через data-кабель от мобильного телефона.

  8. Alex_EXE пишет 05.10.2011 в 21:38 #

    Теоретически можно, практически не знаю, смотреть нужно.
    К старым моделям, например Siemens, у которых есть UART и возможен диалог по средствам AT команд – можно, к примеру с помощью СМС. Но понадобиться небольшой движок, для диалога с телефоном.

  9. Александр пишет 08.12.2011 в 20:49 #

    собрал схему, при старте двиг дергается и ни на что не реагирует

  10. Александр пишет 09.12.2011 в 22:37 #

    Со схемой разобрался, все работает как и ожидалось, огромное СПАСИБО Alex_EXE !!! за поддержку, много переписывались, он объяснял что и к чему, к сожалению это была моя невнимательность при разработке печатки, конструкция очень понравилась, мои ожидания оправдала.

  11. Александр пишет 26.02.2012 в 15:06 #

    Доброго времени суток!

    Можно сделать так, что бы записать в программу десяток-другой фиксированных точек положений (разных для каждой сервы) и потом включать работу их нажатием кнопки на экране монитора?

    Спасибо!

  12. Alex_EXE пишет 26.02.2012 в 15:55 #

    Сделать можно.
    В программу можно отсылать значения из сторонних программ или командной строки, см. статью по программе или подкорректировать программу под Ваши нужды.

  13. Михаил пишет 21.10.2012 в 20:47 #

    А сколько раз в секунду происходит прерывание по таймеру?

  14. Alex_EXE пишет 22.10.2012 в 13:45 #

    Очень много, если не ошибаюсь то около 150000.
    Этот метод устарел, как доделаю новую плату начну писать статью по более оптимальному алгоритму управления сервами.

  15. Михаил пишет 22.10.2012 в 18:44 #

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

  16. Alex_EXE пишет 23.10.2012 в 08:36 #

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

  17. art-mistik пишет 17.06.2014 в 21:24 #

    Здравствуйте!
    Может не по теме — и в этой ветке решил написать )))
    У меня такой вопрос:
    Есть передатчик 9 каналов и есть приемник — набор для авиамоделизма. Но задача в том чтоб с приемника сигналы ШИМ — через AVR — получать логические сигналы. Т.е. сервы работают от передатчика самим собой, но хотелось бы с пульта посылать сигналы логики для включения фар освещения или другой функционал.
    Спасибо

  18. Alex_EXE пишет 17.06.2014 в 22:19 #

    В данной ветке не по теме.
    Но такой проект у меня есть, правда он все еще закрытый, — в разделе авиа — PPM ключ.

  19. 123ksn пишет 21.08.2014 в 11:07 #

    Большое спасибо за разработку!!!
    Но есть вопрос. Мне надо управлять сервомашинками заслонок вентиляции. Т.е. контроллер будет где-то в центре дома, а сероприводы на удалении более 10м. Посольку Вы работаете с сервомашинками может быть у Вас встречалась аналогичная проблема(большое расстояние)? Если «ДА», то как Вы её решали? Я вот думаю через интерфейс RS485. Но может зря волнуюсь?

  20. Alex_EXE пишет 25.08.2014 в 18:30 #

    А сервомашинки стоят промышленные или хоббийные? Т.к. у промышленных серв может быть не PPM интерфейс, а что-нибудь по интереснее.
    В паре своих проектов кидал PPM сигнал на удаление до 5м от пульта, всё работало нормально, дальше не пробовал.
    На большие же расстояния лучше применять специальные промышленные линии, например известный и надёжный Rs-485. С ним работа, впечатления хорошие, но опубликованных наработок по нему у меня мало.

  21. Павел пишет 09.12.2015 в 23:33 #

    Alex_EXE, здравствуйте, собрал вашу плату, проблема как у Александра, отписавшегося выше, — при подключении серво слегка дергается и все, затем ноль реакции, можете оказать помощь?

  22. Евгений пишет 01.10.2016 в 20:00 #

    Уважаемый Alex_EXE !
    Почему файл с программой для ПК поврежден ? (exe. — o байт)
    Можно дать ссылку на рабочий файл ? или эта тема уже закрыта ?
    Спасибо !

  23. Alex_EXE пишет 01.10.2016 в 23:27 #

    Сайт последнее время стал работать не очень стабильно, в скором времени нужно будет этим заняться.
    Скачать программу AlServo4

  24. Владислав пишет 21.12.2016 в 16:47 #

    Здравствуйте, не могли бы Вы пояснить некоторые моменты алгоритма, в частности для чего нужная строка
    TMR0=180; //Установка начального значения 0 таймера
    Почему начальное значение не 0?
    И при каких исходных параметрах этот код работает (частота кварца, делителя и прочее)?

Комментарии RSS

Оставьте отзыв