Робот предназначен для поиска движущихся объектов.
Основой этого робота является микроконтроллер 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 (tilt rightIRvalue) { leftright=(leftIRvalue-rightIRvalue)*3/panscale; tilt=tilt-leftright; } if (leftIRvalue downIRvalue) { 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