Робот!.. Просыпайся…

 | 15.54

Äłᐨʢ align=»justify»>

В далеком 1999-м я впервые познакомился с ПК, когда пошел в компьютерный кружок. К лету 2000 года я и сосед обзавелись «четверками», а к осени апгрейднули их до «пеньков». Соседу повезло больше, чем мне — не только в плане тактовой частоты приобретенного «тазика», а еще и тем, что в комплекте шел 4x CD-ROM! И, естественно, несколько компактов с программами — в основном игрового назначения.

Мой Компьютер, №14 (518), 25.08.2008

Для начала проще сделать робот на колесах. Например, использовать платформу (назовем её машинкой) от производительных ребят с надписью «Made in China». Запасаемся таким набором элементов: резисторы, конденсаторы, кварц, микроконтроллер, драйвер двигателей (желательно), светодиоды, кренки (стабилизаторы напряжения), кнопки и провода. Необходима плата, на которой будут располагаться элементы. Травление платы в домашних условиях (весьма вредное занятие) можно оставить для истории, существует множество различных монтажных плат, специально созданных для подобных целей. И собственно паяльник с оловом и припоем. Иногда к подобным наборам дописывают наличие «прямых рук», но с этим каждый разберется сам. Поскольку все перечисленное найти дома не то чтобы трудно, а скорее всего, просто невозможно, идем в магазин радиоэлектроники или на пресловутые рынки, а при отсутствии таковых (или нежелании) идем в интернет-магазин. Если заказать через Интернет с оплатой услуг почтовой доставки, есть возможность заплатить меньше; правда, в подобных магазинах может существовать определенная минимальная сумма заказа.

Далее, чтобы войти в курс дела, можно посетить страничку http://myrobot.ru/stepbystep. Начинающие подкрепят свой пытливый разум, да и другие найдут полезное. На этом сайте, как и на многих других (включая их форумы), встречаются примеры на СИ (а куда пропал язык Ассемблер?). Если заглянуть на русскую версию сайта фирмы-производителя микроконтроллеров, по ссылке http://atmel.ru/Articles/Atmel11.htm прочтем «Справку по Ассемблеру для AVR» — рекомендую. Если кому мало — Гуглим себе на здоровье. Без затруднений можно найти и скачать русскоязычные книги, посвященные этой тематике.

Роботы как они есть

Рис. 1

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

На рис. 2 (плата) и рис. 3 (исполнительные механизмы) в виде схем нарисован весь робот.

Главная деталь (самая большая с 28-ю контактами) — микросхема ATmega8-16PU (Мега8), это и есть микроконтроллер (МК), для которого мы напишем программу и при помощи 10-контактного разъема и программатора запрограммируем. Число 8 в маркировке — количество памяти в килобайтах, 16 означает максимальную частоту кварцевого резонатора, который можно использовать (частота есть — значит, можно её увеличить, позаботиться об охлаждении и оверклочить для удовольствия), PU — энергопотребление и вид корпуса.

Мега8 — это представитель большой линейки 8-разрядных высокопроизводительных RISC (Reduced Instruction Set Computers) микроконтроллеров общего назначения, объединенных общей маркой AVR, серийно выпускаемых с 1996 года корпорацией Atmel (atmel.com).

Рис. 2

Как у каждой программы есть справка (Help), так и у каждого МК есть свой даташит (Datasheet). Программ много, они все разные, но всегда есть что-то общее; ситуация с МК такая же. Есть МК, у которых более 100 ног ввода/вывода, кучи встроенных таймеров, счетчиков, АЦП и еще много страшных слов; ограничить возможности применения подобных МК можно только собственной фантазией. У нашей Меги8 всего 28 ног, и то, как мы видим, половина не задействована.

Рис. 3

Микросхема на рис. 2 поменьше (с 16-ю контактами) — это драйвер двигателей, он будет управлять моторами. Правда, только двумя, чего для нашей цели достаточно. Ножка, подписанная Vss, — это питание микросхемы, а есть Vs, на которую нужно подавать питание, необходимое для двигателей. Просьба не перепутать.

Под микросхемы советую раздобыть «кроватки», чтоб при паянии не испортить ценные детали, и в дальнейшем оставить возможность без больших усилий заменить одну микросхему на другую. И не путайтесь в нумерации! Обычно на микросхемах и на разъемах возле первой ноги присутствует кружочек или треугольник, т.е. обозначения всегда есть — главное знать, как они выглядят.

Рис. 4

Трехногая деталь (рис. 4) с маркировкой «78L05» называется кренкой, а по-простому стабилизатор (или ограничитель) напряжения, деталь будет при поступающих 6 В (хотя выдерживает и больше) выдавать ровно 5 В, которые необходимы для питания микросхем. Если повезет и найдутся пятивольтовые двигатели, деталь не нужна, и в этом случае провода, идущие на ножку 1 и 3 соединяем между собой, а который на 2-ю — оставляем в сторонке. Если двигатели потребляют меньше 5 В, также необходимо позаботиться о раздельном питании.

Присутствует такой элемент, как кварц (Cr1), он 8-ми мегагерцовый и используется для более точного тактирования МК. Да, конечно же, существует подобный и внутренний, будем учиться работать с обоими — а научившись, будете использовать нужный в зависимости от поставленных целей.

Остальные детали: резисторы (можно использовать в пределах 200-300 Ом) необходимы для того, чтоб не сгорели светодиоды. Конденсаторы: 1000mF — электролитический конденсатор на 1000 микрофарад, М15 — это керамический на 0.15 микрофарад, и 22 (без каких-либо букв) — конденсатор на 22 пикофарад. Они необходимы из-за сильно шумящих (создающих электрические помехи во всей цепи питания) работающих двигателей, которые при включении «тянут на себя одеяло», т.е. создают нежелательные скачки. Короче, конденсаторы нужны для правильной и безотказной работы. Элементы с двумя стрелками (показывающие в сторону от детали — значит, что-то излучают, в данном случае свет) — это светодиоды, они хоть и лампочки, но плюс с минусом путать не советую (для нахождения +/– попробуйте последовательно соединить две пальчиковые батарейки и смотреть, при каком подключении засветится). Соответственно прямоугольники с черными точками — это разъемы (добросовестно выпаянные с того же факс-модема). Можно обойтись без них, но по собственному опыту могу отметить, что с ними намного удобнее.

На рис. 3 элементы, подписанные М1 и М2. Думаю, вы уже догадались, что это двигатели. Один из них вращает заднюю ось, другой поворачивает, но возможен вариант, при котором каждый двигатель отвечает за свою сторону (как у танков), разница только в логике управления и радиусе разворота. К каждому двигателю подключен конденсатор и не подписан (их туда припаяли до меня), где-то было написано — нужны для того, чтоб движки не искрили (приблизительно 0.15 микрофарад, думаю, будет достаточно). S1 и S2 — кнопки, они же датчики, они же усики, заземлены через резистор минус к отсеку батареек. Батарейки, отмеченные Bat1-Bat4, дают необходимое питание в объеме 6 В. Светодиоды (рис. 3) используются как подобие габаритных огней у автомобилей.

Робот и его программа

На чистом харде и наши компьютеры работать не будут; конечно же, нужен софт, и всегда желательно наличие фриварности и возможности бесплатно скачать.

Я знаю только две программы, которые подходят под такие требования, а именно: WinAVR и AVRStudio. По набору возможностей программы очень похожи, но и различий хватает, у каждой есть свои плюсы и минусы. В обоих писать можно как на С так и на языке Ассемблер. Я объяснять буду на примере AVRStudio, но если вам не понравится, пробуйте с WinAVR.

Открываем свой любимый браузер и скачиваем AVRStudio по ссылке http://atmel.com/dyn/resources/prod_documents/AVRStudio4.13SP2.exe (размер 45 Мб). В Интернете можно найти инструкцию по пользованию программой на русском языке. Желательно в названиях каталогов (папок, директорий) кириллицу не употреблять (во избежание предупреждений и ошибок). Надеюсь, с установкой проблем не возникло — запускаем.

Создаем новый проект, если сразу помощник сам не запустился, жмем меню Project/Project Wizard. В появившемся окне давим кнопку New Project, выбираем тип проекта Atmel AVR Assembler. Вписываем имя проекта, например, Led_on_PD0, выбираем путь (также желательно поближе к корню и на латыни), ставим галочку Create folder, жмем Next>, выбираем среду — отладчик, нам подходит AVR Simulator, в правом списке выбираем ATmega8 и жмем на Finish.

Мы создали новый проект, и в открывшемся файле проекта, который будет называться Led_on_PD0.asm, вводим текст программы на языке Ассемблер. Конечно, можно писать на С, но на Ассемблере вы лучше поймете, как работает микроконтроллер. Основные используемые команды для большинства МК семейства AVR одинаковы, а полный набор поддерживаемых команд содержится в даташите. Используя язык Ассемблер, можно с большой точностью посчитать затрачиваемое время на выполнение любого куска кода. Итак, код программы должен выглядеть следующим образом:

.include «m8def.inc»

;подключение библиотеки на Мегу8

.def temp=r16

.def temp1=r17

.def temp2=r18

;создание констант, по-простому — переопределение имен регистров

.org 0x000 rjmp init

;прерывание происходит при сбрасывании RESET

.org 0x012 rjmp timer_0

;при переполнении счетчика таймера попадаем в подпрограмму обработки

;прерывание по переполнению таймера/счетчика0

timer_0:

push temp

;помещение содержимого регистра в стек

ldi temp,0x00

;остановка счетчика

out TCCR0,temp

SET

;установка флага T в регисте SREG

pop temp

;извлечение из стека в регистр

Reti

;Возврат из прерывания

;инициализация

init:

;настройку портов ввода/вывода — можно сравнить с объявлением необходимых переменных

;настройка порта B на выход

ldi temp,0b11111111

out DDRB,temp

ldi temp,0b00000000

out PORTB,temp

;точно так же для портов C и D

;Настройка стека

ldi temp,0x04

out sph,temp

ldi temp,0x5f

out spl,temp

;настройка таймера/счетчика 0

ldi temp,0b00000001

;Разрешаем прерывание

out TIMSK,temp

;установкой «1» в разряд TOIE0

SEI

;Общее разрешение прерываний

;главная программа

Main:

sbi portd,0

;включили LED1

rcall time_1s

;вызвали подпрограмму, которая создает задержку в 1 с.

rcall led_10

;вызвали подпрограмму, которая моргает светодиодом LED1

cbi portd,0

;выключили LED1

rcall time_1s

rcall led_10

rjmp Main

;так создается бесконечный цикл

Далее необходимо написать подпрограммы, которые мы уже вызывали: timer_1s — задержка работающая при помощи внешнего кварца, led_10 — подпрограмма, в которой мы будем управлять морганием светодиода LED1 и в которой вызывается подпрограмма timer_100 — задержка, работающая от внутреннего тактирования. Полный листинг программы указан ссылкой в конце статьи.

Если писали (набирали) программу вручную, и если вы еще нормальный человек — опечатки неизбежны. Вот тут и пригодится достаточно мощный отладчик, встроенный в программу. Жмем F7 и смотрим, что нам сообщают. Все стандартно: красный кружочек — сообщение об ошибке (таких сообщений по одному на каждую ошибку). Читаем-находим-исправляем. Когда мы увидим зеленый кружочек с текстом «Assembly complete 0 errors. 0 warnings» — все хорошо и необходимый нам hex-файл создан.

Кому интересно, жмем Ctrl+F7, так мы запускаем отладчик, и для начала в пошаговом режиме (F11) наблюдаем за работой написанной нами программы. Чтоб видеть изменения, находим вкладку I/O View и, клацая мышкой по плюсам, открываем I/O ATMEGA8, а там TIMER_COUNTER_0, PORTD и CPU, где есть регистр SREG с флагом T (второй квадратик слева), который используется для определения переполнения внутреннего таймера/счетчика. По ходу вашего нажатия на F11 (или клацанья мышкой по соответствующей кнопке) квадратики (они же собственно биты) будут оставаться пустыми или окрашиваться в черный цвет. Клацать там можно по-разному — и до курсора, и до точки останова, и пропуская циклы. Поначалу будет казаться, что программа зависла, а на самом деле она проходит такт за тактом конкретную подпрограмму и терпеливо подсчитывает пройденные доли секунд. Но если вы умудрились наклацать, или надоело ждать, или не знаете, как выключить (попробуйте Ctrl+Shift+F5), открывайте диспетчер задач и, выделив строку AVRStudio.exe, нажимайте Deletе и затем Enter. Когда вдоволь напрактикуетесь, шагнем дальше.

Железное программирование

Рис. 5

Для того, чтоб все крутилось-моргало-жужжало, необходимо запрограммировать МК; как уже писалось выше, нужен программатор (рис. 5).

Самый простой программатор состоит из нескольких резисторов и проводов, с одной стороны подключается разъемом к параллельному LPT-порту, с другой — к десятиконтактному ISP-разъему на плате. Провод лучше делать как можно короче (сантиметров 20), иначе возможно возникновение проблем и ошибок, а со временем можно спаять себе USB-программатор.

Одной из популярных программ по прошивкам является PonyProg (LancOS.com). Интерфейс английский, но есть умельцы, которые перевели на русский, при желании можно найти.

Программа поддерживает работу с большим количеством МК, нам необходимо в первом выпадающем списке выбрать AVR micro, во втором — ATmaga8. Потом выбираем пункт меню Setup/Interface Setup…. В появившемся окне переключаем на параллельный с режимом Avr ISP I/O и соответственно LPT1, жмем на кнопку Probe. Если вы не увидели сообщения об успешном завершении теста, значит, забыли присоединить программатор к LPT, еще возможен вариант с неправильной настройкой порта в BIOS-е, или хорошая защита компьютера не дает программе обращаться к порту.

В BIOS-е посоветую включить стандартные настройки, при них обычно порт включен, прерывания разрешены и LPT работает в нормальном режиме. Если еще «Test ok» не видать, проверяем антивирус (вдруг он пожадничал и заблокировал нам доступ), а также файерволл, можно все лишнее отключить и еще попробовать, иначе открываем Help и вспоминаем (а кто-то изучает) английский.

Если тест пройден успешно, переходим к пункту меню Command/Configuration and Security bits и выставляем нужные биты, это необходимо для правильного тактирования МК (т.е. чтоб секунда была секундой, а не увеличивалась/уменьшалась в десятки раз).

Рис. 6

Если кому интересно, нажмите кнопку Read и посмотрите, где стоят флажки. Из тех флажков, которые нам доверяют изменить, включаем только CKSEL3, CKSEL1 и CKSEL0, остальные флажки убираем и жмем на кнопку Write. Далее открываем скомпилированный hex-файл, залезая в меню File/Open Deviсe File…, ищем и открываем файл Led_on_PD0.hex, и в окне видим шестнадцатиразрядные числа. Далее для программирования — меню Command/Write All — и происходящее напоминает запись болванки, только намного быстрее. Все!

Отсоединяем плату от программатора и с улыбкой на лице (не исключен детский восторг) наблюдаем, как моргает светодиод. Поздравляю!

Интересно будет увидеть в Беседке фотографии того, что получилось у вас. У меня получилось так (рис. 6).

И на десерт добавлю: схемы, пример готового проекта Led_on_PD0 для AVR Studio — всё это можно скачать по адресу http://jarcom.at.ua/load/1-1-0-17. Увидите обещанный полный листинг программы (Led_on_PD0.asm). Также, скачав архив, вы найдете там файл Dir_motor.asm; когда он будет зашит в МК, заработают двигатели, и робот начнет реагировать на нажатие кнопок (все те же датчики-усики). Настоятельно рекомендую предусмотреть возможность отключать двигатели на момент программирования, иначе уедет вместе с проводами :-).

JaRcom

Robo User
Web-droid editor

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *