Политехнический музей
В.Э.Карпов, Т.А. Волкова, М.В. Платонова
Мобильные минироботы
Часть II
Знакомство с микроконтроллерами и интегральной схемотехникой
Методические материалы
по проведению занятий со школьниками
Москва 2009
УДК 621.865.8
ББК 32.816
Одобрено Научно-методическим Советом Политехнического музея по представлению Мироновой В.А. - заведующей научно-учебной лабораторией Робототехники и искусственного интеллекта Политехнического музея.
Карпов В.Э., Волкова Т.А., Платонова М.В. Мобильные минироботы. Ч.2. Знакомство с микроконтроллерами и интегральной схемотехникой: метод. материалы по проведению занятий со школьниками / Политехн.музей. –М., 2009. – 64 с.
Методические материалы содержат сведения теоретического и практического характера, необходимые учащимся для создания простого робота с микропроцессорной системой управления. Рассматриваемый курс является продолжением вводного цикла занятий «Знакомство с автоматикой и электроникой». Пособие рассчитано на преподавателей робототехнических курсов и кружков.
УДК 621.865.8
ББК 32.816
ISBN 978-5-98962-018-3
Ó Политехнический музей, 2009
Содержание
Лекция 1. Что такое микроконтроллер
4. Входы и выходы микроконтроллера
6. Аналоговые и цифровые системы управления
7. Примеры роботов с микроконтроллерами
Лекция 2. Новая элементная база
4. Конденсатор в электрической цепи
4. Управление двигателями при помощи L293D
5. Простой робот, движущийся по линии
2. Компиляция и загрузка программы в память ОЭВМ
3. Устройство простейшей программы
Лабораторная работа 1. Среда программирования. Программатор
Лабораторная работа 2. Линейные операторы. Порты
Лабораторная работа 3. Функция задержки
Лабораторная работа 5. Макроподстановки
Лабораторная работа 6. Условный оператор и опрос датчиков
Лабораторная работа 7. Функции
Лабораторная работа 8. Основная программа
Приложение 1. Технические сведения
Схема стабилизатора напряжения
Список деталей для контроллера
Разъем для подключения к UART контроллера
Разъем для внутрисхемного программатора
Данные методические материалы предназначены для преподавателей робототехнических курсов. В них излагается порядок и примерное содержание лекционного материала, который должны усвоить обучаемые, а также приведено описание ряда практических занятий.
Курс является продолжением вводного робототехнического курса. В ходе обучения учащимся предстоит изготовить полноценного мобильного миниробота, управляемого микроконтроллером. Робот оснащается набором датчиков и далее с помощью программирования на языке высокого уровня Си эта робот ориентируется на решение некоторых простых задач из области спортивной робототехники.
Этот курс учит азам программирования, знакомит с архитектурой микроконтроллеров, спецификой их программирования. Обучение программированию ориентировано на написание простых управляющих программ для микроконтроллера и далее заканчивается решением практической задачи управления роботом, ищущим полосу. Кроме того, в рамках курса рассказывается о перспективах развития возможностей как созданного робота, так и робототехники и микропроцессорной техники в целом, о том, какого уровня программы можно создать на микроконтроллерной базе.
Курс рассчитан на 12 занятий и предназначен для детей от 12 лет и выше.
Отличие создаваемого в этом курсе робота от предыдущего состоит в том, что его основой являются интегральные схемы, а система управления роботом построена на основе микроконтроллера.
Для создания такого робота требуется изучить познакомиться с такими разделами, как:
• интегральные микросхемы и архитектура микроконтроллера;
• новые практические навыки (например, обжимка проводов и работа с SMD-компонентами);
• обучение программированию на языке Си и разработка алгоритмов, позволяющих реализовывать гибкое и разнообразное поведение робота.
Представьте себе, что все транзисторы и резисторы уменьшили во много раз, объединили в кристалл из кремния и поместили в маленький пластмассовый корпус:
Рис.1.1. Микросхема
То, что получится в результате, называется интегральной микросхемой. Пока мы не будем останавливаться на том, как они устроены внутри. Сейчас нам важнее знать, как их использовать. Обычно на микросхемы существует подробная документация, объясняющая, что делает микросхема, как её правильно подключать и использовать, поэтому очень важно уметь читать подобного рода техническую документацию.
Основной управляющей схемой, «мозгом» создаваемого робота является микроконтроллер.
Микроконтроллер – это компьютер на одной микросхеме. Он предназначен для управления различными электронными устройствами. Микроконтроллеры можно встретить во многих современных приборах, таких, как телефоны, стиральные машины и т. п.
Рис.2.1. Однокристальная микроЭВМ
Внутри такой микросхемы реализованы такие компоненты, как
• арифметико-логическое устройство;
• система управления;
• FLASH-память;
• счетчики, таймеры и прочие схемы;
• порты для связи с внешними устройствами;
и многое другое
Обратите внимание на то, что микроконтроллер - это самый настоящий маленький компьютер. Внутри микроконтроллера есть процессор и периферийные устройства: FLASH-память, таймеры, интерфейсы для связи с внешними устройствами и множество других полезных схем. На нём удобно учиться программировать и изучать устройство компьютера.
Мы будем использовать микроконтроллер фирмы ATMEL, который называется ATMega8. В наших схемах он работает на тактовой частоте 7 МГц и обладает памятью в 8 килобайт. Немного, но для простых программ более чем достаточно.
Микроконтроллер действует по заданной программе, которая загружается в него извне. Программа в нашем курсе будет писаться на персональной ЭВМ на языке высокого уровня Си, а затем эта программа должна быть загружена в микроконтроллер.
Рис.3.1. Написание программы и загрузка в микроконтроллер
Использование микроконтроллера бывает гораздо удобнее схем, построенных на дискретных элементах. Во-первых, микроконтроллер обычно компактный и сравнительно дешёвый. Во-вторых, его можно запрограммировать для решения самых разнообразных задач. В нашем курсе программа для микроконтроллера пишется на «большой» машине, а затем она загружается с помощью программатора (в простейшем виде – это специальный кабель) в микроконтроллер.
Напомним, что у робота есть органы для взаимодействия с окружающей средой. Органы, которые получают информацию из окружающей среды, называются рецепторами (или датчиками), например, фототранзистор, микрофон, контактный датчик (кнопка). А органы, которые воздействуют на окружающую среду – эффекторы: двигатели, динамики, светодиоды и проч.
У микроконтроллера есть некоторое количество входов и выходов. К входам мы можем присоединить рецепторы, а к выходам эффекторы. Микроконтроллер может обрабатывать информацию с входов и создавать электрические сигналы на выходах в соответствии с тем, как мы запрограммируем поведение робота.
Рис.4.1. Необходимые роботу эффекторы и рецепторы
Конечно, подключение датчиков и эффекторов (периферии) к микроконтроллеру – не такое простое дело. Сделать это «напрямую», так, как показано на рисунке, обычно не получается. Для подключения периферии используются дополнительные схемы, с некоторыми из которых мы познакомимся позже.
В этом курсе нам придется познакомиться и с некоторыми новыми видами элементов: интегральными микросхемами, стабилизаторами, конденсаторами, SMD-компонентами.
Стабилизаторы SMD-компоненты Конденсаторы
Рис.5.1. Некоторые новые элементы
Интегральные микросхемы
Стремление к миниатюризации схем (во-первых, малые размеры – это удобно с конструктивной точки зрения, во-вторых – это уменьшение потребляемой мощности) привело сначала к появлению микросборок и гибридных схем, а затем – интегральных микросхем.
Рис. 5.2. Интегральные микросхемы
В нашем курсе будут использоваться три микросхемы – однокристальная микроЭВМ ATMega8, стабилизатор напряжения КР142ЕН5 и драйвер двигателя L293D.
Сравним две системы – роботов с аналоговым и цифровым управлением.
Рис.6.1. Схема с аналоговой системой управления
Рис.6.2. Схема с системой управления на основе микроконтроллера
Внешне они весьма похожи. Разве что плата микроконтроллера выглядит более сложно. Однако эти системы имеют принципиальнейшие различия.
Робот на дискретных элементах. Этот робот хорошо ездит по линии, но чтобы заставить его делать еще что-нибудь, нужно придумать другую схему и спаять ему новую плату.
Робот с микроконтроллером. Этот робот обладает большей гибкостью. Его поведение не заложено жестко в схеме управления. Для решения новой задачи не нужно перепаивать схему, а можно перепрограммировать микроконтроллер.
Можно легко «научить» робота реагировать на свет и препятствия, искать темную или светлую линию, играть в кегельринг или в робо-сумо. Здесь все зависит от умения программировать (и, разумеется, от того, какими датчиками и исполнительными механизмами оснащен робот).
Рис.6.3. Гибкость микроконтроллерной системы управления
Подавляющее большинство роботов (особенно – мобильные минироботы) построено на базе микроконтроллеров. Причем зачастую очень разнообразные внешне конструкции используют весьма похожие, универсальные контроллеры.
Рис.7.1. Разнообразные роботы, построенные на сходной элементной базе
Рис.7.2. Исследовательский
робот «Зенон», предназначенный
для изучения моделей поведения
Рис.7.3. Исследовательский робот «ПЛУТ-3» с антропоморфной системой управления манипулятором
Рис.7.4. Система управления робота «ПЛУТ-3»
Рис.7.5. Исследовательский прототип шагающего шестиногого робота
В рамках настоящего курса предстоит изготовить простого робота, решающего ту же задачу, что и в предыдущем курсе – задачу движения по полосе. Только робот этот будет управляться микроконтроллером.
Один из таких роботов изображен на рис. 8.1. Разумеется, создаваемые роботы могут отличаться от этого. Здесь все зависит от имеющейся элементной базы и фантазии робототехника.
Рис.8.1. Робот, управляемый
микроконтроллером и
решающий задачу движения по полосе
Для создания подобного робота предстоит:
· Изучить основы архитектуры микроконтроллеров и микроЭВМ
· Изготовить контроллер робота
· Научиться азам программирования на языке Си (для этого предстоит выполнить ряд лабораторных работ по программированию)
· Изготовить ходовую часть робота, датчики и т.п.
Дополнительными задачами (для тех, кто все успеет сделать) могут быть задачи поиска света, объезда препятствий, реализация связи с внешней ЭВМ по последовательному интерфейсу RS232, работа с АЦП и т.д.
Резистор (повторение пройденного); маркировка резисторов, кратные приставки; конденсатор; микроконтроллер.
Вспомним закон Ома:
Или , причем ток измеряется в Амперах (А), напряжение – в Вольтах (В), а сопротивление – в Омах (Ом).
Обычно резисторы (или сопротивления) применяются для того, чтобы уменьшить ток, проходящий через цепь. Чем больше его сопротивление, тем меньше потечет ток через цепь, в которую он включен. Уменьшать ток необходимо для того, чтобы, например, не сжечь элементы (те же светодиоды).
Рис.1.1. Включение диода и ограничивающего резистора
Итак, основной характеристикой резистора является его сопротивление, которое измеряется в Омах.
Ниже приведена таблица кратных приставок. Они образуют из некоторой базовой величины (метр, грамм, байт, герц и т.д.) новую величину, которая больше или меньше базовой во сколько-то раз. Во сколько - об этом нам как раз и скажет кратная приставка. Обратите внимание, что некоторые приставки пишутся с большой буквы, некоторые - с маленькой.
1 000 000 000 (109) |
Г |
гига |
1 000 000 (106) |
М |
мега |
1 000 (103) |
К |
кило |
|
|
|
0.001 (10-3) |
м |
милли |
0.000 001 (10-6) |
мк |
микро |
0.000 000 001 (10-9) |
н |
нано |
0.000 000 000 001 (10-12) |
п |
пико |
«Микро» и «пико» ещё обозначают греческими буквами μ (мю) и π (пи).
Резисторы изготавливаются в разных корпусах. В нашем курсе мы будем работать с SMD-корпусами.
Рис.1.2. «Обычный» резистор с цветовой маркировкой
Рис.1.3. SMD-резисторы
Элементы в SMD-корпусах припаиваются непосредственно к дорожкам на плате. Они маленькие, поэтому для их монтажа нужен пинцет.
Рис.2.1. SMD-компоненты
Маркировка - это условные обозначения, наносимые на корпус детали, по которым мы можем узнать о некоторых её свойствах. Маркировка резистора может сказать нам о самом главном его свойстве - сопротивлении.
Первые 2 цифры – это некоторое число, а последняя цифра – это количество нолей, которое нужно дописать после числа (или степень 10). Строго говоря, это степень десятки, на которую нужно умножить число.
Например:
Конденсатор обычно устроен так: две металлические пластины (обкладки) разделяет диэлектрик (вещество, не пропускающее электрический ток). От расстояния между пластинами и материала диэлектрика зависит емкость конденсатора.
Рис.3.1. Конденсатор
Конденсатор обладает свойством накапливать и сохранять электрическую энергию. Если вы подключите конденсатор к батарейке на некоторое время и потом отключите, то на его выводах мультиметр покажет напряжение, равное напряжению батарейки. Со временем напряжение на выводах конденсатора будет уменьшаться и, в конце концов, он полностью разрядится из-за своего внутреннего сопротивления.
Один из первых в истории конденсаторов был создан голландскими учёными в городе Лейден. Конденсатор представлял собой стеклянную банку, стенки которой были снаружи и внутри обклеены фольгой. Электричество для зарядки банки в то время получали с помощью трения. Внутри банки собирались положительно заряженные частицы, а снаружи – отрицательные. Такая банка могла накапливать электрический заряд.
Рис.3.2. Лейденская банка
Проводились разные эксперименты с лейденской банкой. Некоторые из них приводили к сильному удару током и закончились плачевно для участников.
Лейденские банки вызвали большой интерес не только в научной среде. Говорят, что французский король Людовик XV однажды приказал 180 мушкетерам взяться за руки, а затем первому и последнему коснуться заряженной лейденской банки. При электрическом разряде все они высоко подпрыгнули, что очень позабавило короля. Потом этот же опыт повторили 700 монахов. Затем электрический заряд из банки пропустили через тело воробья и мыши – и они погибли.
Рис.3.3. Эксперименты с Лейденской банкой
Лейденскую банку можно изготовить в домашних условиях, но следует помнить, что электричества, скапливающегося в ней, достаточно, чтобы нанести опасный и болезненный удар током.
Для понимания принципов работы конденсатора можно предложить аналогию с водой. Представим, что электрический ток – это вода, источник тока – кран, конденсатор – пустое ведро, а напряжение на конденсаторе – уровень воды в ведре. Когда мы открываем кран (подключаем источник тока), вода (ток) начинает заполнять ведро (заряжать конденсатор) и уровень воды (напряжение). Но как только ведро наполнено (конденсатор заряжен), уровень воды расти не может (напряжение достигает максимума), и вода переливается через край (ток не идёт через конденсатор). Почему ток перестаёт идти через конденсатор? Потому что для прохождения тока нужна разность электрических потенциалов между точками цепи. А так как напряжение на конденсаторе стало равно напряжению источника тока, разность исчезла, и ток идти перестал. После отключения источника тока, конденсатор начинает разряжаться – как ведро с маленьким отверстием, через которое вся вода уходит.
Рис.3.4. Процессы заряда и разряда конденсатора
Итак, конденсатор обладает свойством накапливать электрическую энергию. Ниже приведены иллюстрации простых опытов с конденсатором. Оставим их без комментариев.
Рис.3.5. Эксперименты с зарядом конденсатора
Рис.3.6. Различные виды конденсаторов
Конденсаторы делают из разных материалов, но нас больше всего интересуют электролитические и керамические. Керамические конденсаторы можно включать в цепь как угодно. Электролитические же имеют полярность. Минус у таких конденсаторов обозначается либо полосой сбоку, либо явным указанием на корпусе.
Внимание! Несоблюдение полярности включения конденсатора приводит к неприятностям и может повлечь за собой взрыв конденсатора.
Единица измерения ёмкости конденсатора – Фарада (F). Это очень большая величина. Такие конденсаторы в технике используются редко. В нашей схеме мы будем использовать конденсаторы ёмкостью 0,1 микрофарад (мкФ), 4,7мкФ и 15 пикофарад (пФ). Посчитайте сами, сколько это.
К сожалению, на SMD-конденсаторах номинал не пишется, в отличие от резисторов. Номинал нужно смотреть на упаковке или разбираться во внешнем виде конденсатора.
В нашей схеме конденсаторы используются для того, чтобы сгладить броски напряжения питания. Эти броски (или помехи) возникают довольно часто, особенно тогда, когда в схеме имеется электродвигатель. Помехи могут не только приводить к сбоям в работе схем, но даже и к выходу их из строя. Посмотрим на следующем примере, как конденсатор сглаживает такие помехи.
Есть такое устройство – выпрямитель. Задача выпрямителя состоит в том, чтобы преобразовать переменное напряжение в постоянное. В состав выпрямителя входит диодный мост. Сравним схему без конденсатора и с ним. На выход мы подаём переменное напряжение. На выходе получаем в первом случае крутые горбы. Во втором случае перепад между горбами гораздо меньше за счет того, что конденсатор медленно разряжается – это и есть сглаживание. Как видно, напряжение на выходе становится гораздо стабильнее.
Рис.3.7. Конденсатор в выпрямительной цепи
В нашей схеме конденсаторы нужны прежде всего для того, чтобы сгладить броски напряжения питания.
Рис.3.8. Конденсатор в схеме микроконтроллера
Примечание 1. Для фильтрации (сглаживания) бросков напряжения в цепи питания обычно используют пару конденсаторов, включенных параллельно. Один из них - электролитический конденсатор большой емкости (несколько десятков мкФ), другой - маленький, керамический. Дело в том, что электролитический конденсатор в силу своего устройства способен хорошо сглаживать большие, но низкочастотные пульсации (особенности электрохимических процессов в электролите). А высокочастотные импульсы гасятся быстрым керамическим конденсатором малой емкости.
Примечание 2. В схеме нашего контроллера используются конденсаторы трех видов: электролитические 22 мкФ (для питания), керамические 0.1 мкФ (питание и обвязка драйвера последовательного интерфейса MAX202), а также керамические по 15 пФ для обвязки кварцевого резонатора.
Схема, которую мы собираем в этом курсе называется контроллером (по-русски – управляющее устройство).
Основной частью нашего контроллера является однокристальная ЭВМ – маленький компьютер. «Однокристальный» означает, что все его компоненты находятся на одном кристалле кремния, внутри пластикового корпуса.
Рис.1.1. Контроллер робота на основе микроЭВМ
Напомним, что работает контроллер в соответствии с тем, как мы его запрограммируем. Очевидно, что робот с ОЭВМ обладает большей гибкостью. Его поведение не заложено в схеме раз и навсегда. Для решения новой задачи не нужно придумывать и паять новую схему, а можно придумать новый алгоритм и перепрограммировать ОЭВМ.
Устройство и заложенные принципы построения микроконтроллера называются его архитектурой.
Рис.1.2. Структурная схема микроЭВМ
Арифметико-логическое устройство (АЛУ) – это блок, выполняющий арифметические (сложение, вычитание, умножение, деление и т.д.) и логические (сравнение величин, логические И, ИЛИ и т.д.) операции.
Система управления выбирает из памяти программ коды очередных команд и передает их АЛУ для исполнения.
Последовательный порт позволяет обмениваться данными с внешними устройствами – например, с персональным компьютером.
Порты ввода-вывода позволяют получать цифровой сигнал с датчиков или же формировать сигнал на исполняющие устройства.
Цифровой сигнал означает, что у нас либо есть сигнал, либо нет сигнала – только два состояния. Мы не можем заставить светодиод гореть ярче или тусклее – мы можем заставить его либо гореть, либо не гореть. На цифровой порт мы можем подключить как входы различные датчики, такие как фоторезисторы, переключатели, звуковые датчики, или как выходы светодиоды, электродвигатели, индикаторы. То же самое мы можем подключить и на аналоговый вход. Аналоговый вход даст нам не только информацию о наличии или отсутствии сигнала, но и его значение. Для этого используется особая схема, входящая в состав микроконтроллера – аналого-цифровой преобразователь (АЦП). В нашем случае аналоговый сигнал может принимать значение от 0 до 5 вольт.
Не путайте: однокристальная ЭВМ отличается от микропроцессора тем, что содержит, кроме арифметико-логического устройства, ещё и память, устройства ввода-вывода и другие компоненты, необходимые для полноценной работы.
Желательно понимать разницу между контроллером и однокристальной ЭВМ (микроконтроллером).
Контроллер – это, вообще говоря, некая управляющая схема, обычно - однокристальная ЭВМ (микроконтроллер) с обвязкой. Обвязку мы создаем сами, она разная в зависимости от наших задач. Обычно обвязка состоит из кварца (кварцевого резонатора), конденсаторов, входных и выходных разъёмов, интерфейсов и т.д. Мы можем, например, добавлять индикацию (светодиод), сигнализирующую о включении контроллера. Или, если наше устройство работает с большими токами, в контроллере нужно предусмотреть силовые транзисторы, предохранители и проч.
Контроллеры изготавливаются для разных целей. Бывают контроллеры, специально разработанные для управления двигателями, для приема и передачи сигналов, обработки сигналов от датчиков, для программирования других контроллеров, и многие другие.
Наш контроллер – универсальный, он предназначен для управления малым мобильным роботом. В больших роботах разных контроллеров, связанных между собой – десятки, и каждый за что-то отвечает – например, за руку или пальцы робота (манипулятор и схват), движение головы, обработку сигналов и т.п.
Сейчас почти во всех контроллерах используются микроконтроллеры, которые тоже бывают разными и подбираются в соответствии с задачей (напоминаем, что в этом курсе мы используем микроконтроллер AT Mega8).
Итак, ОЭВМ считывает и выдаёт электрические сигналы. Причем главная особенность ОЭВМ заключается в том, что с помощью заложенной в нее программы происходит обработка и анализ поступающих внешних сигналов (вход) и выработка управляющих сигналов вовне (выход). Входные сигналы формируются разнообразными датчиками, а выходные управляющие сигналы отправляются на внешние исполнительные устройства.
Рис.2.1. ОЭВМ и необходимая периферия
Подытожим нашу терминологию.
Однокристальная ЭВМ – это компьютер, все основные компоненты которого реализованы на одном кристалле (на одной микросхеме).
Микроконтроллер – это однокристальная ЭВМ с периферией в одном корпусе. Иногда таким словом неверно называют однокристальные ЭВМ
Под термином контроллер понимают управляющую схему или систему управления.
Часто контроллер реализован на основе однокристальной ЭВМ.
Контроллер = однокристальная ЭВМ +периферия
Рис.2.2. Различного рода контроллеры
Итак, контроллер включает в себя, помимо ЭВМ, ещё и «обвязку»:
• Кварцевый резонатор
• Разъёмы для подключения устройств
• Конденсаторы
• Другие микросхемы (например, для связи с внешним компьютером)
Рис.2.3. Некоторые элементы обвязки ОЭВМ
Одна и та же однокристальная ЭВМ, как уже говорилось, может использоваться в самых разных контроллерах.
Рис.2.4. Многообразие
роботов, построенных на базе
одного и того же контроллера
Помимо основного элемента - ОЭВМ - контроллер содержит и такие элементы, как кварцевый резонатор («кварц»), стабилизатор напряжения и драйвер двигателей.
Для работы микроконтроллера необходим ритм, или тактирование (как сердце у человека). Для этого применяется кварцевый резонатор (или просто кварц). Задача кварца – формировать электрические импульсы строго определенной частоты. Частота импульсов (количество колебаний в секунду) определяет скорость работы микроконтроллера.
Рис.1.1. Кварцевый резонатор
Частота измеряется в Герцах (Гц, англ. Hz). 1 Гц – это одно колебание в секунду.
1 Гигагерц = 1 000 Мегагерц = 1 000 000 Килогерц = 1 000 000 000 Герц (см. таблицу кратных приставок)
Посчитаем, с какой скоростью будет работать ATMega8, если ее частоту будет задавать кварц с частотой .
Мы нашли период колебания (период – это величина, обратная частоте). За это количество времени ATMega8 с частотой 7.3728Гц будет выполнять один такт.
Такты – это самые простые, элементарные операции процессора, из них составляются команды. Выполнение некоторых команд требует достаточно большого количества тактов.
Для выполнения нашего задания вполне хватит этой частоты, но для решения более сложных задач частоту можно повысить путем использования кварца с большей частотой. Впаивать кварц можно как угодно, он не имеет полярности.
На микроЭВМ нужно подавать постоянное напряжение около 5 вольт. Отклонения от этого напряжения крайне нежелательны - если подавать больше, то микроЭВМ может попросту сгореть, а при недостаточном напряжении откажется работать.
Для того, чтобы получить постоянное напряжение 5 В используется специальная интегральная микросхема – стабилизатор напряжения. В нашей схеме используется стабилизатор КР142ЕН5.
На вход стабилизатора подается напряжение, большее 5 вольт – например, 9 или 12. На выходе стабилизатора появляется 5 вольт. И вход, и выход стабилизатора нужно соединить с «землей» (минусом схемы) конденсатором.
Стабилизаторы обычно сильно нагреваются, поэтому на них ставят радиаторы – металлические пластины для отвода тепла.
Рис.2.2. Радиаторы
Примечание. На самом деле схема будет работать и от источника питания в 4.5 В (обычная квадратная батарея). Контроллер позволяет достаточно вольно обращаться с входным напряжением, лишь бы оно было в диапазоне от 5 (не выше) до 3.5В. Использование стабилизатора - это дань «культуре» производства.
Вспомним нашего первого робота, которого мы делали на 1 курсе. Как происходило управление двигателями робота? Включение двигателя производилось подачей малого (управляющего) тока, который, в свою очередь, регулировался фоторезистором. Этот малый ток усиливался при помощи каскада из двух транзисторов. Ещё раз посмотрим на схему робота и вспомним принцип его работы.
Рис.3.1. Схема аналогового регулятора
Такой робот мог ехать только вперёд, так как мы подавали ток всегда только в одном и том же направлении. А чтобы двигатель поменял направление вращения, нужно поменять полярность – то есть, пустить ток в другом направлении, поменять плюс с минусом. Для этого, увы, придется перепаивать провода, идущие к двигателям.
Рис.3.2. Изменение направления вращения двигателя
Направление вращения меняется, если мы меняем полярность подключения двигателя
Однако существуют электрические схемы, которые позволяют менять полярность подключения тока. Мы можем делать это автоматически – посылая на вход схемы малый управляющий сигнал (например, с ОЭВМ) пустить ток на двигатель в другом направлении.
Схема управления двигателем
Рассмотрим следующую схему. Мы можем менять полярность подключения двигателя, посылая небольшой управляющий ток с микроконтроллера на один из входов – «Влево» или «Вправо».
Рис.3.3. Схема управления двигателем
На рис. 3.3 показана работа этой схемы при подаче сигналов на вход «Влево» и «Вправо»
а) б)
Рис.3.3. Работа схемы при подаче команды «Влево» (а) и «Вправо» (б)
Схема для робота. Схема рассчитана на один двигатель, а у робота их два. Значит, нужно объединить две схемы в одну и разместить на одной плате. Представьте себе, что это будет за плата. Одних транзисторов там будет 8.
Рис.3.4. Схема на 2 канала
Реальная схема будет ещё сложнее – в ней присутствуют диоды (чтобы ток всегда шел в нужном направлении) и резисторы, чтобы ограничить ток, идущий на базу транзистора.
Рис.3.5. Схема управления с защитными диодами
Существуют устройства, реализующие подобного рода схемы – микросхемы, называемые драйверами двигателей. Например, это микросхема L293D. Она преобразует управляющие сигналы малой мощности в токи, достаточные для управления электромоторами.
Упрощенно можно считать, что приведенная выше схема реализована в едином корпусе. На самом деле реальная схема, конечно, значительно сложнее, хотя принцип ее действия примерно такой же.
Рис.4.1. Драйвер двигателей L293
Для каждого из двигателей, подсоединенных к L293D, есть 2 управляющих входа. Мы можем запрограммировать микроЭВМ так, чтобы она выдавала электрические сигналы на эти входы.
Рис.4.2. Принцип управления
Если мы подаём напряжение на один вход, то двигатель вращается в одну сторону, если на другой вход - в другую. Если напряжение подается на оба входа сразу - двигатель блокируется.
Для драйвера двигателей уже предусмотрено место в нашей плате. Стоит учитывать, что эта микросхема также сильно нагревается во время работы. По этой причине средние выводы у неё соединены для лучшего теплоотвода.
И напоследок приведем структурную схему драйвера двигателей.
Рис.4.3. Структурная схема
Самая простая схема с драйвером двигателей – это аналог той схемы, которую мы делали раньше, но с использованием драйвера двигателей (по информации MyRobot.ru). Здесь управляющий ток будет регулироваться фототранзистором (фотодиодом или фоторезистором) и поступать непосредственно на вход драйвера двигателей.
Рис.5.1. Система
управления для робота, движущегося по линии и
его «аналоговый» аналог
Приведем основную схему – контроллер робота, построенный на основе ATMega8 и знакомого нам драйвера двигателей - микросхемы L293D. Если в предыдущей схеме управляющие сигналы от датчиков подключались к драйверу двигателей, то теперь сигналы от датчиков поступают на вход микроЭВМ, которая и посылает сигналы управления на микросхему L293D.
Теперь у нас имеется полноценный контроллер, способный обрабатывать сигналы от множества датчиков и формировать управляющие воздействия.
Очень важным вопросом является способ подключения датчиков. Существует 2 способа определения входных сигналов.
1. Входные порты подтянуты к единице. Контроллер настраивается таким образом, что при отсутствии сигнала на входе («нога висит в воздухе»), на этой висящей ноге устанавливается высокий потенциал («единица»).
2. Входные порты подтянуты к нулю. На висящей ноге устанавливается низкий потенциал («ноль»).
Предлагаемые библиотеки содержат функцию инициализации контроллера, которая подтягивает свободные ноги к единице. Это бывает достаточно удобно, т.к. для подачи сигнала на вход контроллера достаточно соединить нужный вход с землей.
Рис.6.1. Основная схема контроллера робота
Подключение датчиков в случае подтянутых к единице входам изображено на рис.6.2. Подключение контактного датчика достаточно очевидно. Если контакт не замкнут, то входная нога – в воздухе и на ней по умолчанию единица. При замыкании контакта на входе микроконтроллера будет «0».
Рис.6.2. Подключение датчиков к подтянутому к единице входу
В принципе та же ситуация наблюдается и при подключении фотодатчиков (фототранзисторов, фотодиодов и проч.). При малой освещенности сопротивление Фд велико и на входе микроконтроллера остается «1». При уменьшении сопротивления входной потенциал будет снижаться.
Подобного рода схема достаточно груба и иногда работает неустойчиво. Значительно лучших результатов измерения освещенности можно добиться, используя уже знакомую схему эмиттерного повторителя. Выход повторителя может быть подключен, к примеру, ко входу АЦП (в составе ATMega8 имеется 6 АЦП).
Рис.6.3. Схема эмиттерного повторителя
Когда мы впаиваем микросхему или вставляем её в гнездо, важно поместить ее на место правильно. Иначе она может испортиться при включении питания.
Выводы микросхемы в DIP-корпусе нумеруются так, как показано на рисунке. Первый вывод микросхемы обозначается на самом корпусе либо точкой, либо полосой или треугольником, либо выемкой. Эта особая отметка на корпусе микросхемы, определяющая направление нумерации, называется ключом.
Рис.6.4. Нумерация выводов микросхемы
Каждый такт времени, по импульсу от кварцевого резонатора, система управления (СУ) выбирает очередную команду из памяти, выполняет ее, увеличивает счетчик команд на 1 и переходит к следующей команде. Команды могут быть самые различные: взять данные из ячейки памяти, положить данные в ячейку, вычислить арифметическое выражение – например, сложить два числа и т.п. Правда, бывают команды, «нарушающие» естественный порядок выполнения – т.н. управляющие команды, но об этом позже. По большому счету, это основное, что делает компьютер.
Рис.1.1. Основные компоненты ОЭВМ
Значит, чтобы заставить машину делать то, что нам нужно, мы должны объяснить ей: откуда брать данные, что с ними делать, куда потом класть. Причем объяснить подробно, строго, на специальном языке, который понимает машина. Это и называется программированием.
Итак, команды для исполнения машиной должны быть записаны на специальном языке. Языков существует великое множество. Начиная с человеческого, естественного языка (который, разумеется и к большому сожалению, не подходит для общения с машиной) вплоть до искусственных, специально созданных языки высокого и низкого уровней.
Рис.2.1. Языки
В дальнейшем мы будем писать программы на одном из таких искусственных языков – языке программирования высокого уровня, который называется Си.
Предположим, что мы написали некоторую программу на языке Си – некое множество фраз (инструкций), смысл которых пока нас не очень интересует.
Lab.c
/*****************************************************
Программа, которая ничего не делает
*****************************************************/
// Подключение библиотек: сюда вставляется содержимое файла "m8inc.h"
#include "m8inc.h"
//----------------------------------------------------------
// Основная программа
//----------------------------------------------------------
void main(void)
{
// Вызов функции инициализации контроллера
InitCM8();
}
Наша ЭВМ, к сожалению, язык Си не понимает. У нее есть свой внутренний язык, свои собственные команды. Да и в памяти ЭВМ программа выглядит совсем не так, как текст в окне редактора. Эту программу надо для начала перевести на другой, понятный машине язык. Программа-переводчик с одного языка на другой называется компилятором.
Наш компилятор умеет переводить программы, написанные на языке Си, на другой, более машинный язык - язык ассемблера.
Язык ассемблера нужен для того, чтобы «подробнее», понятнее для машины расписать то, что мы написали на более «человеческом» языке Си.
Например, простая инструкция языка Си
TICK_CNT++;
превращается в множество ассемблерных команд
LDS R30,_TICK_CNT
LDS R31,_TICK_CNT+1
ADIW R30,1
STS _TICK_CNT,R30
STS _TICK_CNT+1,R31
Итак, из исходной программы на языке Си, которая понятна и которую легко читать, мы, запустив компилятор, получаем программу на языке ассемблера. Программа на ассемблере читается значительно сложнее, однако она гораздо «понятнее» для ЭВМ. Это - почти ее родной, внутренний язык.
Вот пример фрагмента программы на языке ассемблера:
Lab.asm
#pragma AVRPART ADMIN PART_NAME ATmega8
#pragma AVRPART MEMORY PROG_FLASH 8192
...
.EQU UDRE=0x5
.EQU RXC=0x7
...
__SAVELOCR2:
ST -Y,R17
ST -Y,R16
RET
__LOADLOCR2:
LDD R17,Y+1
LD R16,Y
RET
;END OF CODE MARKER
__END_OF_CODE:
Но это еще не все. Хоть ассемблер и ближе к машинному языку, ЭВМ все еще не может исполнять этот код. Все-таки ассемблер устроен так, чтобы с ним еще мог работать и человек. Поэтому дальше запускается еще одна программа, которая называется так же - программа ассемблер. Эта программа создаст из ассемблерного текста двоичный код. Этот код уже понятен ЭВМ и его можно загружать в машину.
Не запутайтесь: ассемблером называется язык программирования, а также программа, которая создает машинный (или двоичный) код. Машинный код читать уже совершенно невозможно, однако это именно то, что понимает ЭВМ.
Ниже приведен фрагмент одного из таких двоичных файлов - Lab.hex.
Lab.hex
:080000001CC0FECFFDCFFCCFB8
:10000800FBCFFACFF9CFF8CF7DC0F6CFF5CFF4CF3D
:10001800F3CFF2CFF1CFF0CFEFCFEECFEDCF00009F
:100028002040E000040062012600010004002A00CC
:100038000000F894EE27ECBBF1E0FBBFEBBFE5BF97
:10004800F8E1F1BDE1BD8DE0A2E0BB27ED938A9513
...
:100138005F9BFECFECB108955D9BFECFE881ECB9E3
:10014800219608951A930A930895198108810895AC
:00000001FF
Дальше - проще. Специальная программа загрузчик берет двоичный файл и загружает его в память ЭВМ. Теперь микроконтроллер готов к работе.
Схематично весь этот описанный процесс изображен на рис.2.2.
Рис.2.2. Процесс компиляции
Эта программа не делает ничего, кроме инициализации (запуска) микроконтроллера. Разберём по строкам ее устройство.
Листниг 0
/*****************************************************
Проект: Робот, ищущий линию
Версия: 1.00
Дата создания: 01.01.2008
Дата посл. модификации: 01.01.2008
Автор: Иванов Сидор Петрович
Комментарии: программа, которая ничего не делает
----------------------------------------------------
Chip type : ATmega8
Clock frequency : 7,372800 MHz
*****************************************************/
// Подключение библиотек: сюда вставляется содержимое файла "m8inc.h"
#include "m8inc.h"
//----------------------------------------------------------
// Основная программа
//----------------------------------------------------------
void main(void)
{
// Вызов функции инициализации контроллера
InitCM8();
}
Первое выражение в ней: #include “m8lib.h”. Директива #include в языке Си для нас обозначает подключение дополнительных библиотек, в которых записаны полезные нам, уже кем-то написанные функции. Чтобы подключить библиотеку, нужно указать на её заголовочный файл (с расширением .h – header”, что и означает заголовок), в котором написаны только объявления функций. Мы подключаем библиотеку работы с микроконтроллером АТ Mega 8, потому и пишем #include “m8lib.h”. Строго говоря, директива #include “m8lib.h” означает, что в данное место программы будет вставлено содержимое файла “m8lib.h”.
void main(void) означает, что функция не возвращает нам никакого результата. Это не означает, что функция бесполезна – нас интересует не результат, возвращаемый функцией, а действия, которые в ней происходят.
Функция main должна быть в любой программе. Контроллер начинает выполнение программы именно с нее – с основной программы. Именно из этой функции будут вызываться все остальные функции. Отметим здесь, что функция – это некоторая подпрограмма, которая возвращает значение.
Открывающая скобка и закрывающая скобка означают начало и конец программы. Всё, что находится между ними – это тело программы, её основная часть.
В теле программы стоит единственная команда – запустить микроконтроллер (инициализация). На этом программа заканчивается.
Посмотрим на первую программу (Листинг 0). Помимо выражений языка Си, в ней есть еще много всяких подсказок, комментариев заметок.
Комментарии в языке Си пишутся после двух наклонных черточек: // и никак не влияют на работу программы. Комментарии нужно писать всегда, это правила хорошего тона.
Разумеется, не следует писать комментарий на каждую строку программы. Программисты комментируют свои программы, чтобы лучше понимать, как они работают, и чтобы потом было легко вернуться к этой программе и вспомнить, как она работала. Но самое главное, что комментарии должны помочь разобраться в написанной программе и постороннему человеку.
Можно делать комментарии на несколько строчек, заключая их в /* слева и в */ справа.
В начале каждой программы обычно пишется большой блок комментариев. Это - информация о проекте. Нужно заполнять эту «шапку», чтобы потом было легче разобраться с программой. Помимо указания автора, даты создания и версии также желательно указать, для какой микроЭВМ написана программа и какая тактовая частота у кварца и прочая полезная техническая информация (для того случая, если возникнет необходимость переписывания программы для другой микроЭВМ).
Программу на машинном языке нужно загрузить в ОЭВМ. Это делается при помощи программатора. Наш программатор представляет собой самодельный кабель из 5 проводов, соединяющий параллельный порт компьютера (LPT) и наш контроллер. Обычно LPT-порт используется для подключения принтеров. Имейте в виду, что LPT-порт очень капризен и его легко вывести из строя (сжечь).
Рис.4.1. LPT-порт
Описание разъемов программирования приведено в Приложении 1.
Задача лабораторных работ заключается не столько в том, чтобы научить писать программы, сколько читать и понимать их. Кроме того, учащийся должен освоить среду программирования CodeVision или аналогичную (например, WinAVR).
Для проведения лабораторных работ необходимо наличие установленной среды программирования (CodeVision). При этом предлагается следующая структура рабочих каталогов, содержащих библиотеки, тестовые и рабочие проекты:
Library\
clr.bat
cm8lib.c
cm8lib.h
m8inc.h
MyProg\
clr.bat
lab.c
lab.cwp
lab.prj
lab.txt
MVL_L293_ADC\
TEST_ADC\
TEST_L293\
TEST_L293_RS232\
TEST_PWM\
Library - каталог, содержащий библиотеки.
MyProg – рабочий каталог, содержащий подготовленный проект для среды CodeVision.
Остальные каталоги содержат проекты различных тестовых программ.
Среда программирования. Базовая программа. Понятие подпрограммы (функции). Компиляция. Работа с программатором.
В папке с проектом (каталог MyProg) находятся несколько файлов. Файл с расширением prj – это файл описания проекта (lab.prj). Именно его использует CodeVision - наша основная среда разработки. Когда мы «запускаем» этот файл, то происходит следующее: CodeVision считывает из этого файла всю необходимую для работы системы конфигурацию, в том числе - информацию обо всех используемых файлах. Ещё один важный файл – с расширением .c (язык С) – это исходный код нашей программы.
Файл clr.bat «чистит» нам папку с проектом от всяких вспомогательных файлов, которые образуются при компиляции и сборке программы.
Итак, «запустим» файл с расширением prj - lab.prj. Мы видим среду разработки CodeVisionAVR. Основное окно программы – текстовый редактор, в котором мы и будем писать программы. Слева от основного окна – дерево проекта, там перечислены все файлы, участвующие в проекте. Снизу выводятся сообщения об ошибках.
Когда плата готова, следует тщательным образом проверить её на наличие ошибок. Имейте в виду, что вы можете сжечь микросхему, если неправильно спаяли плату. И особенно следите за тем, чтобы не перепутать полярность, когда подключаете питание.
Теперь можно вставлять микросхему. Осторожно вставьте её в гнездо, стараясь не погнуть выводы.
Проверим, правильно ли мы собрали плату. Пока никакую программу писать не будем, а просто считаем сигнатуру чипа – код, уже зашитый в микросхему и обозначающий модель устройства.
Запустим программу CodeVisionAVR.
Примечание 1. Нужно указать тип программатора в настройках
Settings®Programmer
дальше в AVR Chip Programmer Type выбрать Kanda Systems STK200+/300.
Примечание 2. При использовании подобного программатора необходимо настроить BIOS компьютера, установив режим работы параллельного порта в EPP (или EPP+SCP).
Прежде, чем выполнить следующие шаги, запомните следующие рекомендации. Обязательно соблюдайте порядок действий, иначе вы можете сжечь LPT-порт компьютера. Не рекомендуется также подключать или отключать программатор при включенном питании микроконтроллера.
Если вдруг что-то дымится, искрит или нагревается, следует немедленно выключить питание микроконтроллера. Особенно надо следить за соблюдением полярности (правильности подключения) питания.
Итак, далее выполняем следующее:
Должно появиться окно с сигнатурой чипа – ATMega8. Если вместо него появляется ошибка, то проверьте:
Попробуем загрузить первую программу в микросхему. Эта программа входит в базовый комплект лабораторного проекта и набивать ее текст не надо. Далее нажимаем SHIFT+F9.
Произойдёт компиляция и компоновка (сборка) программы. Компилятор переведет вашу программу на машинные коды. Если в программе нет ошибок, то появится кнопка «PROGRAM THE CHIP».
Теперь выполняем следующие действия:
Линейные операторы. Работа с портами. Включение и выключение индикаторных диодов.
Порт в микроЭВМ - это сгруппированные 8 “ножек” или линий ввода-вывода, имеющие индивидуальные номера от 0 до 7 и общее имя - букву A, B, C, D, ... отличающую этот порт от других.
В нашей ATMega8 всего 3 порта – B, C и D. Мы будем использовать только 13 выводов из 24, поскольку остальные заняты для программатора, сброса, кварца и проч.
Каждый из незанятых выводов можно программно назначить входом или выходом – в зависимости от задачи. В нашей программе 7 выводов мы назначили выходами, а 6 - входами. На плате контроллера для удобства они также разделены по группам – IN – входы, OUT – выходы.
МикроЭВМ может измерять уровень напряжения на любом своём входе.
Если напряжение на выводе больше, чем 2.5 В, то считается, что на выводе «1» - логический высокий уровень (логическая единица). А если ближе к нулю, то это низкий логический уровень (логический нуль).
Также и с выходами: если мы подаём логическую единицу на вывод, то на нем устанавливается напряжение более 2.5 В.
Пример: Чтобы присвоить 1 четвертому выходу (вывод номер 5 порта D), пишут так:
PORTD.5 = 1;
Попробуем включить индикацию, а затем выключить.
Листниг 1
/*****************************************************
Версия: 1.01
Комментарии: Пытаемся включить индикацию
*****************************************************/
// Подключение библиотек: сюда вставляется содержимое файла "m8inc.h"
#include "m8inc.h"
//----------------------------------------------------------
// Основная программа
//----------------------------------------------------------
void main(void)
{
// Вызов функции инициализации контроллера
InitCM8();
// Включаем
PORTD.2 = 1;
PORTD.3 = 1;
PORTD.4 = 1;
// Выключаем
PORTD.2 = 0;
PORTD.3 = 0;
PORTD.4 = 0;
}
Функция задержки delay_ms. Программа включения индикации с задержкой.
К сожалению, никакого мигания светодиодов мы не увидим. Дело в том, что программа всегда выполняется по шагам, а время исполнения одной команды очень мало, сотые доли секунды. Светодиод успел загореться и погаснуть прежде, чем мы это заметили.
Нужна какая-нибудь задержка при исполнении программы. Функция для формирования задержки называется delay_ms(). В скобках указывается длительность задержки в миллисекундах, отсюда ms в названии. Миллисекунда – это одна тысячная секунды. Поставим задержку в одну секунду между включением и выключением светодиода.
Листниг 2
/*****************************************************
Версия: 1.02
Комментарии: Пытаемся включить индикацию, но уже с задержкой
*****************************************************/
// Подключение библиотек: сюда вставляется содержимое файла "m8inc.h"
#include "m8inc.h"
//----------------------------------------------------------
// Основная программа
//----------------------------------------------------------
void main(void)
{
// Вызов функции инициализации контроллера
InitCM8();
// Включаем
PORTD.2 = 1;
delay_ms(1000); //Вызов функции задержки выполнения программы (на 1сек.)
PORTD.3 = 1;
delay_ms(1000);
PORTD.4 = 1;
delay_ms(1000);
// Выключаем
PORTD.2 = 0;
delay_ms(1000);
PORTD.3 = 0;
delay_ms(1000);
PORTD.4 = 0;
delay_ms(1000);
}
Циклы. Программа циклического включения/выключения индикации.
Предположим, что, мы хотим мигнуть не один раз, а много, например 10 или 100 раз. Писать все команды вручную очень долго, да и память расходуется. Для многократного повторения операций служит такая конструкция, как цикл.
Циклы бывают разные. В одних циклах можно указать количество повторений, а в других - указывать условие повторения цикла.
Сделаем так, чтобы светодиод мигал бесконечно. Используем цикл while (“пока”). То, что записано в теле цикла (между открывающей и закрывающей фигурной скобкой), повторяется до тех пор, пока истинно условие в круглых скобках после while. Мы можем вписать туда единицу (1 означает истину, а 0 - ложь), и тогда цикл будет совершаться бесконечно.
Листниг 3
/*****************************************************
Версия: 1.03
Комментарии: Управление индикацией с задержкой и в бесконечном цикле
*****************************************************/
// Подключение библиотек: сюда вставляется содержимое файла "m8inc.h"
#include "m8inc.h"
//----------------------------------------------------------
// Основная программа
//----------------------------------------------------------
void main(void)
{
// Вызов функции инициализации контроллера
InitCM8();
// Бесконечный цикл
while(1)
{
// Включаем
PORTD.2 = 1;
delay_ms(1000); //Вызов функции задержки выполнения программы (на 1сек.)
PORTD.3 = 1;
delay_ms(1000);
PORTD.4 = 1;
delay_ms(1000);
// Выключаем
PORTD.2 = 0;
delay_ms(1000);
PORTD.3 = 0;
delay_ms(1000);
PORTD.4 = 0;
delay_ms(1000);
}
}
Макроподстановки. Конструкция #define
Еще раз посмотрим на текст предыдущей программы. Работая с задержками, мы использовали функцию delay_ms, задавая в качестве указывая в качестве параметра число 1000. Однако предположим, что мы хотим сделать все задержки поменьше. Скажем, не 1000, а 250. Тогда нам придется изменить текст программы, заменив везде 1000 на 250. Хорошо, если программа небольшая, а мы очень внимательны и трудолюбивы. В случае же большой программы риск ошибиться значительно возрастает. Гораздо удобнее воспользоваться следующим очень полезным механизмом.
Добавим в текст программы следующую строку:
#define TIME 250
А затем заменим delay_ms(1000) на delay_ms(TIME).
Тогда произойдет следующее. Анализируя текст программы, компилятор получит указание заменить далее в тексте программы имя TIME на ту строку символов, которая находится в определении #define после TIME, т.е. на '250'.
Теперь, если потребуется устроить задержку на какое-нибудь иное время, нам больше не понадобится просматривать весь текст программы. Достаточно будет поменять одну конструкцию #define.
В приведенной ниже программе именно так и делается.
Листниг 4
/*****************************************************
Версия: 1.04
Комментарии: Управление индикацией с задержкой и в бесконечном цикле
Использование #define
*****************************************************/
// Подключение библиотек: сюда вставляется содержимое файла "m8inc.h"
#include "m8inc.h"
// Определение имени TIME: далее везде, где будет встречено слово (имя) TIME,
// оно будет заменено на 250
#define TIME 250
//----------------------------------------------------------
// Основная программа
//----------------------------------------------------------
void main(void)
{
// Вызов функции инициализации контроллера
InitCM8();
// Бесконечный цикл
while(1)
{
// Включаем
PORTD.2 = 1;
delay_ms(TIME); //Вызов функции задержки выполнения программы (на 1сек.)
PORTD.3 = 1;
delay_ms(TIME);
PORTD.4 = 1;
delay_ms(TIME);
// Выключаем
PORTD.2 = 0;
delay_ms(TIME);
PORTD.3 = 0;
delay_ms(TIME);
PORTD.4 = 0;
delay_ms(TIME);
}
}
Условный оператор. Считывание состояния портов ввода. Программа опроса датчиков с индикацией.
Очень часто бывает необходимо, чтоб то или иное действие совершалось не всегда, а лишь при выполнении некоторого условия. В таких ситуациях мы имеем дело с правилами вида «ЕСЛИ-ТО». Например:
«ЕСЛИ состояние входа 1 порта B равно ‘0’, ТО установить ‘1’ на выходе 2 порта D»
Такая конструкция на языке Си будет записана так:
if(PINB.1==0) PORTD.2 = 1;
Бывают правила с частью «ИНАЧЕ» (ELSE):
if(PINB.1==0) PORTD.2 = 1; else PORTD.2 = 0;
Здесь для понимания достаточно почти дословно перевести эту инструкцию на русский язык, помня, что «if» переводится как «ЕСЛИ», «else» - как «ИНАЧЕ».
Листниг 5
/*****************************************************
Версия: 1.05
Комментарии: Датчики и условный оператор
*****************************************************/
// Подключение библиотек: сюда вставляется содержимое файла "m8inc.h"
#include "m8inc.h"
//----------------------------------------------------------
// Основная программа
//----------------------------------------------------------
void main(void)
{
// Вызов функции инициализации контроллера
InitCM8();
// Бесконечный цикл
while(1)
{
// Если сигнал на ноге PINB.1 равен 0, то отправить на PORTD.2 единицу
// (включить), иначе - выключить
if(PINB.1==0) PORTD.2 = 1; else PORTD.2 = 0;
if(PINB.2==0) PORTD.3 = 1; else PORTD.3 = 0;
if(PINC.0==0) PORTD.4 = 1; else PORTD.4 = 0;
}
}
Аналогичный вариант предыдущей программы, но с использованием конструкций #define.
Листниг 6
/*****************************************************
Версия: 1.06
Комментарии: Датчики и условный оператор
Более культурный вариант программы
*****************************************************/
// Подключение библиотек: сюда вставляется содержимое файла "m8inc.h"
#include "m8inc.h"
// Много полезных определений, чтобы не путать обозначения ног
#define IN1 PINB.1
#define IN2 PINB.2
#define IN3 PINC.0
#define IN4 PINC.1
#define IN5 PINC.2
#define IN6 PINC.3
#define OUT1 PORTD.2
#define OUT2 PORTD.3
#define OUT3 PORTD.4
#define OUT4 PORTD.5
#define OUT5 PORTD.6
#define OUT6 PORTD.7
#define OUT7 PORTB.0
//----------------------------------------------------------
// Основная программа
//----------------------------------------------------------
void main(void)
{
// Вызов функции инициализации контроллера
InitCM8();
// Бесконечный цикл
while(1)
{
// Если сигнал на ноге in1 (PINB.1) равен 0, то отправить на out1
// (PORTD.2) единицу (включить), иначе - выключить
if(IN1==0) OUT1 = 1; else OUT1 = 0;
if(IN2==0) OUT2 = 1; else OUT2 = 0;
if(IN3==0) OUT3 = 1; else OUT3 = 0;
}
}
А в этой программе уже происходит управление двигателями. Сигналы OUT4-OUT7 идут на вход микросхемы драйвера двигателя L293D.
Листниг 7
/*****************************************************
Версия: 1.07
Комментарии: Управление двигателями
*****************************************************/
// Подключение библиотек: сюда вставляется содержимое файла "m8inc.h"
#include "m8inc.h"
// Много полезных определений, чтобы не путать обозначения ног
#define IN1 PINB.1
#define IN2 PINB.2
#define IN3 PINC.0
#define IN4 PINC.1
#define IN5 PINC.2
#define IN6 PINC.3
#define OUT1 PORTD.2
#define OUT2 PORTD.3
#define OUT3 PORTD.4
#define OUT4 PORTD.5
#define OUT5 PORTD.6
#define OUT6 PORTD.7
#define OUT7 PORTB.0
//----------------------------------------------------------
// Основная программа
//----------------------------------------------------------
void main(void)
{
// Вызов функции инициализации контроллера
InitCM8();
// Бесконечный цикл
while(1)
{
// Если сигнал на ноге IN1 равен 0, то включаем левый двигатель,
// иначе - выключаем
if(IN1==0)
{
OUT7 = 0;
OUT6 = 1;
}
else
{
OUT7 = 0;
OUT6 = 0;
}
// Аналогично с правым
if(IN2==0)
{
OUT5 = 0;
OUT4 = 1;
}
else
{
OUT5 = 0;
OUT4 = 0;
}
}
}
Описание и вызов функций.
Использование подпрограмм-функций. Обратите внимание на значительно лучшую читаемость программы и удобство модификаций движений робота.
Листниг 8
/*****************************************************
Версия: 1.08
Комментарии: Функции
*****************************************************/
// Подключение библиотек: сюда вставляется содержимое файла "m8inc.h"
#include "m8inc.h"
// Много полезных определений, чтобы не путать обозначения ног
#define IN1 PINB.1
#define IN2 PINB.2
#define IN3 PINC.0
#define IN4 PINC.1
#define IN5 PINC.2
#define IN6 PINC.3
#define OUT1 PORTD.2
#define OUT2 PORTD.3
#define OUT3 PORTD.4
#define OUT4 PORTD.5
#define OUT5 PORTD.6
#define OUT6 PORTD.7
#define OUT7 PORTB.0
// Описание функции (подпрограммы) ML_GO: тип функции - void (ничего не
// возвращает), аргументов нет (void)
void MotorLeftGO(void)
{
OUT7 = 0;
OUT6 = 1;
}
void MotorLeftSTOP(void)
{
OUT7 = 0;
OUT6 = 0;
}
void MotorRightGO(void)
{
OUT5 = 0;
OUT4 = 1;
}
void MotorRightSTOP(void)
{
OUT5 = 0;
OUT4 = 0;
}
//----------------------------------------------------------
// Основная программа
//----------------------------------------------------------
void main(void)
{
// Вызов функции инициализации контроллера
InitCM8();
// Бесконечный цикл
while(1)
{
// Если сигнал на ноге IN1 равен 0, то включаем левый двигатель,
// иначе - выключаем
if(IN1==0)
MotorLeftGO();
else
MotorLeftSTOP();
// Аналогично с правым
if(IN2==0)
MotorRightGO();
else
MotorRightSTOP();
}
}
Программа движения робота по линии
Это – вполне рабочий вариант программы. В случае потери линии робот начинает вращаться на месте (искать линию).
Листниг 9
/*****************************************************
Версия: 1.09
Комментарии: Программа с поиском линии
Логические выражения
*****************************************************/
// Подключение библиотек: сюда вставляется содержимое файла "m8inc.h"
#include "m8inc.h"
// Много полезных определений, чтобы не путать обозначения ног
#define IN1 PINB.1
#define IN2 PINB.2
#define IN3 PINC.0
#define IN4 PINC.1
#define IN5 PINC.2
#define IN6 PINC.3
#define OUT1 PORTD.2
#define OUT2 PORTD.3
#define OUT3 PORTD.4
#define OUT4 PORTD.5
#define OUT5 PORTD.6
#define OUT6 PORTD.7
#define OUT7 PORTB.0
// Описание функции (подпрограммы) ML_GO: тип функции - void (ничего не
// возвращает), аргументов нет (void)
void MotorLeftGO(void)
{
OUT7 = 0;
OUT6 = 1;
}
void MotorLeftSTOP(void)
{
OUT7 = 0;
OUT6 = 0;
}
void MotorRightGO(void)
{
OUT5 = 0;
OUT4 = 1;
}
void MotorRightSTOP(void)
{
OUT5 = 0;
OUT4 = 0;
}
//----------------------------------------------------------
// Основная программа
//----------------------------------------------------------
void main(void)
{
// Вызов функции инициализации контроллера
InitCM8();
// Бесконечный цикл
while(1)
{
// Если сигнал на ноге IN1 равен 0, то включаем левый двигатель,
// иначе - выключаем
if(IN1==0)
MotorLeftGO();
else
MotorLeftSTOP();
// Аналогично с правым
if(IN2==0)
MotorRightGO();
else
MotorRightSTOP();
// Если нет сигнала на ноге IN1 и нет сигнала на ноге IN2,
// то будем крутиться направо
if(IN1==1 && IN2==1)
{
MotorLeftGO();
MotorRightSTOP();
}
}
}
И, наконец, финальный вариант программы. В ней собраны все обсуждаемые выше механизмы. Здесь есть и механизм реакции робота на препятствия.
Листниг 10
/*****************************************************
Проект: Робот, ищущий линию
Версия: 1.10
Дата создания: 01.01.2008
Дата посл. модификации: 01.01.2008
Автор: Иванов Сидор Петрович
Комментарии: Программа с поиском линии и реакцией на препятствия
----------------------------------------------------
Chip type : ATmega8
Clock frequency : 7,372800 MHz
*****************************************************/
// Подключение библиотек: сюда вставляется содержимое файла "m8inc.h"
#include "m8inc.h"
// Много полезных определений, чтобы не путать обозначения ног
#define IN1 PINB.1
#define IN2 PINB.2
#define IN3 PINC.0
#define IN4 PINC.1
#define IN5 PINC.2
#define IN6 PINC.3
#define OUT1 PORTD.2
#define OUT2 PORTD.3
#define OUT3 PORTD.4
#define OUT4 PORTD.5
#define OUT5 PORTD.6
#define OUT6 PORTD.7
#define OUT7 PORTB.0
// Описание функции (подпрограммы) ML_GO: тип функции - void (ничего не
// возвращает), аргументов нет (void)
void MotorLeftGO(void)
{
OUT7 = 0;
OUT6 = 1;
}
void MotorLeftBACK(void)
{
OUT7 = 1;
OUT6 = 0;
}
void MotorLeftSTOP(void)
{
OUT7 = 0;
OUT6 = 0;
}
void MotorRightGO(void)
{
OUT5 = 0;
OUT4 = 1;
}
void MotorRightBACK(void)
{
OUT5 = 1;
OUT4 = 0;
}
void MotorRightSTOP(void)
{
OUT5 = 0;
OUT4 = 0;
}
//Время задержки (500 мс или 0.5 с)
#define TIME 1000
//----------------------------------------------------------
// Основная программа
//----------------------------------------------------------
void main(void)
{
// Вызов функции инициализации контроллера
InitCM8();
// Бесконечный цикл
while(1)
{
// Если сигнал на ноге IN1 равен 0, то включаем левый двигатель,
// иначе - выключаем
if(IN1==0)
MotorLeftGO();
else
MotorLeftSTOP();
// Аналогично с правым
if(IN2==0)
MotorRightGO();
else
MotorRightSTOP();
// Если нет сигнала на ноге IN1 и нет сигнала на ноге IN2,
// то будем крутиться направо
if(IN1==1 && IN2==1)
{
MotorLeftGO();
MotorRightSTOP();
}
// Сработал левый датчик препятствий
if(IN3==0)
{
MotorLeftBACK();
MotorRightBACK();
delay_ms(TIME);
MotorLeftGO();
MotorRightSTOP();
delay_ms(TIME/2);
}
// Сработал правый датчик препятствий
if(IN4==0)
{
MotorLeftBACK();
MotorRightBACK();
delay_ms(TIME);
MotorLeftSTOP();
MotorRightGO();
delay_ms(TIME/2);
}
}
}
Практические занятия делятся на две части - лабораторные работы, связанные с программированием микроконтроллера и занятия по сборке электронных и механических компонент робота. Ниже приводятся некоторые комментарии и рекомендации по проведению практических занятий по созданию робота.
Содержание: Травление и залуживание платы. Подготовка и изготовление монтажных проводов.
Количество часов – 1.
Базовая технология изготовления основана на применении шаблона (фотобумага), утюжного метода (температура – около 200°C) и использовании раствора хлорного железа. Здесь следует быть предельно внимательным, т.к. плотность монтажа, особенно для элементов в SMD-корпусах, достаточно велика.
Результат – подготовленная плата контроллера и монтажные провода.
Содержание: Сверление и монтаж элементов.
Количество часов – 1.
Отверстия для перемычек, выводов микросхемы L293D, панели микроконтроллера и электролитических конденсаторов сверлятся сверлом 0.8 мм.
Отверстия для штыревых контактов PLS сверлятся сверлом 0.9 – 1.0 мм.
Для стабилизатора питания КР142ЕН5 может потребоваться более толстое сверло.
При монтаже SMD-элементов используется пинцет. На начальном этапе микросхема MAX202 для реализации интерфейса RS232 может не монтироваться.
Результат – подготовленная плата контроллера и частично припаянные элементы.
Содержание: Монтаж элементов платы контроллера.
Количество часов – 1.
Завершение монтажа (пайки) элементов, установка перемычек (навесных проводников на верхней стороне платы). Далее требуется на верхней стороне платы перманентным маркером подписать все выводы, в т.ч. – промаркировать контакты «земля» и разъем питания.
Тестирование платы осуществляется в Лабораторной работе 1.
Результат – готовая плата контроллера.
Содержание: Система питания. Корпусные работы.
Количество часов – 1.
Система питания представляет собой провод с выключателем (тумблером) и разъемами для подключения к контроллеру и источнику питания. В качестве источника питания можно использовать либо последовательно соединенные батареи по 4.5В, либо две параллельно включенные батареи типа «Крона», либо иной источник с выходным напряжением 7..9В.
Корпус робота и его ходовая часть могут быть произвольными. Ограничения касаются лишь потребляемого электродвигателями тока – суммарный ток должен быть не более 400 мА.
И стабилизатор питания, и микросхема L293D оснащаются радиаторами.
Результат – ходовая часть робота с готовой законченной системой питания.
Содержание: Изготовление, настройка и отладка датчиков полосы.
Количество часов – 1.
Датчики полосы представляют собой фототранзистор, подключаемый к входам микроконтроллера и светодиоды подсветки. Настройка заключается в определении взаимного расположения фототранзисторов и светодиодов, а также оптимального расстояния между датчиками. Отладка работы системы датчиков осуществляется программно.
Результат – система датчиков полосы.
Содержание: Доводка робота.
Количество часов – 1.
Окончательный монтаж всех компонент робота. Комплексная отладка базовой конструкции.
Результат – базовая конструкция робота.
Содержание: Доводка робота. Изготовление дополнительных датчиков.
Количество часов – 1.
Завершение монтажа. Изготовление и установка дополнительных датчиков препятствий. Датчики препятствий в простейшем виде представляют собой штыревые контактные датчики.
Результат – робот с дополнительными датчиками.
Содержание: Окончательная отладка программы, доводка робота.
Количество часов – 1.
Комплексная отладка робота на полигоне. Окончательная настройка датчиков полосы, работы ходовой части и проч.
Результат – законченный проект – робот.
Содержание: Соревнования "Движение по полосе".
Количество часов – 2.
Проведение соревнований по регламенту состязаний мобильных минироботов «Движение по полосе».
Результат – участие в соревнованиях.
|
|
|
|
|
|
|
|
|
|
|
1 |
PC6 (RESET) |
ATMega8 |
28 |
ADC-2 |
||
|
|
2 |
PD0 (RXD) |
PC4 (ADC4) |
27 |
ADC-1 |
|
|
|
|
3 |
PD1 (TXD) |
PC3 |
26 |
In-6 |
|
|
|
Out-1 |
4 |
PD2 |
PC2 |
25 |
In-5 |
|
|
|
Out-2 |
5 |
PD3 |
PC1 |
24 |
In-4 |
|
|
|
Out-3 |
6 |
PD4 |
PC0 |
23 |
In-3 |
|
|
|
|
7 |
VCC |
AGND |
22 |
|
|
|
|
|
8 |
GND |
AREF |
21 |
|
|
|
|
|
9 |
PB6 |
AVCC |
20 |
|
|
|
|
|
10 |
PB7 |
PB5 (SCK) |
19 |
|
|
|
MR.2 |
Out-4 |
11 |
PD5 |
PB4 (MISO) |
18 |
|
|
|
MR.1 |
Out-5 |
12 |
PD6 |
PB3 (MOSI) |
17 |
|
|
|
ML.2 |
Out-6 |
13 |
PD7 |
PB2 |
16 |
In-2 |
|
|
ML.1 |
Out-7 |
14 |
PB0 |
PB1 |
15 |
In-1 |
|
|
|
|
|
|
|
|
|
|
|
Стабилизатор КР142ЕН5А Расположение выводов: 1-Вход, 2-Земля, 3-Выход
Обозначение |
Номинал |
Тип |
Кол-во |
BQ1 |
7.3728 МГц |
|
1 |
C1, C2 |
15 пФ |
керамический SMD 0805 |
2 |
C3,С4,С5,С6,С7,С8 |
0.1 мкФ |
керамический SMD 0805 |
6 |
C9 |
0.1 мкФ |
керамический SMD 1206 |
1 |
C10, C11 |
47.0 мкФ |
К56-35 импортный |
2 |
DD1 |
ATMega8-16PU |
DIP28 |
1 |
DD2 |
Max202 |
DIP |
|
панель для ATMega8 |
28 ног |
DIP28 |
1 |
разъем Programing |
BLS-6 |
угловой |
1 |
разъем UART |
BLS-4 |
угловой |
1 |
разъем Power |
WF-4 |
угловой |
1 |
разъем |
PLS-40 |
прямой |
1 |
Выводятся два сигнала UART – RXD, TXD, GND и питание +5В.
Вилка подключения RS232.
Тип: OWF-3: Контакты разъема DB-9: (3), (2), (5)
RS232
DB-9 |
ИС |
OWF-3 |
2 |
RXD |
1 |
3 |
TXD |
2 |
5 |
GND |
3 |
9 |
+5V (опционально) |
|
Выводятся сигналы SPI – MOSI, MISO, SCK, Reset, GND, питание +5В.
LPT
CENTRONIX |
Сигнал |
OWF-5 |
18-25 GND |
GND |
1 |
9 |
RESET |
2 |
6 |
SCK |
3 |
10 |
MISO |
4 |
7 |
MOSI |
5 |
2-12 |
|
|
3-13 |
|
|
Знакомство с микроконтроллерами и интегральной схемотехникой
12 занятий.
Продолжительность занятия - 120 минут.
Программа рассчитана на детей от 12 лет и выше
В ходе обучения учащимся предстоит изготовить полноценного мобильного миниробота, управляемого микроконтроллером. Робот оснащается набором датчиков и далее с помощью программирования на языке высокого уровня Си эта робот ориентируется на решение некоторых простых задач из области спортивной робототехники, в частности - на решение задачи езды по линии. Этот курс учит азам программирования, знакомит с архитектурой микроконтроллеров, командами и спецификой программирования для них. Обучение программированию ориентировано на написание простых управляющих программ для микроконтроллера и далее заканчивается решением практической задачи управления роботом, ищущим полосу. Кроме того, рассказывается о перспективах развития возможностей как созданного робота, так и робототехники и микропроцессорной техники в целом, о том, какого уровня программы можно создать на микроконтроллерной базе.
Курс является продолжением вводного робототехнического курса «Знакомство с автоматикой и электроникой». Уровень подготовки - базовый.
Целью курса является ознакомление с микроконтроллерами и интегральными микросхемами и создание простого мобильного робота.
Для достижения поставленной цели требуется решить следующие задачи:
В теоретическом плане обучаемому требуется усвоить базовые понятия следующих разделов:
1. Основы архитектуры однокристальных микроЭВМ.
2. Основы программирования (язык Си).
3. Интегральные микросхемы.
4. Принципы программного управления.
В практическом плане обучаемый должен освоить принципы создания простейших управляющих программ, а также реализовать на более высоком уровне полученные на предыдущем этапе обучения навыки в области электроники и механики.
№ |
Тема |
Содержание |
Часы |
1 |
Введение |
Лекция. Цели и задачи курса. Особенности элементной базы (SMD). Перечень элементов. Краткий инструктаж по технике безопасности. |
1 |
Изготовление платы |
Практика. Травление и залуживание платы. Подготовка и изготовление монтажных проводов. |
1 |
|
2 |
Архитектура микроЭВМ |
Лекция. Общие сведения об архитектуре однокристальных микроЭВМ. Базовые понятия. Архитектура Mega8. |
1 |
Монтаж элементов платы |
Практика. Сверление и монтаж элементов. |
1 |
|
3 |
Драйвер двигателей |
Лекция. Схема управления двигателями. Понятие логического "0" и "1". |
1 |
Монтаж элементов платы. |
Практика. Монтаж элементов. |
1 |
|
4 |
Система питания и датчики |
Лекция. Стабилизатор напряжения. Дополнительные элементы. Кварцевый резонатор и конденсаторы. Особенности подключения датчиков. |
1 |
Корпус робота |
Практика. Система питания. Корпусные работы. |
1 |
|
5 |
Начало программирования |
Лекция. Понятие программы. Среда программирования. Компиляция. Зашивка программы в микроЭВМ. Программатор. |
1 |
Программирование |
Практика Лабораторные работы 1, 2. |
1 |
|
6 |
Программирование |
Практика. Лабораторные работы 3, 4, 5. |
2 |
7 |
Понятие алгоритма |
Лекция. Понятие алгоритма. Алгоритм программы движения по линии. |
1 |
Программирование |
Практика. Основная программа движения по линии. |
1 |
|
8 |
Программирование |
Лекция. Переменные и типы данных. |
1 |
Датчики полосы |
Практика. Изготовление, настройка и отладка датчиков полосы. |
1 |
|
9 |
Программирование |
Лекция. Программа, использующая переменные. |
1 |
Построение робота |
Практика. Доводка робота. |
1 |
|
10 |
Дополнительные датчики |
Лекция. Контактные датчики столкновения. Объезд препятствий. Пример программы. |
1 |
Построение робота |
Практика. Доводка робота. Изготовление дополнительных датчиков. |
1 |
|
11 |
Дальнейшие перспективы |
Лекция. Расширение возможностей и дальнейшее развитие системы. АЦП. Считывание значений сигналов датчиков. Связь с управляющей ЭВМ по RS232. Прерывания. Таймер. |
1 |
Отладка робота |
Практика. Окончательная отладка программы, доводка робота. |
1 |
|
12 |
Соревнования |
Практика. Соревнования "Движение по полосе". |
2 |
Всего часов |
24 |
№ |
Наименование |
Содержание работы |
1 |
Среда программирования. Программатор |
Среда программирования. Базовая программа. Понятие подпрограммы (функции). Компиляция. Работа с программатором. |
2 |
Линейные операторы. Порты |
Линейные операторы. Работа с портами. Включение и выключение индикаторных диодов. |
3 |
Функция задержки |
Функция задержки delay_ms. Программа включения индикации с задержкой. |
4 |
Макроподстановки |
Макроподстановки. Конструкция #define |
5 |
Циклы |
Циклы. Программа циклического включения/выключения индикации. |
6 |
Условный оператор и опрос датчиков |
Условный оператор. Считывание состояния портов ввода. Программа опроса датчиков с индикацией. |
7 |
Функции |
Описание и вызов функций. |
8 |
Основная программа |
Программа движения робота по линии |
Об авторах
Карпов Валерий Эдуардович, доц., к.т.н.
научный руководитель проектов научно-учебной лаборатории
Робототехники и искусственного интеллекта Политехнического музея,
в.н.с. НИИ Информационных технологий.
Волкова Татьяна Александровна, методист лаборатории Робототехники и искусственного интеллекта Политехнического музея
Платонова Мария Валерьевна, методист лаборатории Робототехники и искусственного интеллекта Политехнического музея