În acest tutorial vom discuta și proiecta un circuit pentru măsurarea distanței. Acest circuit este dezvoltat prin interfața senzorului ultrasonic „HC-SR04” cu microcontrolerul AVR. Acest senzor folosește o tehnică numită „ECHO”, care este ceva ce obțineți atunci când sunetul se reflectă înapoi după ce a lovit cu o suprafață.
Știm că vibrațiile sonore nu pot pătrunde prin solide. Deci, ceea ce se întâmplă este că, atunci când o sursă de sunet generează vibrații, acestea călătoresc prin aer cu o viteză de 220 de metri pe secundă. Aceste vibrații atunci când întâlnesc urechea noastră le descriem ca sunete. După cum sa spus mai devreme, aceste vibrații nu pot trece prin solid, așa că atunci când lovesc cu o suprafață ca peretele, acestea sunt reflectate înapoi cu aceeași viteză la sursă, care se numește ecou.
Senzorul cu ultrasunete „HC-SR04” furnizează un semnal de ieșire proporțional cu distanța pe baza ecoului. Senzorul de aici generează o vibrație sonoră în domeniul ultrasunetelor la declanșare, după care așteaptă revenirea vibrației sonore. Acum, bazat pe parametri, viteza sunetului (220m / s) și timpul necesar pentru ca ecoul să ajungă la sursă, acesta oferă un impuls de ieșire proporțional cu distanța.
Așa cum se arată în figură, la început trebuie să inițiem senzorul pentru măsurarea distanței, adică un semnal logic ÎNALT la pinul de declanșare al senzorului pentru mai mult de 10uS, după care o vibrație sonoră este trimisă de senzor, după un ecou, senzorul oferă un semnal la pinul de ieșire a cărui lățime este proporțională cu distanța dintre sursă și obstacol.
Această distanță se calculează ca, distanță (în cm) = lățimea impulsului de ieșire (în uS) / 58.
Aici lățimea semnalului trebuie luată în multiplu de uS (micro secundă sau 10 ^ -6).
Componente necesare
Hardware: ATMEGA32, sursă de alimentare (5v), PROGRAMATOR AVR-ISP, JHD_162ALCD (16x2LCD), condensator 1000uF, rezistor 10KΩ (2 bucăți), senzor HC-SR04.
Software: Atmel studio 6.1, progisp sau flash magic.
Diagrama circuitului și explicația de lucru
Aici folosim PORTB pentru a ne conecta la portul de date LCD (D0-D7). Oricine nu dorește să lucreze cu FUSE BITS de la ATMEGA32A nu poate folosi PORTC, deoarece PORTC conține un tip special de comunicare care poate fi dezactivat doar prin schimbarea FUSEBITS.
În circuit, observați că am luat doar doi pini de control, ceea ce oferă flexibilitatea unei mai bune înțelegeri. Bitul de contrast și READ / WRITE nu sunt adesea folosite, astfel încât acestea pot fi scurtcircuitate la sol. Acest lucru pune LCD în cel mai mare contrast și modul de citire. Trebuie doar să controlăm ENABLE și pinii RS pentru a trimite caractere și date în consecință.
Conexiunile care se fac pentru LCD sunt date mai jos:
PIN1 sau VSS la masă
PIN2 sau VDD sau VCC la + 5v putere
PIN3 sau VEE la sol (oferă un contrast maxim optim pentru un începător)
PIN4 sau RS (Selectare înregistrare) la PD6 de uC
PIN5 sau RW (citire / scriere) la masă (pune LCD în modul de citire facilitează comunicarea pentru utilizator)
PIN6 sau E (Activare) la PD5 de uC
PIN7 sau D0 la PB0 de uC
PIN8 sau D1 la PB1 de uC
PIN9 sau D2 până la PB2 de uC
PIN10 sau D3 până la PB3 de uC
PIN11 sau D4 la PB4 de uC
PIN12 sau D5 până la PB5 de uC
PIN13 sau D6 la PB6 de uC
PIN14 sau D7 la PB7 de uC
În circuit puteți vedea că am folosit comunicația pe 8 biți (D0-D7), totuși acest lucru nu este obligatoriu și putem folosi comunicația pe 4 biți (D4-D7), dar programul de comunicare pe 4 biți devine un pic complex. Așa cum se arată în tabelul de mai sus, conectăm 10 pini LCD la controler, în care 8 pini sunt pini de date și 2 pini pentru control.
Senzorul cu ultrasunete este un dispozitiv cu patru pini, PIN1-VCC sau + 5V; PIN2-TRIGGER; PIN3- ECHO; PIN4- TEREN. Pinul de declanșare este locul în care dăm declanșator pentru a spune senzorului să măsoare distanța. Ecoul este pinul de ieșire de unde obținem distanța sub forma lățimii impulsului. Pinul de ecou aici este conectat la controler ca o sursă de întrerupere externă. Deci, pentru a obține lățimea semnalului de ieșire, pinul de ecou al senzorului este conectat la INT0 (întrerupere 0) sau PD2.
1. Declanșați senzorul trăgând în sus pinul de declanșare pentru cel puțin 12uS.
2. Odată ce ecoul crește, obținem o întrerupere externă și vom începe un contor (activând un contor) în ISR (Interrupt Service Routine) care se execută imediat după declanșarea unei întreruperi.
3. Odată ce ecoul scade din nou, este generată o întrerupere, de data aceasta vom opri contorul (dezactivând contorul).
4. Deci, pentru un impuls de la mare la scăzut la ecou, am pornit un contor și l-am oprit. Acest număr este actualizat în memorie pentru obținerea distanței, deoarece acum avem lățimea ecoului în numărare.
5. Vom face alte calcule în memorie pentru a obține distanța în cm
6. Distanța este afișată pe afișajul LCD 16x2.
Pentru configurarea caracteristicilor de mai sus vom seta următoarele registre:
Cele trei registre de mai sus trebuie să fie setate în consecință pentru ca setarea să funcționeze și le vom discuta pe scurt, ALBASTRU (INT0): acest bit trebuie setat ridicat pentru a activa întreruperea externă0, odată ce acest pin este setat, vom simți modificările logice la pinul PIND2.
BROWN (ISC00, ISC01): acești doi biți sunt reglați pentru schimbarea logică adecvată la PD2, care trebuie considerată ca întrerupere.
Așa cum am spus mai devreme, avem nevoie de o întrerupere pentru a începe un număr și pentru a-l opri. Deci, setăm ISC00 ca unul și primim o întrerupere atunci când există o logică LOW to HIGH la INT0; o altă întrerupere atunci când există o logică de la ÎNALT la MIC.
RED (CS10): Acest bit este pur și simplu pentru a activa și a dezactiva contorul. Deși funcționează împreună cu alți biți CS10, CS12. Nu facem nicio prescalare aici, deci nu trebuie să ne facem griji cu privire la ele.
Câteva lucruri importante de reținut aici sunt:
Folosim ceasul intern al ATMEGA32A, care este de 1 MHz. Fără prescalare aici, nu facem compararea întreruperii meciului, generează rutină, deci nu există setări complexe de înregistrare.
Valoarea de numărare după numărare este stocată în registrul TCNT1 pe 16 biți.
Verificați și acest proiect cu arduino: Măsurarea distanței folosind Arduino
Explicație de programare
Funcționarea senzorului de măsurare a distanței este explicată pas cu pas în programul C de mai jos.
#include // antet pentru a permite controlul fluxului de date peste pini #define F_CPU 1000000 // indicând frecvența cristalului controlerului atașată #include