Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #119, НОЯБРЬ 2008 г.

Домашний терминатор

Артемий «Di Halt» Исламов / di_halt@mail.ru /




Роботы вторгаются в наш мир! Уже никого не удивишь механическими руками, а робопсы вовсю шастают по квартирам. К сожалению, пока не у нас. Но почему? Сложно, что ли, изготовить домашнего робота? По-твоему, это под силу только промышленному гиганту вроде Sony? Вовсе нет! Сейчас я расскажу тебе, как сварганить терминатора-убийцу в домашних условиях.

Если ты интересовался роботами и лазил по нашим робосайтам и форумам, то, думаю, находил немало схем, выполненных на разных микроконтроллерах. В свое время я тоже там шарился, все это видел и не могу не отметить, что подавляющее большинство таких конструкций — это вещь в себе. Они не нацелены на дальнейшее развитие. Сделал человек самобеглую тележку с датчиками и успокоился. Как правило, там один микроконтроллер, на котором все и висит. Честно говоря, мне такая система в корне не нравится, поэтому предпочитаю делать все модульно, по отдельному микроконтроллеру на каждый узел. А завязаны все узлы через последовательную шину данных на головной микроконтроллер.

Звучит пугающе, но на деле получается гораздо проще — под каждую задачу свой процессор и не надо городить многозадачную систему, пытаясь все вывезти на одном контроллере. Да и управлять куда легче! Скажем, главный процессор дает шасси с ноги по почкам и кричит: «Так, Шасси, ну-ка, шагом марш! Отсюда и до обеда!» И шасси поехало, — пиная контроллер датчиков на предмет возможного западла на пути. А мозговой процессор, тем временем, пинает блок сонаров с требованием составить ему карту местности и обдумывает план порабощения человечества. Собственно, человек устроен также — головной мозг думает, спинной делает. Так что, творим по образу и подобию. Благо, контроллеры нынче не те, что десять лет назад, продаются по цене грязи и практически на вес.

Выбор шасси

На чем будет перемещаться наш робот, это первое, о чем стоит задуматься. Именно от этого будет зависеть дальнейшая логика работы контроллера шасси, а также, возможно, его схемотехника. Выбор тут весьма обширный: колеса, гусеницы, ноги, крылья, а также плавательные хвосты. Дальше все зависит от радиуса кривизны рук. Меня, например, сильно удивляют некоторые камрады, пытающиеся без опыта, с наскока, сделать «гигантского человекоподобного робота». Наивные!

Фигня даже не в том, что потребуются сложные алгоритмы перемещения конечностей — это проблемы программные и решаются они умом. Куда хуже, что там нужна высокоточная механика, которую на коленке сделать чертовски трудно, а выдрать ее особо неоткуда. Так что, большинство мега-проектов загнивают, так и не успев развиться. Можно, конечно, заюзать какой-нибудь робоконструктор (появились в продаже), но это же неспортивно! Может тогда купить готового Aibo и не парить мозг? :). Автономная авиация сложна в управлении и, честно говоря, я слабо представляю, как ей рулить в независимом полете. Плавающий робот? Согласен, прикольно, но в ванной особо не поплаваешь, а водоем не у каждого под окнами. Поэтому мой выбор пал на наземный вариант на гусеничном ходу. Гусеничным шасси проще управлять, оно обладает большой проходимостью, а главное — валялось у меня на антресоли с незапамятных времен (от детской совковой БМП). Тебе же советую поискать готовое от китайской игрушки либо склепать самому из подручных материалов.

Контроллер шасси aka силовой блок

С конструкцией я определился. Пора делать систему, которая бы привела все это в движение. Поскольку двигатели обычно требуют напряжение от 12 вольт и выше, то кормиться робот будет от SLA-аккумулятора. Он хоть и тяжел, но имеет большую емкость, низкую стоимость и выдает сразу же 12 вольт. Возникает, правда, другая проблема — питание электроники. Контроллеру нужно 5 вольт, а некоторым датчикам зачастую — 3.3 вольта. Поэтому первым делом в силовом блоке устанавливаем два DC-DC преобразователя на 5 и 3.3 вольта. Недолго думая, я воткнул тот же самый преобразователь на MC 34068A, который описывал в статье про блоки питания. Сразу две копии: одну настроил на 3.3 вольта, вторую на 5.

Впрочем, пока впаял только на 5 вольт — второй смонтирую по необходимости. Управляться все будет ATMega8 — проц не самый могучий, но для ходового контроллера хватит. Кроме того, при желании вместо Меги 8 можно воткнуть более фаршированную и мозговитую Мегу168. У нее точно такой же корпус и полное совпадение с ATmega8 на уровне выводов. Поскольку напрямую с вывода микроконтроллера запитать двигатель нельзя — слабый вывод меги может выдавать не более 20 миллиампер, а движку порой (особенно в момент пуска) надо амперы, то будем усиливать. В этих целях лучше всего применять специализированные микросхемы для управления моторами. Вариантов много, самые популярные — это L293D и L298. Первая — более слабая, рассчитанная на маломощные моторы, но она и стоит дешевле. Максимальный ток здесь в районе 1 ампера. Другая (L298) — в разы мощнее и способна раскрутить мотор с током под 4 ампера. У моего робота движки потребляют мало, поэтому я применил L293D. Узнать предельный ток двигателя несложно. Для этого возьми свой моторчик и подключи его через амперметр — в качестве амперметра подойдет обычный китайский тестер. Его нужно поставить в режим 10А и подключить красный щуп в самое верхнее гнездо. Затем тебе надо заклинить двигатель (я обычно зажимаю вал плоскогубцами).

Теперь подцепляй двигатель к аккумулятору и смотри на прибор — число, которое он покажет, это и есть максимальный ток двигателя при предельной нагрузке. Только не держи долго, мотор может сгореть от перегрузки. Китайские моторчики обычно имеют стремные характеристики, поэтому при отвратительной мощности на валу дико потребляют ток — несколько ампер даже на холостом ходу! Это требует мощной системы управления и быстро садит батарейки. Так что, если используешь готовое шасси от игрушки, то выковыривай этих поганцев и ставь туда двигло попродвинутей. Кстати, очень неплохие японские двигатели стояли в китайских магнитофонах. Выглядят они как серебристые стальные цилиндры с шестью резьбовыми отверстиями на морде (на них еще иногда написано Mabuchi Motor). Можно выдрать из магнитофона или купить в магазине радиотоваров по пятьдесят рублей за штуку. Рекомендую: ток предельной нагрузки не превышает одного ампера и это при внушительном вращающем моменте! Мне вообще повезло — совершенно случайно я намутил двигатели швейцарской фирмы Maxon. На холостом ходу потребляют раза в два меньше, чем светодиод!

А на двенадцати вольтах, при предельной нагрузке всего 600 миллиампер, их руками не остановить. Если где увидишь такое чудо — отрывай с мясом и беги, пока хозяева не опомнились. Свои два движка я выковырял из старого пятидюймового дисковода Robotron, который нашел на заводской свалке оборудования. На барахолке я их тоже видел, продавали по пятьсот рублей за штучку. Жаль тогда не успел купить — перед самым носом увели. Хоть и дорогие, но они стоят того! Двигатели ставь на место родных. Если не встают, примени народную смекалку и приколхозь их подручными средствами. Я, к примеру, применяю остатки от конструктора LEGO, точнее, его китайского аналога. Эти кубики отлично режутся, пилятся, сверлятся и клеятся, образуя прочные конструкции любой нужной конфигурации. Из них очень удобно делать разные детали, кронштейны и прочие элементы.

От двигателя на управляющий контроллер непременно должны идти датчики вращения, чтобы можно было отслеживать скорость вращения, а также количество оборотов мотора. Иначе будут невозможны точные перемещения. Лучше всего делать датчик оптическим. Вариантов конструкции — масса. У меня в шестерне редуктора просверлена дырка, через которую светит диод, а свет улавливается фотодатчиком. Один импульс датчика равен одному обороту шестерни или одному сантиметру хода гусеницы. Можно сделать и по-другому — наклеить полоску фольги на шестерню, а ее саму покрасить в матовый черный цвет и ловить отраженный свет. Короче, конструкция ограничена только твоей фантазией и имеющимися материалами.

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

Схемотехника

Общий принцип и компоновку рассказал, — теперь гляди схему. Расскажу, что там и для чего сделано. Сразу же в глаза бросается море стрелочек и обозначений вида Хn.mm. Не стоит пугаться, так обозначаются разъемы. Поскольку робот модульный, то я все выводы сделал на клеммниках, чтобы можно было быстро подсоединять и отсоединять внешние цепи, вроде датчиков или источников питания. Первое число в обозначении указывает на номер клеммника, а второе число, которое через точку, — на номер контакта в разъеме.

  • X1 — разъем подключения программатора, он же выход SPI-порта.
  • X2 — разъем подключения входных цепей, датчиков, шин i2c и UART, и аккумулятора.
  • X3 — разъем дополнительного питания. Выведены туда 5 вольт, земля и 3.3 вольта. Будет нужен для запитки других блоков, когда они будут доделаны.

На скриншоте полюбуйся схемой преобразователя напряжения с 12 вольт на 5 вольт. Она расположена на той же плате, но является как бы независимым подблоком, поэтому стоит особняком. От нее лишь запитывается схема. Таких блоков всего два. Второй — на 3.3 вольта и его выход подключен на клеммник Х3. Как работает эта схема, я рассказывал в статье «О вкусной и здоровой пище» в августовском номере ][акера за 2008 год. В качестве контроллера используется, как я уже говорил, ATMega8 — любая, можно с индексом L. Работает она от внутреннего генератора, поэтому максимальная частота — 8 МГц, чего для этой задачи хватит с лихвой. Обрати внимание, как подключена мега. Видишь, на разъемы выходит куча линий?

Это свободные порты — я специально так сделал, — чтобы, во-первых, уже на один только этот контроллер можно было нацеплять всякого железа, а во-вторых, для связи с другими блоками. В первую очередь, выведен интерфейс шины i2c (линии SDA и SCL) и UART. Об UART я уже рассказывал, а про i2c ты, возможно, не слышал. Это специальный внутрисхемный протокол, позволяющий связать по двухпроводной шине до 127 устройств. Именно через него различные блоки будут общаться между собой. К тому же, Мега поддерживает его аппаратно. Линии PD2, PD3, PC1, PC2 идут на вход микросхемы L293D. Эта микруха является мощным усилителем, заточенным под работу с движками. Ее выводы подключены к клеммнику, в котором зажимаются проводки от моторчиков.

В микросхему на вывод 8 подается плюс высокого напряжения. У нас это 12 вольт, а максимум для этой микросхемы — 36 вольт. Также ей требуется наличие +5 вольт, для работы управляющей логики и, само собой, земля. Когда на вход усилителя подают 1, то его выход намертво сажается на высоковольтную шину. Если же подать на вход 0, то выход усилителя сажается на землю. Когда мы подключаем двигатель обеими концами к выходам усилителей, — от комбинации нуля и единицы зависит направление вращения. Если верхний вывод будет на 1 (помним, что «1» = 12Вольт), а нижний на нуле, то ток через мотор потечет сверху вниз — движок будет крутиться, например, вправо. А если выставить уровни наоборот: внизу 1, а вверху — 0, то ток пойдет уже снизу вверх и мотор раскрутит влево. Если подать две единицы или два нуля, то это будет равносильно замыканию выводов двигателя друг на друга. В этом режиме двигатель начинает работать как генератор, у которого в качестве нагрузки — его собственная обмотка, поэтому очень быстро остановится.

В L293D четыре усилка, поэтому полноценно, с реверсом, управлять она может двумя моторами. Отдельно скажу про выводы 1 и 9 микросхемы. На схеме они подписаны как «Правый Разреш.» и «Левый Разреш.» — это входы разрешения работы. Если на них подать 1, то усилители подключаются к двигателю, а если 0, то отключаются и выводы переходят в режим Hi-Z. Нужен он для плавного управления двигателем в режиме ШИМ (Широтно Импульсная Модуляция). Про ШИМ я рассказывал уже дважды — не буду повторяться, напомню лишь, что для управления по ШИМ на эти входы надо слать импульсы прямоугольной формы, а от соотношения ширины высокого и низкого сигнала зависит мощность, получаемая двигателем.

Выводы идут к микроконтроллеру на порты PB1 и PB2. Так сделано не случайно; эти две линии имеют альтернативную функцию: ОС1А и ОС1В — выходы с ШИМ-генератора на базе таймера TC/1, встроенного почти во все ATMega. Стоит рассказать и о датчиках вращения двигателей. Как я уже говорил, в каждой шестерне есть по небольшому отверстию. С одной стороны стоит светодиод, с другой — фотодиод. Когда отверстие проходит между ними, то свет от источника попадает к приемнику. Это отслеживает микроконтроллер. Одна вспышка — один оборот шестерни. Можно считать путь и высчитывать реальную скорость двигателя. Очень полезно! Краеугольным камнем оптических датчиков является фотодиод. Внешне он совершенно не отличается от светодиода, поэтому, когда будешь покупать, не перепутай и лучше сразу подпиши пакетики. Если включить тестер в режим прозвонки и подключить щупы к фотодиоду, то при поднесении к яркому источнику света его сопротивление будет резко падать — от многих МегаОм до десятков Ом. Запомни, к какому выводу в этом случае был подведен красный, плюсовой, вывод тестера. Это будет анодом. Если сопротивление не меняется, то попробуй поменять выводы местами, возможно, ты неправильно к нему подключился. Не помогло? Тогда проверь, не перепутал ли ты его со светодиодом :).

Дальше система работает так. Ты подключаешь фотодиод анодом (плюсом) к земле, а минусом, катодом, к выводу микроконтроллера. И включаешь эту ножку контроллера на вход с подтяжкой до единицы, то есть, до плюс пяти. Когда фотодиод в темноте, его сопротивление очень большое и ножка, по сути, висит в воздухе. Соответственно, с регистра PIN считывается 1. А вот если датчик осветить, то его сопротивление рушится в ноль, что фактически означает просадку напряжения до нуля и с регистра PIN считается 0. Точно такой же эффект как от кнопки! Но одна тонкость тут все же есть. Дело в том, что подавляющее большинство фотодиодов являются инфракрасными, поэтому на обычный свет откликаются весьма вяло. Скажем, на зеленый и синий светодиоды не реагируют совершенно. Поэтому в качестве фонаря бери либо красный светодиод, либо белый — в идеале хорошо бы надыбать инфракрасный. Выглядит он, как и все остальные, только его свет не видно невооруженным глазом. Чтобы увидеть свечение инфракрасного диода, погляди на него через экран фотокамеры от мобильника или мыльницы — явственно будет видно свечение, так как матрица фотоаппарата ИКизлучение видит отлично.

Свето- и фотодиоды можно купить в радиомагазинах или откуда-нибудь выдрать. ИК-светодиоды есть во всех пультах дистанционного управления телевизоров, магнитофонов и прочей техники. А фотодиодами есть шанс поживиться в старых шариковых мышах или пятидюймовых дисководах. Так, в дисководах обычно ставили два фотодиода. Один отслеживал защитную наклейку против записи, а другой — дырочку на магнитном диске. К сожалению, в 3.5" флопарях все датчики механические, и там нужных деталей нет. Как ты видишь из схемы, фотодиоды подключаются напрямую к портам, а светодиоды — к источнику питания через резистор. В печатной плате контакты сразу же выведены на клеммник, для удобства монтажа. Так что от редукторного блока до контроллера двигателя у меня сразу же идет внушительной ширины шлейф.

Связь между блоками по шине II C

Для обмена данными между частями робота ничего лучше, чем шина i2c, еще не придумали. Это синхронный протокол, который использует всего два провода для передачи данных. По линии SDA передаются биты, по SCL — синхроимпульсы. В спокойном состоянии обе шины стоят в единице. Передача данных следует от ведущего к ведомому. Вначале идет старт бит — при поднятой в единицу линии SCL ведущий контроллер прижимает линию SDA в ноль. В этот момент все ведомые девайсы просыпаются и начинают смотреть на шину — не передаст ли ведущий их адрес.

Ведущий, тем временем, выставляет первый бит данных на линию SDA (если передается 0, то выставляет низкий уровень, если 1 — то высокий) и поднимает SCL вверх, в единичку, давая понять ведомым, что можно читать бит. Все ведомые одновременно его читают. Затем линия SCL вновь опускается, и ведущий выставляет второй бит и снова поднимает SCL. Таким образом, ведомые читают биты только тогда, когда линия SCL находится в единичке. Это исключает возможность неправильного чтения, ведь мастер выставляет данные на шину при прижатой в ноль линии SCL. Первым байтом после стартового бита передается адрес и направление обмена.

Адресом являются первые 7 бит, переданных по шине (потому-то максимальное число устройств равно 127), а самый последний, восьмой бит, определяет, что хочет дальше сделать ведущий: ноль, если ведущий хочет передать байт ведомому, и один — если хочет затребовать у него байт. Когда один из ведомых услышит свой адрес, то на следующем такте он прижимает линию SDA в ноль — это означает, что он принял вызов и готов к обмену данными — процесс называют подача ACK или просто «А», от английского Acknowledge (подтверждение). Дальше мастер начинает в том же порядке дрыгать вверх-вниз вожжу SCL и либо выставлять на нее байты (в случае передачи), либо читать байты, которые выставляет на шину уже ведомый.

По окончании передачи идет стоп-бит: мастер вначале поднимает шину SCL, а потом — шину SDA, освобождая ее для работы других передатчиков. Протокол несложен, а главное, физическая реализация мало должна тебя волновать, ведь он аппаратно поддерживается почти всеми видами контроллеров AVR, а также многими другими семействами (вроде Microchip PIC или С51). В случае чего, будет нетрудно сделать его и программно. В инете мгновенно нагугливается подробнейший русский мануал по протоколу IIC. Так что, забивай документацию на шину IIC и даташит на твой любимый микроконтроллер в огромный косяк и залпом скуривай. Просветление наступит быстро, и ты поймешь, что однопроцессорные системы — это моветон и куда веселей гонять данные между кучей специализированных контроллеров.

Дальнейшие планы

Это все, что у меня готово на текущий момент. В скором времени я планирую купить ультразвуковые сонары LV-MaxSonar-EZ. Вряд ли их можно найти в свободной продаже, поэтому я буду заказывать пересылкой. Погугли, многие конторы торгующие радиодеталями могут их доставить. Стоит такой девайс порядка 70 баксов, но он хорош! Представляет собой небольшую пищалку с платкой на заднице. По запросу проводит сканирование и выдает по стандартному протоколу UART расстояние до цели в миллиметрах. Этот сонар точен и имеет узкую направленность, которая может еще и регулироваться программно.

Хочу поставить его на поворотную платформу и обстукивать местность вокруг, составляя карту в памяти. Заниматься созданием карты и вращением сонара будет отдельный блок, к которому потом станет обращаться за данными центральный процессор. Итак, я начал развивать своего робота дальше. На диске, как всегда, тебя ждут чертежи печатных плат, исходники управляющей логики микроконтроллера с комментариями и необходимые даташиты. А если у тебя возникнут вопросы, то можешь задавать их мне по почте или в комментах на сайте http://easyelectronics.ru в рубрике, посвященной робототехнике. Пиши письма, выражай свой интерес и в журнале, вполне возможно, появится продолжение статей по домашней робототехнике. Удачи!

Содержание