Arduino, servomotori e laser

Ciao a tutti

Da qualche giorno mi sono arrivati dei pezzi che non avevo idea di come usare (assieme). Si tratta di un paio di servomotori e un laser.

I servomotori sono dei motori molto intelligenti a cui si può dare tramite Arduino e la libreria Servo una posizione angolare (in un range da 0 a 180 gradi) ed il servomotore stesso si porterà in quella posizione (con i suoi tempi, che dipendono dalla qualità del motore stesso. I servomotori che ho comprato sono tra i più comuni e diffusi, e portano la sigla SG-90.

large_238_servo-sg90-800

Un altro simpatico acquisto che avevo fatto è un piccolo laser a luce rossa. Dovrebbe essere uguale a quelli che ci sono in praticamente tutti i puntatori laser a basso costo.

Una piccola nota sulla sicurezza:
Attenzione quando avete a che fare con i laser. Sono pericolosi. Il modo più corretto di trattare con questi oggetti è quello di procurarsi una maschera specifica di protezione contro la specifica lunghezza d'onda dell'oggetto che userete. Il laser, anche a bassa potenza, può provocare cecità definitiva, per cui comunque evitate di usarlo contro superfici riflettenti e di puntarlo direttamente verso gli occhi di chiunque.

In ogni caso il laser è fatto più o meno come quello nella foto seguente.

Laser diode

Le sue caratteristiche principali sono le seguenti:

  • luce rossa (650 nm)
  • fascio collimato
  • Potenza 5 mW
  • Tensione di funzionamento 5V

In particolare quest’ultimo dato di funzionamento fa intuire che il laser contenga già al suo interno una resistenza, in quanto altrimenti avrebbe funzionato a tensioni minori.

Il laser non è altro che un diodo, paragonabile ad un LED per il suo funzionamento, per cui quando è attraversato da corrente nella direzione corretta emette luce, in questo caso un raggio laser.

Il problema che mi si poneva adesso era quello di cosa fare con questa roba. Ho pensato quindi di tentare di fare un mini proiettore laser di tipo x-y (in una versione molto molto banale e di scarsa funzionalità). Per intendersi i proiettori laser x-y sono quelli che disegnano strane figure in discoteca, spesso figure geometriche, ma con quelli più complessi si può riuscire anche a fare scritte o figure complesse. Come vedremo in questo progetto il problema principale sono proprio le caratteristiche del servo, anche se nei proiettori laser professionali si trovano altri sistemi (galvo, per esempio).

Detto fatto mi sono ritrovato a progettare un circuitino interessante ed ho tirato fuori quello che vedete di seguito.

Double Servo plus Laser

In seconda istanza ho eliminato la resistenza sul led proprio perchè ho scoperto che non ce n’era bisogno. Ovviamente ho guadagnato in luminosità.

Lo schema elettrico è quello che segue.

Double Servo plus Laser Schematics

Il risultato è quello che vedete nel video seguente

Di seguito incollo il codice:

// double servo plus laser
// Pierluigi Luisi
// 20/05/2014

#include <Servo.h>
// inizializzo i servomotori
Servo myServoX;
Servo myServoY;

// inizializzo variabili relative a 
// servomotori, piedini e laser
boolean laserStatus;
const int laserPin=3;
const int servoPinX=9;
const int servoPinY=10;
int angleX;
int angleY;

// inizializzo variabili relative a 
// angoli e temporizzazioni
const int mid = 1500;
const int minAngleX = 1467;
const int maxAngleX = 1533;
const int minAngleY = 1445;
const int maxAngleY = 1555;
const int timing = 90;
const int times = 1;

void setup(){
 // inizializzo il piedino del laser come uscita
 pinMode(laserPin, OUTPUT);
 
 // inizializzo i due servomotori
 myServoX.attach(servoPinX);
 myServoY.attach(servoPinY);
 
 //inizializzo la seriale
 Serial.begin(9600);

 // posiziono i servomotori a metà corsa
 myServoX.writeMicroseconds(mid);
 myServoY.writeMicroseconds(mid);
 
 // accendo e spengo il laser 
 // per verificarne il corretto funzionamento
 for ( int x = 0; x < 4; x++) {
 laserOn();
 delay(100);
 laserOff();
 delay (100);
 }
 
 myServoX.writeMicroseconds(minAngleX);
 myServoY.writeMicroseconds(minAngleY);
 
 for ( int x = 0; x < 4; x++) {
 laserOn();
 delay(100);
 laserOff();
 delay (100);
 }
 
 myServoX.writeMicroseconds(maxAngleX);
 myServoY.writeMicroseconds(maxAngleY);
 
 for ( int x = 0; x < 4; x++) {
 laserOn();
 delay(100);
 laserOff();
 delay (100);
 }
}

void loop(){
 // accendo il laser
 laserOn(); 
 // disegno un quadrato
 writeSquare();
}

void laserOff(){
 // funzione di spegnimento del laser
 
 digitalWrite(laserPin, HIGH); // spengo il laser
 laserStatus = LOW; //immagazzino lo stato del laser
}

void laserOn(){
 // funzione di accensione del laser

 digitalWrite(laserPin, LOW); // accendo il laser
 laserStatus = HIGH; //immagazzino lo stato del laser
}

void writeSquare(){
 // funzione disegna quadrato
 for (int x=0;x<times;x++){
 
 //mi posiziono nell'angolo superiore destro
 angleX=maxAngleX;
 myServoX.writeMicroseconds(angleX);
 angleY = maxAngleY;
 myServoY.writeMicroseconds(angleY);
 //delay (timing);
 
 // accendo il laser
 laserOn();
 
 // mi sposto nell'angolo inferiore sinistro
 angleY = minAngleY;
 myServoY.writeMicroseconds(angleY);
 delay (timing); // necessario per consentire 
 // ai servo di compiere lo spostamento
 
 // mi sposto nell'angolo inferiore destro
 angleX = minAngleX;
 myServoX.writeMicroseconds(angleX);
 delay (timing);

 // mi sposto nell'angolo superiore sinistro
 angleY = maxAngleY;
 myServoY.writeMicroseconds(angleY);
 delay (timing);
 
 // torno all'angolo superiore sinistro
 angleX = maxAngleX;
 myServoX.writeMicroseconds(angleX);
 delay (timing);

 laserOff(); 
 }
}
Annunci

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione /  Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione /  Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione /  Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione /  Modifica )

Connessione a %s...