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
▲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.
[[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
# in uscita si hanno:
##un segnale acustico, generato dalla cicalina piezoelettrica;
##un segnale visivo, generato dal display LCD 16x2;
##un
Questo processo
# 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.
Il sensore capta la distanza, convertita in centimetri nel codice,
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
=== Schema di montaggio ===▼
Di seguito viene riportato lo schema di montaggio.
[[File:Schema di montaggio Telepass.png|centro|636x636px|senza_cornice]]
{| class="wikitable"
Line 48 ⟶ 44:
!Descrizione
!Q.tà
|-
|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
|}
Di seguito viene riportato il codice sorgente. Per una maggior comprensibilità viene suddiviso in tre parti:
<syntaxhighlight lang="arduino" line="1">▼
# inclusione delle librerie, definizione delle costanti e variabili;
# 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 ===
▲<syntaxhighlight lang="arduino" line="1">
// Librerie per il controllo del display e servomotore
#include <LiquidCrystal.h>
▲#include <Servo.h>
Servo servo; // Nome del servomotore
int attesasbarra = 1500;
int velocitaservo = 10;
int angolosbarra = 90;
int pos
int piezo
int duratasuono = 300;
int
int
const int trig_pin = 9; //
const int echo_pin = 10; //
int larghezzacarr = 10;
int scritta1 = "Benvenuti a"
int scritta2 = "Riccione"
int messaggio = "Arrivederci"
int freqdiagg = 500;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //
</syntaxhighlight>
=== Setup ===
<syntaxhighlight lang="arduino" line="1" start="30">
void setup() {
lcd.begin(16, 2); // Setup schermo
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); //
pinMode(trig_pin, OUTPUT);
pinMode(echo_pin, INPUT);
pinMode(piezo, OUTPUT);
}
</syntaxhighlight>
=== Corpo del programma ===
<syntaxhighlight lang="arduino" line="1" start="47">
void loop() {
digitalWrite(trig_pin, LOW); // Inizzializzazione
delayMicroseconds(2);
digitalWrite(trig_pin, HIGH);
Line 144 ⟶ 138:
durata = pulseIn(echo_pin,HIGH);
distanza = durata / 29.1 / 2 ; // Conversione
▲distanza = durata / 29.1 / 2 ; // Conversione del valore temporale catturato dal sensore in cm (distanza)
if (distanza <= larghezzacarr){ // Se la distanza è minore
▲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);
delay(duratasuono);
noTone(piezo);
// Alza la sbarra
for( int i = 0; i < angolosbarra; i++){
servo.write(i);
delay (velocitaservo);
Line 164 ⟶ 157:
delay (attesasbarra);
tone(piezo, tonalita2);
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); //
lcd.setCursor(0,1);
lcd.print(scritta2);
}
else { // Altrimenti
Serial.print(distanza); //
▲ 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>
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]]).
|