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
[modifica | modifica sorgente]Il 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
[modifica | modifica sorgente]Rispetto al progetto precedente è stato inserito soltanto il servomotore. Questo si controlla inviando un numero corrispondente all'angolo della sbarra in gradi sessagesimali.
Codice
[modifica | modifica sorgente]Di 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 | modifica sorgente]#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
[modifica | modifica sorgente]Inizializzazione 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
[modifica | modifica sorgente]void 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 | modifica sorgente]- 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).