

Робот предназначен для поиска движущихся объектов.
Основой этого робота является микроконтроллер ATmega168 (16 КБ внутрисистемной программируемой Flash памяти).
Программное обеспечение, написано с использованием среды программирования Arduino. Код представляет собой упрощенную версию языка С для начинающих.
Элементы конструкции.
Для создания данного робота потребуется:
1. Плата с микроконтроллером ATmega168.
Описание микроконтроллера ATmega168.
http://www.gaw.ru/html.cgi/txt/ic/Atmel/micros/avr/atmega48_88_168.htm
Платформой робота служит сама плата, дополнительно ничего покупать не нужно.
2. Поворотная платформа (Рис. 1)
3. Инфракрасный глаз (Рис. 2)
4. Колесо с сервоприводом (2 шт.) (Рис. 3)
5. Стальное шаровое колесо высотой 20 или 30 мм (Рис. 4)
6. Крепежные элементы и кронштейны.
7. Батарейный отсек для батареек типа АА (Рис. 5)
8. USB Cable A to Mini-B (Рис. 6)

Рис. 1 Поворотная платформа
Поворотная платформа позволит направить датчики под любым углом. Комплект включает в себя скобы и один миниатюрный сервопривод. Конфигурация отверстий на верхней скобе позволит без проблем закрепить любой датчик или видеокамеру.

Рис. 2 Инфракрасный глаз
Инфракрасный глаз служит для управления и манипулирования роботом и для обнаружения препятствий на расстоянии до 20 см. Датчик состоит из 4-х пар ИК фототранзисторов и 4-x ИК светодиодов, что позволяет распознать как прямые, так и отраженные ИК лучи.

Рис. 3 Колесо с сервоприводом
Колесо с сервоприводом непрерывного вращения. Пластиковые шестерни, диаметр шины 38 мм.
Технические характеристики: Размеры: 41x38x20 mm
Вес: 38 г
Напряжение: 4,8 — 6В
Рабочая температура: 0 — 60
угловая скорость: 0,15 с/60° (6,0 В)
момент остановленного вала: 3,5кг∙см (4,8 В);

Рис. 4 Стальное шаровое колесо

Рис. 5 Батарейный отсек для батареек типа АА

Рис. 6 USB Cable A to Mini-B
Программный код.
Программа сравнивает левый и правый входы глаза для поворота, а верхние и нижние для
наклона глаза. Чем больше разница, тем на больший угол необходимо повернуть сервомашинку
для поиска объекта.
#include <Servo.h> // подключается библиотека Servo
#include "IO_pins.h" // подключается файл входов - выходов
// константы
byte UDscalefactor=3;
int distancemax=200;
int bestdistance=550;
int neckUDcenter=1700; // позиция центра наклонного сервомотора
int leftmotorstop=1510; // позиция остановки левого сервомотора
int rightmotorstop=1505; // позиция остановки правого сервомотора
int UDmax=neckUDcenter+700;
int UDmin=neckUDcenter-700;
// глобальные переменные
int tilt=neckUDcenter;
int panscale;
int tiltscale;
int leftspeed=leftmotorstop;
int rightspeed=rightmotorstop;
int distance;
int temp;
int updown;
int leftright;
int leftIRvalue;
int rightIRvalue;
int upIRvalue;
int downIRvalue;
Servo leftmotor; // объект класса Servo
Servo rightmotor;
Servo neckupdown;
/* В следующей части кода описывается функция Setup().
Данная функция выполняется только один раз при запуске программы или после сброса контроллера.
Инициализирует переменные, порты и т.д. */
void setup()
{ /* Инициализация сервомоторов.
Функция writeMicroseconds позволяет более точно поворачивать шестеренку.
Задаёт значение в микросекундах для длительности управляющего импульса.
На стандартных сервах это приведёт к повороту вала на определённый угол
( 1000 — положение полностью против часовой стрелки,
2000 — положение полностью по часовой стрелке, и 1500 — в середине) */
leftmotor.attach(leftmotorpin); // Servo присоединен к 9 выводу
leftmotor.writeMicroseconds(leftmotorstop);
rightmotor.attach(rightmotorpin); // Servo присоединен к 10 выводу
rightmotor.writeMicroseconds(rightmotorstop);
neckupdown.attach(neckupdownpin); // Servo присоединен к 6 выводу
neckupdown.writeMicroseconds(neckUDcenter);
// Чтобы чип Arduino знал, какой вывод мы хотели бы использовать как вход или выход,
нужно указать это в подпрограмме void setup()
pinMode (IRleds,OUTPUT); // Контакт (порт) устанавливается как выход
// Аналоговые выводы, в отличие от цифровых, не нужно объявлять как вход или выход в
начале программы }
// Финальная часть кода выполняется в циклической функции loop().
Здесь считываются значения с датчиков, производятся все расчеты и выдаются команды
на серводвигатель.
void loop()
{ leftmotor.writeMicroseconds(leftspeed); // скорость левого двигателя
rightmotor.writeMicroseconds(rightspeed); // ........ правого
neckupdown.writeMicroseconds(tilt); // ........ наклоненного
IReye(); // датчики "глаза"
IRfollow(); // перемещение, следование за объектом (целью)
}
void IReye()
// analogRead - эта функция считывает значение установленного аналогового входа.
{digitalWrite(IRleds,HIGH); // включает IR LEDs
delay(2); // время для фототранзисторов на "ответ" , 2 мс - установлено
leftIRvalue=analogRead(IRleft); // Считывает ОБЩЕЕ КОЛИЧЕСТВО света (слева)
rightIRvalue=analogRead(IRright); // .........
upIRvalue=analogRead(IRup); // .........
downIRvalue=analogRead(IRdown); // .........
distance = (leftIRvalue+rightIRvalue+upIRvalue+downIRvalue)/4; // расстояние объекта (цели) является средним из отраженного IR }
void IRfollow () // Объект (Цель) в диапазоне
{ leftspeed=leftmotorstop; // начальная скорость двигателя, устанавливается 0
rightspeed=rightmotorstop;
if (distanceneckUDcenter)tilt=tilt-5; // возвращение наклонного серв. в позицию центра
if (tiltrightIRvalue)
{ leftright=(leftIRvalue-rightIRvalue)*3/panscale;
tilt=tilt-leftright; }
if (leftIRvaluedownIRvalue)
{ updown=(upIRvalue-downIRvalue)*3/tiltscale;
tilt=tilt-updown; }
if (downIRvalue>upIRvalue)
{ updown=(downIRvalue-upIRvalue)*3/tiltscale;
tilt=tilt+updown; }
constrain(tilt,UDmin,UDmax);
// поворот основания, чтобы следовать за объектом (целью)
temp=UDmax-tilt;
if (temp<900)
{ leftspeed=leftmotorstop-500+temp; // поворот влево
rightspeed=rightmotorstop-500+temp; }
temp=tilt-UDmin;
if (temp<900)
{ rightspeed=rightmotorstop+500-temp; // поворот вправо
leftspeed=leftmotorstop+500-temp; }
// Вперед или назад, чтобы следовать за объектом (целью)
temp=distance-bestdistance;
temp=abs(temp);
if (temp>10)
{ temp=temp-10;
if (distance>bestdistance)
{ rightspeed=rightspeed-temp; // Назад
leftspeed=leftspeed+temp; }
else
{ rightspeed=rightspeed+temp; // Вперед
leftspeed=leftspeed-temp; }}}}
IO_pins.h
/* #define - это директива препроцессора, которая запускается перед компилированием.
Номер вывода устанавливается в виде переменной.
На плате Arduino находятся в распоряжении шесть выходов сигналов с ШИМ
(Широтно-импульсная модуляция). Контакты - 3, 5, 6, 9, 10, 11. Они могут использоваться для
цифроаналогового преобразования, управления сервоэлектродвигателями или формирования звуковых сигналов. */
#define IRleft 4 // лево - analog input A4 // аналоговый вход
#define IRright 5 // право - analog input A5 // ...
#define IRup 6 // верх - analog input A6 // ...
#define IRdown 7 // низ - analog input A7 // ...
#define IRleds 2 // Составной Глаз - digital output D2 // цифровой выход
#define neckupdownpin 6 // Наклонный Сервомотор - digital output D6 // цифровой выход (ШИМ)
#define leftmotorpin 9 // Левый ..... - digital output D9 // ...
#define rightmotorpin 10 // Правый ..... - digital output D10 // ...
Видео
http://www.youtube.com/watch?v=4OCM2tpOr5s
Первоисточник — http://letsmakerobots.com/node/10822
