Управление множеством сервомашинок с PIC16F628A
Управление сервоприводами с ПК
Сервоприводы (часть 3)
В предыдущих статьях было рассмотрено устройство сервопривода и управление одним сервоприводом с помощью контроллера. Но ранее рассмотренным способом можно управлять одним – двумя сервомашинками, при большем их количестве это уже будет трудно, тем более, если контроллер выполняет и другие задачи. В этой статье будет рассмотрено, как управлять множеством сервомашинок с одного МК при помощи таймера TMR1. Также этими сервоприводами будем управлять с компьютера.
2 подключенных сервопривода
Идея
Идея в следующем: таймер отсчитывает такты на высокой частоте, при каждом такте переменная T увеличивается на 1 (подсчитывает такты). Эти такты формируют посылки для управления сервоприводами. В начале каждой посылки T=0 и на всех вывода, которые идут на сервомашинки, установлен высокий уровень сигнала. При каждом «тике таймера» значение переменной T сверяется с максимальным количеством тактов в посылке и со значениями количества тактов позиций всех сервоприводов, на совпавших приводах будет установлен низкий уровень сигнала. По достижению конца посылки, T обнулиться и на всех выходах будет установлен высокий уровень сигнала, т.е. текущая посылка будет завершена и начнётся всё с начала.
Посылки для сервоприводов
Все эти действия происходят в обработчике прерываний (по прерываниям от таймера), в фоне, и не мешают выполнению главной функции.
Посылка через 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
Alex_EXE | 31.05.2011 | Робототехника |
В пишет 31.05.2011 в 16:38 #
еще неплохо указать, что первоначально идея была озвучена (по крайней мере я видел около года назад, наверное) на изиэлектрониксе… так, для порядка… 😉
Alex_EXE пишет 01.06.2011 в 20:55 #
Эта тема не нова. Видел ту статью. Не только она послужила толчком для начала работы с сервоприводами, большее впечатление оказали видео ролики на youtube 6-ти ногих роботов жуков.
По сравнению со статьей на easyelectronics тут использован другой метод управления сервоприводами.
Иван пишет 26.09.2011 в 02:21 #
Отлично то что нужно, соберем опробуем. Спасибо)
Иван пишет 29.09.2011 в 05:49 #
Привет. Собрал ваше устройство работает отлично, но заметил такую штуку, что сервомашинки не до конца выкручиваются, как это можно побороть? Спасибо.
Alex_EXE пишет 30.09.2011 в 08:28 #
К сожалению, у сервомашинок, тем более, если они дешевые китайские, могут немного отличаться крайние положения вала.
Придётся перекомпилировать исходники под себя, нужно будет подправить некоторые значения, которые отвечают за крайние положения валов. В выходные постараюсь обновить исходники, что бы нужные константы легче было задавать.
Alex_EXE пишет 04.10.2011 в 11:06 #
Подредактировал исходник – скачать . Константы MIN и MAX отвечают за крайние положения вала.
Дмитрий пишет 05.10.2011 в 16:48 #
Приветствую. Очень понравилась ваша работа. Подскажите пожалуйста, можно ли настроить управление сервомашинками через data-кабель от мобильного телефона.
Alex_EXE пишет 05.10.2011 в 21:38 #
Теоретически можно, практически не знаю, смотреть нужно.
К старым моделям, например Siemens, у которых есть UART и возможен диалог по средствам AT команд – можно, к примеру с помощью СМС. Но понадобиться небольшой движок, для диалога с телефоном.
Александр пишет 08.12.2011 в 20:49 #
собрал схему, при старте двиг дергается и ни на что не реагирует
Александр пишет 09.12.2011 в 22:37 #
Со схемой разобрался, все работает как и ожидалось, огромное СПАСИБО Alex_EXE !!! за поддержку, много переписывались, он объяснял что и к чему, к сожалению это была моя невнимательность при разработке печатки, конструкция очень понравилась, мои ожидания оправдала.
Александр пишет 26.02.2012 в 15:06 #
Доброго времени суток!
Можно сделать так, что бы записать в программу десяток-другой фиксированных точек положений (разных для каждой сервы) и потом включать работу их нажатием кнопки на экране монитора?
Спасибо!
Alex_EXE пишет 26.02.2012 в 15:55 #
Сделать можно.
В программу можно отсылать значения из сторонних программ или командной строки, см. статью по программе или подкорректировать программу под Ваши нужды.
Михаил пишет 21.10.2012 в 20:47 #
А сколько раз в секунду происходит прерывание по таймеру?
Alex_EXE пишет 22.10.2012 в 13:45 #
Очень много, если не ошибаюсь то около 150000.
Этот метод устарел, как доделаю новую плату начну писать статью по более оптимальному алгоритму управления сервами.
Михаил пишет 22.10.2012 в 18:44 #
просто я AVRщик (регистры INTCON и OPTION мне ни о чем не говорят) и мне из-за простоты понравился сам принцип управления.
а из более оптимальных (по крайней мере значительно более оптимальных) я встречал только посылку импульсов при помощи аппаратной шим, но там можно управлять только стольким количеством сервомашинок, сколько ножек у микроконтроллера могут выдавать аппаратную шим. а этого мало
Alex_EXE пишет 23.10.2012 в 08:36 #
Есть у меня более оптимальный алгоритм, он позволяет подключить несколько сервопрводов с большой точностью и меньше грузит камень, на его принципе построен сервотестер , но повторюсь, что материал по тому алгоритму ещё не готов.
Кстати, с этой платой он будет совместим.
art-mistik пишет 17.06.2014 в 21:24 #
Здравствуйте!
Может не по теме — и в этой ветке решил написать )))
У меня такой вопрос:
Есть передатчик 9 каналов и есть приемник — набор для авиамоделизма. Но задача в том чтоб с приемника сигналы ШИМ — через AVR — получать логические сигналы. Т.е. сервы работают от передатчика самим собой, но хотелось бы с пульта посылать сигналы логики для включения фар освещения или другой функционал.
Спасибо
Alex_EXE пишет 17.06.2014 в 22:19 #
В данной ветке не по теме.
Но такой проект у меня есть, правда он все еще закрытый, — в разделе авиа — PPM ключ.
123ksn пишет 21.08.2014 в 11:07 #
Большое спасибо за разработку!!!
Но есть вопрос. Мне надо управлять сервомашинками заслонок вентиляции. Т.е. контроллер будет где-то в центре дома, а сероприводы на удалении более 10м. Посольку Вы работаете с сервомашинками может быть у Вас встречалась аналогичная проблема(большое расстояние)? Если «ДА», то как Вы её решали? Я вот думаю через интерфейс RS485. Но может зря волнуюсь?
Alex_EXE пишет 25.08.2014 в 18:30 #
А сервомашинки стоят промышленные или хоббийные? Т.к. у промышленных серв может быть не PPM интерфейс, а что-нибудь по интереснее.
В паре своих проектов кидал PPM сигнал на удаление до 5м от пульта, всё работало нормально, дальше не пробовал.
На большие же расстояния лучше применять специальные промышленные линии, например известный и надёжный Rs-485. С ним работа, впечатления хорошие, но опубликованных наработок по нему у меня мало.
Павел пишет 09.12.2015 в 23:33 #
Alex_EXE, здравствуйте, собрал вашу плату, проблема как у Александра, отписавшегося выше, — при подключении серво слегка дергается и все, затем ноль реакции, можете оказать помощь?
Евгений пишет 01.10.2016 в 20:00 #
Уважаемый Alex_EXE !
Почему файл с программой для ПК поврежден ? (exe. — o байт)
Можно дать ссылку на рабочий файл ? или эта тема уже закрыта ?
Спасибо !
Alex_EXE пишет 01.10.2016 в 23:27 #
Сайт последнее время стал работать не очень стабильно, в скором времени нужно будет этим заняться.
Скачать программу AlServo4
Владислав пишет 21.12.2016 в 16:47 #
Здравствуйте, не могли бы Вы пояснить некоторые моменты алгоритма, в частности для чего нужная строка
TMR0=180; //Установка начального значения 0 таймера
Почему начальное значение не 0?
И при каких исходных параметрах этот код работает (частота кварца, делителя и прочее)?