Проекты / Другие
Добавить в избранное

Мобильный робостенд

Как я собирал первого своего робота, который потом вылился в мой диплом

Здесь я расскажу как я собирал первого своего робота, который потом вылился в мой диплом. Все началось на 4-ом курсе (2011 год), когда в качестве задания на курсовую я начал писать код для робота, который бы ездил по линии. В понимании того, как это должно работать мне помогла статья "Desktop Line Following Robot" товарища ChaN'а. Мозгом был выбран микроконтроллер ATmega16. Программная часть реализовывалась на ассемблере.

Для начала я внимательно просмотрел код из вышеуказанной статьи. Некоторые идеи я взял оттуда. Впоследствии в процессе разработки и отладки часть кода была только отлажена, а часть претерпела значительные изменения. Но для начала я расскажу о том, как я придумывал самого робота — шасси и крепление всех элементов. Именно придумывал, поскольку поиск оптимальной конструкции длился до середины 5-ого курса :) Для удобства все описание разбито на части.

Механика

Началось все с ролика в одной из тем на Roboforum'е, где было предложено использовать колеса от роликовых коньков. Сама платформа была вырезана из оргстекла толщиной 3мм. В качестве колес применены колеса от роликовых коньков с диаметром 8см. Конструкция приводилась в движение при помощи двух электродвигателей с редукторами, выполненными на основе деталей от CD-приводов. Переднее поворотное колесо мебельное. Тестировал просто подавая питание на двигатели, двигалось шустро и при этом издает характерный звук от шестеренок (сказывались большие обороты двигателей). Фотографии привожу ниже (фотографии кликабельны).

Видеозаписи работы данной платформы к сожалению не делал. Отмечу лишь, что ездила она шустро, но через несколько запусков нужно было поправлять балансировку колес, на фотографии вверху слева как раз видно искривление, вызванное движением шестеренок вертикально относительно друг друга. Для приведения всей этой конструкции в движение я использовал два электродвигателя QX-FF-130-11340 фирмы QX Motors.

Конструкция оказалась сложной в плане балансировки колес и обеспечения достаточной жесткости. А самое главное что возникли бы большие проблемы при управлении. Переднее колесо поворачивается вокруг своей оси и это могло приводить к его непроизвольным поворотам (это явление называется шимми). Поэтому я приступил к разработке нового шасси.

После первой пробы, я начал просматривать различные товары на тему любительской робототехники. особенно меня интересовали редукторы. Подключение двигателей напрямую к колесам является плохой идеей вследствие малого вращательного момента на двигателе и малой его нагрузочной способности. И в один из дней наткнулся на редуктор известной фирмы Tamiya. Это был Tamiya 70168 Double Gearbox Kit. Набор позволяет собрать 4 различных варианта сдвоенных редукторов с разными передаточными числами: 12.7:1, 38:1, 115:1, и 344:1. Также он содержит два небольших электродвигателя постоянного тока, которые вращают независимые 3-миллиметровые шестиугольные оси (старые мои двигатели не совсем подошли по габаритам). Цена составила около 500р и я решил что лучше купить, чем снова лепить свое из мусора. Также была куплена шаровая опора Pololu 1/2" c железным шаром и свинцово-кислотный аккумулятор (SLA) DJW6-4.5 на 6V и 4.5Ah фирмы LEOCH (выбирал исходя из цены и простоты зарядки, литий-полимерные аккумуляторы показались на тот момент дорогими). Размеры аккумулятора 100х47х70 мм, вес 0,81 кг.

После того, как все пришло, я приступил к постройке нового шасси. Размеры платформы были уменьшены до 220х120 мм. В задней части по бокам сделаны два выреза для колес, размером 60х25 мм. Основой также, как и в первом варианте, является оргстекло толщиной 3мм. Колеса взяты от старой китайской радиоуправляемой машинки, диаметр около 55 мм. Следует отметить, что в ходе испытаний было отмечено их малое сцепление с поверхностью (тестировал на столе и полу), поэтому на колеса натянуты отрезки резины от велосипедной камеры (видно на фотографиях). Это позволило немного увеличить сцепление и улучшило эстетический вид самой конструкции.

В роли переднего колеса установлена шаровая опора. Я использовал Pololu 1/2" Ball Caster c железным шаром. Эта шаровая опора использует железный шар диаметром 12,7 мм. Высота собранного комплекта колеблется от 13,5 мм до 20,3 мм. Пластиковые катки используются чтобы минимизировать трение между шаром и основанием.

Затем был проведен первый тест.

Ниже привожу фотографии новой конструкции с установленными платами и аккумулятором (фотографии кликабельны)

Робот включал в себя три платы: управляющая плата с ATmega16, плата управления двигателями на L298N и датчик линии на светодиодах и фототранзисторах. Кстати это был первый запаянный микроконтроллер в корпусе TQFP :) Позже платформа была переработана. Платы объединены с целью удобства. Об электронике и программе я напишу в конце статьи. А пока пример тестовой рулежки с простейшим релейным алгоритмом. Малая скорость обусловлена не весом аккумулятора, а ограничением в коде программы.

Третий вариант шасси не сильно отличается от второго. Платформа была по-новому выпилена из того же оргстекла, но уже аккуратнее. Аккумулятор я заменил на 4 Ni-Mh аккумулятора GP по 2500 mAh. Переделал плату датчика линии и объединил драйвер двигателей с управляющим контроллером. Также к тому времени пришел ультразвуковой дальномер HC-SR04, который я закрепил спереди. Вдобавок я решил прикрутить Bluetooth-модуль HC-05 для управления и удаленного опроса датчиков.

Возможно это и было наивно, но планировалось что плата робота в то же время будет и некой отладочной платой для различных идей. Поэтому к ней было добавлено большое количество дополнительных элементов: светодиоды, кнопки, переменные резисторы, микрофон с усилителем на LM358, 4-разрядный 7-сегментный индикатор, пара штырей для 1-wire c предварительной подтяжкой пина DQ к VCC через 4,7кОм, два биполярных n-p-n транзистора, две интегрирующих цепочки для ШИМ и отдельные линии питания 5 В и 3,3 В. Фото платы и всей конструкции робота ниже (кликабельны).

Электроника

В этой части я опишу электронику робота. Робот состоит из двух плат: датчика линии и управляющей платы. Мозгом робота является МК ATmega16. Тактирование осуществляется от внешнего кварцевого генератора частотой 8 МГц. Применение внешнего кварцевого генератора позволяет добиться большей стабильности частоты ШИМ, а также реализации временных задержек. Номинальное напряжение питания схемы – 5В. В качестве источника питания используется батарея из 4-х NiMh аккумуляторов. Для уменьшения помех, аналоговая часть питания контроллера подключена к источнику питания через LC-фильтр согласно документации. Питание драйвера двигателей делится на питание силовой и логической частей. С целью уменьшения влияния коммутационных помех на работу контроллера, питание силовой части отделено от питания логической части, а также от других модулей и датчиков, диодом Шоттки VD1 (защита от переполюсовки) и конденсаторным фильтром. Питание силовой части драйвера двигателей производится напрямую от батареи.

Схема подключения драйвера L298 взята из документации. Для управления сигналами направления вращения двигателей использована микросхема SN74HC00, включающая 4 логических элемента 2И-НЕ. Использование SN74HC00 позволяет сократить число используемых линий ввода-вывода контроллера с 6 до 4, а также упростить программу контроллера. Драйвер двигателей подключается к линиям 2, 3, 4, 5 порта D. Линии 2 и 5 предназначены для управления скоростью двигателей (Pwm1 и Pwm2), а линии 3 и 4 для изменения направления их вращения (Dir1 и Dir2).

Датчик линии предназначен для определения положения робота относительно нее. Он состоит из 7 светочувствительных элементов, каждый из которых состоит из пары фототранзистор-светодиод. Компоненты датчика крепятся таким образом, чтобы луч света из светодиода, отражаясь от поверхности, попадал на фототранзистор. Уровень сигнала от фототранзисторов прямо пропорционален их освещенности. Следовательно, канал с минимальным уровнем сигнала от фотодатчика будет находиться над черной полосой.

Датчик препятствий предназначен для бесконтактного измерения расстояния до препятствий, используется ультразвуковой дальномер HC-SR04. В сравнении с датчиками на основе инфракрасных светодиодов, ультразвуковые дальномеры обладают большей дальностью измерения. Дальномер подключается к линиям 6 и 7 порта D.

Модуль беспроводной связи предназначен для удаленного управления роботом. Его основой является Bluetooth модуль HC-05. Выбор данного модуля обусловлен простотой и дешевизной его использования. Интерфейс Bluetooth широко распространен, что избавляет от необходимости разработки специального радиопередатчика для компьютера оператора. Питание модуля осуществляется от стабилизатора на напряжение 3,3 В, собранного на микросхеме LM1117 согласно документации. К линии PIO0 модуля HC-05 через ограничительный резистор подключен светодиод, предназначенный для индикации статуса соединения (светится при наличии соединения и мигает при его отсутствии). Также на схеме предусмотрена кнопка для сброса соединения. Для исключения случайного сброса соединения, вывод модуля RESET подтянут резистором к напряжению 3,3 В. Следует отметить, что несмотря на питание от 3,3В, линии ввода-вывода модуля допускают напряжение 5 В. Модуль HC-05 может работать в двух режимах: режим радиоудлинителя интерфейса RS-232 и режим AT-команд. В режиме радиоудлинителя модуль транслирует данные поступающие к нему на подключенное к нему по радиоканалу устройство. Во втором режиме возможна настройка различных характеристик модуля, например, скорость передачи данных (по умолчанию 9600 бит/c). Выбор режима осуществляется изменением логического уровня напряжения на линии PIO11 модуля. По умолчанию модуль работает в первом режиме, поскольку линия PIO11 подтянута резистором R2к общему проводу. При подключении линии к высокому логическому уровню напряжения модуль перейдет в режим AT-команд.

Модуль индикации предназначен для вывода отладочной информации. Он состоит из 14-ти светодиодов (вот уж поставил сколько влезло) с токоограничительными резисторами. Светодиоды включаются высоким логическим уровнем. Также модуль индикации включает в себя 7-сегментный 4-разрядный светодиодный индикатор с общим катодом. Для вывода данных используется динамическая индикация. Разряды подключаются к контроллеру через транзисторы, включенные по схеме с общим эмиттером. Необходимость в транзисторах вызвана ограничением порта ввода-вывода контроллера по току нагрузки в пределах 20-40 мА.

Принципиальные электрические схемы выкладывать здесь не стал, поскольку они займут много места. Все схемы в приложенном PDF-файле. Схемы рисовались в Visio, поскольку это был уже диплом, то рисовал близко к ГОСТам :)

Открыть схему робота

Алгоритмы

В этой части я вкратце опишу алгоритмы работы робота. Начнем со структурной схемы системы управления роботом для решения задачи движения по линии

Аналого-цифровой преобразователь (АЦП) считывает показания датчика, затем они нормируются, и после этого высчитывается ошибка позиционирования. Ошибкой считается разность между текущими показаниями датчиков и показаниями когда робот установлен строго по центру линии. Далее регулятор на основе ошибки вычисляет управляющие переменные, которые являются коэффициентами заполнения широтно-импульсной модуляции (ШИМ) для каждого из двигателей. Коэффициенты ШИМ используются для регулирования скорости двигателей, они поступают на вход модулятора, откуда уже модулированный сигнал подается на линии Pwm1 и Pwm2 драйвера двигателей. Рассмотрим поподробнее некоторые моменты.

Инициализация. В ходе ее выполнения очищается ОЗУ и все регистры общего назначения, инициализируется указатель стека. Затем производится настройка портов ввода-вывода: порт B настраивается полностью на вывод, так как к нему подключены светодиоды датчика линии, а порт D частично на ввод (линия 7) и частично на вывод (линии 2-6). Далее инициализируются периферийные устройства. Поскольку АЦП в выбранном контроллере 10-битный, то есть возможность выбора выравнивания по левому (младшие 2 бита в ADCL, старшие 8 в ADCH) и правому (старшие 2 бита в ADCH, младшие 8 в ADCL) краю. В программе используется выравнивание значений показаний по левому краю, так как это позволяет упростить расчеты. АЦП контроллера после каждого измерения помещает результат в регистровую пару ADCH:ADCL. Для АЦП устанавливается значение опорного напряжения равное напряжению питания контроллера (2,56 В) и выравнивание показаний по левому краю. Затем инициализируется модуль приемопередатчика UART. После инициализации, контроллер считывает из памяти ЭСППЗУ (EEPROM) параметры регулятора. Параметры регулятора в данном случае это – пропорциональный (P), интегральный (I) и дифференциальный (D) коэффициенты, а также значение базового коэффициента заполнения ШИМ двигателей (PWM Base). Они хранятся в ОЗУ (SRAM) в массиве sPidParams. Затем контроллер проверяет необходимость запуска режима отладки . Выбор данного режима задается установкой высокого логического уровня на линии 0 порта ввода-вывода C. В случае запуска режима отладки выполняется процедура Monitor. После ее завершения, контроллер возвращается на процедуру загрузки параметров регулятора из ЭСППЗУ . Это сделано для обновления параметров в памяти ОЗУ. После этого производится выбор режима запуска.

Сбор данных с датчиков. Сбор данных с датчиков осуществляется двумя подпрограммами: Get_line – для получения данных с датчика линии и Get_distance – для получения данных с датчика препятствий. При опросе датчика линии сначала происходит сброс текущего номера канала АЦП. Затем включается светодиод, соответствующий текущему номеру канала АЦП. После этого обновляется значение регистра выбора канала АЦП ADMUX, оно вычисляется путем выполнения логической операции ИЛИ номера текущего канала с магической константой 0xE0. Эта константа определяет значение уставки (2,56 В) АЦП и выравнивания результата по левому краю. После переключения канала, АЦП запускается в режиме одиночного преобразования. Сброс флага ADSC в регистре ADSRA сигнализирует об окончании преобразования. Дождавшись сброса этого флага, контроллер считывает значение показаний из регистра ADCH. С целью уменьшения влияния помех и упрощения вычислений регистр ADCL, содержащий два младших бита показаний не используется. Измерение повторяется 8 раз, после чего вычисляется среднее значение всех измерений и нормируется. Таким образом, реализуется программное повышение точности измерений. Полученное значение сохраняется в массив sLine в ОЗУ (SRAM). Затем номер текущего канала АЦП увеличивается. После сравнения алгоритм повторяется, если количество итераций не достигло 7 (оно ограничено количеством светочувствительных элементов в датчике линии). Таким образом, после выполнения процедуры Get_line, показания датчика линии будут храниться в массиве sLine в ОЗУ. Сбор данных с датчика препятствия инициализируется выводом логической единицы на 6 линию порта D микроконтроллера. Для того чтобы датчик произвел измерение, необходимо в течение 10 мс удерживать его линию Trig в состоянии высокого логического уровня. После этого линия 6 порта D контроллера переводится в состояние низкого логического уровня. Датчик производит измерение и переводит линию Echo в состояние высокого логического уровня. Длительность удержания линии Echo в этом состоянии прямо пропорционально зависит от расстояния до обнаруженного препятствия. Контроллер измеряет ее и затем пересчитывает расстояние в миллиметры. Результат измерения хранится в массиве sDistance в ОЗУ (SRAM).

Алгоритм нахождения отклонения E был реализован методом центра масс. В соответствии с этим методом положение робота находится по формуле

Вычитая из текущего положения робота его положение при котором, он находится строго по центру линии и выполнив нормирование, можно получить искомое отклонение E.

Управление двигателями. ШИМ двигателей реализован программным путем в процедуре PWM_drive. Программная реализация ШИМ позволяет подключать двигатели к любым свободным линиям ввода-вывода. В данном случае это линии 2 и 5 порта D. Параметры ШИМ состоят из трех значений (массив sMotors в ОЗУ). Младшие два байта отвечают за коэффициенты заполнения ШИМ правого и левого каналов, а старший байт используется как регистр сравнения. Значение регистра сравнения циклически изменяется от 0 до 255 с шагом 1. Если значение левого или правого коэффициентов ШИМ меньше (больше) регистра сравнения, то в линию порта D, подключенную к соответствующему двигателю, выводится высокий (низкий) логический уровень напряжения.

Ну а далее управление реализуется согласной выбранному закону регулирования (релейный, П, ПД, ПИД) – все данные готовы. Целью в данном случае было реализовать не сам алгоритм управления, а предоставить обучающемуся набор базовых функций, которые в дальнейшем упростят решение типичных задач (в данном случае движение по линии и объезд препятствий). Приведу видео прохождения трассы (взята с одной из тем на Roboforum'e) с П-регулятором. Скорость установлена небольшая чтобы робот не улетел со стола :) В дальнейшем можно реализовать ПД-регулятор (интегральная составляющая тут не столь необходима) и проводить тесты на скорость :)

Кроме того была разработана подпрограмма отладки, позволяющая протестировать работу стенда. При запуске кнопками выбирается режим: отладка или старт. При отладке робот можно тестировать по UART'у или Bluetooth (что удобнее). Процедура отладки парсит (разбирает) команду и выполняет ее. Для упрощения работы на компьютере с символьными командами (в ASCII) была написана программа на Delphi. Программа преобразует каждый ASCII символ в HEX-код и отправляет его по последовательному интерфейсу в контроллер, а числа в HEX-коде она отправляет как есть (только 0x вначале убирается). Скриншоты ниже.

Список поддерживаемых команд с их подробным описанием приведен ниже.

  • I_X – чтение содержимого регистра ввода-вывода. Здесь X адрес регистра, заданный 2-х байтным словом.
  • O_X_Y – запись заданного значения в регистр ввода-вывода. Здесь X адрес регистра, заданным 2-х байтным словом, а Y – 8-битное значение, выводимое в регистр.
  • M[L|R]_X – запись в коэффициент заполнения ШИМ левого или правого каналов 8-битного значения X. После ввода команды разрешается прерывание от таймера и запускается процедура ШИМ двигателей. Затем контроллер ожидает ввода новой команды. После ввода команды прерывание от таймера будет запрещено, если команда отлична от описываемой или введена с ошибкой. Но при этом значение коэффициентов в ОЗУ не будет обновлено, что позволяет запускать два двигателя одновременно.
  • R – чтение коэффициентов регулятора P, I, D и PWM Base из памяти ЭСППЗУ (EEPROM).
  • R[P|I|D|B]_X – запись в соответствующий коэффициент регулятора в памяти ЭСППЗУ (EEPROM) 8-битного значения X.
  • C – последовательный вывод калибровочных значений для всех элементов датчика линии с 1 по 7.
  • C[1-7]_X –запись 8-битного калибровочного значения X для соответствующего элемента датчика линии, номер которого задан числом от 1 до 7.
  • S – последовательный вывод показаний датчика линии (в шестнадцатеричном виде). Также выводится текущая позиция робота, рассчитанная по показаниям датчика линии.
  • D – вывод показаний датчика препятствия (в шестнадцатеричном виде). Показания состоят из младшего и старшего байтов. Расстояние до препятствия выводится в мм.
  • H – вывод справки по командам.
  • E – выход из режима отладки.

Перечисленные выше команды позволяют настраивать коэффициенты регулятора и калибровочные значения датчиков, выводить текущие показания датчиков, проверять работу двигателей, а также управлять движением робота вручную. Возврат из режима отладки осуществляется в область программы, которая начинается со считывания констант из ЭСППЗУ (EEPROM). Это позволяет при обновлении коэффициентов регулятора, сразу обновить и их значения в ОЗУ (SRAM), используемые при расчетах.

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

Поделиться
Понравился материал?

Комментарии

Добавить комментарий