È da tempo che ho realizzato questo prototipo con il relativo programma ma non ho mai avuto tempo per poter scrivere un articolo su di esso. Ora è giunto il momento!

Si tratta di un piccolo dispositivo capace di muoversi in 4 sensi. Sul Pan Tilt è possibile montarci una mini-telecamera, un laser o qualsiasi altro dispositivo e attraverso un Joystick si effettuano i movimenti, puntando la telecamera dove si desiderata.
Questa è la foto dei primi test che ho eseguito:

Pan Tilt

Per la realizzazione ho utilizzato una struttura in plastica comprata su ebay, due servomotori, un Joystick e ovviamente arduino.
Dopo aver assemblato la struttura montandoci i due servomotori, ho realizzato una piccola shield, dove è collocato il Joystick, quella in figura:

Joystick

Il funzionamento del Joystick è molto semplice, anzi è esattamente identico a quello di un potenziometro lineare. Infatti, esso è costituito da ben 2 trimmer dove è possibile prelevare la tensione utile per essere collegata ad un ingresso analogico (ADC) di un microcontrollore e gestita in modo tale da poterla utilizzare per le proprie esigenze.

Potenziometro

Queste sono le grandezze reali del Joystick, come noterete rispettano perfettamente il passo della basetta mille-fori.

joystick

Joystick2

Mentre qui sotto ci sono le foto della struttura con i relativi servi:

Pan 1

Pan 2

Ed infine il programma:

</pre>
#include <Servo.h>

# define ledRed 5
# define ledGrn 6
# define switchPin 7
# define pinServoX 9
# define pinServoY 10
# define joyX A4
# define joyY A5

int val;
int val2;
int buttonState;
int Mode = 0;

Servo servoX;
Servo servoY;

int gradoX = 90;
int gradoY = 90;

int servoValX;
int servoValY;

int minGradX = 15;
int maxGradX = 170;
int minGradY = 15;
int maxGradY = 170;
void setup()
{
 Serial.begin(9600);
 Serial.print(" START DATI ");

 pinMode(switchPin,INPUT);
 pinMode(ledRed,OUTPUT);
 pinMode(ledGrn,OUTPUT);

 buttonState = digitalRead(switchPin);
 digitalWrite(switchPin,HIGH);

 servoX.attach(pinServoX);
 servoY.attach(pinServoY);

 servoX.write(90);
 servoY.write(90);

 delay(100);
 }

void loop()
{
 servoValX = analogRead(joyX);
 servoValY = analogRead(joyY);

 Serial.print("joyX : ");
 Serial.println(servoValX);
 Serial.print("joyY : ");
 Serial.println(servoValY);

 val = digitalRead(switchPin);
 delay(10);
 val2 = digitalRead(switchPin);

 if (val == val2)
  {
   if (val != buttonState)
   {
    if (val == LOW)
    {
     if (Mode == 0)
    {
     Mode = 1;
     digitalWrite(ledRed,LOW);
     digitalWrite(ledGrn,HIGH);
    }
 else
 {
 if (Mode == 1)
  {
   Mode = 2;
   digitalWrite(ledRed,HIGH);
   digitalWrite(ledGrn,LOW);
  }
  else
  {
   if (Mode == 2)
   {
    Mode = 0;
    digitalWrite(ledRed,LOW);
    digitalWrite(ledGrn,LOW);
   }
  }
 }
}
}
 buttonState = val;
}
 if(Mode == 0)
 {
 servoX.write(90);
 servoY.write(90);
 }

 if(Mode == 1)
 {
 if ((servoValX >= 0) & (servoValX <= 400)) { gradoX--; }
 if ((servoValX >= 600) & (servoValX <= 1023)) { gradoX++; }

 if ( gradoX > maxGradX ) { gradoX = maxGradX; }
 if ( gradoX < minGradX ) { gradoX = minGradX; }

 if ((servoValY >= 0) & (servoValY <= 400)) { gradoY--; }
 if ((servoValY >= 600) & (servoValY <= 1023)) { gradoY++; }

 if ( gradoY > maxGradY ) { gradoY = maxGradY; }
 if ( gradoY < minGradY ) { gradoY = minGradY; }

 servoX.write(gradoX);
 servoY.write(gradoY);
 delay(15);
 }

 if(Mode == 2)
 {
 servoValX = map(servoValX, 0, 1023, 15, 170);
 servoValY = map(servoValY, 0, 1023, 15, 170);

 servoX.write(servoValX);
 servoY.write(servoValY);
 delay(15);
 }
 }
<pre>

Breve spiegazione dello sketch:

Righe 1 – 29: dichiarazione delle variabili;

Righe 30 – 49: nel void setup() sono definiti due pulsanti , il Joystick e i due LED e i relativi pin.

Righe 50 – 64: dichiarazione delle variabili analogiche e scrittura sul serial monitor dell’IDE di arduino;

Righe 65 – 133: gestione movimenti dei due servomotori attraverso il Joystick. Con i due pulsanti si effettua il cambio di modalità di funzionamento del Pan Tilt.

VIDEO DEL FUNZIONAMENTO:

Per ora è tutto. Grazie per l’attenzione.

IMPORTANTE: Se ci sono dei dubbi oppure avete qualche idea per un eventuale miglioramento del progetto, non esitate a scrivermi!! :)