Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР 128, АВГУСТ 2009 г.

Твой электронный друг. Создаем робота в домашних условиях

Анатолий «Lockdog» Зимин (line3d@yandex.ru)

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

Прогресс не стоит на месте

Что такое робот? В большинстве случаев – это автоматическое устройство, которое реагирует на какие-либо действия окружающей среды. Роботы могут управляться человеком или выполнять заранее запрограммированные действия. Обычно на роботе располагают разнообразные датчики (расстояния, угла поворота, ускорения), видеокамеры и манипуляторы. Электронная часть состоит из микроконтроллера (МК) – микросхемы, в которую заключены процессор, тактовый генератор, различная периферия, оперативная и постоянная память. В мире существует огромное количество разнообразных микроконтроллеров для разных областей применения и с ними можно собирать мощных роботов. Для любительских проектов широкое применение нашли микроконтроллеры AVR. На сегодня они наиболее доступны, и в интернете можно найти много примеров на основе этих МК. Чтобы работать с микроконтроллерами, тебе нужно уметь программировать на ассемблере или на C++ и иметь начальные знания в цифровой и аналоговой электронике. В нашем проекте мы будем использовать C++. Программирование для МК мало отличается от программирования на компьютере: синтаксис языка такой же, большинство функций практически ничем не отличаются, а новые довольно легко освоить и ими удобно пользоваться.

Закупаемся материалами

Наш робот должен уметь объезжать препятствия, то есть повторять нормальное поведение большинства животных в природе. Все, что нам потребуется для постройки такого робота, можно найти в радиотехнических магазинах. Давай решим, как наш робот будет передвигаться. Самым удачным вариантом я считаю гусеницы, которые применяются в танках, потому что гусеницы имеют большую проходимость, чем колеса и ими удобнее управлять (для поворота достаточно вращать гусеницы в разные стороны). Поэтому тебе понадобится любой игрушечный танк, у которого гусеницы вращаются независимо друг от друга. Такой ты можешь купить в любом магазине игрушек по разумной цене. От этого танка нужна только платформа с гусеницами и моторы с редукторами. Остальное можно смело открутить и выкинуть. Также нам потребуется микроконтроллер. Мой выбор пал на ATmega16 – у него достаточно портов для подключения датчиков и периферии, и вообще он довольно удобный. Еще надо закупить немного радиодеталей (список ты увидишь во врезке), приготовить паяльник, мультиметр и прямые руки.

Правильное питание – залог здоровья

Микроконтроллер будет выполнять функции «мозга», но начнем мы не с него, а с того, как правильно кормить нашего робота, потому что на этом обычно ошибаются начинающие роботостроители. Чтобы робот работал нормально, нужно использовать стабилизатор напряжения. Я предпочитаю микросхему L7805 – на выходе она выдает стабильное напряжение 5В, которое и нужно нашему микроконтроллеру. Но так как падение напряжения на этой микросхеме составляет порядка 2,5 В, к нему нужно подавать, минимум, 7,5 В. Вместе с стабилизатором используются электролитические конденсаторы, чтобы сгладить пульсации напряжения. В цепь обязательно включают диод, для защиты от переполюсовки.

Делаем плату с МК

Теперь мы можем заняться нашим микроконтроллером. Корпус у МК - DIP (так удобнее паять) и имеет сорок выводов. На борту есть АЦП, ШИМ, USART и многое другое, что мы пока использовать не будем. На диске ты найдешь всю схему робота, так что в этом разделе мы остановимся только на обвязке самого МК. Рассмотрим несколько важных узлов. Вывод RESET (9-ая нога МК) подтянут резистором R1 к «плюсу» источника питания. Это нужно делать обязательно, иначе твой МК может непреднамеренно сбрасываться или, проще говоря – глючить. Также желательной, но необязательной мерой является подключение RESET’а через керамический конденсатор C1 к «земле». На схеме ты можешь увидеть электролит на 1000 мкФ, – он спасает от провалов напряжения при работе двигателей, что тоже благоприятно скажется на работе микроконтроллера. Кварцевый резонатор X1 и конденсаторы C2, C3 нужно располагать как можно ближе к выводам XTAL1 и XTAL2.

О том, как прошивать МК, я рассказывать не буду, – об этом ты можешь прочитать в интернете. Писать программу мы будем на C++. В качестве среды программирования я выбрал CodeVisionAVR. Эта среда удобна новичкам, потому что имеет встроенный мастер создания кода.

Управление двигателями

Не менее важным компонентом в нашем роботе будет драйвер двигателей. Никогда и ни в коем случае не подключай двигатели напрямую к МК! Вообще, мощными нагрузками нельзя управлять с микроконтроллера напрямую, иначе он сгорит. Пользуйся ключевыми транзисторами. Для нашего случая есть специальная микросхема – L293D. В подобных несложных проектах всегда старайся использовать именно эту микросхему с индексом «D», так как она имеет встроенные диоды для защиты от перегрузок. Ей очень легко управлять и ее просто достать в радиотехнических магазинах. Выпускается она в двух корпусах – DIP и SOIC. Мы будем использовать в корпусе DIP из-за удобства монтажа на плате.

L293D имеет раздельное питание двигателей и логики, поэтому саму микросхему мы будем питать от стабилизатора (вход VSS), а двигатели – напрямую от аккумуляторов (вход VS). L293D выдерживает нагрузку 600 мА на каждый канал, а этих каналов у нее два. То есть, к одной микросхеме можно подключить два двигателя. Но, чтобы перестраховаться, мы объединим каналы, и тогда потребуется по одной микре на каждый двигатель. Отсюда следует, что L293D сможет выдержать 1.2 А. Чтобы этого добиться, нужно объединить ноги микры, как показано на схеме. Микросхема работает следующим образом: когда на IN1 и IN2 подается логический «0», а на IN3 и IN4 – логическая единица, то двигатель вращается в одну сторону. А если инвертировать сигналы – подать логический ноль, то двигатель начнет вращаться в другую.

Выводы EN1 и EN2 отвечают за включение каждого канала. Их мы соединяем и подключаем к «плюсу» питания от стабилизатора. Так как микросхема греется во время работы, а установка радиаторов на этот тип корпуса проблематична, то отвод тепла обеспечивается ногами GND - их лучше распаивать на широкой контактной площадке. Вот и все, что на первое время тебе нужно знать о драйверах двигателей.

Датчики препятствий

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

Недостаток датчиков в том, что они могут по-разному реагировать на различные поверхности и не защищены от помех - от посторонних сигналов других устройств датчик случайно может сработать. От помех защитит модулирование сигнала, но пока мы этим заморачиваться не будем. Для начала и этого хватит. На рисунке ты увидишь, как правильно расположить элементы датчика, а на схеме - их правильное включение.

Прошивка робота

Чтобы оживить робота, для него нужно написать прошивку, то есть программу, которая бы снимала показания с датчиков и управляла двигателями. Моя программа наиболее проста: не содержит сложных конструкций и всем будет понятна. Вот эти две строки подключают заголовочные файлы для нашего микроконтроллера и команды для формирования задержек:

#include <mega16.h>
#include <delay.h>

Нижеследующие строки условные, потому что значения PORTC зависят от того, как ты подключил драйвер двигателей к своему микроконтроллеру:

PORTC.0 = 0xFF;
PORTC.1 = 0x00;
PORTC.2 = 0xFF;
PORTC.3 = 0x00;

«0xFF» означает, что на выходе будет лог. «1», а «0x00» – лог. «0». Этой конструкцией мы проверяем, есть ли перед роботом препятствие и с какой оно стороны:

if (!(PINB & (1<<PINB.0)))
{
...
}

Если на фототранзистор попадает свет от ик-диода, то на ноге микроконтроллера устанавливается «0», и робот начинает движение назад, чтобы отъехать от препятствия. Потом разворачивается, чтобы снова не столкнуться с преградой и затем опять едет вперед. Так как у нас два датчика, то мы проверяем наличие преграды два раза – справа и слева, и потому можем узнать, с какой стороны препятствие. Команда «delay_ms(1000)» указывает на то, что пройдет одна секунда, прежде чем начнет выполняться следующая команда.

Собрать терминатора

Я рассмотрел большинство аспектов, которые помогут тебе собрать первого робота. Но на этом робототехника не заканчивается. Если справишься с первым этапом, то у тебя появится куча новых возможностей. Можно усовершенствовать алгоритм робота, – например, что делать, если препятствие не с какой-то стороны, а прямо перед роботом? Также не помешает установить энкодер – простое устройство, которое поможет точно знать расположение робота в пространстве. Для наглядности возможна установка цветного или монохромного дисплея, который будет показывать уровень заряда аккумулятора, расстояние до препятствия и различную отладочную информацию.

Не помешает усовершенствовать датчики – установить TSOP (это ик-приемники, которые воспринимают сигнал только определенной частоты) вместо обычных фототранзисторов. Помимо инфракрасных датчиков существуют ультразвуковые; стоят подороже и тоже не лишены недостатков, но в последнее время набирают популярность у роботостроителей. Чтобы робот мог реагировать на звук, было бы неплохо установить микрофоны с усилителем. Но по-настоящему классным я считаю установку камеры и программирование на ее основе машинного зрения! Есть набор специальных библиотек OpenCV, с помощью которых можно запрограммировать распознавание лиц, движения по цветным маякам и много всего интересного. Все зависит только от твоей фантазии и умений.

Необходимые компоненты

Вот список того, что тебе нужно приобрести:

  • ATmega16 в корпусе DIP-40
  • L7805 в корпусе TO-220
  • L293D в корпусе DIP-16 х2 шт.
  • резисторы мощностью 0,25 Вт номиналами: 10 кОм х1 шт., 220 Ом х4 шт.
  • конденсаторы керамические: 0.1 мкФ, 1 мкФ, 22 пФ
  • конденсаторы электролитические: 1000 мкФ х 16 В, 220 мкФ х 16В х2 шт.
  • диод 1N4001 или 1N4004
  • кварцевый резонатор на 16 МГц
  • ИК-диоды: подойдут любые в количестве двух штук
  • фототранзисторы, тоже любые, но реагирующие только на длину волны ик-лучей

Адреса магазинов, в которых ты можешь все это купить, нетрудно найти в интернете – или напиши мне на почту.

Содержание
ttfb: 6.7360401153564 ms