Обучение роботов
Эта страница посвящена строительству и обучению роботов
Введение В первую очередь необходимо заметить, что даже постановка задачи может быть изменена с течением времени много раз, а прочее, включая мои собственные высказывания, могут принимать довольно противоречащие друг другу формы. Так что не обессудьте.
Теперь, когда мы все между собой уяснили, можно и продолжить. Какое-то время назад я активно участвовал в очень увлекательных
соревнованиях роботов. Но то были роботы программные, а я все еще hardware guy, поэтому после достижения некоторой вершины в соревнованиях (мой nick-name - xitra), стали появляться мысли об экспериментах с "железом". Если оно ездит, значит оно так хочет.
Как говорят наши братья по разуму, это в первую очередь - fun. Т.е. в прямом смысле этого слова, просто нравится и все. Да и вообще, большой разницы между этим и аналогичными проектами, нет. Но... в отличии от подавляющего числа собратьев, перед этим экземпляром еще стоит задача не упасть с лестницы. Как это на первый взгляд и не удивительно, но такая элементарная для человека операция, становится проблемой для робота. Конструкция не обязательно должна быть очень красивой, но надежной, устранение повреждений при падении со стола не должно занимать больше, чем десять минут. Краткие заметки о строительстве робота Управление осуществляется RISC микроконтроллерами от Atmel. Выбор был прост - дешевый starter-kit, снимал проблемы с программатором и прочие ненужные сложности. Да и поделать на RISC тоже всегда хотелось (хотя серьезной разницы я пока для себя не заметил). В качестве рабочей лошадки используется AT90S8515 и AT90S8535. Относительное позиционирование робота осуществляется по измерению пройденного расстояние каждым из колес. Для этой цели на каждую из осей посажены диски с прорезями аналогичными тем, что стоят в "мышах". Фактически и внутренний контроллер мыши используется в роботе по прямому назначению - считывает информацию с дисков и посылает ее в стандарте PS/2 контроллеру. Контроллер ее принимает, расшифровывает и использует в личных целях. Так например если необходимо, чтобы робот ехал строго по прямой, контроллер импульсно меняет напряжение на моторах таким образом, чтобы оба колеса совершали одинаковое количество оборотов в минуту. Поворот слегка сложнее, но принцип тот же. Кто интересуется, может взглянуть на заметки о мышах вообще и PS/2 протоколе в частности. 14.05.00. Ничего не умерло :-) Хотя и было двухмесячное безделие, но все потихоньку оживает. Теперь кратко, что же все же сделалось за прошедшее время. Самое главное ожил контроллер AT90S8535. Внутренняя структура контроллера практически идентична 8515, отличие заключается в наличии внутреннего АЦП, дополнительного таймера и еще пары мелочей. Но... разводка выводов другая, вплоть до питания, так что будьте внимательны. Когда я первый раз пытался программировать его в starter-kit у меня ничего не вышло, когда я пытался зашить его еще пяток раз - результат тот же. В конечном счете я сейчас программирую его без проблем на плате и starter-kit не использую совсем. Решение использовать 8535 было принято ввиду наличие встроенного АЦП, который предполагалось использовать для измерения напряжения на фототранзисторах - ИК датчиках. Но так уж получилось, что сейчас используются только модули TSOP1840, а они имеют логический выход и таким образом ЦАП не используется совсем. Эти модули имеют хорошую помехоустойчивость против внешней засветки и даже постороннего ИК сигнала сходного по структуре. В ранних программах я использовал очень простой вариант задержки -программа циклится на 100000 - 10000000 тактов и я получаю необходимую задержку. Но во-первых это некрасиво, а во-вторых в конце концов я научился использовать таймеры. Трассировать программу обычными software средствами практически невозможно. Наряду с большим количеством программных задержек, программа включает в себя еще взаимодействие с внешними контроллерами: мыши и 8535. Для того, чтобы иметь хоть какое-то представление о состоянии ключевых регистров или любых других интересующих данных к контроллеру 8535 был подключен ЖКИ и написаны соответствующие программы инициализации и посылки комманд/данных. В процессе изучение работы таймеров была написана программа полуавтоматичесого телеграфного ключа (key10.asm,key10.hex). Используется шасси робота и его speaker :-) Спереди робота теперь размещена вторая плата на которой находятся: 8535 контроллер, разъемы соединения с большой платой и ЖКИ, приемники модули TSOP1840 и ИК диоды. В будущем предполагается здесь же размещать часть датчиков касания. 06.02.00. Предыдущая неделя прошла в активной и мучительной борьбе с роботом. Он очень не хотел поворачиваться. Причем следует заметить, что движение вперед и назад выполнялось уже вполне прилично, а вот повороты - никак. При такой кинематике, как у этого ворчуна, поворот ничем принципиально не отличается от движения вперед. В обоих случаях контроллер, включив моторы, должен сосчитать заданное количество оборотов колеса (или пальцев на диске - датчике вращения), отличие только в том, что при повороте, колеса вращаются в противоположную сторону. Необходимость дополнения робота звуковым и световым индикаторами обусловлена трудностями в отслеживании и устранении проблем. В состав пакета Atmel входит наряду с ассемблером также и симулятор, но в моем случае его довольно трудно использовать. Эти переговоры с контроллером мыши, завязка на двигатели, потенциальные сбои в датчике вращения колес, все в конечном счете приводит к тому, что невозможно просимулировать работу, это занимает больше времени, нежели просто перепрограммирование контроллера и я все равно не буду очень доверять симуляции, держа в уме пару потенциальных hardware проблем. Появились покрышки на колесах. Они мне очень нравится, особенно если учесть, что это кусочки от резины с моей ракетки для настольного тенниса. Проходимость теперь просто пугающая, но приходится за этим не очень сообразительным орлом следить постоянно. Моторы стоят с большим моментом (из-за редуктора) и если робот находит достаточно тяжелое препятсвие и трение с полом хорошее - он рвет эту резину, отрывает клеевое соединение, в общем и целом - бушует. Если обратиться к разделу Задачи, то можно заметить, что две первые уже выполненны. Программировать робот теперь одно удовольствие - это можно делать прямо в плате, не вынимая контроллера. Наиболее крупные механические работы выполненны. Следующим этапом будет работа с сенсорами, датчиками и прочими приятными вещами из этого ряда. Робот теперь может проехать по настоящему квадрату, "лесенке" или любому другому пути, состоящему из поворотов и движения вперед-назад. Проехав, по прямоугольному пути (2x1 м) он возвращается в исходную точку с погрешностью примерно 5-7 см и угловой ошибкой около 20 градусов. В ряду причин вызывающих ошибки:
28.01.00. Вспомнил, что робот должен все же шевелить лапками, надо подключать моторы. Колеса должны вращаться в обе стороны, поэтому есть необходимость в full-bridge. Никаких МОП транзисторов я поблизости не нашел. Покупать дорого, да и не нужно мне для управления моторами (35 мА на холостом ходу, 200-300 мА при старте и очень мощной нагрузке), транзисторы, способные переключаться за наносекунды (мне подойдут мс) и управляющие большими амперами. Немного поискал и решил остановится на чудных (я имею в виду дешевых) операционных усилителях, которые могут работать с к током до 1 А - L272M. Что такое мотор? Правильно, это большая или не очень головная боль, если не сделать все правильно. Почему? Потому, что это индуктивная нагрузка, которая еще и искрит (если мотор щеточный). Я это знал. Но, что б на столько!!! Когда я первый раз включил, обнаружил, что мой контроллер сбрасывается в определенные моменты (происходит reset) я подумал: "Вот чудесно, сейчас поиграемся". Я конечно до этого уже поставил в схему диоды для закорачивания возникающего в обмотках мотора обратного напряжения, я же не хочу смерти компонентов! И вот я радостный мерю осциллографом напряжение на одном из моторов. В импульсе под 50В! Мама! А где ж диоды? Одна надежда, лишь бы все не "повылетало". Будешь тут reset делать! Мерю между удаленными "землями". Где 5, где 8 В. Тоже неплохо. Делать одну общую точку соединения земель - поздно. Все уже соединено. Пытаюсь делать все виды питания без петель и "землю" покороче, попрямее, потолще - не помогает. Делать нечего, делаю входной фильтр НЧ перед операционным усилителем со временем нарастания порядка 0.2 с. Нет резких включений-выключений - нет проблемы. Конечно на это уходит несколько часов, потому что на компоненты фильтра место не предусматривалось. Включаю - не помогает. Все равно сбрасывается, но не всегда. Один мотор сбрасывает, другой - нет. Когда в одну сторону крутится - плохо, когда в другую - работает без сбоя. На выводе "reset", уже и конденсаторов понавешанно и земля там правильная, но что-то все равно помогает сбросится. Предположил, что сильное импульсное поле от мотора наводится как-нибудь на провода питания, ну и... На контактах питания на макетной плате все вроде бы хорошо, но может быть это самобман. Запитываю от внешнего источника - все хорошо работает. Ага, запитываю от аккумулятора, но через провод, идущий далеко от моторов и подключающийся к точке, куда я подключал внешний источник питания. Работает почти также хорошо, но reset все же иногда случается. После очередных инспекций выясняется, что провода питания и сигналы для моторов шли поверх или вблизи контакта reset микроконтроллера. Все как всегда просто и очевидно! И в случае, когда уже стояли фильтры reset вызывался постоянным искрением щеток. А в начале без фильтров, там, конечно была просто невыносимая обстановка и reset мог случаться в результате тысячи причин. Теперь, наконец-то, этот Ворчун (sound file скоро появится, специально для любителей Hi-Fi -:) имеет практическую возможность передвигаться, хотя он еще полностью глух, слеп, ну и так далее. 26.01.00. Идея писать в процессе развития подопечного пришла недавно, поэтому история не сначала. К этому моменту уже существует рабочая версия программы, считающей количество оборотов колес, естественно программа инициализации мыши. Было все это испытанно в таком виде: контроллер находится в starter-kit, моторы включаются-выключаются просто тумблером и при этом питание берется от аккумулятора, контроллер мыши еще на плате мыши, но датчики вращения уже закреплены на шасси, мышь подключается к starter-kit помощью PS/2 разъема. Т.е. три отдельные части соединены большим количеством проводов. Следующим большим шагом стал монтаж контроллера на макетную плату. Там же расположилась схема управления моторами. Все это было собрано и без особых проблем заработало. И хотя в описании на контроллер приводится официальная максимальная частота 8 МГц, там же они показывают графики потребления питания, где фигурирует и 10, и 12 МГц. Таким образом на макетной плате тактовая частота генератора - 10 МГц, и считать время удобно, и все ж побыстрей, хотя с этим пока проблем нет. Теперь дело за переносом контроллера мыши на макетную плату. Мышь конечно подвергается в этом случая довольно значительному риску быть разрушенной навсегда, но кто их этих мышей спрашивает?! Несколько часов - и контроллер мыши на макетной плате. При вращении датчиков счетчик не работает - проблема. Сразу мысль - умертвил таки. Но нет, программа инициализации проходит нормально и мышь шлет ответ, что с ней все хорошо, готова работать. Но когда диск вращается, мышь на это никак не реагирует. В результате осмотра оказалось, что все соединения в порядке и коротких замыканий тоже нет. Проверил напряжение питание ИК светодиодов - выглядит вполне нормальным. Питание светодиодов, я думаю в целях снижения энергопотребления и увеличение помехозащищенности от внешней засветки, осуществляется от внутреннего источника, который вырабатывает импульсы длительностью несколько десятков мкс и скважностью около 2. Светодиоды соединены последовательно. Проверил прохождение тока по обоим - идет. Так, значит фототранзисторы "ушли". Выпаял, проверил изменение сопротивления, работают вроде бы, заразы. Не поверил, выпаял такой же из другой мыши - один к одному. Помучался еще какое-то время. Проверил ток текущий сквозь светодиоды. Оказалось какае-то жалкая сотня мкА. Может конечно и очень хорошие светодиоды, но что-то сомнительно. Подключил всю цепочку из двух светодиодов и резистора к +5 В. Все чудесным образом заработало. Что там было с генератором тока и почему так странно себя вели светодиоды я не знаю. Фотографии от 14.05.00. Вторая плата, ИК датчики, контроллер 8535, ЖКИ: Фотографии от 06.02.00. Новые покрышки, голос, индикаторы: Фотографии от 29.01.00. Макетная плата, датчик вращения колес, общий вид: Фотографии от 20.01.00. Шасси, моторы, аккумулятор, starter-kit: Технические характеристики
Software Сразу могу сказать - я не профессиональный программист. Все что написано - работает, а уж как я это сделал, как все это выглядит в коде и в комментариях - это уж простите, как мог так и сделал :)
Как говорят на Nokia: "я не эксперт в этом вопросе", но... Прежде всего есть два сильно отличающихся типа мыши: одни общаются по PS/2 протоколу (интерфейсу) с контроллером, а другие по RS-232. Для меня решающим в выборе было то, что мне не придется иметь дело со всякими -12..+12 В если я использую PS/2 (нормальное однополярное +5В). А так, если мышь разбирается до уровня микросхем, то мне кажется особой разницы, с чем играться, нет В результате рысканий по интернету, сложилось впечатление, что PS/2 очень странно поддерживаемый протокол: кто, что хочет, тот так и дополняет его. Может я и не прав. Не хочется утомлять всякими ужасами, просто приведу ссылку на документ, которого достаточно, чтобы понять как работать с мышой. Это описание контроллера мыши. Самым большим откровением для меня было то, что мыши надо разрешить работать , т.е. послать команду "Enable". Другая важная информация, что интерфейс двунаправленный, т.е. и "Data" и "Clock" могут передаваться в двух направлениях. Обе линии подпитываются от +5В через 10 кОм. Таким образом если никто не шлет ноль, то на линии единица. В противном случае естественно ноль, но как видно, никто никого сломать при таком подключении не может, хотя прерывать - легко. Что host и делает, если не хочет ждать пока мышь наговорится. Процедура инициализации мыши выглядит примерно так: Мышь делает себе reset (через 300..500 мс после включения) и посылает два байта (АА и 00). Это говорит машине, что мышь в порядке. Я просто пропускаю это все, потому что информация эта бесполезная. Затем надо выставить на "Clock" ноль, подержать так 100-200 мкс и отпустить. "Clock" при этом опять станет "1". Выставить на "Data" ноль - с него начинается любой байт посылки. Ждать так не более 10 мс. В течении этого времени мышь начнет выдавать на линию "Clock" импульсы. Как только импульс заканчивается и линия "Clock" возвращается к единице, можно менять сигнал на линии "Data". Таким образом надо послать число F4h. После этого надо послать бит контроля четности и затем вернуть "Data" в состояние "1". Мышь проверяет после одиннадцатого импульса (1ый бит "0", 8 бит информации, контроль четности, стоповая "1") линию "Data" и на пару сотен мкс переводит ее в состояние "0". Затем все линии становятся "1" После такой инициализации, мышь шлет три байта информации каждый раз когда на нее каким-либо образом воздействуют: нажимают кнопки, двигают и т.д. Биты из этих байтов расписаны в описании контроллера мыши. В самом начале, у меня были большие проблемы с моторами. Первая ошибка была в том, что я пытался управлять импульсами со слишком крутыми фронтами и это приводило к ужасным выбросам обратного напряжения в 50 вольт. Некоторое подобие ФНЧ исправило ситуацию. Но осталась другая проблема. Моторы щеточные и постоянное искрение дает пульсацию более 5-6 вольт, т.е. больше напряжения питания. Помимо того, что это опасно для контроллеров и прочих компонентов, это вызывает следующий эффект. Датчик TSOP1840 очень чувствительный, но он также и чувствителен к пульсациям напряжения питания, особенно когда частота пульсаций в районе 40 кГц (частота наполнения пачек). Искрение щеток видно на осциллографе как импульсы длительностью 1-20 мкс. Это означает, что спектр будет довольно широк - до 1-2 МГц. Напряжение как уже было сказано - несколько вольт. Хотя для TSOP1840 достаточно и милливольт, чтобы чувствительность снизилась. Естественно, применяется фильтрация по питанию, хотя и простая... :-) Рассмотрим проблему подробнее . Когда моторы включены робот может обнаружить препятствие на расстоянии 10 см, например. После этого он останавливается. Импульсы пропадают и в этом случае робот уже может "видеть" в несколько раз дальше. Появляется гистерезис и очень неприятный. Как его бороть пока не ясно. Замечено, что при использовании ИК диодов в очень маломощном режиме гистерезис практически незаметен, но и расстояние обнаружения для крупных предметов составляет всего 5-10 см. Учитывая такие сложности с искрением, возможно было бы лучшим решением использовать шаговые двигатели. В этом случае и подсчет оборотов колес был бы значительно облегчен.
|