Информация к новости
  • Просмотров: 2450
  • Автор: sulicompany
  • Дата: 16-02-2013, 05:16
 (голосов: 0)
16-02-2013, 05:16

Управляемая веб-камера или же web-cam-бот

Категория: Электроника » Arduino




Не так давно я уже , что мою(и -а) статью про  — «Веб-камера на сервоприводах» опубликовали в журнале . Статья уже выложена на их сайте и её можно прочитать .

Вкратце расскажу про создание такой камеры. 

Как видно на фотографии я собрал поворотную основу для камеры из самых простых и дешёвых маленьких — .
Камера крепится прямо к качалке верхней сервы, которая привинчивается к Г-образной загогулине, вылепленной из ПКЛ ( — замечательный пластик для моделирования и прототипирования!). Эта же загогулина другим концом крепится к качалке второй сервы.

Основу я недолго думая вырезал из пластиковой бутылки :) Хотя можно было бы вылепить из того же пластика ПКЛ ;)

Вот и вся механика. Очень просто и быстро. Использовать  для таких поделок сплошное удовольствие. Но если у вас нет под рукой паяльной станции с феном, то нужно держать наготове чайник с кипятком ;) 
Так же обратите внимание, что массивные детали из пластика будут размегчаться дольше, чем мелкие. Это можно наблюдать по цвету. Нагреваясь пластик становится прозрачным, а в глубине у него может оставаться белый стержень более холодного и твёрдого пластика.

Далее обе сервомашинки напрямую подключаются к 7 и 8 портам контроллера Arduino/CraftDuino:


В данном случае Arduino/ играет роль шлюза, т.е. углы поворота сервомашинок передаются контроллеру по последовательному порту от управляющей программы на ПК, а Arduino просто получает значение угла поворота и поворачивает нужную серву на заданный угол.

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

Вот какая программа для Arduino у нас получится (фактически — это немного модифицированный пример, поставляемый с библиотекой Firmata)

#include <Firmata.h>
#include <Servo.h>

Servo servo7;
Servo servo8;

void analogWriteCallback(byte pin, int value)
{
   
if(pin == 7)
      servo7
.write(value);
   
if(pin == 8)
      servo8
.write(value);
}

void setup()
{
   
Firmata.setFirmwareVersion(0, 2);
   
Firmata.attach(ANALOG_MESSAGE, analogWriteCallback);

    servo7
.attach(7);
    servo8
.attach(8);
   
   
Firmata.begin(9600);
}

void loop()
{
   
while(Firmata.available())
       
Firmata.processInput();
}


Вот и всё — механика и электроника готовы и остаётся только написать программу для управления этим мини-роботом!

Так как дальнейшие планы научить этого мини-web-cam-бота самостоятельно обнаруживать объекты и следить за ними, то для работы с камерой я воспользуюсь библиотекой .

Управляющая программа довольно простая.
 к web-камере и показывам её картинку. Так же выведем в окошко с картинкой пару , с помощью которых будем управлять положением сервомашинок.

Так как в моей конструкции робота web-камеру пришлось закрепить на боку, то в программе приходится это исправлять (поворачивать картинку на 90 градусов против часовой стрелки).
Эта процедура реализуется функцией rotate(), которая является обёрткой вокруг функции OpenCV: (), которая и выполняет поворот изображения ().

//
// программа для управления
// сервомашинками мини-web-cam-бота
//
// robocraft.ru

#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>

#include "serial.h"

Serial sg; // для работы с COM-портом

// положение 1-й сервы
int A = 0;
int Amax = 180;

// положение 2-й сервы
int F = 0;
int Fmax = 180;

IplImage* dest = 0;

//
// функции-обработчики ползунков
//
void myTrackbarA(int pos) {
        A
= pos;
       
// Firmata
       
char buf[3];
        buf
[0] = 0xE0 | 7;
        buf
[1] = A & 0x7F;
        buf
[2] = (A >> 7) & 0x7F;
        sg
.Send(buf, 3);
       
Sleep(100);
}

void myTrackbarF(int pos) {
        F
= pos;
       
// Firmata
       
char buf[3];
        buf
[0] = 0xE0 | 8;
        buf
[1] = F & 0x7F;
        buf
[2] = (F >> 7) & 0x7F;
        sg
.Send(buf, 3);
       
Sleep(100);

}

// функция поворота изображения на заданный угол
void rotate(IplImage* _image, double _angle=90)
{
       
// матрицы трансформации
       
CvMat* rot_mat = cvCreateMat(2,3,CV_32FC1);
       
// вращение относительно центра изображения
        CvPoint2D32f center
= cvPoint2D32f(_image->width/2, _image->height/2);
       
double angle = _angle;
       
double scale = 1;
        cv2DRotationMatrix
(center,angle,scale,rot_mat);
       
       
IplImage* Temp = 0;
       
Temp = cvCreateImage(cvSize(_image->width, _image->height) , _image->depth, _image->nChannels);

       
// выполняем вращение
        cvWarpAffine
(_image,Temp,rot_mat);

       
// сохраняем результат
        cvCopy
(Temp, _image);

        cvReleaseImage
(&Temp);
        cvReleaseMat
(&rot_mat);
}

int main(int argc, char* argv[])
{
       
// получаем любую подключённую камеру
       
CvCapture* capture = cvCaptureFromCAM(CV_CAP_ANY);
       
assert( capture );

       
// устанавливаем ширину и высоту кадра
        cvSetCaptureProperty
(capture, CV_CAP_PROP_FRAME_WIDTH, 640);//1280);
        cvSetCaptureProperty
(capture, CV_CAP_PROP_FRAME_HEIGHT, 480);//960);


       
IplImage* frame=0;

     
// окно для вывода изображения
        cvNamedWindow
("capture", CV_WINDOW_AUTOSIZE);

       
// инициализация COM-порта
       
int port=19; // номер виртуального COM-порта Arduino
        printf
(" try to open COM-port %d\n", port);
       
bool b = sg.Open(port, 9600);
       
if(!b)
       
{
                printf
("[!] Error open COM-port!\n");
               
return 1;
       
}
        printf
(" ok\n");

       
// добавляем ползунки для управления положением сервомашинок
        cvCreateTrackbar
("A", "capture", &A, Amax, myTrackbarA);
        cvCreateTrackbar
("F", "capture", &F, Fmax, myTrackbarF);

     
// цикл обработки кадров с камеры
       
while(true){
               
// получаем кадр
                frame
= cvQueryFrame( capture );
         
// копируем изображение
                dest
= cvCloneImage(frame);

               
// поворачиваем картинку на 90 градусов
                rotate
(dest);

               
// показываем
                cvShowImage
("capture", dest);

               
// освобождаем изображение
                cvReleaseImage
(&dest);
       
               
char c = cvWaitKey(33);
               
if (c == 27) { // нажата ESC
                       
break;
               
}
       
}
       
// освобождаем ресурсы
        sg
.Close();
        cvReleaseCapture
( &capture );
        cvDestroyWindow
("capture");
       
return 0;
}



Вот и всё!
Главное — желание и хорошая идея! ;)

исходники к статье можно скачать по адресу:

Мозги для робота

  •   
Выбор самой главной части любого робота — его мозга — это очень важный и ответственный этап его построения. 

Рассмотрим возможные варианты:
(как и любая попытка классификации — это довольно спорный и неполный список, но, как основа для дальнейшей работы, сойдёт и такой :))

1. простейший робот 
здесь роль мозга выполняет простая микросхема, транзисторы и т.д.

пример: 

 (

2. простой робот
здесь роль мозга выполняет микроконтроллер (atmega, PIC...)



пример: 
 и т.д.

роботы на базе /

данное решение одно из самых простых и доступных.

3. МК + ПК
Создать простого и доступного робота можно на базе микроконтроллера, который будет принимать информацию с датчиков, управлять различными механизмами робота (моторами, , реле и т.д.). 
Однако, на простом МК не получится сделать обработку видео, распознавание речи и прочие вкусности «настоящего робота».
Но и из этого можно выкрутиться с минимальными потерями, разбив робота на две части:
1) робот на базе МК
2) ПК

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



Это очень удобное решение. Простое и доступное.
Золотая середина по простоте, доступности и функционалу.
К тому же, удобно программировать под той ОС, под которой Вы привыкли работать.

а вот далее идёт более обширный список различных вариантов более «мозговитых» роботов.

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

4. робот на базе обычного ПК или ноутбука
плюсы этого решения очевидны:
знакомый стандартный набор средств программирования,
множество готовых библиотек,
множество различной документации, 
для управления можно использовать стандартные порты ввода/вывода (),
возможно подключение любых устройств (например, различные )
высокая производительность

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

так же, обратите внимание, что обычная материнская плата требует одновременного наличия целого набора напряжений питания: ±12В, ±5В, ±3.3В что даёт дополнительные проблемы с .

использование ноутбука, как кажется, решает эту проблему (более скромные габариты, встроенный аккумулятор), но если ноутбук уже старый, то его аккумулятор не сможет держать заряд достаточно долго, да и вес всё-равно будет в районе 3-5 килограмм.

Из этого следует вывод, что старые ПК лучше использовать в качестве стационарного пульта управления или в связке по радиоканалу с автономным модулем, но устанавливать на самого робота его не стоит.

* робот на базе специализированного ПК

сейчас всё большее распространение получают различные специализированные решения:
материнские платы формата Mini-ITX, или даже, Pico-ITX, причём эти ПК полностью совместимы с компьютерами x86.
Размеры плат и их небольшое энергопотребление делают их более чем привлекательными для роботов.

* робот на базе промышленного ПК


так же стоит обратить внимание на различные платы для промышленных ПК: 
платы формата  или Micro PC.

обратите внимание, что модули PC/104 насаживаются друг на дурга в эдакий бутерброд (очень напоминает Arduino)


плюсы:
совместимость с компьютерами x86;
низкое энергопотребление (стандартное напряжение 5В, потребление 5W (платы с потреблением более 10W — довольно редки));
небольшой размер (PC/104: 115 x 103 мм.)
множество различных плат расширения,
индустриальное качество плат (рабочий температурный диапазон: -40°C … +85°C, сторожевой таймер, требования по влажности, устойчивость к вибрациям и одиночным ударам)

минусы:
высокая цена,
в зависимости от платы может потребоваться использовать ОС для встраиваемых систем:
Windows CE, Windows Embedded, QNX.

Российские фирмы-изготовители:


другие варианты плат для встраиваемых систем можно посмотреть здесь:


почти все такие платы работают на базе маломощных процессоров:
Vortex86, AMD Geode

на базе Vortex86 построен робо-контроллер 


новые версии плат уже работают на процессорах Intel® Atom, Intel® Celeron M, Intel® Pentium M

* робот на базе КПК

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

плюсы:
компактность и небольшой вес (200 — 300 грамм),
низкое энергопотребление (особенно при выключенном экране),

Время автономной работы КПК — более чем приемлимо для робота.

минусы:
трудности подключения к КПК внешних устройств. 

* робот на базе нетбука
как кажется, почти идеальное решение — плюсы ноутбука, но при этом небльшой вес и доступная цена

пример:
Asus Eee PC

* робот на базе контроллера

микроэлектроника развивается и дарит нам возможность использовать свои новинки для создания по-настоящему мозговитых автономных роботов.

существует множество плат развития, контроллеров и отладочных плат:
(чаще всего на базе ARM)









Российская компания:


плюсы:
приемлемая цена,
малые габариты,
невысокое энергопотребление, 

минусы (или, наоборот, плюсы):
установка ОС для встраиваемых систем:
 дистрибутивы Linux

например:
 

способ погружения и знакомства со встраиваемыми системыми, мини-Linux-ом и прочими вкусностями. Главное за всем этим не забыть — зачем всё это делается :)

* робот из переделанного устройства

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

Это Wi-Fi- роутеры:
D-Link DIR-300
D-Link DIR-320


существуют различные варианты открытых Linux-прошивок для роутеров:
* DD-WRT 
* Tomato 
* Openwrt 
* Oleg firmware 

которые позволят Вам работать с роутером так, как Вы сами того захотите, а управлять своим роботом через COM-порт, который почти всегда .
А, например, у  — вообще есть USB-порт ;)

а ведь есть ещё и  ;)

и помните:
«роботы — это увлечение, которое не только отнимает много времени, но и ещё довольно дорогое...»