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



Робот предназначен для поиска движущихся объектов.
Основой этого робота является микроконтроллер 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


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

Arduino

Что такое Arduino?
Зачем мне Arduino?
Начало работы с Arduino
Для начинающих ардуинщиков
Радиодетали (точка входа для начинающих ардуинщиков)
Первые шаги с Arduino

Разделы

  1. Преимуществ нет, за исключением читабельности: тип bool обычно имеет размер 1 байт, как и uint8_t. Думаю, компилятор в обоих случаях…

  2. Добрый день! Я недавно начал изучать программирование под STM32 и ваши уроки просто бесценны! Хотел узнать зачем использовать переменную типа…

3D-печать AI Android Arduino Bluetooth CraftDuino DIY IDE iRobot Kinect LEGO OpenCV Open Source Python Raspberry Pi RoboCraft ROS swarm ИК автоматизация андроид балансировать бионика версия видео военный датчик дрон интерфейс камера кибервесна манипулятор машинное обучение наше нейронная сеть подводный пылесос работа распознавание робот робототехника светодиод сервомашинка собака управление ходить шаг за шагом шаговый двигатель шилд юмор

OpenCV
Робототехника
Будущее за бионическими роботами?
Нейронная сеть - введение