Делаем WEB камеру управляемой. Часть1

«В тапера не стрелять, он играет, как умеет!»

Очередной проект от нашего коллеги Vlada.

Вот не люблю я обзоры писать, не писатель, но чего не сделаешь, для друзей и товарищей. И так. Для реализации очередного проекта, долго искал на АлиЭкпресс подходящую камеру. Такую, что бы была и IP, и можно было бы программно менять настройку фокусного расстояния, наводить резкость, что бы при этом, была не дорогая и с хорошим качеством. В результате нашел вот такой вот образец:

A B C

Это не совсем то, что искал. Программно не особо ее с ходу не «покрутить», но руки-то у нас есть, а значит начнем «творить». Что нам для этого потребуется:

  1. Пара сервоприводов, причем не нужны дорогие, усилие потребуется небольшое, для поворота линз. Например вот такие, вполне подойдут.
  2. Ардуинка для управления. Была в наличии, в свое время покупал вот тут.
  3. 3D принтер, и немного времени для создания шестеренок и крепления.

В результате получился такой вот конструктор «собери сам»:

D

 

Еще нам потребуется 4ре мелких самореза 2,5х5 мм. И начинаем:

  1. Откручиваем (удаляем) винты ручной настройки, в дальнейшем нам не понадобятся.
  2. Снимаем поворотный механизм с камеры, сохраняя мелкие винты крепления.

F

E

  1. Монтируем камеру в пластиковый корпус, закрепляя ее винтами, что сняли. (Кабелем к верхней части, та что с вырезом. В дальнейшем расскажу почему так;) ). Так же ставим шестеренки на сервоприводы и крепим их, саморезами, что идут с ними в комплекте. Получаем вот такое вот «чудо»:)G

 

При креплении шестеренок на объективе, выбираем правильное положение, такое, что бы они были примерно «посередине» от крайнего левого и правого положения объектива. Получиться должно что-то подобное:

G-1

 

Теперь перейдем к сервоприводам. Для начала, нам надо их выставить в «среднее» положение. Учитывая, что они имеют два крайних положения 0 и 180, нам надо 90 градусов. Собираем маленький макетик:

I

По распиновке — на сервоприводе:

Коричневый — «земля», Красный (центральный) — +5В, Желтый — «дата».

на Ардуинке:

2 пин — на «дату» первого (будет управлять) малой (ближе к корпусу) шестерней, 3 пин, соответственно, на «дату» второго.

Скетч прост до безобразия.

 

 

#include <Servo.h>

 Servo servo1;

Servo servo2;

 int i_1=90,i_2=90;

void setup()

 {

Serial.begin(115200);

servo1.attach(2);

servo2.attach(3);

}

void loop()

{

servo1.write(i_1);

servo2.write(i_2);

i_1=servo1.read();

i_2=servo2.read();

   Serial.print(«I’m ready!»);

   Serial.println();

   Serial.print(«i_1 = «);   Serial.println(i_1);

   Serial.print(«i_2 = «);   Serial.println(i_2);  

}

 

Можно «поиграться» покрутить сервоприводы. Главное их выставить в положение 90. Можно поступить иначе — выставить оба в положение 0 градусов. Соответственно в это же положение выкрутить объектив и закрепить правильно шестерни. Но это кому как удобно.

Далее монтируем сервоприводы на корпус. В результате получаем вот такое вот «безобразие»:

H

H-1

Немного подправим сам скетч.

Будем «читать» нажатие «q» и «w» — и поворачивать первое кольцо на объективе (servo1) в лево и право. При этом, выводить значение угла на servo1 (Мы же должны понять, где крайние положение, с точки зрения привода(ов)). Нажатие «a» и «s» — соответственно, для servo2.

Ну и пусть нажатие «o» — возвращает все в положение 90 градусов (среднюю точку).

#include <Servo.h>

 

Servo servo1;

Servo servo2;

 int i_1=90,i_2=90;

char ch;

 void setup()

 {

Serial.begin(115200);

servo1.attach(2);

servo2.attach(3);

servo1.write(i_1);

servo2.write(i_2);

i_1=servo1.read();

i_2=servo2.read();

}

void loop()

 {

if (Serial.available() > 0)

{

   Serial.print(«I’m ready!»);

   Serial.println();

   ch = Serial.read();

   Serial.print(«Your character: «);

   Serial.write(ch);

   Serial.println(ch);

   if (ch==’o’||ch==’O’) {servo1.write(90); i_1=servo1.read();servo2.write(90); i_2=servo1.read();}  

if (ch==’q’||ch==’Q’) {i_1—; servo1.write(i_1); i_1=servo1.read();}

if (ch==’w’||ch==’W’) {i_1++; servo1.write(i_1); i_1=servo1.read();}

if (ch==’a’||ch==’A’) {i_2—; servo2.write(i_2); i_2=servo2.read();}

if (ch==’s’||ch==’S’) {i_2++; servo2.write(i_2); i_2=servo2.read();}

Serial.print(«Serv1= «);

Serial.print(i_1);

Serial.print(«. Serv2= «);  

Serial.print(i_2);

Serial.println(«.»);

}

 }  

 

В результате, мы должны найти, крайнее положение для обеих колец объектива. И внести коррективы в программу. Зачем напрягать сервопривод и пытаться сломать шестеренки?!

В моем случае, это Serv1= 120. Serv2= 132. Добавим несколько ifов.

 

#include <Servo.h>

 

Servo servo1;

Servo servo2;

 int i_1=90,i_2=90;

char ch;

 void setup()

 {

Serial.begin(115200);

servo1.attach(2);

servo2.attach(3);

servo1.write(i_1);

servo2.write(i_2);

i_1=servo1.read();

i_2=servo2.read();

}

 void loop()

{

 

if (Serial.available() > 0)

{

   Serial.print(«I’m ready!»);

   Serial.println();

   ch = Serial.read();

   Serial.print(«Your character: «);

   Serial.write(ch);

   Serial.println(ch);

  

if (ch==’o’||ch==’O’) {servo1.write(90); i_1=servo1.read();servo2.write(90); i_2=servo1.read();}  

 

if (ch==’q’||ch==’Q’) {if (i_1>=0) i_1—; else i_1=0; servo1.write(i_1); i_1=servo1.read();}

if (ch==’w’||ch==’W’) {if (i_1<=119) i_1++; else i_1=119; servo1.write(i_1); i_1=servo1.read();}

if (ch==’a’||ch==’A’) {if (i_2>=0) i_2—; else i_2=0; servo2.write(i_2); i_2=servo2.read();}

if (ch==’s’||ch==’S’) {if (i_2<=131) i_2++; else i_2=131; servo2.write(i_2); i_2=servo2.read();}

   Serial.print(«Serv1= «);

   Serial.print(i_1);

   Serial.print(«. Serv2= «);  

   Serial.print(i_2);

   Serial.println(«.»);

}

 

}

На этом пока все. В следующей раз, мы дополним камеру поворотным устройством по двум осям. И «прикрутим» джойстик к управлению положением камеры.

Комменты ниже…

Если понравилась статья — поделись с друзьями

 

Посмотрите так же...
4 комментария
  1. Kavkazec:

    Зачетная конструкция! Для чего планируете использовать?

    • Vlad:

      Изначально для сканера. Но направлений много. Как вариант — слежение за маленьким ребенком. Пока я просто прорабатываю сам механизм настройки и поворота.

  2. MyHabar:

    Камера вроде не тяжелая. Есть идея прикрутить на квадрокоптер. Сколько весит?

    • Vlad:

      Корпус металлический. Дает основной вес. Можно конечно его снять и сделать пластиковый. Но — как и на что ты будешь писать, если у нее Ethernet выход. Да и питается она от 12 В.
      Соберу вместо — взвешу сообщу. Но думаю, что для квадрокоптера, надо поискать что-то другое и желательно WiFi.

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *