Устройства управления роботами, схемотехника и программирование (М. Предко, 2004). Устройства управления роботами, схемотехника и программирование. Устройствауправления роботамисхемотехника и микроконтроллеров picmicro
Скачать 6.79 Mb.
|
4.34. ОДОМЕТРИЯ Одометр - это устройство, связанное с колесом робота, которое по количеству сделанных оборотов позволяет измерять пройденное им расстояние. Эти данные можно использовать в программе для вычисления текущих координат робота (на- вигация) или для измерения скорости его движения (спидометр). В этом разделе мы рассмотрим основные методы одометрии, которые можно применять в радио- любительских конструкциях мобильных автоматических устройств. Чтобы не разочаровывать читателя, должен сразу признаться, что здесь вы не найдете конкретных примеров реализации подобных функций. Во-первых, они были бы слишком громоздки на фоне остальных представленных в этой книге простых примеров, а во-вторых, я всерьез сомневаюсь в возможности ре- ализации описанных в данном разделе алгоритмов с помощью микроконтролле- ра PIC16F627. Сам по себе принцип измерения расстояния по количеству оборотов двигате- ля или колеса довольно прост. Не слишком сложна и реализация этого принципа. Именно так ваш компьютер узнает о перемещении манипулятора типа «мышь». Если вы разберете компьютерную мышку (заметьте, я сказал то обна- ружите, что вращающийся внутри нее шарик соединен с двумя колесиками, име- ющими по краям множество отверстий. По одну сторону от каждого колесика рас- положены два оптических излучателя, а по другую напротив каждого излучателя имеется оптический детектор (рис. 4.85). Пара «излучатель-детектор» вместе с прорезями на ободе колесика образуют так называемый оптический прерыва- тель. Во время вращения колесика принимаемый детектором сигнал периодически прерывается, так как между детектором и излучателем прозрачные и непрозрачные участки сменяют друг друга. Число принятых импульсов соответствует количеству отверстий; таким образом, обычный цифровой счетчик, подключенный к прерыва- телю, позволяет измерить угол, на который повернулось колесико. Два излучателя и детектора нужны для того, чтобы определять направление вращения. Если мы хотим использовать тот же принцип в наших автоматических устрой- ствах, то должны соединить оптический прерыватель непосредственно с валом Прорези ' (интервал Оптический прерыватель 1 Оптический прерыватель 1 Рис. 4.85. вращения колеса 306 Устройства управления роботами двигателя. Прим этом в большинстве одного излучателя и де- тектора, так как направление вращения известно управляющей программе. Зная угол, на который повернулся вал в каждый момент времени, несложно вычислить скорость движения робота V: для этого можно воспользоваться фор- мулой V = / где - радиус колеса робота; М - количество отверстий в колесике прерывателя; N - число импульсов, принятых счетчиком за время Т. Например, если колесо радиусом 3 см используется вместе с прерывателем, в котором имеется 30 отверстий, то 10 импульсов в секунду соответствуют скоро- сти движения робота V = 2 х 3,14 х 3 см х 10 / (30 х 1 с) = 6,28 см/с. Разумеется, это не слишком высокая скорость. Среднее значение обычно со- ставляет около 15 см/с, а скорость, достигающая 1 м/с, по-настоящему впечатля- ет, особенно если робот при этом ни во что не врезается. Используя один датчик и предполагая, что оба колеса вращаются с одинако- вой скоростью, можно рассчитать длину пути, пройденного роботом за данный период времени. Если ваше устройство основано на модели мыши фирмы вы вряд ли заставите его двигаться прямолинейно. Когда каждое колесо управляется отдель- ным двигателем и не принимаются специальные меры по точной ско- рости их вращения (а эти меры требуют использования двух прерывателей - по одному на каждое колесо), то разброс параметров двигателей и различные силы трения, действующие в левом и правом приводе, всегда приведут к тому, что ро- бот будет стремиться повернуть в какую-либо сторону. Впрочем, даже если скорости вращения левого и правого колеса немного отли- чаются друг от друга, разница эта настолько мала, что ею можно пренебречь при вычислении длины пройденного пути. Но, разумеется, этого же нельзя дать применительно к направлению движения: даже самый небольшой приводит к заметным искривлениям траектории. Что касается методов стабилизации направления движения, основанных на регулировании скорости вращения левого и правого двигателей, то их рассмотре- ние и тем более программирование относятся к области высшего пилотажа в тео- рии автоматического управления, а потому выходят за рамки данной книги (хотя это интересные темы и, быть может, я вернусь к ним в какой-нибудь следующей книге). Чтобы вы получили возможность оценить круг возникающих при этом проблем, приведем два основных момента, которые приходится учитывать. Во-первых, надо знать инерцию двигателей (и самого робота) при изменении управляющих сигналов. Очевидно, что двигатели не могут сразу начать вращать- ся с той скоростью, которую мы для них хотим задать. Это очень важный вопрос, потому что два двигателя, которые по-разному ускоряют или замедляют свое вра- щение, даже хуже, чем два двигателя, вращающиеся с разной скоростью. Подключение к микроконтроллеру периферийных устройств 307 Во-вторых, надо рассчитать стабильный режим работы. А он зависит от того, насколько правильно двигатель «держит» заданную скорость. Наиболее распространенный метод управления двигателями основан на ис- пользовании так называемого регулятора (ПИД). Входным сигналом регулятора обычно является отклоне- ние измеряемой величины (в нашем случае это скорость от ее желаемого значения. Как следует из названия, ПИД-регулятор состоит из трех частей: пропорциональная часть вырабатывает управляющий сигнал, величина которого пропорциональна входному сигналу (то есть текущее отклонение скоро- сти вращения двигателя от желаемого умножается на какой-то коэффициент); выходной сигнал интегральной части, как нетрудно догадаться, вычисляется с помощью интегрирования входной величины за некоторый уже прошедший про- межуток времени (другими словами, на какой-то другой коэффициент умножает- ся лишнее число оборотов, которые двигатель совершил за данное время); нако- нец, дифференциальная часть вырабатывает управляющий сигнал по величине скорости изменения входного сигнала (то есть на некий третий коэффициент умножается ошибка ускорения вращения двигателя). Все это проще выразить формулой u = k v + + v, n и а - это соответственно ошибка скорости, ошибка числа оборотов и ошиб- ка ускорения вращения двигателя, a k , Ц и - три коэффициента, значения ко- торых необходимо подобрать так, чтобы достичь оптимальных характеристик проектируемой системы. Существуют специальные методы (и программы) для расчета этих коэффици- ентов, но их можно подобрать и экспериментально, если предусмотреть какой- либо способ их оперативного изменения, например с помощью пульта дистанци- онного управления. В первую очередь надо выбрать оптимальное значение коэффициента k про- порциональной части. Это лучше делать, испытывая работу двигателей и регу- лятора на неизменных режимах. Затем можно заняться подстройкой остальных двух коэффициентов, обращая внимание на моменты включения и выключения двигателей. Необходимо убедиться, что при смене режима работы не происхо- дит слишком резких или даже изменения направления вращения двига- телей. Вполне возможно реализовать с помощью микроконтроллера PIC16F627 все необходимые для вычисления в промежутке между двумя вызо- вами обработчика прерываний от таймера TMRO, происходящих каждую милли- секунду. В принципе, эти вычисления лучше было оформить в виде биологичес- кого кода верхнего уровня, но на самом деле соответствующий уровень не совсем биологический. Он скорее механический, и его выполнение в главной программе может помешать работе действительно биологического кода. В некоторых случа- ях целесообразно рассмотреть вопрос о возможности использования отдельного микроконтроллера, который взял бы на себя функции ПИД-регулятора. 308 Устройства управления роботами С помощью информации, получаемой от двух оптических прерывателей, мож- но с той или иной точностью вычислить текущие координаты робота, подобно тому как это делается в самолетах с помощью системы INS (Inertial Navigation System). В ней компьютеры с помощью нескольких гироскопов определяют, ка- кое ускорение действует на воздушный лайнер, и тем самым вычисляют его теку- щие координаты. Для обсуждения хотя бы самых основ этих методов нам потребуется высшая математика. Если вы не помните, что такое тригонометрия, вам стоит освежить свои знания, заглянув в учебник по математике для старших классов. Как бы то ни было, сама по себе идея управления роботом на основе навигаци- онной информации не так уж и сложна. Если известны начальная и конечная позиции робота, то можно вычислить направление движения и расстояние между ними. Например, робот сейчас находится в точке плоскости (х, у) с координатами = (0, 0), причем его ориентация совпадает с осью абсцисс, а мы хотим пе- реместить его в точку с координатами (х2, у2) = (3, 4). Сначала надо рассчитать величину угла, на который должен повернуться робот. Тангенс этого угла опреде- ляется по формуле Для нашего примера получаем tga = Ay / Ax = 4 / 3 Для вычисления самого приходится использовать функцию арктангенс: a = arctg Ay / Для нашего случая arctg (4/3) = 53,13° = 0,927 рад. Разумеется, вы помните теорему Пифагора, поэтому без труда вычислите, что после поворота на этот угол робот должен преодолеть единиц расстояния, чтобы попасть в нужную точку. Проблема состоит в том, что идеального робота не существует. Трудно добить- ся поворота на точно заданный угол, и нелегко правильно измерить пройденное расстояние, особенно если учесть, что робот перемещается по прямой линии. На рис. 4.86 показана траектория, по которой движется робот, если разни- ца в скорости вращения двух его колес остается строго постоянной. Эта траекто- рия близка к окружности. Если робот будет двигаться в таком режиме достаточно долго, а поворота будет выдерживаться весьма точно, то, совершив полный оборот вокруг некоторой точки, робот вернется в то место, откуда начал свой путь. Для определенности будем называть текущей позицией робота ту его точку, которая лежит на оси строго посередине между двумя его колесами. Рассмотрим для примера рис. 4.87. Робот медленно поворачивается направо; при этом его правое колесо проходит путь, длина которого чуть меньше той, что приходится Подключение к микроконтроллеру периферийных устройств 309 Конечное положение Угол поворота Начальное положение Рис. 4.86. Траектория движения робота радиус Начальное положение Рис. 4.87. Вычисление координат по данным преодолевать левому колесу. Обозначим буквой X длину пути, пройденную внут- ренним (при повороте направо - правым, при повороте налево - левым) колесом, а длину пути, пройденного за то же время вторым колесом, - буквой Y. Треуголь- ник на рис. 4.87 при небольших углах поворота похож на прямоугольный. Тогда, согласно формулам тригонометрии, для внутреннего треугольника X = R X / R = sina. Здесь R - радиус поворота (то есть радиус окружности, которую образует траек- тория движения робота); a - угол поворота. Для наружного треугольника Y (R + + Z) = sina, где Z - расстояние между колесами. Приравняв второе равенство, записанное для одного колеса, и второе равен- ство, записанное для другого колеса, получим + Z). 310 Устройства управления роботами Отсюда можно найти радиус окружности, которую описывает внутреннее ко- лесо: R XZ / (Y - X). При известных значениях X, Y и Z можно без труда определить R, что, в свою очередь, позволяет вычислить угол поворота: а = arcsin(X / R). Если, например, X = 2 см, Y = 2,1 см, а расстояние между колесами Z = 4 см, то R = 2 x 4 / (2,1 - 2) = 8 / 0,1 = 80 см; а = arcsin(X / R) arcsin(2 / 80) = arcsinO,025 0,025 рад = 1,43°. Заметим, что арксинус малого угла всегда примерно равен величине самого угла, выраженной в радианах. Позицию робота мы договорились определять по координатам его средней точки, которая на Z/2 отстоит от внутреннего колеса. Поэтому радиус окружнос- ти, которую описывает эта точка, равен R + Z/2 = 82 см. Следовательно, конечные координаты робота у2 = (R + Z / 2) = 82 х sinO,025 = 2,05 см; - 0. Итак, конечные координаты робота в нашем примере (0; 2,05). Глядя на эти формулы, вы можете решить, что теперь легко сумеете направить робота прямиком к любой точке комнаты. К сожалению, это не совсем так. При- меняя формулы на практике, следует учитывать, что с увеличением расстояний, которые используются при вычислениях, растет и погрешность результата, по- скольку перестают выполняться допущения, которые были сделаны при выводе формул. Кроме того, в программе придется использовать вычисления с плаваю- щей точкой, причем все выкладки надо делать быстро, иначе вы не будете успе- вать остановить робота в нужной точке. А если еще учесть неточность определения начальной позиции и весьма веро- ятные проскальзывания колес, особенно заметные, когда робот будет преодоле- вать неровные участки своего пути, наши выкладки окажутся еще менее надеж- ными, а задача навигации на основе одометрии еще более усложнится. 4.35. РАДИОУПРАВЛЯЕМЫЙ СЕРВОПРИВОД Для передачи команд дистанционного управления различными игрушками часто используются радиопередатчик и сервопривод с радиоприемником. Поэтому при конструировании робота мы можем использовать серводвигатели, установленные на радиоуправляемых моделях самолетов, автомобилей или лодок. Радиоуправ- ляемый сервопривод (R/C servo) обычно имеет на выходе колесо, которое может Подключение к микроконтроллеру периферийных устройств 311 поворачиваться на угол в диапазоне от 0° до 90° (некоторые устройства - от 0° до 180°). Усилие (вращающий момент), развиваемое серводвигателем, обычно неве- лико, хотя существуют специальные устройства, в которых оно может достигать больших значений. Напряжение питания в большинстве случаев составляет +5 В. Никаких сложных подключений сервоприводы не требуют - чаще всего исполь- зуются всего три внешних вывода: напряжение питания, общий вывод и входной сигнал управления. . ' Серводвигатель является аналоговым устройством, управляемым с помощью широтно-модулированного сигнала постоянной амплитуды. Обычно это импуль- сы длительностью от 1 до 2 мс, подаваемые каждые 20 мс (рис. 4.88). 1 мс I 2 I I I I I I I I I Рис. 4.88. диаграмма управления сервоприводом длительность импульсов соответствует большему углу поворота сер- водвигателя. Для формирования управляющего ШИМ-сигнала можно использо- вать следующий код, который понадобится поместить в процедуру обработки пре- рываний от таймера: { int i = 0; Servo, 1 ) for ( = 0, i < (1 msec + BitOutput( Servo, 2 ); for ( ; i < 2 msec; i++ ); // Процедура обработки прерываний. // Выходной сигнал. ServoDlay); i++ ); // Задержка на 2 мс. // Конец обработчика прерываний. Эту программу несложно модифицировать для работы с несколькими серво- двигателями (добавив новые выходные переменные Servo и счетчики для фор- мирования задержек ServoDlay). Основное преимущество продемонстри- рованного подхода заключается в том, что значение переменной ServoDlay можно изменять, не оказывая никакого влияния на выполнение обработчика Приведенный код прекрасно работает с автономным радиоуправляемым устройством, но показывает не слишком хорошие результаты, если мы захотим 312 Устройства управления роботами использовать его в качестве одного из многих интерфейсов, реализованных в виде процедуры обработки прерываний от таймера, срабатывающего каждую миллисе- кунду. В этом случае миллисекундная задержка оказывается слишком большой. Надо раза в четыре уменьшить период срабатываний таймера, доведя его значе- ние хотя бы до 256 Обычно радиоуправляемые сервоприводы могут распо- знавать около пяти команд; возможные варианты и соответствующие длительно- сти импульсов приведены в табл. 4.19. Таблица Команды радиоуправляемого сервопривода Номер команды 1 3 4 5 Задержка во времени, мс 1,00 1,25 1,50 2,00 Команда Реверс на полной скорости Реверс на половинной скорости Стоп Вперед на половинной скорости Вперед на полной скорости Серводвигатель можно заставить вращаться постоянно, заменив в его схе- ме потенциометр, который входит в цепь обратной связи, управляющей поло- жением привода, резистором, а также убрав пластмассовый выступ, который ограничивает угол поворота привода, не давая ему повернуть- ся на угол, больший 90°. Положение движка подстроечного резистора следует подобрать экспериментально. Мы еще вернемся к этому вопросу в следующем разделе. 4.36. ПРОСТОЕ РАДИОУПРАВЛЯЕМОЕ УСТРОЙСТВО Здесь мы рассмотрим простую радиоуправляемую конструкцию на основе стан- дартного серводвигателя. Нам потребуется два таких двигателя, каждый из кото- рых будет управлять соответствующим колесом робота. Радиоуправляемые сер- водвигатели не слишком дороги и достаточно неприхотливы с точки зрения как требуемых для их подключения аппаратных средств, так и управляющего про- граммного обеспечения. Но их придется немного модифицировать, чтобы они могли крутиться постоянно. На постройку описанной здесь конструкции я затратил не более получаса, включая то время, которое потребовалось на модификацию обоих серводвига- телей. Я использовал лист толстой фанеры размером 8x3,75 дюймов (203x95 мм). Перед размещением элементов поверхность фанеры желательно покрыть грунтов- кой (для этого удобно использовать пульверизатор с краской), чтобы элементы приклеились к основанию. В крайнем случае можно обмотать уже собранное устройство изоляционной лентой. Внешний вид приемника показан на рис. 4.89. Принципиальная схема приве- дена на рис. 4.90, а использованные элементы описаны в табл. 4.20. Подключение к микроконтроллеру периферийных устройств 313 Правый контактор Микроконтроллер Правый фоторезистор Инфракрасный детектор Балансировка фоторезисторов Выключатель Батарейки питания Левый контактор Левый фоторезистор сервоприводом Рис. 4,89. Приемник команд радиоуправления От батарейки Vcc т 4 Т 15 5 Gnd | 47 мкФ PIC16F627 RBO Osc1 RB2 Osc2 RB4 RB5 C3 6 Vcc Разъемы для Vcc подключения Vcc } серводвигателей 8 4 vcc C4 К R | SW3 ' 10 ЮмкФ 4.90. Принципиальная схема приемника команд радиоуправления Таблица 4.20. Перечень использованных элементов Обозначение Элемент Примечание PIC16F627 Микроконтроллер U3 Инфракрасный детектор фирмы или другой совместимый /три вывода) Любой видимого диапазона КЗ, R6, R8 10 0,25 Вт 314 Устройства управления роботами Таблица 4.20. Перечень использованных элементов (окончание) Обозначение R2 R4 R7 С2 Элемент 470 Ом; 0,25 Вт 100 Ом, 0,25 Вт Фоторезистор, при нулевом освещении 16 В Выключатель любого типа Микропереключатель Керамический на 4 МГц, со встроенными конденсаторами Материалы Примечание При освещении должен уменьшать свое сопротивление Конденсатор любого типа Оксидный конденсатор Оксидный конденсатор Выключатель питания Для детектора столкновений Для генератора тактовых импульсов микроконтроллера Два модифицированных серводвигателя, два колесика от модели самолета, фанера, макетная плата, монтажные провода, четыре батарейки 1,2 В типа АА Сборку устройства лучше производить в следующем порядке: 1. Модифицируйте оба сервопривода для постоянного вращения двигателей, как описано выше. 2. Подсоедините серводвигатели к колесам робота. 3. С помощью эпоксидной смолы закрепите на робота в передней его части светодиод для индикации срабатывания детектора столкновений (од- новременно он может играть роль третьей точки опоры для всей конструк- ции). 4. Прикрепите к корпусу серводвигатели, батареи питания и контактные уси- ки обоих детекторов столкновений. 5. Выполните необходимые соединения между компонентами конструкции. 6. Запрограммируйте микроконтроллер и проверьте, как работает дистанци- онное управление. Все шесть этапов достаточно просты, но надо соблюдать внимательность, что- бы ничего не упустить. Первый этап (модификация сервопривода) не должен вызвать затруднений, но прежде чем приобретать ту или иную конкретную модель, следует убедиться, что вы сможете найти для нее нужную документацию (возможно, в сети Internet), где будет подробно объяснено, как модифицировать привод для того, чтобы двигате- ли могли совершать полный оборот вокруг своей оси. В некоторых случаях такая операция оказывается довольно затруднительной. Лучше всего приобрести сер- вопривод попроще и подешевле. Как уже говорилось, надо будет удалить встроенный потенциометр (или два резистора, которые его заменяют) и поставить вместо него резистор, Подключение к микроконтроллеру периферийных устройств 315 Декоративная панель Рис. Одно из колес для робота который можно просто приклеить к корпусу двигателя. Резистор следует распо- ложить так, чтобы вы могли изменить положение движка, не меняя положения робота, пока он стоит на месте. Разумеется, эту регулировку можно было бы реализовать программно, но управляющая программа от этого неоправданно услож- нилась бы. Гораздо проще подстроить сервопривод с помощью отвертки. Используемые в конструкции колеса должны подходить для серводвигателей. Самое простое — взять колесики от мо- дели самолета (диаметром 2 или 3 дюйма, то есть 5-7,5 см) и просверлить в центре каждого из них небольшое отверстие, в которое мог бы пройти болт, - с его помощью колесики будут крепиться к сер- водвигателям. Затем надо наклеить свер- ху (на ступицу) декоративную крышку, продающуюся в комплекте с колесиком, используя, к примеру, эпоксидную смолу (рис. 4.91). После того как все части окажутся скреплены друг с другом, настанет время поместить их в корпус робота. Для крепления батареек, сервопривода и электрон- ного блока управления можно обмотать их липкой лентой. Микропереключатели детектора столкновений также можно приклеить к кор- робота. Работая с клеем или эпоксидной смолой, не забывайте следовать инструкциям завода-изготовителя и хорошо проветривайте помещение. Выделяемые при этом пары не слишком ядовиты, но могут вызывать неприятные ощущения. На рис. 4.89 видно, что сбоку от батареек с одной стороны мы оставили место для выключателя питания, а с другой - для проводов, идущих к серводвигателям. Выключатель можно приклеить, а для крепления проводки следует просверлить отверстия в фанерном корпусе. Если вы не новичок и умеете планировать свои действия на несколько шагов вперед, то можете приклеить оба контактных детектора, светодиод, переключа- тель, подстрочные резисторы серводвигателей и декоративные крышки колеси- ков за один раз, но если это первая ваша конструкция, лучше не пытаться все сде- лать единым махом. В отличие от прошлых проектов, здесь не применяется стабилизатор напряже- ния. Как видно на рис. 4.89, в качестве источника питания используются четыре батарейки типа АА (они могут быть никель-кадмиевые или Каждая из них дает напряжение 1,2 В, поэтому последовательном соедине- нии батареек получается источник питания напряжением 4,8 В, чего вполне до- статочно для микроконтроллера и серводвигателей. Подсоединение остальных элементов не должно вызвать у вас затруднений. Последовательно со светодиодом надо включить резистор 470 Ом. Светодиод будет сигнализировать о срабатывании левого или правого детектора столкновений. 316 Устройства управления роботами Такая обратная связь очень пригодится при настройке контактных усиков. Кроме того, надо подключить «подтягивающие» резисторы сопротивлением 10 кОм к микропереключателем детекторов столкновений. Хотя мы взяли сервопривод от радиоуправляемой модели, радиоприемник и передатчик нам не потребуются. В этой конструкции опять же использованы инфракрасный пульт дистанционного управления и инфракрасный детектор фир- мы Sony. Все это работает точно так же, как и в предыдущем проекте, выполнен- ном на основе модели мыши фирмы А датчики света для простоты взяты из нашей первой конструкции такого типа. Если вы были внимательны, то уже заметили резистор (эле- мент R7 на рис. 4.90), который предназначен для балансировки плеч делителя напряжения, образованного двумя фоторезисторами. Когда все будет готово, можно приступить к программированию микрокон- троллера Исходный текст управляющей программы содержится в фай- ле ttinclude // 28 апреля 2002 - добавлено дистанционное управление. // 23 февраля 2002 - разработано Майком Предко. // // Используются прерывания от таймера // вырабатываемые каждые 512 мкс. // // Замечания по аппаратным средствам: // Микроконтроллер PIC16F627 работает на частоте 4 МГц. // Используется внешний тактовый генератор. // // Подключение выводов // RA1 - вход компаратора 1 (сигнал с делителя напряжения // на фоторезисторах); // RA2 - контрольный выход внутреннего источника опорного напряжения // для компараторов (половина напряжения питания); // RBO - инфракрасный детектор для приема команд дистанционного // фирмы Sony (прерывания по положительному перепаду); static volatile bit IRDetect @ // - правый контактор; static volatile bit // RB2 - левый контактор; static volatile bit LeftWhiskerPin // RB3 - выход индикаторного светодиода; static volatile bit LED static volatile bit LEDTRIS // RB4 - левый серводвигатель; static volatile bit leftServo static volatile bit leftServoTRIS // RB5 - правый static volatile bit Подключение к микроконтроллеру периферийных устройств 317 static volatile bit rightServoTRIS // Глобальные переменные и константы: unsigned int RTC = 0; // Счетчик реального unsigned char RTCOlay = 2; // Задержка 1 мс (период срабатывания // таймера равен 512 мс). // Константы для 38 LeftStop 37 LeftReverse 36 «define RightForward 36 «define RightStop 37 RightReverse 38 char ServoDlay = 1; char leftSpeed = LeftStop; char rightSpeed = RightStop; // Для левого двигателя. // Для правого двигателя. // Выход управления сервоприводом // (каждые 20 // Скорость вращения левого двигателя. // Скорость вращения правого двигателя. // Константы для декодера Ox06EF OxOFEF OxODEF «define Ox09EF «define OxOEEF OxOB6F Ox036F «define OxOF6F Ox076F Ox022F «define OxOD6F Ox056F команд дистанционного управления: // Цифры 0-9. unsigned int unsigned char = 0; int DataTime = 0; unsigned int CurrentRTC = 0; int = 1; volatile char = 0; volatile char = 0; // Кнопка "Громче". // Кнопка "Тише". // Кнопка "Канал +1". // Кнопка "Канал -1". // Кнопка "Предыдущий // Кнопка "Приглушить звук". // Кнопка "Питание". // Входные данные детектора команд управления. // Число символов для приема. Если двигатели не работают, //' можно проверить компаратор. // Счетчик для левого контактора. // Счетчик для правого контактора. char ExecuteFlag = 0; // Флаг для выполнения биологического кода. // Слово defined(_16F627) PIC16F627 with external XT oscillator selected _CONFIG(Ox03F21); // Для МК PIC16F627: // внешний тактовый генератор XT, // RA6/RA7 используются для ввода-вывода, // внешний сигнал сброса, // таймер PWRT включен, 318 Устройства управления роботами // сторожевой таймер выключен, // защита кода отключена, // детектор BODEN (terror Unsupported selected // Обработчик прерываний: void interrupt { • if { // Обработчик прерываний от таймера = 0; // Сбросить флаг прерываний от таймера if (--ServoDlay == 0) { ServoDlay = 40; leftServo = 1; rightServo = 1; // Задержка 20 мс. // Высокий уровень сигнала // управления для обоих // серводвигателей. else { if (leftSpeed •>= ServoDlay) leftServo = 0; // Закончить подачу импульса // для серводвигателя. if (rightSpeed >= ServoDlay) rightServo = Закончить подачу импульса // для правого серводвигателя. // Декодирование команд дистанционного управления // (если оно установлено в системе). // Новый пакет. // Ждать 12 бит. // Очередной бит. if (DataTime) if == 0) { = 12; = 0; > else { Dataln = Dataln 1; if > 450) && (DataTime < { // Получена 1. if == 0) { = 400; // Конец. leftSpeed = LeftForward; rightSpeed = if (Dataln else if (Dataln leftSpeed else if (Dataln rightSpeed = else if (Dataln leftSpeed = rightSpeed = } else == = LeftReverse; == RightReverse; == { LeftReverse; RightReverse; Подключение к микроконтроллеру периферийных устройств 319 if == { = 1; = rightSpeed = OpnCount = 1; // Конец. } else { // Стоп или ничего. ExecuteFlag = 0; leftSpeed = LeftStop; rightSpeed = RightStop; OpnCount = 1; // Конец. } else if > 750) < { // Получен О. if == 0) { OpnCount = 400; // Конец. leftSpeed = rightSpeed = RightForward; if (Dataln == else if (Dataln == leftSpeed = LeftReverse; else if (Dataln rightSpeed = RightReverse; else if (Dataln == remote8) { leftSpeed LeftReverse; rightSpeed = } else if (Dataln remotePower) { ExecuteFlag = 1; leftSpeed = LeftStop; rightSpeed = RightStop; OpnCount // Конец. } else { // Стоп или ничего. ExecuteFlag = 0; leftSpeed = LeftStop; rightSpeed = RightStop; OpnCount Конец. } else // Ошибка. DatalnCount = 0; } DataTime = 0; CurrentRTC += 0x0100; // Задержка для приема одного бита. // Проверка на пропущенный импульс: if (CurrentRTC > DatalnCount = 0; // Сброс и ожидание следующего пакета. // Код для обработки каждого второго прерывания // от таймера (работает через 1 if (--RTCDlay == 0) { ' • 320 Устройства управления роботами RTCDlay = 2; // Следующий раз - через один RTC++; // Инкремент счетчика реального времени. // Код для левого контактора: if // Левый контактор сработал. else if < 20) LeftWhisker++; else; if (LeftWhisker != 0) // // // Нажат уже 20 Контактор разомкнут. // Противодребезговая // задержка. // Разомкнут уже 20 мс. // Код для правого контактора: if // Правый контактор сработал. else if < 20) RightWhisker++; else; if (RightWhisker != 0) else; // Противодребезговая // задержка. // Нажат уже 20 мс. // Контактор разомкнут. // Противодребезговая // задержка. // Разомкнут уже 20 мс. // Работа с фоторезисторами и светодиодом: if && == { OpnCount = 1; = LeftStop; = RightStop; if (C20UT) LED = 0; // Светодиод включить. else LED = 1; // Светодиод выключить. } // Конец обработки прерываний от таймера. // Здесь можно разместить прерываний. if (INTF) { // Обработка прерываний по изменении // сигнала на входе DataTime = + Время приема текущего бита. = OxOFFFF - THRO; // Время для следующего бита. INTF = 0; // Сброс флага прерывания. } // Конец обработки прерываний по изменении входного сигнала. // Конец обработчика прерываний. // Задержка на миллисекунд. // Служебные void Dlay(int msecs) int valueDlay = RTC + msecs + 1; // Время окончания while (valueDlay != RTC); // Ждать. } // Конец функции void state ) // Управление состоянием светодиода. Подключение к микроконтроллеру периферийных устройств if (state) LED = 0; // else LED = 1; // Светодиод выключить. } // Конец функции int // Опрос состояния фоторезисторов. { if return // Источник света else return OxOFF; } Конец функции GetLeftLight. int < * if return 0x080; // Источник света else return OxOFF; } // Конец функции GetRightLight. // Опрос состояния левого контактора. < if (LeftWhisker == 20) return 1; // Левый контактор else return 0; } // Конец функции int // Опрос состояния контактора. { if == 20) return 1; // Правый контактор else return 0; } // Конец функции void Movement) // Управление левым двигателем. { = Movement; } // Конец функции void Movement) // Управление правым двигателем. { rightSpeed = Movement; } // Конец функции rightMotor. // Главная программа; 322 Устройства управления роботами void { OPTION = OxODO; // работает с таймером // коэффициент деления = 0; // Начальный сброс таймера TOIE = 1; // Разрешение прерываний от таймера TMRO. GIE = 1; // Разрешение обработки прерываний. // Здесь можно разместить код верхнего уровня. INTEDG = 1; // Прерывания вырабатываются по положительному // перепаду сигнала на выходе RBO/INT. INTF = 0; // Сброс флага прерываний. INTE = 1; // Разрешение прерываний по изменении // сигнала на входе = 0x002; // Разрешение работы // выходы компараторов не инвертируются; // бит CIS = // режим 2 (внутренний источник // опорного напряжения). TRISA = 0x007; // Входными являются только RAO и RA1. VRCON = ОхОЕС; // Разрешение работы внутреннего источника // опорного напряжения: // для контроля его напряжение выводится // на выход RA2, // верхний поддиапазон, // установочное значение равно LED = 1; // Разрешить работу к которому LEDTRIS = 0; // подключен светодиод. leftServo = rightServo = 0; // Начальные значения // для сигналов управления двигателями. leftServoTRIS = // Биологический код: while (1 1) { // Бесконечный цикл. if { надо разместить код, определяющий поведение робота. } else { // Код для инициализации состояния робота. } // Конец оператора while. } // Конец главной программы. Теперь необходимо провести две операции по калибровке систем. Во-первых, следует резисторы серводвигателей. Это не долж- но вызвать у вас затруднений, особенно если вы уже испытали в работе предыду- щую конструкцию. Надо просто включить питание робота и с помощью отвертки медленно изменять положение движка резистора, пока двигатель не остановится. Во-вторых, необходимо настроить резистор R7, который пред- назначен для балансировки плеч делителя напряжения на фоторезисторах. Ваша Подключение к микроконтроллеру периферийных устройств 323 задача - добиться такого положения его движка, при котором индикаторный све- тодиод мигает, если робот незначительно отклоняется от направления на источ- ник света. В идеале все настройки надо проводить, создав те же условия (исполь- зуя то же помещение, ту же освещенность), при которых планируется испытывать робота. После всех проверок вы, возможно, захотите усовершенствовать конструкцию робота, добавив к ней более сложные интерфейсные модули, которые уже описы- вались в предыдущих проектах. |