Загрузка...


Купить радиодетали для ремонта


Делаем робота




ДРАЙВЕР ДВИГАТЕЛЕЙ L293D

Для управления двигателями робота необходимо устройство, которое бы преобразовывало управляющие сигналы малой мощности в токи, достаточные для управления моторами. Такое устройство называют драйвером двигателей.

драйвер двигателей L293DСуществует достаточно много самых различных схем для управления электродвигателями. Они различаются как мощностью, так и элементной базой, на основе которой они выполнены.

Мы остановимся на самом простом драйвере управления двигателями, выполненном в виде полностью готовой к работе микросхемы. Эта микросхема называется L293D и является одной из самых распространенных микросхем, предназначенных для этой цели.

L293D содержит сразу два драйвера для управления электродвигателями небольшой мощности (четыре независимых канала, объединенных в две пары). Имеет две пары входов для управляющих сигналов и две пары выходов для подключения электромоторов. Кроме того, у L293D есть два входа для включения каждого из драйверов. Эти входы используются для управления скоростью вращения электромоторов с помощью широтно модулированного сигнала (ШИМ).
L293D обеспечивает разделение электропитания для микросхемы и для управляемых ею двигателей, что позволяет подключить электродвигатели с большим напряжением питания, чем у микросхемы. Разделение электропитания микросхем и электродвигателей может быть также необходимо для уменьшения помех, вызванных бросками напряжения, связанными с работой моторов.

Принцип работы каждого из драйверов, входящих в состав микросхемы, идентичен, поэтому рассмотрим принцип работы одного из них.

Схема драйвера двигателей



К выходам OUTPUT1 и OUTPUT2 подключим электромотор MOTOR1.
На вход ENABLE1, включающий драйвер, подадим сигнал (соединим с положительным полюсом источника питания +5V). Если при этом на входы INPUT1 и INPUT2 не подаются сигналы, то мотор вращаться не будет. Если вход INPUT1 соединить с положительным полюсом источника питания, а вход INPUT2 - с отрицательным, то мотор начнет вращаться. Теперь попробуем соединить вход INPUT1 с отрицательным полюсом источника питания, а вход INPUT2 - с положительным. Мотор начнет вращаться в другую сторону. Попробуем подать сигналы одного уровня сразу на оба управляющих входа INPUT1 и INPUT2 (соединить оба входа с положительным полюсом источника питания или с отрицательным) - мотор вращаться не будет. Если мы уберем сигнал с входа ENABLE1, то при любых вариантах наличия сигналов на входах INPUT1 и INPUT2 мотор вращаться не будет. Представить лучше принцип работы драйвера двигателя можно, рассмотрев следующую таблицу:

ENABLE1

INPUT1

INPUT2

OUTPUT1

OUTPUT2

1

0

0

0

0

1

1

0

1

0

1

0

1

0

1

1

1

1

1

1

Купить

Робототехника: роботы, комплектующие для робототехники, Квадрокоптеры


Теперь рассмотрим назначение выводов микросхемы L293D.

L293D

 

  • Входы ENABLE1 и ENABLE2 отвечают за включение каждого из драйверов, входящих в состав микросхемы.
  • Входы INPUT1 и INPUT2 управляют двигателем, подключенным к выходам OUTPUT1 и OUTPUT2.
  • Входы INPUT3 и INPUT4 управляют двигателем, подключенным к выходам OUTPUT3 и OUTPUT4.
  • Контакт Vs соединяют с положительным полюсом источника электропитания двигателей или просто с положительным полюсом питания, если питание схемы и двигателей единое. Проще говоря, этот контакт отвечает за питание электродвигателей.
  • Контакт Vss соединяют с положительным полюсом источника питания. Этот контакт обеспечивает питание самой микросхемы.
  • Четыре контакта GND соединяют с "землей" (общим проводом или отрицательным полюсом источника питания). Кроме того, с помощью этих контактов обычно обеспечивают теплоотвод от микросхемы, поэтому их лучше всего распаивать на достаточно широкую контактную площадку.


Характеристики микросхемы L293D

  • напряжение питания двигателей (Vs) - 4,5...36V
  • напряжение питания микросхемы (Vss) - 5V
  • допустимый ток нагрузки - 600mA (на каждый канал)
  • пиковый (максимальный) ток на выходе - 1,2A (на каждый канал)
  • логический "0" входного напряжения - до 1,5V
  • логическая "1" входного напряжения - 2,3...7V
  • скорость переключений до 5 kHz.
  • защита от перегрева

         

 

ПРОСТЕЙШИЙ РОБОТ НА ОДНОЙ МИКРОСХЕМЕ

 

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

робот, реализующий реакцию фотокинезисаПринцип поведения робота основывается на "фоторецепции" и является типичным для целого класса BEAM-роботов. В живой природе, которой будет подражать наш робот, фоторецепция - одно из основных фотобиологических явлений, в котором свет выступает как источник информации.

В качестве первого опыта обратимся к устройству BEAM-робота, двигающегося вперед, когда на него падает луч света, и останавливающегося, когда свет перестает его освещать. Поведение такого робота называется фотокинезисом - ненаправленным увеличением или уменьшением подвижности в ответ на изменения уровня освещённости.
В устройстве робота, кроме микросхемы драйвера моторов L293D, будет использоваться только один фотоэлемент и один электромотор. В качестве фотоэлемента можно применить не только фототранзистор, но и фотодиод или фоторезистор.
В конструкции робота мы используем фототранзистор n-p-n структуры в качестве фотосенсора. Фототранзисторы на сегодняшний день являются, пожалуй, одним из самых распространенных видов оптоэлектронных приборов и отличаются хорошей чувствительностью и вполне приемлемой ценой.

Как сделать робота - схема робота №1

Схема робота с одним фототранзистором

 



А не мог бы ты рассказать об отличиях, которые мне необходимо будет учесть при использовании L293DNE.

С удовольствием, старина Бибот. Все микросхемы линейки L293D имеют входы, совместимые с TTL-уровнями*, но лишь совместимостью уровней некоторые из них не ограничиваются. Так, L293DNE имеет не только совместимость с TTL по уровням напряжения, но и обладает входами с классической TT-логикой. То есть на неподключенном входе присутствует логическая "1".
Если на неподключенном входе у L293DNE присутствует высокий уровень (логическая "1"), то и на соответствующем выходе мы будем иметь сигнал высокого уровня. Если мы теперь подадим на рассматриваемый вход сигнал высокого уровня, говоря по другому - логическую "1" (соединим с "плюсом" питания), то на соответствующем выходе ничего не изменится, так как на входе у нас и до этого была "1". Если же мы подадим на наш вход сигнал низкого уровня (соединим с "минусом" питания), то состояние выхода изменится и на нем будет напряжение низкого уровня.

То есть получается все наоборот: L293D мы управляли с помощью положительных сигналов, а L293DNE нужно управлять с помощью отрицательных.

L293D и L293DNE можно управлять как в рамках отрицательной логики, так и в рамках положительной*. Для того чтобы управлять входами L293DNE с помощью положительных сигналов, нам будет необходимо подтянуть эти входы к "земле" подтягивающими резисторами.

вход с подтягивающим резистором


Тогда, при отсутствии положительного сигнала, на входе будет присутствовать логический "0", обеспечиваемый подтягивающим резистором. Хитроумные янки называют такие резисторы pull-down, а при подтягивании высокого уровня - pull-up.

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

 Номинал этих резисторов можно выбрать около 4,7 кОм. Тогда схема простейшего робота будет выглядеть следующим образом.

Схема простого робота на микросхеме L293DNE



Причем от номинала резистора R1 будет зависеть чувствительность нашего робота. Чем сопротивление R1 будет меньше, тем чувствительность робота будет ниже, а чем оно будет больше, тем чувствительность будет выше. А так как в данном случае нам нет необходимости управлять мотором в двух направлениях, то второй вывод мотора мы можем подключить напрямую к "земле". Что даже несколько упростит схему.

Схема простого робота на микросхеме L293DNE



И последний вопрос. А в тех схемах роботов, которые ты привел в рамках нашей беседы, может быть использована классическая микросхема L293D? Конечно, может. И я бы даже добавил, что использование pull-down резисторов для L293D будет вполне оправдано.

 

фототранзистор

У фототранзистора эмиттер
(на схеме со стрелкой)
длиннее коллектора.

На рисунке приведены монтажная и принципиальная схемы робота, и если Вы еще не очень хорошо знакомы с условными обозначениями, то, исходя из двух схем, несложно понять принцип обозначения и соединения элементов. Провод, соединяющий различные части схемы с "землей" (отрицательным полюсом источника питания), обычно не изображают полностью, а на схеме рисуют небольшую черточку, обозначающую, что это место соединяется с "землей". Иногда рядом с такой черточкой пишут три буквы "GND", что означает "землю" (ground). Vcc обозначает соединение с положительным полюсом источника питания. Вместо букв Vcc часто пишут +5V, показывая тем самым напряжение источника питания.


Драйвер двигателей L293D
производства SGS-THOMSON Microelectronics
(
ST Microelectronics).

драйвер двигателей L293D

 

Купить

Робототехника: роботы, комплектующие для робототехники, Квадрокоптеры

Принцип действия схемы робота очень простой. Когда на фототранзистор PTR1 упадет луч света, то на входе INPUT1 микросхемы драйвера двигателей появится положительный сигнал и мотор M1 начнет вращаться. Когда фототранзистор перестанут освещать, сигнал на входе INPUT1 исчезнет, мотор перестанет вращаться и робот остановится.
Чтобы скомпенсировать проходящий через фототранзистор ток, в схему введен резистор R1, номинал которого можно выбрать около 200 Ом. От номинала резистора R1 будет зависеть не только нормальная работа фототранзистора, но и чувствительность робота. Если сопротивление резистора будет большим, то робот будет реагировать только на очень яркий свет, если - небольшим, то чувствительность будет более высокой. В любом случае не следует использовать резистор с сопротивлением менее 100 Ом, чтобы предохранить фототранзистор от перегрева и выхода из строя.

Сделать робота, реализующего реакцию фототаксиса (направленного движения к свету или от света), можно с использованием двух фотосенсоров.

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

робот, движущийся на свет






Как сделать робота - схема робота №2

Принципиальная схема робота с двумя фототранзисторами


Схема робота симметричная и состоит из двух частей, каждая из которых управляет соответствующим электромотором. По сути, она является как бы удвоенной схемой предыдущего робота. Фотосенсоры следует располагать крест-накрест по отношению к электромоторам так, как показано на рисунке робота выше. Также можно расположить моторы крест-накрест относительно фотосенсоров так, как показано на монтажной схеме ниже.

 

Как сделать робота - схема простейшего робота, движущегося на свет

 

Монтажная схема простейшего робота с двумя фототранзисторами



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

движущийся робот, уклоняющийся от светаСделать поведение робота более живым можно, подав на входы INPUT2 и INPUT3 положительный сигнал (подключить их к плюсу источника питания): робот будет двигаться при отсутствии падающего на фотосенсоры света, а "увидев" свет, будет поворачивать в сторону его источника.

Чтобы сделать робота, "бегающего" за рукой, нам понадобятся два ярких светодиода (на схеме LED1 и LED2). Подключим их через резисторы R1 и R4, чтобы скомпенсировать протекающий через них ток и предохранить от выхода из строя. Расположим светодиоды рядом с фотосенсорами, направив их свет в ту же сторону, в которую ориентированы фотосенсоры, и уберем сигнал с входов INPUT2 и INPUT3.

Как сделать робота - схема робота №3

Схема робота, движущегося на отраженный свет



робот, движущийся за рукойЗадача получившегося робота - реагировать на отраженный свет, который излучают светодиоды. Включим робота и поставим ладонь перед одним из фотосенсоров. Робот повернет в сторону ладони. Переместим ладонь немного в сторону так, чтобы она скрылась из поля "зрения" одного из фотосенсоров, в ответ робот послушно, как собачка, повернет за ладонью.
Светодиоды следует подбирать достаточно яркие, чтобы отраженный свет устойчиво улавливался фототранзисторами. Хороших результатов можно достичь при использовании красных или оранжевых светодиодов с яркостью более 1000 мКд.

Если робот реагирует на вашу руку только тогда, когда она почти касается фотосенсора, то можно попробовать поэкспериментировать с листочком белой бумаги: отражающие способности белого листа намного выше, чем у человеческой руки, и реакция робота на белый листок будет намного лучше и устойчивее.

Белый цвет обладает самыми высокими отражающими свойствами, черный - наименьшими. Основываясь на этом, можно сделать робота, следующего по линии. Сенсоры при этом следует расположить так, чтобы они были направлены вниз. Расстояние между сенсорами должно быть немного больше, чем ширина линии.

робот, движущийся по линииCхема робота, следующего по черной линии, идентична предыдущей. Чтобы робот не терял черную линию, нарисованную на белом поле, ее ширина должна быть около 30 мм или шире. Алгоритм поведения робота достаточно прост. Когда оба фотосенсора улавливают отраженный от белого поля свет, робот движется вперед. Когда один из сеносоров заезжает на черную линию, соответствующий электромотор останавливается и робот начинает поворачиваться, выравнивая свое положение. После того как оба сенсора снова находятся над белым полем, робот продолжает свое движение вперед.

Примечание:
На всех рисунках роботов микросхема драйвера двигателей L293D показана условно (только управляющие входы и выходы).

ПРОГРАММИРОВАНИЕ МИКРОКОНТРОЛЛЕРОВ AVR


    Для микроконтроллеров AVR существуют различные языки программирования, но, пожалуй, наиболее подходящими являются ассемблер и Си, поскольку в этих языках в наилучшей степени реализованы все необходимые возможности по управлению аппаратными средствами микроконтроллеров.

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

 

Компиляторы

 


    Чтобы преобразовать исходный текст программы в файл прошивки микроконтроллера, применяют компиляторы.

    Фирма Atmel поставляет мощный компилятор ассемблера, который входит в среду разработки AVR Studio, работающую под Windows. Наряду с компилятором, среда разработки содержит отладчик и эмулятор.
AVR Studio совершенно бесплатна и доступна на сайте Atmel.
Atmel AVR Studio
    В настоящее время представлено достаточно много компиляторов Си для AVR. Самым мощным из них считается компилятор фирмы IAR Systems. Именно ее сотрудники в середине 90-х годов участвовали в разработке системы команд AVR. IAR C Compiler имеет широкие возможности по оптимизации кода и поставляется в составе интегрированной среды разработки IAR Embedded Workbench (EWB), включающей в себя также компилятор ассемблера, линкер, менеджер проектов и библиотек, а также отладчик. Цена полной версии пакета составляет 2.820 EUR.

    Фирмой Image Craft выпускается компилятор языка Си, получивший достаточно широкую популярность. Image Craft C Compiler обладает неплохим уровнем оптимизации кода и достаточно низкой ценой (от $199 до $749 в зависимости от версии).

    Не меньшую популярность завоевал Code Vision AVR C Compiler, цена полной версии этого компилятора невысока и составляет 150 EUR. Компилятор поставляется вместе с интегрированной средой разработки, в которую, помимо стандартных возможностей, включена достаточно интересная функция - CodeWizardAVR Automatic Program Generator. Наличие в среде разработки последовательного терминала позволяет производить отладку программ с использованием последовательного порта микроконтроллера.

WinAVR    Поистине культовой стала интегрированная среда разработки WinAVR. Она включает мощные компиляторы Си и ассемблера, программатор AVRDUDE, отладчик, симулятор и множество других вспомогательных программ и утилит. WinAVR прекрасно интегрируется со средой разработки AVR Studio от Atmel. Ассемблер идентичен по входному коду ассемблеру AVR Studio. Компиляторы Си и ассемблера имеют возможность создания отладочных файлов в формате COFF, что позволяет применять не только встроенные средства, но и использовать мощный симулятор AVR Studio. Еще одним немаловажным плюсом является то, что WinAVR распространяется свободно без ограничений (производители поддерживают GNU General Public License). В качестве резюме стоит сказать, что WinAVR является идеальным выбором для тех, кто начинает осваивать микроконтроллеры AVR. Именно эта среда разработки и рассматривается в качестве основной в данном курсе.

ПРОСТОЙ ПРОГРАММАТОР AVR :: AVRDUDE

 

Для того чтобы запрограммировать ("прошить") микроконтроллер, необходим программатор. Программатор представляет собой программно-аппаратный комплекс, состоящий непосредственно из устройства, связывающего микроконтроллер с компьютером, и программы, которая этим устройством управляет. Программатор заносит подготовленную для микроконтроллера программу в его память. Наиболее распространенным способом программирования для AVR является внутрисхемное программирование (функция ISP - in-cirсuit serial programming) через коммуникационный интерфейс SPI. Этой возможностью обладают все микроконтроллеры AVR, кроме Tiny11 и Tiny28. Данный режим удобен тем, что позволяет программировать AVR, расположенный в готовом устройстве, то есть вам не нужно вытаскивать микроконтроллер из платы каждый раз, когда вы хотите его перепрограммировать.

Интерфейс SPI



Интерфейс SPI (Serial Peripheral Interface) представляет собой 3 линии: SCK, MISO и MOSI.

SCK (SPI ClocK)
Тактовый сигнал, который программатор формирует на линии SCK.
MOSI (Master Out, Slave In - вход ведомого, выход ведущего)
Линия передачи данных от программатора (ведущий), к программируемому микроконтроллеру (ведомый). Во время каждого импульса на линии SCK передается один бит от программатора к программируемому микроконтроллеру по линии MOSI.
MISO (Master In, Slave Out - выход ведомого, вход ведущего)
Линия передачи данных от программируемого микроконтроллера (ведомый) к программатору (ведущий). По каждому импульсу на линии SCK передается один бит от микроконтроллера к программатору по линии MISO.
Для обеспечения нормальной связи по трем SPI линиям необходимо соединить общую землю (GND) на программаторе и программируемом устройстве.
Для входа и нахождения в режиме последовательного программирования используется линия сброса (RESET). Она должна удерживаться в активном состоянии (низкий уровень) во время программирования AVR. Также при стирании чипа на линии RESET должен быть сформирован импульс в конце цикла стирания.
Кроме того, может использоваться вывод контроллера XTAL1 для тактировки контроллера программатором при отсутствии кварцевого резонатора.
При программировании AVR программатор всегда функционирует как ведущее устройство, а микроконтроллер как ведомое.

Программная часть


В интернет можно найти множество программ, работающих с теми или иными типами устройств для программирования микроконтроллеров AVR. Большинство из этих программ совершенно бесплатны.

AVRDUDE


В состав пакета WinAVR входит мощная утилита AVRDUDE. Она позволяет загружать программы и данные в память микроконтроллера, а также считывать их оттуда. AVRDUDE использует SPI-интерфейс. Существуют версии для Windows и Linux. Первоначальный код был написан Брайеном Дином (Brian S. Dean) и имел название avrprog.
AVRDUDE может использоваться через командную строку, чтобы читать или записать все типы памяти кристалла, или при помощи графического интерфейса. Использование AVRDUDE из командной строки удобно для полного программирования всей памяти кристалла, в то время как графический интерфейс полезен для исследования содержания памяти, изменения отдельных байтов EEPROM, fuse и lock битов и т.д.
AVRDUDE поддерживает множество типов программирующих устройств, работающих как через интерфейс параллельного (LPT) порта, так и через последовательный (COM) порт, и может быть сконфигурирован для использования практически с любым LPT-устройством.

AVReAl
Предназначен для программирования AVR с использованием SPI-интерфейса. Отличается простотой использования и поддерживает несколько основных типов популярных простых программаторов, подключаемых к параллельному порту (LPT). Существуют версии для DOS и Windows (существует версия и для Linux). Во всех вариантах запускается только из командной строки с необходимыми ключами, графический интерфейс отсутствует. Написан Александром Редчуком. Сайт программы: http://ln.com.ua/~real/avreal/

IcProg
Поддерживает полтора десятка популярных LPT-программаторов, в том числе самых простых. Осуществляет программирование кристалов через SPI. Имеет удобный графический интерфейс, переведенный на русский язык. Автор Bonny Gijzen. Свободно распространяется в Интернете на сайте http://www.ic-prog.com/.

PonyProg
Свободная GNU-утилита с открытым исходным кодом для программирования Flash-микросхем с последовательным доступом. PonyProg написан Клаудио Ланконелли (Claudio Lanconelli) и существует в Windows и Linux версиях. Имеет поддержку русского языка. Может использовать стандартный последовательный порт (COM) или параллельный (LPT) порт. Поддерживает ряд популярных программаторов.

 

 

Купить

Робототехника: роботы, комплектующие для робототехники, Квадрокоптеры

Настройка AVRDUDE


В Windows 2000 и Windows XP запрещена прямая работа с параллельным (LPT) портом, поэтому для нормальной работы AVRDUDE необходимо установить драйвер giveio.sys.

Для установки этого драйвера зайдите в папку WinAVR\bin и запустите файл install_giveio.bat (удалить драйвер из системы можно, запустив файл remove_giveio.bat).
В Windows 98 никаких специальных настроек не требуется

 

 

Аппаратная часть

 

Простой программатор AVR

программатор stk200 (простая версия)

Схема простого программатора AVR

 

Разъем, подключаемый к параллельному порту ПК, показан со стороны пинов Один из самых простых программаторов состоит из 25-контактного разъема для параллельного (LPT) порта, 4-х резисторов (150 Ом) и соединительного кабеля, длина которого не должна превышать 1,5 метра. Резисторы необходимы для предохранения параллельного порта в случае неправильного монтажа и некоторых других неприятностей. Схема получила свое название от отладочных плат Atmel для быстрого начала работы с микроконтроллерами AVR. Если вы хотите, чтобы ваш программатор почти в точности соответствовал классическому программатору STK200, то следует поставить перемычку для определения программатора программным обеспечением (для AVRDUDE не обязательно). Перемычка должна соединять выводы 2-12. Следует обратить внимание, что схема не имеет промежуточного буфера и не имеет гальванической развязки по отношению к параллельному порту, поэтому во избежание вывода из строя параллельного порта подключать и отключать кабель следует при выключенном питании на плате, где установлен контроллер. Кроме того, когда программатор подключен к параллельному порту, следует избегать короткого замыкания его выводов.

 

 

ПЕРВЫЙ ПРОЕКТ НА МИКРОКОНТРОЛЛЕРЕ: схема и описание

Для того чтобы собрать схему для реализации примера, нам понадобятся:

Соберем все, как показано на принципиальной схеме.

Схема первого проекта на микроконтроллере

Принципиальная схема первого проекта на микроконтроллере.


Вывод GND соединим с "землей" (отрицательным полюсом источника питания). Вывод VCC соединим с положительным полюсом источника питания. Подсоединим катод ("минус") светодиода LED1 через компенсирующий резистор R1 к "земле" (отрицательному полюсу источника питания), а анод ("плюс") - к любому выводу порта D микроконтроллера (на схеме - PD0).
Микроконтроллер будет тактироваться от внутреннего генератора тактовых импульсов. ATmega8 выпускаются с предустановками на работу от внутреннего генератора, настроенного на частоту 1 мегагерц (МГц).

Схема соединения элементов первого проекта на микроконтроллере

 



Подключим RESET (PC6), SCK (PB5), MISO (PB4), MOSI (PB3) и общий провод (GND) к предварительно собранному программатору (описание программатора см. в предыдущей статье "Простой программатор AVR").  Перед подачей питания к схеме еще раз проверим правильность подключения всех элементов. Подключим программатор к параллельному (LPT) порту компьютера и только после этого подадим питание к схеме. Если ничего не загорелось и не задымилось, можно переходить к следующей части.
Запустим Programmers Notepad, откроем пример программы. Можно еще раз откомпилировать его командой Tools -> [WinAVR] Make All. После чего загрузим откомпилированный файл my_test.hex в память программ вашего микроконтроллера командой Tools -> [WinAVR] Make Program.
По окончании процесса внизу, в окне "Output", должно появиться сообщение об успешной загрузке:

 

/olim3/rob/ris/image025.gif



Отсоединим программатор (светодиод должен весело замигать).

Вы можете подсоединить несколько светодиодов таким же образом к другим выводам порта D (PD1-PD7) и наслаждаться мигающей гирляндой, пока не решите перейти к следующим опытам.

 

MAKEFILE И КОМПИЛЯЦИЯ ПРОГРАММЫ

 

 

Исходный текст программы

 

Сначала создадим на диске папку, где будут находиться файлы вашего проекта. Название папки любое, а вот место для нее желательно выбрать на том диске, куда установлен пакет WinAVR. Запустим редактор программиста Programmers Notepad [WinAVR], его ярлык должен остаться у вас на рабочем столе. В меню редактора выберем File -> New -> C/C++ и напишем программу на языке Си.

 

 

 
/************************************************
 
ПРИМЕР МИГАНИЯ СВЕТОДИОДАМИ :: 

MYROBOT.RU
 
*************************************************/
 
 
#define F_CPU 1000000UL  // 1 MHz
#include <avr/io.h>
#include <avr/delay.h>
 
int 

main(void)              

// начало основой программы
{
 
DDRD = 

0xff;            // все выводы порта D сконфигурировать как выходы
 
while (1) 

{              // Бесконечный цикл
 
PORTD = 0xff; // установить "1" на всех линиях порта D
 
_delay_ms(250);   // Ждем 0.25 сек.
 
PORTD = 0x00;  // установить "0" на всех линиях порта D
 
_delay_ms(250);   // Ждем 0.25 сек.
 
}       

// закрывающая скобка бесконечного цикла
 
}      

// закрывающая скобка основной программы


Сохраним листинг программы в файл с именем "my_test.c" (каждый проект лучше сохранять в отдельной, специально созданной папке). Имя файла может быть любым без пробелов и иметь расширение ".c".

 

Создание файла Makefile


В WinAVR исходный текст программы компилируется при помощи утилиты make.exe, которая находится в папке WinAVR\utils\bin. Make.exe контролирует генерацию исполняемых файлов из исходного кода программы. Для управления работой этой утилиты используют make-файлы. Make-файл сообщает компилятору, какие команды запускать, какие файлы компилировать и линковать, какой выходной код генерировать и т. д.  После установки WinAVR в папке WinAVR\sample можно найти шаблон с именем Makefile, который нужно скопировать в папку с проектом и уже там редактировать.
Внимание: Makefile и компилируемый файл должны находиться в одной папке.
Откроем Makefile в редакторе Programmers Notepad и отредактируем несколько важных для компилятора инструкций.
Во-первых, обязательно нужно указать, для какого типа микроконтроллера мы хотим получить выходной код. Найдем следующие строки:
# MCU name
MCU = atmega128
Первая строка - комментарий, а во второй вместо atmega128 пишем тот микроконтроллер, который нас интересует (например, atmega8, attiny2313, attiny26).
Частота тактирования микроконтроллера в герцах определяется в строках:
# Processor frequency.
F_CPU = 8000000
Вместо 8000000 напишем 1000000, что будет составлять 1 мегагерц (1 МГц).
Должно получиться так:
# Processor frequency.
F_CPU = 1000000
Имя проекта, а соответственно и имя исходного файла с функцией main и выходные файлы с расширениями hex и cof, определяется в следующих строках:
# Target file name (without extension).
TARGET = testpp
Здесь вместо testpp пишем нужное имя проекта (в нашем случае my_test).
Ищем строки:
# List C source files here. (C dependencies are automatically generated.)
SRC =
После знака "равно" пишем $(TARGET).c, чтобы получилось
# List C source files here. (C dependencies are automatically generated.)
SRC = $(TARGET).c
Ищем строки:
# List C++ source files here. (C dependencies are automatically generated.)
CPPSRC = main.cpp
Стираем запись после знака "равно". Должно получиться:
# List C++ source files here. (C dependencies are automatically generated.)
CPPSRC =
В разделе Optimization level проверяем уровень оптимизации. Можно оставить все как есть (s - оптимизирует выходной файл по размеру).
# Optimization level, can be [0, 1, 2, 3, s].
# 0 = turn off optimization. s = optimize for size.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT = s
После этого, немного ниже, ищем раздел:
#---------------- Programming Options (avrdude) ----------------
Ищем строку:
AVRDUDE_PROGRAMMER = stk500
Заменяем на:
AVRDUDE_PROGRAMMER = stk200
В дальнейшем в курсе "Шаг за шагом" мы будем использовать упрощенный вариант программатора stk200.
Ищем строку:
AVRDUDE_PORT = com1     # programmer connected to serial device
Заменяем на:
AVRDUDE_PORT = lpt1
Программатор stk200 использует параллельный порт (lpt).
Вы можете использовать более удобный шаблон в котором часто изменяемые опции вынесены в начало файла. В простейшем случае для использования этого Makefile'а достаточно скопировать его в папку с проектом и изменить строки в разделе "ОСНОВНЫЕ ИНСТРУКЦИИ". Кроме того, в состав пакета WinAVR входит утилита MFile, которая помогает правильно составить или отредактировать Makefile. Запустить утилиту можно через меню "Пуск -> Программы -> WinAVR -> MFile [WinAVR]"

Компиляция программы


Откройте в редакторе Programmers Notepad исходный текст программы my_test.c, в меню выберете Tools -> [WinAVR] Make All. Команда Make All выполняет компиляцию исходного кода программы и в случае отсутствия ошибок генерирует файл, который можно прошивать в микроконтроллер AVR.

Внизу, в окне "Output", должно появиться сообщение об успешной компиляции:

/olim3/rob/ris

А в папке вашего проекта должны появиться следующие файлы:

/olim3/rob/ris

Самым главным из этих файлов для нас будет файл my_test.hex. В нем хранится шестнадцатиричный код для загрузки в память программ (Flash ROM) микроконтроллера.

:1000000012C02BC02AC029C028C027C026C025C0C6
:1000100024C023C022C021C020C01FC01EC01DC0DC
:100020001CC01BC01AC011241FBECFE5D4E0DEBF28
:10003000CDBF10E0A0E6B0E0E0E8F0E002C005903F
:100040000D92A036B107D9F710E0A0E6B0E001C0EC
:100050001D92A036B107E1F701C0D2CFCFE5D4E0C1
:10006000DEBFCDBF8FEF81BB282FE0E0F0E022BBE9
:10007000CF010197F1F712BACF010197F1F7F7CF4E
:00000001FF

В файле my_test.eep хранится шестнадцатиричный код для загрузки в энергонезависимую память данных (EEPROM).
Следует помнить, что после каждого изменения кода программа должна быть перекомпилирована, т.е. в редакторе Programmers Notepad выполнено Tools -> [WinAVR] Make All.
Если проект будет состоять из нескольких файлов и в одном из них что-то изменили, то при повторной компиляции будет компилироваться только измененный файл. Для полной перекомпиляции необходимо вначале выполнить команду Tools -> [WinAVR] Make Clean, а затем команду [WinAVR] Make All. Команда Make Clean удаляет все файлы, сгенерированные предыдущей командой Make All.

Купить

Робототехника: роботы, комплектующие для робототехники, Квадрокоптеры

ПРОСТОЙ РОБОТ НА МИКРОКОНТРОЛЛЕРЕ (Часть 1)

 

 

Простого робота на микроконтроллере можно собрать на основе драйвера управления двигателями и непосредственно самого микроконтроллера. В качестве драйвера двигателей используем микросхему L293D, входы которой подсоединим к выводам микроконтроллера так, как показано на схеме. В данном примере будет рассмотрен микроконтроллер ATmega8, хотя можно использовать и другой микроконтроллер (например, ATtiny26 или какой-либо микроконтроллер из семейства Mega).

Схема простого робота на микроконтроллере AVR

 

Схема робота на микроконтроллере AVR

В приведенной схеме рекомендуется использовать электродвигатели с током потребления до 150 мА и напряжением питания 3-5 В. При использовании более мощных моторов рекомендуется применить раздельное питание электронной схемы и электродвигателей, а также предусмотреть меры по стабилизации работы микроконтроллера. На схеме робота входы драйвера двигателей L293D подключены к выводам порта C микроконтроллера ATmega8, но их можно подключить к любому из портов микроконтроллера (при этом будет необходимо внести изменения в программную часть, указав порт и непосредственно его выводы в соответствующих строках программы, приводимой ниже). Электролитический конденсатор C3 (1000 мкф, 10-25 в.) необходим для того, чтобы сгладить броски по питанию, вызванные работой моторов. Этот конденсатор очень важен. Именно он дает возможность работать схеме с необходимым уровнем стабильности. Вместо одного конденсатора можно использовать два. Номинал каждого из них в этом случае может быть около 470 мкф. При этом один из конденсаторов устанавливают в непосредственной близости от выводов питания микроконтроллера, а второй - рядом с выводом Vs микросхемы драйвера моторов L293D. Обеспечение стабилизации питания - один из важнейших аспектов проектирования устройств на микроконтроллерах. Для того чтобы еще больше стабилизировать работу микроконтроллера, хорошим решением может служить керамический конденсатор емкостью около 0,1 мкф, подсоединенный между выводами питания VCC, GND (ножки 7 и 8) и располагающийся в непосредственной близости от них (на схеме не указан). Механическая схема рассматриваемого робота должна быть собрана по "танковому" принципу: левый мотор передает движение на левое колесо, правый - на правое. По-другому такая механическая схема называется схемой с двумя ведущими колесами.

/olim3/rob/ris
Для того чтобы собранный робот "ожил", напишем для него программу. Откомпилируем ее и загрузим в микроконтроллер.

 

А что мне добавить в схему в первую очередь, если я захочу сделать ее более защищенной?
Начни с цепи сброса, о которой мы только что говорили. Подключи внешний подтягивающий резистор номиналом от 4,7 до 10 кОм так, как показано на следующем рисунке,

 и подключи вывод "аналогового" питания AVCC. Схема при этом усложнится не намного.

 

/olim3/rob/ris


Кроме того, чтобы избежать проблем с наводками от работающих электродвигателей,

подсоедини непосредственно к каждому из них керамический конденсатор номиналом 0,1 мкф.

/olim3/rob/ris/image031.gif


А каким образом я должен подключить микроконтроллер, чтобы быть абсолютно уверенным в своем устройстве?

Абсолютно уверенным быть ни в чем нельзя (Бобот с сожалением посмотрел на свою беспричинно погасшую трубку).

Но вот обеспечить некоторые меры, чтобы работа устройства была приближена к уровню стабильности промышленной автоматики, вполене можно.

 

Питание микроконтроллеров AVR и тактовая частота. Подключение питания
к микроконтроллеру AVR. Снижение риска непреднамеренного сброса.
Микроконтроллер в схеме с электромоторами.

Микроконтроллеры AVR второго поколения имеют улучшенную защиту от кратковременных (brown-out) и полных (black-out) просадок питания. Кроме того, они имеют low-pass фильтр, чтобы устранить пики и шум, которые могли бы вызвать сброс микроконтроллера. Также все микроконтроллеры AVR второго поколения имеют встроенный резистор, который "подтягивает" RESET к питанию. Номинал встроенного pull-up резистора калибруется на заводе Atmel таким образом, чтобы обеспечить максимально устойчивую работу чипа.

Но, как бы ни были устойчивы AVR сами по себе, часто стоит предпринять дополнительные меры по стабилизации их работы.

 

Питание микроконтроллеров AVR и тактовая частота


Существует два основных типа микроконтроллеров AVR. Первый из них предназначен для получения максимального быстродействия при высокой частоте, второй - для экономичной работы на небольших тактовых частотах. Маркировка микросхем второго типа отличается от первого тем, что на конце добавляется буква "L". Например, ATtiny26 и ATtiny26L, ATmega8 и ATmega8L. Микроконтроллеры первой группы допускают питание в диапазоне от 4,5 до 5,5 вольт при тактовой частоте 0...16 МГц (для некоторых моделей - до 20 МГц, например ATtiny2313-20PU или ATtiny2313-20PI), вторые - соответственно 2,7...5,5 вольт при частоте 0...8 МГц (для большинства моделей, у некоторых моделей диапазон может быть уже). Ток потребления у них также различается: микроконтроллеры с индексом "L" потребляют меньше электроэнергии. Существуют также микроконтроллеры с возможностью понижения питания до 1.8 В, которые обычно маркируются буквой "V", например ATtiny2313V. При понижении питания соответствующим образом должна быть снижена и тактовая частота. Для ATtiny2313V при питании 1,8...5,5 В частота должна находиться в интервале 0...4 МГц, при питании 2,7...5,5 В - в интервале 0...10 МГц. Для создания экспериментальных роботов подойдут микроконтроллеры любой группы. К тому же, если вы, например, захотите поставить ATmega8 в схему с питанием 3 вольта и запустить его на невысокой тактовой частоте, то ничего страшного не произойдет: в таком режиме он будет успешно работать. Единственное, что нельзя будет гарантировать, так это устойчивый запуск микроконтроллера при крайних значениях температур, да и ток потребления будет выше, чем у ATmega8L. Таким образом, мы можем говорить, что если требуется максимальное быстродействие, то надо ставить ATtiny26 или ATmega8 и повышать тактовую частоту до 8...16 МГц при питании 5 В. Если важнее всего экономичность вашего робота, то лучше применить ATtiny26L или ATmega8L и понизить частоту и питание. Хорошим вариантом во втором случае может быть питание от трех пальчиковых аккумуляторов по 1,2 В, что в сумме дает 3,8 В или от трех алкалиновых батарей по 1,5 В, что в сумме даст 4,5 В.  Хотя указывается максимальное рекомендуемое напряжение в 5,5 В, тем не менее на практике очень часто используют напряжение питания 6 В: микроконтроллер AVR можно запитать от четырех батарей по 1,5 В. Это удобно также в тех случаях, когда не используется раздельное с моторами питание. При этом стоит учитывать, что чем выше частота, тем выше потребление энергии, а соответственно, и нагрев микросхемы. Т. е. в данном случае лучше не запускать микроконтроллер на крайнем значении тактовой частоты. Стоит также учитывать, что максимальный ток через выводы GND, VCC не должен превышать 200 мА.

 

 

/olim3/rob/ris/image032.gif

Чтобы сгладить возможные броски напряжения, особенно в схемах с общим питанием для микросхем и моторов, параллельно питающим линиям включают электролитический конденсатор 100-1000 мкф (C1), который обычно дополняют керамическим конденсатором около 0,1 мкф (C2) для фильтрации высокочастотных и среднечастотных помех (точный номинал этого конденсатора можно расчитать только тогда, когда точно известна паразитная частота).

 

/olim3/rob/ris/image033.gif


Кроме того, чтобы развязать питание моторов и микросхем, в положительную линию питания микроконтроллера включают диод, например, 1N4001 или 1N4004.

В экспериментальной и hobby-робототехнике часто применяют сборки батарей с напряжением 9 В и даже 12-вольтовые аккумуляторы. В этих случаях ставят пятивольтовый стабилизатор положительного напряжения КР142ЕН5А или его зарубежный аналог 7805.




/olim3/rob/ris/image034.gif

Подключение питания к микроконтроллеру AVR



Среди микроконтроллеров AVR существуют микросхемы, имеющие двойное питание: "цифровое" (выводы VCC и GND) и "аналоговое" (AVCC и AGND,

который часто обозначают просто GND). К таким микросхемам относятся, например, ATmega8 и ATtiny26.

 В стандартном включении выводы VCC и AVCC закорачивают между собой.

/olim3/rob/ris/image035.gif

Выводы GND уже замкнуты внутри микроконтроллера через сопротивление 0,7 Ом, и их обычно просто соединяют с "землей". Керамические конденсаторы С1 и С2 емкостью 0,1 мкф располагают максимально близко от "своих" по схеме выводов. Если у микроконтроллера AVR нет вывода AVCC, то, вместо двух, ставят один конденсатор. На практике так часто поступают и для микросхем с двойным питанием. Если используется встроенный аналогово-цифровой преобразователь (АЦП), то вывод AVCC подключают к напряжению питания VCC через резистор около 100 Ом. Кроме того, для уменьшения помех применяют последовательный LC-фильтр для питания. Номинал индуктивности L1 может лежать в диапазоне 30...47 мкГн. Танталовый конденсатор C1 - 4,7 мкф

.

Снижение риска непреднамеренного сброса


Как уже говорилось выше, линия RESET имеет внутренний резистор привязки к шине питания для увеличения помехозащищенности, который калибруется на фабрике при изготовлении микроконтроллера. Кроме того, микроконтроллеры AVR второго поколения имеют улучшенную защиту от кратковременных (brown-out) и полных (black-out) просадок питания. Исходя из этого в простых схемах на AVR иногда обходятся без дополнительных мер по отношению к выводу RESET и даже оставляют его висящим в "воздухе. Такой подход может быть применим для экспериментального макетирования и любительских самоделок, но в промышленной автоматике может приводить к сбоям при помехах по питанию. В условиях сильных внешних помех сопротивление этого резистора (100-500 кОм) оказывается слишком большим, и при отсутствии на линии RESET сигнала высокого уровня может происходить случайный сброс микроконтроллера.

Купить

Робототехника: роботы, комплектующие для робототехники, Квадрокоптеры

/olim3/rob/ris/image036.gif

/olim3/rob/ris/image037.gif

/olim3/rob/ris/image038.gif

Существует несколько способов снижения риска непреднамеренного сброса. Один из самых простых - это подключить к линии RESET внешний подтягивающий резистор с рекомендуемым значением сопротивления от 4,7 до 10 кОм.
Для дополнительной защиты линии RESET от внешних помех рекомендуется также шунтировать ее на землю с помощью внешнего конденсатора емкостью около 0,1 мкф. Но при этом необходимо помнить, что вход внешнего сброса RESET может использоваться однопроводным интерфейсом debugWIRE при отладке программного обеспечения микроконтроллера. Наличие конденсатора, подключенного параллельно входу RESET, будет приводить к сбоям в работе этого интерфейса. Поэтому, если планируется отлаживать микроконтроллер на целевой плате с помощью debugWIRE, необходимо предусмотреть перемычку, чтобы отключать этот конденсатор на время отладки прикладного программного обеспечения.

 

Для поддержки режима высоковольтного программирования микроконтроллеры AVR не имеют стандартного внутреннего диода для защиты от избыточного напряжения на входе RESET. Поэтому, если высоковольтное программирование не используется, для защиты от помех рекомендуется подключать внешний диод, например 1N4148 между линией RESET и шиной питания микроконтроллера. Таким образом, типовая схема внешней "обвязки" для линии RESET будет выглядеть следующим образом.
Если же линия сброса не используется и внутрисхемное программирование не требуется, то в законченном устройстве вывод RESET может быть присоединен непосредственно к шине питания микроконтроллера.

 

 

 

 

Кнопка "Сброс"

 

/olim3/rob/ris/image039.gif

При отладке сложных программ может понадобиться осуществление принудительного сброса микроконтроллера. В этом случае удобно добавить в схему кнопку сброса, замыкание контактов которой будет подавать сигнал низкого уровня на вход RESET. Кнопку сброса обычно подключают вместе со стандартной RC-цепочкой.

Контакты кнопки при внутрисхемном программировании должны обязательно находиться в разомкнутом состоянии.


Микроконтроллер в схеме с электромоторами

 

 

/olim3/rob/ris/image031.gif

Для того чтобы снизить помехи от "искрящих" цепей электродвигателей, параллельно двигателям включают керамические конденсаторы 0,01...0,1 мкф. Конденсаторы располагают непосредственно на самих контактах двигателей.

 

/olim3/rob/ris/image040.gif

Дополнительной мерой может служить шунтирование каждого контакта электродвигателя на его корпус или на "землю".
Емкость керамических конденсаторов С2 и С3 в этом случае также может лежать в диапазоне 0,01...0,1 мкф

 

/olim3/rob/ris/image041.gif

При установке микроконтроллера в непосредственной близости от двигателей следует позаботиться о снижении риска возможных наводок на внешние цепи AVR. Так, цепь внешнего тактирования может служить транзитным путем для наводок. Чтобы устранить возможные сбои, рекомендуется конденсаторы С1 и С2 устанавливать как можно ближе к выводам XT1 и XT2, а их "земляные" обкладки подключать непосредственно к выводу GND микроконтроллера короткими проводниками. Кроме того, рекомендуется корпус кварцевого резонатора Q1 припаивать коротким проводом к цепи GND. Еще большую безопасность может обеспечить экранирующий контур на печатной плате вокруг кварцевого резонатора и конденсаторов.

 

 

/*******************************************************

ПРИМЕР 1 :: ВРАЩЕНИЕ МОТОРАМИ ВПЕРЕД-НАЗАД :: MYROBOT.RU

********************************************************/

 

#define F_CPU 1000000UL  // указываем частоту в герцах

 

#include <avr/io.h>

#include <util/delay.h>

 

int main(void) // начало основной программы

{

 

DDRC = 0xff; // все выводы порта C сконфигурировать как выходы

 

while (1) {  // Бесконечный цикл

 

// ---------- вращаем моторы вперед 1 сек ----------

 

PORTC |= _BV(PC1); // установить "1" на линии 1 порта C

PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C

PORTC |= _BV(PC3); // установить "1" на линии 3 порта C

PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C

 

_delay_ms(1000); // ждем 1 сек.

 

// --------------------------------------------------

 

 

// ---------- вращаем моторы назад 1 сек ----------

 

PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C

PORTC |= _BV(PC2); // установить "1" на линии 2 порта C

PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C

PORTC |= _BV(PC4); // установить "1" на линии 4 порта C

 

_delay_ms(1000); // ждем 1 сек.

 

// --------------------------------------------------

 

 

} // закрывающая скобка бесконечного цикла

 

} // закрывающая скобка основной программы


Отсоединив программатор, проверим направление вращения колес робота.

Если моторы вращают колеса в противоположные стороны, поменяйте местами их выводы.

Следующим шагом будет создание программы, реализующей поворот на необходимый угол остановкой одного из моторов.

 

/***************************************************

ПРИМЕР 2 :: ДВИЖЕНИЕ ПРЯМО С ПОВОРОТОМ :: MYROBOT.RU

****************************************************/

 

#define F_CPU 1000000UL  // указываем частоту в герцах

 

#include <avr/io.h>

#include <util/delay.h>

 

int main(void) // начало основной программы

{

 

DDRC = 0xff; // все выводы порта C сконфигурировать как выходы

 

while (1) {  // Бесконечный цикл

 

// ---------- вращаем моторы вперед 1 сек ------------

 

PORTC |= _BV(PC1); // установить "1" на линии 1 порта C

PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C

PORTC |= _BV(PC3); // установить "1" на линии 3 порта C

PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C

 

_delay_ms(1000); // ждем 1 сек.

 

// ----------------------------------------------------

 

 

// ---------- останавливаем мотор M2 на 0,5 сек ------

 

PORTC |= _BV(PC1); // установить "1" на линии 1 порта C

PORTC |= _BV(PC2); // установить "1" на линии 2 порта C

 

_delay_ms(500); // ждем 0,5 сек.

 

// ----------------------------------------------------

 

 

} // закрывающая скобка бесконечного цикла

 

} // закрывающая скобка основной программы


Изменяя время задержки, попробуйте добиться поворота на прямой угол так, чтобы траектория движения робота напоминала квадрат.
Для более быстрого разворота робота можно использовать реверс (вращение в противоположную сторону) одного из моторов.

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

 

ПРОСТОЙ РОБОТ НА МИКРОКОНТРОЛЛЕРЕ (Часть 2)

 

Робот с фотодатчиком для следования по линии

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

Принцип работы датчика границы основан на свойстве поверхностей по-разному отражать падающий на них свет. Черные или темные поверхности отражают свет намного хуже, чем белые или светлые. Улавливая отраженный свет, мы сможем определить тип поверхности, находящейся под датчиком.

Устройство фотодатчика, реагирующего на отраженный свет.Для изготовления датчика границы нам понадобятся фототранзистор и яркий светодиод. На приведенном рисунке изображена конструкция датчика. Светодиод и фототранзистор направлены в сторону исследуемой поверхности. Расстояние до поверхности зависит от силы свечения светодиода и чувствительности фототранзистора. Обычно оптимальное расстояние равно 1-1,5 см. Расстояние между светодиодом и фототранзистором не следует делать слишком большим: хорошим выбором может стать зазор в 0,5-1 см. В некоторых случаях, чтобы предотвратить срабатывание фототранзистора от прямого света, излучаемого светодиодом, между ними располагают непрозрачную шторку.Схема фотодатчика, реагирующего на отраженный свет. Свет от светодиода отражается от поверхности и улавливается фототранзистором. Если поверхность светлая, то отраженного света достаточно для открытия фототранзистора, в противном случае фототранзистор будет закрыт (не будет пропускать ток). Использование фототранзистора обусловлено тем, что скорость его срабатывания высока и достаточна даже при очень быстром движении робота. Использование фотодиодов также допустимо. Фоторезисторы имеют невысокую скорость срабатывания, и ее может быть недостаточно при высокой скорости движения робота. Схема датчика очень проста, состоит непосредственно из фототранзистора, светодиода и ограничивающих резисторов. При срабатывании фототранзистора на выходе формируется сигнал низкого уровня, который и подается на один из свободных входов микроконтроллера.

Схема робота с фотодатчиком.

Схема робота с фотодатчиком.

Купить

Робототехника: роботы, комплектующие для робототехники, Квадрокоптеры

В приведенной схеме рекомендуется использовать электродвигатели с током потребления до 150 мА и напряжением питания 3-5 В.

При использовании более мощных моторов рекомендуется применить раздельное питание электронной схемы и электродвигателей,

 а также предусмотреть меры по стабилизации работы микроконтроллера.

 

При использовании другого микроконтроллера (например, ATtiny26 и др.) внутренних подтягивающих резисторов микроконтроллера может

быть недостаточно для уверенного срабатывания датчика. В этом случае следует использовать

подтягивающий резистор при подключении фототранзистора. Если фототранзистор имеет хорошую чувствительность, номинал резистора может лежать в диапазоне 1,5К - 2,7К.

 

Рассмотрим программу, которая будет включать моторы,

если датчик находится над белой поверхностью, и выключать - если над черной.

 
/***********************************************************************
< pre style='text-align:center'>ПРИМЕР 3 :: ВРАЩЕНИЕ МОТОРАМИ С ИСПОЛЬЗОВАНИЕМ ФОТОДАТЧИКА :: MYROBOT.RU
************************************************************************/
 
#include <avr/io.h>
 
int main(void) // начало основной программы
{
 
DDRC = 0xff; // все выводы порта C сконфигурировать как выходы
DDRD = 0x00; // все выводы порта D сконфигурировать как входы
 
 
PORTD = 0xff; // установить "1" на всех выводах порта D,
// включаем подтягивающие 

резисторы
 
while (1) {  // Бесконечный цикл
 
// ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ ОТ 

ФОТОДАТЧИКА
 
if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
{
// ---------- вращаем моторы вперед 

----------
 
PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C
 
// 

--------------------------------------------------
}
else
{
// ---------- вращаем моторы назад 

----------
 
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
PORTC |= _BV(PC4); // установить "1" на линии 4 порта C
 
// 

--------------------------------------------------
}
 
 
} // закрывающая скобка бесконечного цикла
 
} // закрывающая скобка основной программы



Загрузим программу в микроконтроллер. После чего проверим работу датчика, поставив робота на белый лист бумаги, на котором нарисуем широкую черную линию. Изменяя расстояние между датчиком и поверхностью, добьемся уверенного срабатывания фототранзистора. При необходимости следует защитить фототранзистор от прямых лучей светодиода, установив между ними шторку, как уже говорилось выше. Расположение фототранзистора и светодиода будет оптимальным в том случае, если линза фототранзистора будет смотреть точно в центр светового "зайчика", отбрасываемого светодиодом на листе. Добившись уверенного срабатывания датчика, напишем программу для следования робота по линии. Алгоритм движения робота строится на следующем принципе. Когда датчик находится над белым полем, то робот поворачивается в правую сторону по направлению к черной линии. Когда датчик находится над черной линией, то робот поворачивается в левую сторону, съезжая с черной линии. Чередуя повороты по направлению к линии и от нее, робот движется вперед, следуя по границе белого и черного.

 

/****************************************************************
ПРИМЕР 4 :: ПРОСТЕЙШИЙ АЛГОРИТМ 

СЛЕДОВАНИЯ ПО ЛИНИИ :: MYROBOT.RU
*****************************************************************/
 
#include <avr/io.h>
 
int main(void) // начало основной программы
{
 
DDRC = 0xff; // все выводы порта C сконфигурировать как выходы
DDRD = 0x00; // все выводы порта D сконфигурировать как входы
 
 
PORTD = 0xff; // установить "1" на всех выводах порта D,
// включаем подтягивающие 

резисторы
 
while (1) {  // Бесконечный цикл
 
// ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ ОТ 

ФОТОДАТЧИКА
 
if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
{
// ---- включаем левый мотор, останавливаем 

правый -----
 
PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC |= _BV(PC4); // установить "1" на линии 4 порта C
 
// 

-----------------------------------------------------
}
else
{
// ---- останавливаем левый мотор, включаем 

правый -----
 
PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C
 
// 

-----------------------------------------------------
}
 
 
} // закрывающая скобка бесконечного цикла
 
} // закрывающая скобка основной программы



Для проверки и настройки робота, нарисуем на белом листе ватмана черную замкнутую линию шириной около 3-х см. Черную линию можно нарисовать тушью, баночки которой продаются практически в любом магазине канцтоваров. Поставим робота так, чтобы датчик находился над белым полем, а линия была справа от него. Включим питание. Робот должен начать двигаться, следуя всем изгибам трассы.
 При конструировании робота, следующего по линии и использующего вышеприведенный алгоритм движения, следует учесть расстояние между ведущими колесами и расстояние между датчиком и осевой линией ведущих колес. Чем больше первое и меньше второе, тем более размашистые движения будет совершать робот и тем выше будет общая скорость его движения. При этом будет повышаться риск того, что робот может переехать датчиком линию и таким образом потерять ее. Следует найти баланс между скоростью робота и уверенным следованием по линии. При использовании конструкции с небольшим расстоянием между ведущими колесами для повышения скорости движения робота может понадобиться введение в программу небольшой задержки, увеличивающей длительность поворотов, и тем самым оптимизирующей движение робота. Если вы решите принять участие в соревнованиях роботов "Следование по линии", то разрешите дать маленький совет: сделайте вокруг датчика небольшую светонепроницаемую бленду, чтобы исключить "засветку" датчика от бокового света. Ну и, конечно же, не пожалейте свежий комплект батарей для своего электронного спортсмена. Хорошее питание поможет ему быстрей прийти к финишу.

Желаем Вам успехов!

 

ПРОСТОЙ РОБОТ НА МИКРОКОНТРОЛЛЕРЕ (Часть 3)

 

 

 

 

Робот для соревнований.



Робот для соревнований КегельрингСледующим экспериментом с датчиком, реагирующим на отраженный свет, будет робот, движущийся в пределах области, ограниченной черной линией. Схема робота останется такой же, как во второй части статьи "Простой робот на микроконтроллере: Робот с фотодатчиком". Алгоритм, использованный в этом роботе, будет представлять собой следующую последовательность движений. Находясь на белом поле, робот будет двигаться вперед до тех пор, пока не наткнется на черную границу. Наткнувшись на линию, робот отъедет назад и повернется на небольшой угол. Затем алгоритм повторится.

 

 

 

 
/**********************************************************
ПРИМЕР 5 :: РОБОТ ДЛЯ СОРЕВНОВАНИЙ 

КЕГЕЛЬРИНГ :: MYROBOT.RU
***********************************************************/
 
#define F_CPU 1000000UL  // указываем частоту в герцах
 
#include <avr/io.h>
#include <util/delay.h>
 
int main(void) // начало основной программы
{
 
DDRC = 0xff; // все выводы порта C сконфигурировать как выходы
DDRD = 0x00; // все выводы порта D сконфигурировать как входы
 
 
PORTD = 0xff; // установить "1" на всех выводах порта D,
// включаем подтягивающие 

резисторы
 
while (1) {  // Бесконечный цикл
 
// ПРОВЕРЯЕМ СИГНАЛ НИЗКОГО УРОНЯ 

ОТ ФОТОДАТЧИКА
 
if (!(PIND & (1<<PIND1))) // проверить "0" на линии 1 порта D
{
// -------------- включаем моторы вперед 

---------------
 
PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
PORTC &= ~_BV(PC4); // установить "0" на линии 4 порта C
 
// 

-----------------------------------------------------
}
else
{
// ------------------ отъезд назад 

------------------
// -------- включаем моторы назад на 1,8 сек 

--------
 
PORTC &= ~_BV(PC1); // установить "0" на линии 1 порта C
PORTC |= _BV(PC2); // установить "1" на линии 2 порта C
PORTC &= ~_BV(PC3); // установить "0" на линии 3 порта C
PORTC |= _BV(PC4); // установить "1" на линии 4 порта C
 
_delay_ms(1800); // ждем 1,8 сек.
 
// 

--------------------------------------------------
 
// --------------------- поворот 

--------------------
//  правый мотор вперед, левый мотор 

стоп на 0,6 сек
 
PORTC |= _BV(PC1); // установить "1" на линии 1 порта C
PORTC &= ~_BV(PC2); // установить "0" на линии 2 порта C
PORTC |= _BV(PC3); // установить "1" на линии 3 порта C
 
_delay_ms(600); // ждем 0,6 сек.
 
// 

--------------------------------------------------
}
 
 
} // закрывающая скобка бесконечного цикла
 
} // закрывающая скобка основной программы

 

Данного робота можно использовать на соревнованиях "Кегельринг". Сделайте белый круглый ринг, ограниченный черной линией около 50 мм шириной (именно такая ширина ограничительной линии используется на соревнованиях "Кегельринг"). Внутренний диаметр круга - 1 метр. Ринг может быть сделан из листов белого ватмана. Расставьте в круге 8 кеглей (используйте в качестве кеглей пустые жестяные банки объемом 0,33 л. из-под напитков).

Кегельринг



Поставьте робота в центр ринга и включите. Объезжая ринг, робот начнет выталкивать банки одну за другой. Добейтесь такого угла поворота и длины отъезда робота, чтобы он не пропускал расставленные на ринге кегли. Наиболее выигрышной будет конструкция робота с установленным спереди заборником. Он необходим для того, чтобы робот "захватывал" попавшиеся ему на пути кегли. Заборник должен быть вынесен вперед относительно датчика настолько, чтобы робот, подъезжая к ограничительной линии, мог полностью вытолкнуть кеглю с ринга. Настройка робота для соревнований "Кегельринг" является увлекательнейшим занятием, а сами соревнования одними из самых азартных и зрелищных.

По материалам myROBOT




На главную













Радио для всех
©
Научно-популярный образовательный ресурс


Создать сайт бесплатно