- Componenti richiesti
- Schema del circuito e spiegazione del funzionamento
- Spiegazione della programmazione
In questo tutorial discuteremo e progetteremo un circuito per misurare la distanza. Questo circuito è sviluppato interfacciando il sensore a ultrasuoni “HC-SR04” con il microcontrollore AVR. Questo sensore utilizza una tecnica chiamata "ECHO", che si ottiene quando il suono si riflette dopo aver colpito una superficie.
Sappiamo che le vibrazioni sonore non possono penetrare attraverso i solidi. Quindi quello che succede è che quando una fonte di suono genera vibrazioni viaggia attraverso l'aria a una velocità di 220 metri al secondo. Queste vibrazioni quando incontrano il nostro orecchio le descriviamo come suoni. Come detto in precedenza, queste vibrazioni non possono passare attraverso il solido, quindi quando colpiscono una superficie come un muro, vengono riflesse alla stessa velocità verso la sorgente, che si chiama eco.
Il sensore a ultrasuoni “HC-SR04” fornisce un segnale di uscita proporzionale alla distanza in base all'eco. Il sensore qui genera una vibrazione sonora nella gamma degli ultrasuoni quando si preme un grilletto, dopodiché attende che la vibrazione sonora ritorni. Ora, in base ai parametri, alla velocità del suono (220 m / s) e al tempo impiegato dall'eco per raggiungere la sorgente, fornisce un impulso di uscita proporzionale alla distanza.
Come mostrato in figura, in un primo momento dobbiamo avviare il sensore per misurare la distanza, cioè un segnale logico ALTO sul pin di attivazione del sensore per più di 10uS, dopodiché una vibrazione sonora viene inviata dal sensore, dopo un'eco, il sensore fornisce un segnale al pin di uscita la cui larghezza è proporzionale alla distanza tra sorgente e ostacolo.
Questa distanza viene calcolata come distanza (in cm) = larghezza dell'uscita dell'impulso (in uS) / 58.
Qui l'ampiezza del segnale deve essere presa in multipli di uS (micro secondi o 10 ^ -6).
Componenti richiesti
Hardware: ATMEGA32, alimentatore (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), condensatore 1000uF, resistenza 10KΩ (2 pezzi), sensore HC-SR04.
Software: Atmel studio 6.1, progisp o flash magic.
Schema del circuito e spiegazione del funzionamento
Qui stiamo usando PORTB per connetterci alla porta dati LCD (D0-D7). Chi non vuole lavorare con FUSE BITS di ATMEGA32A non può usare PORTC, in quanto PORTC contiene un tipo speciale di comunicazione che può essere disabilitato solo cambiando FUSEBITS.
Nel circuito, vedete, ho preso solo due pin di controllo, questo dà la flessibilità di una migliore comprensione. Il bit di contrasto e READ / WRITE non sono usati spesso, quindi possono essere cortocircuitati a massa. Questo mette l'LCD nel più alto contrasto e modalità di lettura. Abbiamo solo bisogno di controllare i pin ENABLE e RS per inviare caratteri e dati di conseguenza.
Di seguito sono riportati i collegamenti effettuati per l'LCD:
PIN1 o VSS a terra
Alimentazione da PIN2 o VDD o VCC a + 5v
PIN3 o VEE a massa (offre il massimo contrasto migliore per un principiante)
PIN4 o RS (selezione registro) a PD6 di uC
PIN5 o RW (lettura / scrittura) a massa (mette l'LCD in modalità di lettura facilita la comunicazione per l'utente)
PIN6 o E (Abilita) a PD5 di uC
PIN7 o D0 a PB0 di uC
PIN8 o D1 a PB1 di uC
PIN9 o D2 a PB2 di uC
PIN10 o D3 a PB3 di uC
PIN11 o D4 a PB4 di uC
PIN12 o D5 a PB5 di uC
PIN13 o D6 a PB6 di uC
PIN14 o D7 a PB7 di uC
Nel circuito si può vedere che abbiamo utilizzato la comunicazione a 8 bit (D0-D7) tuttavia questo non è obbligatorio e possiamo utilizzare la comunicazione a 4 bit (D4-D7) ma con il programma di comunicazione a 4 bit diventa un po 'complesso. Quindi, come mostrato nella tabella sopra, stiamo collegando 10 pin dell'LCD al controller in cui 8 pin sono pin dati e 2 pin per il controllo.
Il sensore a ultrasuoni è un dispositivo a quattro pin, PIN1-VCC o + 5V; PIN2-TRIGGER; PIN3- ECHO; PIN4- TERRA. Il perno del grilletto è il punto in cui diamo il grilletto per dire al sensore di misurare la distanza. L'eco è il pin di uscita in cui otteniamo la distanza sotto forma di larghezza dell'impulso. Il pin dell'eco qui è collegato al controller come sorgente di interrupt esterna. Quindi, per ottenere l'ampiezza dell'uscita del segnale, il pin di eco del sensore è collegato a INT0 (interrupt 0) o PD2.
1. Attivare il sensore tirando verso l'alto il perno del grilletto per almeno 12uS.
2. Una volta che l'eco diventa alto, otteniamo un interrupt esterno e avvieremo un contatore (abilitando un contatore) nell'ISR (Interrupt Service Routine) che viene eseguito subito dopo l'attivazione di un interrupt.
3. Una volta che l'eco diventa di nuovo basso, viene generato un interrupt, questa volta fermeremo il contatore (disabilitando il contatore).
4. Quindi per un impulso da alto a basso sul pin eco, abbiamo avviato un contatore e lo abbiamo fermato. Questo conteggio viene aggiornato in memoria per ottenere la distanza, poiché ora abbiamo la larghezza dell'eco nel conteggio.
5. Faremo ulteriori calcoli nella memoria per ottenere la distanza in cm
6. La distanza viene visualizzata sul display LCD 16x2.
Per impostare le funzionalità di cui sopra, imposteremo i seguenti registri:
I tre registri precedenti devono essere impostati di conseguenza affinché la configurazione funzioni e li discuteremo brevemente, BLU (INT0): questo bit deve essere impostato alto per abilitare l'interrupt esterno0, una volta che questo pin è impostato possiamo rilevare i cambiamenti logici sul pin PIND2.
MARRONE (ISC00, ISC01): questi due bit sono regolati per il cambio logico appropriato a PD2, che deve essere considerato come interrupt.
Quindi, come detto in precedenza, abbiamo bisogno di un'interruzione per avviare un conteggio e per interromperlo. Quindi impostiamo ISC00 come uno e otteniamo un interrupt quando c'è una logica da LOW a HIGH a INT0; un'altra interruzione quando c'è una logica da HIGH a LOW.
ROSSO (CS10): questo bit serve semplicemente per abilitare e disabilitare il contatore. Sebbene funzioni insieme ad altri bit CS10, CS12. Non stiamo effettuando alcuna prescaling qui, quindi non dobbiamo preoccuparci di loro.
Alcune cose importanti da ricordare qui sono:
Stiamo usando il clock interno di ATMEGA32A che è 1MHz. Nessuna prescaling qui, non stiamo confrontando la routine di generazione dell'interrupt di corrispondenza, quindi nessuna impostazione di registro complessa.
Il valore di conteggio dopo il conteggio viene memorizzato nel registro TCNT1 a 16 bit.
Controlla anche questo progetto con arduino: misurazione della distanza usando Arduino
Spiegazione della programmazione
Il funzionamento del sensore di misurazione della distanza è spiegato passo dopo passo nel programma C sottostante.
#include // intestazione per abilitare il controllo del flusso di dati sui pin #define F_CPU 1000000 // indica la frequenza di cristallo del controller collegata #include