Упрощенная версия робота, предназначенного для поиска движущихся объектов




Робот предназначен для поиска движущихся объектов.
Основой этого робота является микроконтроллер ATmega168 (16 КБ внутрисистемной программируемой Flash памяти).
Программное обеспечение, написано с использованием среды программирования Arduino. Код представляет собой упрощенную версию языка С для начинающих.

Элементы конструкции.
Для создания данного робота потребуется:
1. Плата с микроконтроллером ATmega168.
Описание микроконтроллера ATmega168.
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 (distance<distancemax)                         // если нет никакого объекта (цели) в диапазоне
{  if (tilt>neckUDcenter)tilt=tilt-5;             // возвращение наклонного серв. в позицию центра
 if (tilt<neckUDcenter)tilt=tilt+5; } 
else 
{  // Объект (Цель) в диапазоне
 panscale=(leftIRvalue+rightIRvalue)/UDscalefactor;
 tiltscale=(upIRvalue+downIRvalue)/UDscalefactor;
 if (leftIRvalue>rightIRvalue)
{  leftright=(leftIRvalue-rightIRvalue)*3/panscale;
 tilt=tilt-leftright; }
 if (leftIRvalue<rightIRvalue)
{  leftright=(rightIRvalue-leftIRvalue)*3/panscale;
 tilt=tilt+leftright; } 
 if (upIRvalue>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      // ...

Видео


Первоисточник — letsmakerobots.com/node/10822
  • +3
  • 23 апреля 2012, 12:48
  • SergeiKV

Комментарии (0)

RSS свернуть / развернуть

Автор топика запретил добавлять комментарии