Robotica educativa/Telepass
Ora che si è imparato come misurare una distanza e come emettere un segnale acustico è possibile aggiungere un servomotore per alzare e abbassare una sbarra al passaggio di un veicolo ricostruendo, così, il funzionamento di un tipico telepass autostradale.
Descrizione del progetto
modificaIl sistema ha il seguente funzionamento:
- in ingresso il sensore di prossimità rileva la distanza dell'oggetto di fronte a lui, distanza che poi verrà convertita in centimetri;
- in uscita si hanno:
- un segnale acustico, generato dal cicalino piezoelettrico;
- un servomotore, per alzare e abbassare la sbarra.
Questo processo ha il suo avvio quando il sensore a ultrasuoni rileva un valore al di sotto di un livello stabilito dall'utente. A questo punto si eseguono i seguenti eventi:
- il cicalino produce un suono ( ) per un breve istante;
- il servomotore alza la sbarra alla velocità scelta dall'utente;
- si attende il passaggio dell'autoveicolo;
- il cicalino produce un altro suono ( ) per un breve istante;
- si richiude la sbarra.
Tutti i parametri sono gestibili attraverso le variabili nella prima sezione del codice.
Il sensore capta la distanza, convertita in centimetri nel codice, inviando e ricevendo un segnale a ultrasuoni.
Se il segnale è minore o uguale a un valore prestabilito (distanza massima del veicolo dal telepass), si attiva il cicalino piezoelettrico, il quale riproduce un segnale acustico la cui tonalità è regolabile; mentre il servomotore viene utilizzato per alzare e abbassare una sbarra (realizzata con una cannuccia).
Schema di montaggio
modificaRispetto al progetto precedente è stato inserito soltanto il servomotore. Questo si controlla inviando un numero corrispondente all'angolo della sbarra in gradi sessagesimali.
Codice
modificaDi seguito viene riportato il codice sorgente. Per una maggior comprensibilità viene suddiviso in tre parti:
- inclusione di librerie, definizione delle costanti e variabili;
- codice da eseguire all'avvio del programma e alla pressione del tasto di
reset
; - programma di controllo.
Librerie, costanti e variabili
modifica#include <Servo.h> // Libreria per il controllo delservomotore
#define pin_servo 11 // Pin a cui è collegato il servomotore
Servo sbarra; // Nome del servomotore
int attesasbarra = 1500; // Tempo di attesa prima della discesa della sbarra
int velocitaservo = 10; // Velocita' di movimeno della sbarra
int angolosbarra = 90; // Angolo finale della sbarra
int pos = 0; // Angolo iniziale della sbarra
int piezo = 2; // Pin a cui è collegata al cicalino
int duratasuono = 300; // Durata del beep in millisecondi
int tonalita = 800; // Frequenza primo beep
int tonalita2 = 700; // Frequenza secondo beep
const int trig_pin = 10; // Pin TRIG del sensore a ultrasuoni
const int echo_pin = 9; // Pin ECHO del sensore a ultrasuoni
int larghezzacarr = 10; // Distanza in cm per il quale la sbarra si alzerà
int freqdiagg = 500; // Intervallo in millisecondi tra un ciclo e il successivo
Inizializzazione
modificaInizializzazione del progetto, dove vengono identificate le uscite e le entrate di Arduino verso i vari componenti, e si inizializza il servomotore.
void setup() {
Serial.begin(9600); // Inizializzazione della porta seriale
sbarra.attach(pin_servo); // Identificazione pin servo motore
sbarra.write(pos); // Abbassa la sbarra
pinMode(trig_pin, OUTPUT); // Setup del sensore di prossimita'
pinMode(echo_pin, INPUT);
pinMode(piezo, OUTPUT); // Setup del pin per il cicalino
}
Programma principale
modificavoid loop() {
long durata, distanza;
digitalWrite(trig_pin, LOW); // Inizializzazione del sensore a ultrasuoni
delayMicroseconds(5);
digitalWrite(trig_pin, HIGH);
delayMicroseconds(10);
digitalWrite(trig_pin, LOW);
durata = pulseIn(echo_pin,HIGH);
distanza = durata / 29.1 / 2 ; // Conversione della durata in cm (distanza)
if (distanza <= larghezzacarr){ // Se la distanza è conforme
Serial.println("OK"); // Scrive OK sul monitor seriale (fase di test)
tone(piezo, tonalita); // Esegue il primo beep
delay(duratasuono);
noTone(piezo);
// Alza la sbarra
for( int i = pos; i < angolosbarra; i++){
sbarra.write(i);
delay (velocitaservo);
}
delay (attesasbarra); // Fa passare il veicolo
tone(piezo, tonalita2); // Esegue il secondo beep
delay(duratasuono);
noTone(piezo);
// Abbassa la sbarra
for(int i = (angolosbarra - 1) ; i>= pos; i--){
sbarra.write(i);
delay (velocitaservo);
}
}
else {
// Altrimenti scrive sul monitor seriale la distanza in cm (test)
Serial.println(distanza + " cm");
}
delay(freqdiagg);
}
Espansioni suggerite
modifica- Una possibile espansione di questo progetto è il conteggio delle automobili in ingresso (utile per un parcheggio, zone a traffico limitato e altro). Attenzione: se le autovetture entrano ed escono dal medesimo ingresso saranno necessari due sensori di prossimità, per determinare il verso di percorrenza.
- Un'altra – che richiede una sensoristica ulteriore – è l'apertura della sbarra solo alle automobili autorizzate (possibile con sensore RFID).