Движущийся вдоль линии робот на микроконтроллере AVR ATmega16

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

Движущийся вдоль линии робот на микроконтроллере AVR ATmega16: внешний вид конструкции

Для обнаружения линии обычно используются инфракрасные сенсоры – они хорошо подходят для обнаружения (распознавания) белых или черных поверхностей. Но если вы будете использовать более сложные сенсоры, то вы можете сделать робота, который сможет следовать вдоль линии любого цвета. Робот должен распознавать линию даже если она поворачивает под каким то углом. Также он должен уметь останавливаться если встретит на линии зону остановки.

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

Также на нашем сайте можно прочитать про аналогичного робота, движущегося вдоль линии, реализованного на Arduino.

Принцип работы робота движущегося вдоль линии

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

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

Белая поверхность отражает инфракрасный свет

Черная поверхность поглощает инфракрасный свет
Внешний вид подобного инфракрасного сенсора показан на этом рисунке:

Внешний вид инфракрасного сенсора

Таким образом, мы будем использовать два инфракрасных сенсора чтобы проверять находится ли робот на пути вдоль линии, и два двигателя чтобы корректировать движение робота если он отклонится от этого маршрута. Поскольку эти двигатели требуют достаточно большого тока и должны быть двунаправленными (реверсивными) мы будем использовать драйвер мотора, например, L293D. Микроконтроллер будет нам необходим для управления двигателями основываясь на показаниях инфракрасных сенсоров. Упрощенные диаграммы этого процесса показаны на рисунках ниже.

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

Робот движется прямо

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

Робот должен повернуть влево

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

Робот должен повернуть вправо

Если оба сенсора обнаруживают черную линию, робот останавливается.

Робот должен остановиться

Необходимые компоненты

Микроконтроллер ATmega16
Батарейка или аккумулятор с напряжением 5 Вольт
Программатор AVR-ISP, USBASP или другой подобный
Двигатель постоянного тока (2 шт.)
Инфракрасный сенсор (2 шт.)
Драйвер мотора L293D
Шасси робота
Кварцевый генератор 16 МГц
Конденсатор 100 нФ (2 шт.)
Конденсатор 22 пФ (2 шт.)
Кнопка
Соединительные провода
Макетная плата

Работа схемы

Схема устройства приведена на следующем рисунке.

Движущийся вдоль линии робот на микроконтроллере AVR ATmega16: схема соединений

Инфракрасные сенсоры подключаются к PORTA микроконтроллера. Управляющие команды на драйвер мотора L293D подаются с PORTC микроконтроллера. Оба электродвигателя управляются при помощи драйвера L293D.

Исходный код программы на языке С (Си) с пояснениями

Мы постараемся сделать код программы настолько коротким насколько это возможно. Для этого мы будем использовать макросы (Macros) и регистры специальных функций.

if(bit_is_clear(PINA,leftSen)){ // проверить выключен ли левый сенсор

Это выражение проверяет находится ли контакт PA0 микроконтроллера, к которому подсоединен левый сенсор, в состоянии LOW или HIGH.

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

Условия, определяющие алгоритм движения робота

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

#include<avr/io.h>
#define leftSen PA0 // подсоединить левый сенсор к PA0
#define rightSen PA1 // подсоединить правый сенсор к PA1

int main(void)
{
DDRA=0xFC; // конфигурируем контакты PA0,PA1 на вход поскольку мы подсоединяем к ним сенсоры 0x0b11111100
DDRC=0xFF; // конфигурируем PortC на выход поскольку с его контактов мы будем управлять электродвигателями (с помощью драйвера мотора)

while(1)
{
PINA=0x03; // инициализируем PA0 и PA1
if(bit_is_clear(PINA,leftSen)){ // проверяем выключен ли левый сенсор (на нем 0)
if(bit_is_clear(PINA,rightSen)) { // проверяем выключен ли правый сенсор (на нем 0)
PORTC=0b00000000; // если на обоих сенсорах 0
} // останавливаем робота
else{
PORTC=0b00000001; // если на правом сенсоре 1 то поворачиваем вправо
}
}
else // проверяем если на левом сенсоре 1
{
if(bit_is_clear(PINA,rightSen)) { // проверяем если на правом сенсоре 0
PORTC=0b00000010; // на левом сенсоре 1
} // поворачиваем влево
else{
PORTC=0b00000011; // если на обоих сенсорах 1
} // робот продолжает ехать прямо
}
}
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
55 просмотров

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

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