Gestione di un telepass con Arduino: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
→‎Descrizione del progetto: Aggiunta immagine sensore HC SR04
Etichetta: Editor wikitesto 2017
Revisione del progetto
Riga 1:
{{Risorsa|tipo=lezione| materia1 = Sistemi automatici per le superiori 1|avanzamento=100%|dipartimento1=Scuole}}
{{Risorsa
| tipo = lezione
| materia1 = Sistemi automatici per le superiori 1
| avanzamento = 50%
| dipartimento1 = Scuole
}}
 
TramiteIn questa lezione si mostrerà come, tramite la scheda [[w:Arduino|Arduino]], andiamosia apossibile ricostruire il funzionamento di un ipotetico [[w:Telepass|telepass]] autostradale, con l'utilizzo di un sensore ad ultrasuoni, una cicalina piezoelettrica per la segnaletica acustica, di un monitor per la messaggistica e un servomotore per riprodurrealzare e abbassare la sbarra.
== Telepass ==
Tramite Arduino andiamo a ricostruire il funzionamento di un ipotetico telepass autostradale, con l'utilizzo di un sensore ad ultrasuoni, una cicalina piezoelettrica per la segnaletica acustica, di un monitor per la messaggistica e un servomotore per riprodurre la sbarra.
 
=== Descrizione del progetto ===
[[File:HC_SR04_Ultrasonic_sensor_1480322_3_4_HDR_Enhancer.jpg|miniatura|Il sensore a ultrasuoni HC-SR04]]
[[File:16x2_LCD_Display_(cropped).jpg|link=https://it.wikiversity.org/wiki/File:16x2_LCD_Display_(cropped).jpg|miniatura|Display 16 linee x 2 righe]]
Il sistema ha il seguente funzionamento:
 
# in ingresso si hatrova il sensore di prossimità, cheil quale rileva la distanza dell'oggetto davanti a lui, distanza che poi vieneverrà convertita in centimetri;
# in uscita si hanno:
##un segnale acustico, generato dalla cicalina piezoelettrica;
##un segnale visivo, generato dal display LCD 16x2;
##un servosterzoservomotore per alzare e abbassare la sbarra.
 
Questo processo si ha inizio 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;
# la cicalina 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;
#la cicalina produce un suono (a una differente frequenza) per un breve istante;
#si richiude la sbarra.
 
TuttoTutti lei durate, velocità e posizioniparametri sono regolabili tramiteattraverso le variabili nella prima parte del codice.
 
Il sensore capta la distanza, convertita in centimetri nel codice, sparandoinviando e ricevendo ilun segnale ad ultrasuoni.
 
|{{Vedi anche|Misurazione della distanza con sensore a ultrasuoni}}
Se il segnale è minore/uguale al valore stabilito, Arduino da corrente al piezo, che crea un segnale acustico di tonalità regolabile, al display LCD 16x2 sul quale viene scritto un messaggio simile a quello autostradale (Arrivederci o Benvenuti), e al servomotore che girando simula l'alzarsi e abbassarsi della sbarra.
 
Se il segnale è minore/ o uguale ala un valore stabilito, Arduino daattiva correntela alcicalina piezopiezoelettrica, chela quale creariproduce un segnale acustico di tonalità regolabile; invece, al display LCD 16x2 sul quale viene scrittoinviato un messaggio simileanalogo a quello autostradale (''Arrivederci'' o ''Benvenuti''),; ementre alil servomotore cheviene girandoutilizzato simulaper l'alzarsialzare e abbassarsiabbassare dellauna sbarra.
=== Schema di montaggio ===
 
=== Schema di montaggio ===
 
Di seguito viene riportato lo schema di montaggio.
[[File:Schema di montaggio Telepass.png|centro|636x636px|senza_cornice]]
 
=== Componenti utilizzati ===
 
{| class="wikitable"
Line 48 ⟶ 44:
!Descrizione
!Q.tà
!Approfondimenti
|-
|LCD 16x2
|Display
|1
|
|-
|HC-SR04
|Sensore di prossimità
|1
|{{Vedi anche|Misurazione della distanza con sensore a ultrasuoni}}
|-
|SG90 9g
|Servomotore
|1
|
|-
| -
|Cicalina
|1
|
|-
| -
|Resistenze elettriche
|3
|
|}
 
=== Codice ===
Di seguito viene riportato il codice sorgente. Per una maggior comprensibilità viene suddiviso in tre parti:
Zona delle variabili, che regolano il completo funzionamento del progetto:
<syntaxhighlight lang="arduino" line="1">
 
# inclusione delle librerie, definizione delle costanti e variabili;
#include <LiquidCrystal.h> // Iseriamo le librerie per la semplificazione del codice
# codice da eseguire all'avvio del programma e alla pressione del tasto di reset;
#include <Servo.h>
# programma vero e proprio.
#define pin_servo 6 // definiamo il pin a cui è collegato il servo motore
 
=== Librerie, costanti e variabili ===
Servo servo; //Identifica il nome del servo
<syntaxhighlight lang="arduino" line="1">
// Librerie per il controllo del display e servomotore
#include <LiquidCrystal.h>
#include <Servo.h>
 
#define pin_servo 6 // definiamo il pinPin a cui è collegato il servo motoreservomotore
Servo servo; // Nome del servomotore
 
int attesasbarra = 1500;
int velocitaservo = 10;
int angolosbarra = 90;
int pos = 0; = 0; // Variabile utilizzata come posizionePosizione iniziale del servo motoreservomotore
 
int piezo = 7; = 7; // Variabie per identificare il pinPin a cui è collegatocollegata illa piezocicalina
int duratasuono = 300;
int tonalita2tonalita = 700800;
int tonalitatonalita2 = 800700;
const int trig_pin = 9; // Variabile per identificare il pinPin TRIG del sensore a ultrasuoni
const int echo_pin = 10; // Variabile per identificare il pinPin ECHO del sensore a ultrasuoni
int larghezzacarr = 10; // Variabile per identificare la distanzaDistanza 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); // Defibniamo a che pinPin è collegato lo schermo LCD
 
</syntaxhighlight>
 
=== Setup ===
Set upInizializzazione del progetto, dove identifichiamovengono identificate le uscite e le entrate di Arduino verso i vari componenti, e inizializziamosi Displayinizializza il display e Servoil servomotore.
<syntaxhighlight lang="arduino" line="1" start="30">
void setup() {
Serial.begin(9600); // Inizializzazione della porta seriale
 
lcd.begin(16, 2); // Setup schermo LcdLCD, identificandonecon 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); // RitornoaRitorno alla posizione iniziale
 
pinMode(trig_pin, OUTPUT); // Setup deidel pinsensore di entrata e uscita del segnale a ultrasuondsprossimita'
pinMode(echo_pin, INPUT);
 
pinMode(piezo, OUTPUT); // Setup deLdel pin diper la uscita del piezocicalina
}
</syntaxhighlight>
 
=== Corpo del programma ===
Funzionamento del progetto
<syntaxhighlight lang="arduino" line="1" start="47">
void loop() {
long durata, distanza;
 
 
digitalWrite(trig_pin, LOW); // Inizzializzazione Sensoredel adsensore Ultrasuonia ultrasuoni
delayMicroseconds(2);
digitalWrite(trig_pin, HIGH);
Line 144 ⟶ 138:
durata = pulseIn(echo_pin,HIGH);
 
distanza = durata / 29.1 / 2 ; // Conversione deldella valore temporale catturato dal sensoredurata in cm (distanza)
:
distanza = durata / 29.1 / 2 ; // Conversione del valore temporale catturato dal sensore in cm (distanza)
 
if (distanza <= larghezzacarr){ // Se la distanza è minore o uguale del valore sceltoparametro allora:atteso
Serial.println("OK"); // ScriviScrive OK sul monitor seriale (in fase di test)
 
lcd.clear(); // PulisciCancella il monitor LCD e scriviciscrive ARRIVEDERCI"Arrivederci"
if (distanza <= larghezzacarr){ // Se la distanza è minore o uguale del valore scelto allora:
Serial.println("OK"); // Scrivi OK sul monitor seriale
 
lcd.clear(); // Pulisci il monitor LCD e scrivici ARRIVEDERCI
lcd.print(messaggio);
 
tone(piezo, tonalita); // Suona illa Piezocicalina per una certala durata di tempoprestabilita
delay(duratasuono);
noTone(piezo);
// Alza la sbarra
for( int i = 0; i < angolosbarra; i++){ // Fai girare il servo motore di 90 gradi e ritorna indietro
for( int i = 0; i < angolosbarra; i++){
servo.write(i);
delay (velocitaservo);
Line 164 ⟶ 157:
delay (attesasbarra);
tone(piezo, tonalita2); // Suona illa Piezocicalina per una certala durata di tempoprestabilita
delay(duratasuono);
noTone(piezo);
 
// Abbassa la sbarra
for(int i = (angolosbarra - 1) ; i>= 0; i--){
servo.write(i);
Line 175 ⟶ 169:
lcd.clear();
 
lcd.print(scritta1); // RiscriviRiscrive "Benvenuti a Riccione"
lcd.setCursor(0,1);
lcd.print(scritta2);
 
}
 
else { // Altrimenti
Serial.print(distanza); // ScriviScrive sul monitor seriale la distanza in centrimetricm catturata dal sensore(test)
Serial.print(distanza); // Scrivi sul monitor seriale la distanza in centrimetri catturata dal sensore
Serial.println(" cm");
Serial.println();
 
}
delay(freqdiagg);
Line 192 ⟶ 182:
</syntaxhighlight>
 
=== Espansioni suggerite ===
Una 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 (con sensore [[w:RFID|RFID]]).