Camera con brandeggio e joystick

In questo articolo spiegherò come ho realizzato un sistema di brandeggio PAN TILT con arduino e una videocamera wireless con una spesa ridotta.

 

 

 

Videocamera utilizzata:

 

  • Alimentazione : 6-9 volt 80 mA (alimentatore incluso)

  • Risoluzione: PAL 628x582  NTSC 510x492

  • Illuminazione min.: 1.5 lux

  • Sensore : Colore CMOS Omnivision

  • Angolo di apertura: Circa 69°

  • Otturatore elettronico 1/50 - 1/100.000 sec

  • Uscita Wireless Audio/Video: 1,2 GHz

  • Dimensioni 25x35x15 mm

Comprata in fiera dell'elettronica a 15€(ricevitore, alimentatori etc inclusi). In più ho dovuto prendere solamente l'adattatore USB (8€ circa) per passare i dati dal ricevitore al pc.  La risoluzione è buona, è difficile mantenere i colori brillanti specialmente con la videocamera in movimento. Di questi però non mi importava più di tanto quindi sono stato soddisfatto del mio acquisto.

 

Passiamo al sistema di brandeggio: Composto da due servocomandi standard e 3 staffe. Acquistato su seeedstudio.com

Ho montato quindi la videocamera sulla staffa del servo superiore.

Ho rimediato quindi anche un joystick per controllare il tutto con l'Arduino.

In modo rapido: il funzionamento è basato su due assi X,Y che useremo per il Pan e Tilt. Per ogni asse corrisponde quindi un potenziometro(10K Ohm) da dove ci si "prende" il segnale(che varierà tra 0V e poco meno di 5V) e lo si porta come Input all'Arduino.

Ecco il tutto:

 

 

Come gestire il brandeggio con arduino attraverso il joystick:

/* Source by Vendramin Federico   03/03/2011 */


#include                                        //include la libreria Servo.h necessaria per questo programma

Servo Pan;                                                     //Dichiara i due servi Pan e Tilt
Servo Tilt;
int   potP = 2;                                               //pin lettura potenziometri
int   potT = 3;
int   valP;                                                      //variabili per lettura potenziometri
int   valT;
int   P = 90;                                                 //Variabile per la scrittura della posizione
int   T = 90;

void setup()
{
Pan.attach(9);                                          //assegna pin 9 e 10 come output del segnale per controllare i servi
Tilt.attach(10);
}

void loop ()                                                 //Esegue il ciclo infine volte
{  
valP = analogRead(potP);                          //legge il valore di potP e lo assegna a valP. Valore compreso tra 0 e 1023
valT = analogRead(potT);

valP = map(valP, 0, 1023, 0, 180);             //Aggiorna valP con valore relativo in scala compresa tra 0 e 180

valT = map(valT, 0, 1023, 0, 180);            //La posizione del servo varia tra 0 e 180

if ((valP > 95) & (P < 180)) P++;              //Se rileva uno spostamento positivo aumenta P di uno

if ((valP 0)) P--;                   //Viceversa se lo spostamento e opposto decrementa P
Pan.write(P);                                         //A questo punto comunica al servo la nuova posizione da raggiungere


if ((valT > 95) & (T < 180)) T++;            //stessa cosa con T
if ((valT 0)) T--;
Tilt.write(T);


delay(10);                                             //delay per permettere ai servi di raggiungere le posizioni
}

 

Purtroppo non ho ancora trovato il modo di gestire la proporzionalità tra lo spostamento del joystick e la velocità dei due servi.

In questo video che ho realizzato scrivevo direttamente le posizioni letti dai potenziometri  ai servi:

Ecco il sorgente che implementa la proporzionalità tra lo spostamento del joystick rispetto alla sua posizione di riposo e la velocità dei servi.

/* Source by Vendramin Federico   04/03/2011 */

#include

Servo Pan;         
Servo Tilt;
int   potP = 2;        //pin lettura potenziometri
int   potT = 3;
int   valP;            //variabili per la posizione del joystick
int   valT;
int   P = 90;          //Variabile per la scrittura della posizione
int   T = 90;


void setup()

{
Pan.attach(9);     //assegna pin 9 e 10 come output del segnale per controllare i servi
Tilt.attach(10);
}

void loop ()
{  
valP = analogRead(potP);  //legge il valore di potP e lo assegna a valP. Valore compreso tra 0 e 1023
valT = analogRead(potT);

valP = map(valP, 0, 1023, 0, 180);    //Aggiorna valP con valore relativo in scala compresa tra 0 e 180

valT = map(valT, 0, 1023, 0, 180);    //La posizione del servo varia tra 0 e 180

if ((valP > 90) & (P < 180))          //se il potenziometro non e in posizione di riposo aumenta P di un trentesimo

P = P + ((valP - 90) / 30);         //della differenza tra il valore del potenziometro e il valore di riposo
if ((valP 0)              //anzichè aumentare in questo caso diminuisce
P = P - ((90 - valP) / 30);

if ((valT > 90) & (T < 180))          //come sopra ma per l altro potenziometro

T = T + ((valT - 90) / 30);
if ((valT 0))  
T = T - ((90 - valT) / 30);   

Pan.write(P);                                 //A questo punto comunica al servo la nuova posizione da raggiungere

Tilt.write(T);
delay(10);                                    //delay per permettere ai servi di raggiungere le posizioni
}

Ringrazio Marnic per l'aiuto e il forum di Roboitalia.

The secret of any online business is web hosting. Select the best hosting service reading offered by justhost.
Free Joomla Templates designed by Joomla Hosting