Gestione di un telepass con Arduino
In questa lezione si mostrerà come sia possibile ricostruire il funzionamento di un ipotetico telepass autostradale, tramite la scheda Arduino, con l'utilizzo di un sensore ad ultrasuoni, un cicalino piezoelettrica per la segnaletica acustica, un monitor per la messaggistica e un servomotore per alzare e abbassare la sbarra.
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 testo, generato dal display LCD 16x2;
- 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:
- si scrive "Benvenuti a Riccione" nel display;
- 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;
- si scrive "Arrivederci" nel display;
- il cicalino produce un suono ( ) per un breve istante;
- si richiude la sbarra.
Tutti i parametri sono regolabili 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.
Per approfondire questo argomento, consulta la pagina Misurazione della distanza con sensore a ultrasuoni. |
Se il segnale è minore o uguale a un valore stabilito (distanza massima del veicolo dal telepass), Arduino attiva il cicalino piezoelettrico, il quale riproduce un segnale acustico la cui tonalità è regolabile; invece, nel display LCD 16x2 viene inviato un messaggio analogo a quello autostradale (Arrivederci o Benvenuti); mentre il servomotore viene utilizzato per alzare e abbassare una sbarra (quella visibile nel video è stata realizzata con una cannuccia).
Schema di montaggio
modificaDi seguito viene riportato lo schema di montaggio.
Componenti utilizzati
modificaComponente | Descrizione | Q.tà |
---|---|---|
LCD 16x2 | Display | 1 |
HC-SR04 | Sensore di prossimità | 1 |
SG90 9g | Servomotore | 1 |
- | Cicalino | 1 |
- | Resistenze elettriche | 3 |
Codice
modificaDi seguito viene riportato il codice sorgente. Per una maggior comprensibilità viene suddiviso in tre parti:
- inclusione delle 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// Librerie per il controllo del display e servomotore
#include <LiquidCrystal.h>
#include <Servo.h>
#define pin_servo 6 // Pin a cui è collegato il servomotore
Servo servo; // Nome del servomotore
int attesasbarra = 1500;
int velocitaservo = 10;
int angolosbarra = 90;
int pos = 0; // Posizione iniziale del servomotore
int piezo = 7; // Pin a cui è collegata al cicalino
int duratasuono = 300;
int tonalita = 800;
int tonalita2 = 700;
const int trig_pin = 9; // Pin TRIG del sensore a ultrasuoni
const int echo_pin = 10; // Pin ECHO del sensore a ultrasuoni
int larghezzacarr = 10; // Distanza in cm per il quale la sbarra si alzerà
int scritta1 = "Benvenuti a";
int scritta2 = "Riccione";
int messaggio = "Arrivederci";
int freqdiagg = 500;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Pin è collegato lo schermo LCD
Inizializzazione
modificaInizializzazione del progetto, dove vengono identificate le uscite e le entrate di Arduino verso i vari componenti, e si inizializza il display e il servomotore.
void setup() {
Serial.begin(9600); // Inizializzazione della porta seriale
lcd.begin(16, 2); // Setup schermo LCD, con colonne e righe
lcd.print(scritta1); // Scritta iniziale, "Benvenuti a Riccione"
lcd.setCursor(0, 1);
lcd.print(scritta2);
servo.attach(pin_servo); // Identificazione pin servo motore
servo.write(0); // Ritorno alla posizione iniziale
pinMode(trig_pin, OUTPUT); // Setup del sensore di prossimita'
pinMode(echo_pin, INPUT);
pinMode(piezo, OUTPUT); // Setup del pin per il cicalino
}
Corpo del programma
modificavoid loop() {
long durata, distanza;
digitalWrite(trig_pin, LOW); // Inizzializzazione del sensore a ultrasuoni
delayMicroseconds(2);
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 è minore uguale del parametro atteso
Serial.println("OK"); // Scrive OK sul monitor seriale (in fase di test)
lcd.clear(); // Cancella il monitor LCD e scrive "Arrivederci"
lcd.print(messaggio);
tone(piezo, tonalita); // Suona il cicalino per la durata prestabilita
delay(duratasuono);
noTone(piezo);
// Alza la sbarra
for( int i = 0; i < angolosbarra; i++){
servo.write(i);
delay (velocitaservo);
}
delay (attesasbarra);
tone(piezo, tonalita2); // Suona il cicalino per la durata prestabilita
delay(duratasuono);
noTone(piezo);
// Abbassa la sbarra
for(int i = (angolosbarra - 1) ; i>= 0; i--){
servo.write(i);
delay (velocitaservo);
}
lcd.clear();
lcd.print(scritta1); // Riscrive "Benvenuti a Riccione"
lcd.setCursor(0,1);
lcd.print(scritta2);
}
else { // Altrimenti
Serial.print(distanza); // Scrive sul monitor seriale la distanza in cm (test)
Serial.println(" cm");
Serial.println();
}
delay(freqdiagg);
}
Espansioni suggerite
modificaUna possibile espansione di questo progetto è il conteggio delle automobili in ingresso (utile per un parcheggio, zone a traffico limitato e altro).
Un'altra - che richiede una sensoristica ulteriore - è il riconoscimento delle automobili autorizzate (possibile con sensore RFID).