En aquest tutorial anem a discutir i dissenyar un circuit per mesurar la distància. Aquest circuit es desenvolupa mitjançant la interfície del sensor d’ultrasons “HC-SR04” amb el microcontrolador AVR. Aquest sensor utilitza una tècnica anomenada "ECHO" que s'obté quan el so es reflecteix després de tocar amb una superfície.
Sabem que les vibracions sonores no poden penetrar a través dels sòlids. El que passa és que, quan una font de so genera vibracions, viatgen a través de l’aire a una velocitat de 220 metres per segon. Aquestes vibracions quan es troben amb la nostra oïda les descrivim com a so. Com s'ha dit anteriorment, aquestes vibracions no poden passar a través de sòlides, de manera que quan impacten amb una superfície com la paret, es reflecteixen de nou a la mateixa velocitat de la font, que es diu eco.
El sensor d'ultrasons "HC-SR04" proporciona un senyal de sortida proporcional a la distància basat en l'eco. Aquí el sensor genera una vibració sonora en un rang ultrasònic en donar un tret, després d’això s’espera que torni la vibració sonora. Ara, basat en els paràmetres, la velocitat del so (220 m / s) i el temps que triga l’eco a arribar a la font, proporciona un impuls de sortida proporcional a la distància.

Com es mostra a la figura, en un primer moment hem d’iniciar el sensor per mesurar la distància, és a dir, un senyal lògic ALTA al pin d’activació del sensor per més de 10uS, després del sensor s’envia una vibració sonora, després d’un ressò, un senyal al pin de sortida l'amplada és proporcional a la distància entre la font i l'obstacle.
Aquesta distància es calcula com, distància (en cm) = amplada de la sortida d’impulsos (en uS) / 58.
Aquí l'amplada del senyal s'ha de prendre en múltiples de uS (micro segon o 10 ^ -6).
Components necessaris
Maquinari: ATMEGA32, font d'alimentació (5v), PROGRAMADOR AVR-ISP, JHD_162ALCD (16x2LCD), condensador 1000uF, resistència 10KΩ (2 peces), sensor HC-SR04.
Programari: Atmel studio 6.1, progisp o flash magic.
Diagrama de circuits i explicació de treball

Aquí estem utilitzant PORTB per connectar-nos al port de dades LCD (D0-D7). Qualsevol persona que no vulgui treballar amb FUSE BITS d’ATMEGA32A no pot utilitzar PORTC, ja que PORTC conté un tipus de comunicació especial que només es pot desactivar canviant FUSEBITS.
Al circuit, observeu que només he pres dos passadors de control, cosa que dóna la flexibilitat d’una millor comprensió. El bit de contrast i READ / WRITE no s’utilitzen sovint, de manera que es poden reduir a terra. D’aquesta manera, la pantalla LCD té un contrast i un mode de lectura més alts. Només hem de controlar els pins ENABLE i RS per enviar caràcters i dades en conseqüència.
Les connexions que es fan per a LCD es donen a continuació:
PIN1 o VSS a terra
PIN2 o VDD o VCC a una potència de + 5v
PIN3 o VEE a terra (proporciona el màxim contrast possible per a principiants)
PIN4 o RS (Selecció de registre) a PD6 de uC
PIN5 o RW (lectura / escriptura) a terra (posa la pantalla LCD en mode lectura facilita la comunicació per a l'usuari)
PIN6 o E (Habilita) a PD5 de uC
PIN7 o D0 a PB0 de uC
PIN8 o D1 a PB1 de uC
PIN9 o D2 a PB2 de uC
PIN10 o D3 a PB3 de uC
PIN11 o D4 a PB4 de uC
PIN12 o D5 a PB5 de uC
PIN13 o D6 a PB6 de uC
PIN14 o D7 a PB7 de uC
Al circuit podeu veure que hem utilitzat la comunicació de 8 bits (D0-D7), però això no és obligatori i podem utilitzar la comunicació de 4 bits (D4-D7), però amb un programa de comunicació de 4 bits es torna una mica complex. Així, tal com es mostra a la taula anterior, estem connectant 10 pins de LCD al controlador en què 8 pins són pins de dades i 2 pins per al control.
El sensor d'ultrasons és un dispositiu de quatre pins, PIN1-VCC o + 5V; PIN2-TRIGGER; PIN3- RESSCH; PIN4- TERRA. El pin gatell és on donem un disparador per dir al sensor que mesuri la distància. Echo és un pin de sortida on obtenim la distància en forma d’amplada de pols. El pin d'eco aquí està connectat al controlador com a font d'interrupció externa. Per obtenir l'amplada de la sortida del senyal, el pin de ressò del sensor està connectat a INT0 (interrupció 0) o PD2.
1. Comenci el sensor tirant cap amunt del passador durant almenys 12uS.
2. Un cop l'eco augmenta, obtindrem una interrupció externa i iniciarem un comptador (habilitant un comptador) a la ISR (Interrupt Service Routine) que s'executa just després d'una interrupció activada.
3. Una vegada que l'eco torna a baixar es genera una interrupció, aquesta vegada pararem el comptador (inhabilitant el comptador).
4. Per tant, per a un pols de més alt a més baix en el pin de ressò, hem iniciat un comptador i l’hem aturat. Aquest recompte s’actualitza a la memòria per obtenir la distància, ja que ara tenim l’amplada de ressò.
5. Farem més càlculs a la memòria per obtenir la distància en cm
6. La distància es mostra a la pantalla LCD de 16x2.
Per configurar les funcions anteriors, establirem els registres següents:



Els tres registres anteriors s’han de configurar en conseqüència perquè la configuració funcioni i els parlarem breument, BLAU (INT0): aquest bit s’ha d’establir alt per habilitar la interrupció externa0, un cop configurat aquest pin, podrem percebre els canvis lògics al pin PIND2.
MARRÓ (ISC00, ISC01): aquests dos bits s’ajusten per al canvi lògic adequat a PD2, que s’ha de considerar com a interrupció.

Per tant, com s’ha dit anteriorment, necessitem una interrupció per iniciar un recompte i aturar-lo. Per tant, establim ISC00 com un i rebem una interrupció quan hi ha una lògica BAIXA a ALTA a INT0; una altra interrupció quan hi ha una lògica D'ALTA a BAIXA.
VERMELL (CS10): aquest bit és simplement per habilitar i desactivar el comptador. Tot i que funciona juntament amb altres bits CS10, CS12. Aquí no estem realitzant cap prescripció, de manera que no ens hem de preocupar d’ells.
Algunes coses importants que cal recordar aquí són:
Estem fent servir un rellotge intern d’ATMEGA32A, que és d’1 MHz. No hi ha cap prescripció prèvia, no estem fent una rutina de comparació de la interrupció de coincidència, de manera que no hi ha configuracions de registre complexes.
El valor del recompte després del recompte s’emmagatzema al registre TCNT1 de 16 bits.
Comproveu també aquest projecte amb arduino: mesurament de la distància mitjançant Arduino
Explicació de la programació
El funcionament del sensor de mesura de distància s’explica pas a pas al programa C.
#include // capçalera per habilitar el control de flux de dades sobre els pins #define F_CPU 1000000 // indicant la freqüència de cristall del controlador adjunta #include
