Robotica educativa/Sensore di parcheggio
Seguendo passo, passo questo progetto si realizzerà un sensore di parcheggio, sfruttando quanto utilizzato nel modulo Misurazione della distanza.
Descrizione del progetto
[modifica | modifica sorgente]Di seguito vengono mostrati dei sensori di parcheggio, come siamo abituati a vederli quotidianamente.
Schema di montaggio
[modifica | modifica sorgente]Di seguito lo schema di montaggio:
Il quale utilizza i seguenti componenti:
Componente | Descrizione | Q.tà |
---|---|---|
Sensore di prossimità | Sensore a ultrasuoni HC-SR04 | 1 |
Buzzer | Cicalina piezoelettrica | 1 |
Rispetto al progetto precedente aggiunge soltanto una cicalina (o buzzer). Alcune di queste, come quella in figura sono molto piccole.
Avendo usato una breadboard per inserire i componenti elettronici, si è alloggiato lì anche il buzzer, ma – osservandolo bene – i suoi pedini distano quanto tre ingressi/uscite della breadbord (e di Arduino). Quindi, se un pedino deve andare a massa, l'altro può utilizzare il pedino 12 di Arduino (modificando la linea 2 del codice).
Così facendo sarà possibile inserire il buzzer direttamente nella scheda Arduino.
Attenzione: questo non vale per i diodi led, poiché questi necessitano di una resistenza.
Codice
[modifica | modifica sorgente]In questo caso il codice verrà suddiviso in più parti, così da comprenderne fino in fondo il senso. La cosa più importante è copiarlo nell'esatto ordine in cui si presenta.
Connessione dei vari pin
[modifica | modifica sorgente]Come prima cosa si definiscono i pin ai quali si collega la cicalina e il sensore a ultrasuoni (trigger
ed echo
).
// Connessione dei pin
#define beep 6 // Buzzer
#define echo 7 // Echo
#define trigger 8 // Trigger
trigger
è il pin “Trigger”: comunica al sensore quando inviare un segnale;echo
è il pin "Echo" riceve il ritorno del segnale inviato dal sensore (ammesso che vi sia un ritorno).
Parametri del codice
[modifica | modifica sorgente]Quindi vengono definite: la distanza massima di lettura del sensore distanzaMax
; la distanza minima del buzzer (al di sotto della quale si avrà un suono continuo) distanzaMin
; la velocità di dialogo col monitor seriale (espresso in baud) baud
, infine la velocità del suono (espressa in centimetri al microsecondo) c
.
// Parametri editabili dall'utente
#define distanzaMax 80 // centimetri
#define distanzaMin 4 // centimetri
#define baud 9600 // bit / secondo
#define c 0.0343 // cm / us
A questo punto vengono definite le variabili, ovvero grandezze che potranno essere modificate durante il ciclo di lavorazione. long
è un dato che può contenere numeri a 32 bit, con segno, necessario perché il tempo viene misurato in microsecondi, pertanto è facile ottenere numeri molto alti.
// Variabili
long tempo; // tempo in microsecondi trascorso tra trigger ed eco
float spazio; // distanza dell'ostacolo
Setup
[modifica | modifica sorgente]Nel setup si definiscono i perdini e il loro utilizzo (ingresso/uscita) e – dopo aver inizializzato la porta seriale – si invia al computer l'intestazione di quel che farà il programma.
void setup() {
// definizione di ingressi e uscite
pinMode( trigger, OUTPUT );
pinMode( echo, INPUT );
pinMode( beep, OUTPUT );
// Inizializzazione porta seriale
Serial.begin( baud );
// Scrittura delle prime tre linee di testo
Serial.println( "+---------------------+" );
Serial.println( "|Sensore di parcheggio|" );
Serial.println( "+---------------------+" );
}
Programma principale
[modifica | modifica sorgente]
Nel programma principale si scrive il programma principale. La particolarità di loop
è che i comandi vengono ripetuti fino allo spegnimento o al reset della macchina.
void loop() {
// Prima della misurazione, si porta il trigger a livello basso
digitalWrite( trigger, LOW );
delayMicroseconds( 5 );
// Invio di un impulso della durata di 10 microsecondi
digitalWrite( trigger, HIGH );
delayMicroseconds( 10 );
digitalWrite( trigger, LOW );
// Attende la ricezione dell'impulso e lo divide per 2 (andata e ritorno)
tempo = pulseIn( echo, HIGH ) / 2;
spazio = c * tempo;
// Invia i dati acquisiti nel monitor seriale ([Ctrl] + [Shift] + M)
// approssimati alla prima cifra decimale
Serial.println("Distanza = " + String(spazio, 1) + " cm" );
// A seconda della posizione dell'ostacolo produce un
if( spazio < distanzaMax ){
// suono intermittente proporzionale alla distanza (1 m = 400 ms)
tone(beep, 1000);
delay(40);
// Il suono e' intermittente solo se non si arriva alla distanzaMin
if ( spazio > distanzaMin ) {
noTone( beep );
delay( spazio * 4 );
}
}
// Attende 50 millisecondi prima di un'altra misurazione
delay( 50 );
}
Il risultato finale
[modifica | modifica sorgente]Di seguito, un video che mostra il funzionamento del sensore di parcheggio, mostrando le fasi in cui non vi è segnale acustico, vi è un avviso di prossimità e – infine – la segnalazione di pericolo, per poi ripercorrere i passaggi a ritroso.
Espansioni suggerite
[modifica | modifica sorgente]Naturalmente, il sensore di prossimità, trova numerose altre applicazioni. A titolo di esempio:
- interruttore di prossimità, quando è presente una persona;
- contapersone (ne occorrono due, per determinare la direzione);
- misuratore di altezze e profondità (come l'acqua presente in una piscina);
- canestro contapunti automatico (solo il numero di canestri, naturalmente).