Введение
Итак. Что же такое робот? В большинстве случаев это автоматическое устройство, которое реагирует на какие-либо действия окружающей среды. Роботы могут управляться человеком или выполнять заранее запрограммированные действия. Обычно на роботе располагают разнообразные датчики (расстояния, угла поворота, ускорения), видеокамеры, манипуляторы.
Электронная часть робота состоит из микроконтроллера (МК) – микросхема, в которую заключён процессор, тактовый генератор, различная периферия, оперативная и постоянная память. В мире существует огромное количество разнообразных микроконтроллеров для разных областей применения и на их основе можно собирать мощных роботов.
Для любительских построек широкое применение нашли микроконтроллеры AVR. Они, на сегодняшний день, самые доступные и в интернете можно найти много примеров на основе этих МК. Чтобы работать с микроконтроллерами тебе нужно уметь программировать на ассемблере или на Cи и иметь начальные знания в цифровой и аналоговой электронике.
Управление роботом EV3 и мониторинг
Для того, чтобы осуществлять управление роботом EV3, мониторинг портов и показаний датчиков, отладку программы и многое другое в среде программирования EV3 существует очень полезный инструмент.
Находится она в правом нижнем углу среды программирования EV3 и представляет собой небольшую панель, которую можно свернуть или развернуть, нажав на стрелочку. Страница аппаратных средств дает возможность управления роботом EV3 и мониторинга его состояния.
Для того, чтобы панель стала активной нужно подключить к среде программирования блок EV3 любым способом. После установления соединения между компьютером и блоком EV3 панель становиться активной и можно осуществлять управление роботом EV3.
Разберем более подробно функции страницы аппаратных средств. Всего у нас в панели управления и мониторинга есть три вкладки:
- Доступные модули
- Просмотр портов
- Информация о модуле
Делаем плату с МК
В нашем случае микроконтроллер будет выполнять функции мозга, но начнём мы не с него, а с питания мозга робота. Правильное питание – залог здоровья, поэтому мы начнём с того, как правильно кормить нашего робота, потому что на этом обычно ошибаются начинающие роботостроители. А для того, чтобы наш робот работал нормально нужно использовать стабилизатор напряжения.
Я предпочитаю микросхему L7805 – она предназначена, чтобы на выходе выдавать стабильное напряжение 5В, которое и нужно нашему микроконтроллеру. Но из-за того, что падение напряжения на этой микросхеме составляет порядка 2,5В к нему нужно подавать минимум 7,5В. Вместе с этим стабилизатором используются электролитические конденсаторы, чтобы сгладить пульсации напряжения и в цепь обязательно включают диод, для защиты от переполюсовки.
Теперь мы можем заняться нашим микроконтроллером. Корпус у МК — DIP (так удобнее паять) и имеет сорок выводов. На борту имеется АЦП, ШИМ, USART и много другого, что мы пока использовать не будем. Рассмотрим несколько важных узлов. Вывод RESET (9-ая нога МК) подтянут резистором R1 к «плюсу» источника питания – это нужно делать обязательно!
Иначе твой МК может непреднамеренно сбрасываться или, проще говоря – глючить. Так же желательной мерой, но не обязательной является подключение RESET’а через керамический конденсатор C1 к «земле». На схеме ты так же можешь увидеть электролит на 1000 мкФ, он спасает от провалов напряжения при работе двигателей, что тоже благоприятно скажется на работе микроконтроллера. Кварцевый резонатор X1 и конденсаторы C2, C3 нужно располагать как можно ближе к выводам XTAL1 и XTAL2.
О том, как прошивать МК, я рассказывать не буду, так как об этом можно прочитать в интернете. Писать программу мы будем на Cи, в качестве среды программирования я выбрал CodeVisionAVR. Это довольно удобная среда и полезна новичкам, потому что имеет встроенный мастер создания кода.
Информация о модуле
Во вкладке доступные модули можно увидеть какие блоки доступны для подключения. Чтобы все доступные блоки отобразились нужно нажать на кнопку обновить. Происходит обновление и можно увидеть сколько блоков доступно для подключения, названия блоков и при помощи какого соединения к ним можно подключиться.
То есть подключение по USB, Bluetooth или Wi-Fi. На рисунке произведено подключение модуля под названием АВС по Bluetooth. Соединение можно разорвать второй кнопкой «Отключить». Подключается блок при помощи нажатия на доступное соединение.
В третьей вкладке «Информация о модуле» можно увидеть название модуля, версию встроенного программного обеспечения, уровень заряда батареи, тип соединения и индикатор объема занимаемой памяти. На изображении модуль называется ABC, заряд батареи полный, версия встроенного программного обеспечения V1.
В правом углу вкладки «Информация о модуле» есть два значка:
- С изображением гаечного ключа – это настройки беспроводного подключения
- Второй значок – «Обозреватель памяти»
Настройки беспроводного подключения позволяют увидеть все доступные подключения по Wi-Fi и дают возможность добавить и настроить новое подключение.
Обозреватель памяти показывает сколько есть доступной памяти, все файлы и проекты, которые находятся на модуле и на SD – карте, если она подключена к модулю. Файлы можно копировать, удалять, загружать. Но возможности полностью скопировать проект с модуля и перенести его на другой модуль нет.
Проект можно полностью скопировать только со среды программирования EV3 или просто скопировать сохраненную в папке на компьютере программу.
Управление двигателями
Не менее важным компонентом в нашем роботе является драйвер двигателей, который облегчает нам задачу в управлении им. Никогда и ни в коем случае нельзя подключать двигатели напрямую к МК! Вообще мощными нагрузками нельзя управлять с микроконтроллера напрямую, иначе он сгорит. Пользуйтесь ключевыми транзисторами.
Для нашего случая есть специальная микросхема – L293D. В подобных несложных проектах всегда старайтесь использовать именно эту микросхему с индексом «D», так как она имеет встроенные диоды для защиты от перегрузок. Этой микросхемой очень легко управлять и её просто достать в радиотехнических магазинах.
Она выпускается в двух корпусах DIP и SOIC. Мы будем использовать в корпусе DIP из-за удобства монтажа на плате. L293D имеет раздельное питание двигателей и логики. Поэтому саму микросхему мы будем питать от стабилизатора (вход VSS), а двигатели напрямую от аккумуляторов (вход VS). L293D выдерживает нагрузку 600 мА на каждый канал, а этих каналов у неё два, то есть к одной микросхеме можно подключить два двигателя.
Но, чтобы перестраховаться, мы объединим каналы, и тогда потребуется по одной микре на каждый двигатель. Отсюда следует, что L293D сможет выдержать 1.2 А. Чтобы этого добиться нужно объединить ноги микры, как показано на схеме. Микросхема работает следующим образом: когда на IN1 и IN2 подаётся логический «0», а на IN3 и IN4 логическая единица, то двигатель вращается в одну сторону, а если инвертировать сигналы – подать логический ноль, тогда двигатель начнёт вращаться в другую сторону.
Выводы EN1 и EN2 отвечают за включение каждого канала. Их мы соединяем и подключаем к «плюсу» питания от стабилизатора. Так как микросхема греется во время работы, а установка радиаторов проблематична на этот тип корпуса, то отвод тепла обеспечивается ногами GND — их лучше распаивать на широкой контактной площадке. Вот и всё, что на первое время тебе нужно знать о драйверах двигателей.
Просмотр портов
Во вкладке «Просмотр портов» можно увидеть все датчики и моторы, подключенные к портам модуля EV3. Во вкладке можно увидеть, что большой мотор подключен к порту . Датчик касания подключен к 1 порту, ультразвуковой датчик подключен к 4 порту. Также в каждом из этих портов отображаются показания датчиков и моторов в режиме реального времени.
У большого мотора можно посмотреть угол поворота, количество оборотов и мощность. При вращении колеса двигателя в разные стороны можно увидеть изменение значений. У датчика касания можно увидеть два состояния нажато – 1 и не нажато – 0.
Ультразвуковой датчик может показывать расстояние до объекта в сантиметрах, дюймах, обнаруживать присутствие другого робота EV3. Если изменять расстояние от преграды до датчика, то наблюдать видеть изменение показаний.
Датчики препятствий
Чтобы наш робот мог ориентироваться и не врезался во всё, мы установим на него два инфракрасных датчика. Самый простейший датчик состоит из ик-диода, который излучает в инфракрасном спектре и фототранзистор, который будет принимать сигнал с ик-диода. Принцип такой: когда перед датчиком нет преграды, то ик-лучи не попадают на фототранзистор и он не открывается.
Если перед датчиком препятствие, тогда лучи от него отражаются и попадают на транзистор – он открывается и начинает течь ток. Недостаток таких датчиков в том, что они могут по-разному реагировать на различные поверхности и не защищены от помех — от посторонних сигналов других устройств датчик, случайно, может сработать. От помех может защитить модулирование сигнала, но пока мы этим заморачиватся не будем. Для начала, и этого хватит.
Прошивка робота
#include {amp}lt;mega16.h{amp}gt;#include {amp}lt;delay.h{amp}gt;
PORTC.0 = 1; PORTC.1 = 0; PORTC.2 = 1; PORTC.3 = 0; Значение 0xFF означает, что на выходе будет лог. «1», а 0x00 – лог. «0». Следующей конструкцией мы проверяем, есть ли перед роботом препятствие и с какой оно стороны: if (!(PINB {amp}amp; (1{amp}lt;{amp}lt;PINB.0))) { ... }
Если на фототранзистор попадает свет от ик-диода, то на ноге микроконтроллера устанавливается лог. «0» и робот начинает движение назад, чтобы отъехать от препятствия, потом разворачивается, чтобы снова не столкнуться с преградой и затем опять едет вперёд. Так как у нас два датчика, то мы проверяем наличие преграды два раза – справа и слева и потому можем узнать с какой стороны препятствие. Команда «delay_ms(1000)» указывает на то, что пройдёт одна секунда, прежде чем начнёт выполняться следующая команда.
Заключение
Я рассмотрел большинство аспектов, которые помогут тебе собрать твоего первого робота. Но на этом робототехника не заканчивается. Если ты соберёшь этого робота, то у тебя появится куча возможностей для его расширения. Можно усовершенствовать алгоритм робота, как например, что делать, если препятствие не с какой-то стороны, а прямо перед роботом.
Так же не помешает установить энкодер – простое устройство, которое поможет точно располагать и знать расположение твоего робота в пространстве. Для наглядности возможна установка цветного или монохромного дисплея, который может показывать полезную информацию – уровень заряда аккумулятора, расстояние до препятствия, различную отладочную информацию.
Не помешает и усовершенствование датчиков – установка TSOP (это ик-приёмники, которые воспринимают сигнал только определённой частоты) вместо обычных фототранзисторов. Помимо инфракрасных датчиков существуют ультразвуковые, стоят подороже, и тоже не лишены недостатков, но в последнее время набирают популярность у роботостроителей.
Для того, чтобы робот мог реагировать на звук, было бы неплохо установить микрофоны с усилителем. Но по-настоящему интересным, я считаю, установка камеры и программирование на её основе машинного зрения. Есть набор специальных библиотек OpenCV, с помощью которых можно запрограммировать распознавание лиц, движения по цветным маякам и много всего интересного. Всё зависит только от твоей фантазии и умений.
Список компонентов:
ATmega16 в корпусе DIP-40{amp}gt;
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 МГц
ИК-диоды: подойдут любые в количестве двух штук.
фототранзисторы, тоже любые, но реагирующие только на длину волны ик-лучей
/***************************************************** Прошивка для робота Тип МК : ATmega16 Тактовая частота : 16,000000 MHz Если у тебя частота кварца другая, то это нужно указать в настройках среды: Project -{amp}gt; Configure -{amp}gt; Закладка "C Compiler" *****************************************************/ #include {amp}lt;mega16.h{amp}gt; #include {amp}lt;delay.h{amp}gt; void main(void) { //Настраиваем порты на вход //Через эти порты мы получаем сигналы от датчиков DDRB=0x00; //Включаем подтягивающие резисторы PORTB=0xFF; //Настраиваем порты на выход //Через эти порты мы управляем двигателями DDRC=0xFF; //Главный цикл программы. Здесь мы считываем значения с датчиков //и управляем двигателями while (1) { //Едем вперёд PORTC.0 = 1; PORTC.1 = 0; PORTC.2 = 1; PORTC.3 = 0; if (!(PINB {amp}amp; (1{amp}lt;{amp}lt;PINB.0))) // Проверяем правый датчик { //Едем назад 1 секунду PORTC.0 = 0; PORTC.1 = 1; PORTC.2 = 0; PORTC.3 = 1; delay_ms(1000); //Заворачиваем PORTC.0 = 1; PORTC.1 = 0; PORTC.2 = 0; PORTC.3 = 1; delay_ms(1000); } if (!(PINB {amp}amp; (1{amp}lt;{amp}lt;PINB.1))) // Проверяем левый датчик { //Едем назад 1 секунду PORTC.0 = 0; PORTC.1 = 1; PORTC.2 = 0; PORTC.3 = 1; delay_ms(1000); //Заворачиваем PORTC.0 = 0; PORTC.1 = 1; PORTC.2 = 1; PORTC.3 = 0; delay_ms(1000); } }; }