Da lahko kateri koli projekt zaživi, moramo uporabiti senzorje. Senzorji delujejo kot oči in ušesa za vse vgrajene programe, digitalnemu mikrokrmilniku pa pomaga razumeti, kaj se dejansko dogaja v tem resničnem analognem svetu. V tej vadnici se bomo naučili, kako povezati ultrazvočni senzor HC-SR04 z mikrokrmilnikom PIC.
HC-SR04 je ultrazvočni senzor, ki se lahko uporablja za merjenje kjerkoli razdaljo med 2 cm do 450cm (teoretično). Ta senzor se je izkazal kot vreden, saj se je vključil v številne projekte, ki vključujejo odkrivanje ovir, merjenje razdalje, kartiranje okolja itd. Na koncu tega članka boste izvedeli, kako deluje ta senzor in kako ga povezati z mikrokrmilnikom PIC16F877A za merjenje razdalje in prikaza na LCD zaslonu. Sliši se zanimivo kajne !! Začnimo torej…
Potrebni materiali:
- PIC16F877A MCU z nastavitvijo programiranja
- LCD zaslon 16 * 2
- Ultrazvočni senzor (HC-SR04)
- Priključne žice
Kako deluje ultrazvočni senzor?
Preden nadaljujemo, bi morali vedeti, kako deluje ultrazvočni senzor, da bomo veliko bolje razumeli to vadnico. Ultrazvočni senzor, uporabljen v tem projektu, je prikazan spodaj.
Kot lahko vidite, ima dve krožni očesi, kot so štrleči deli, in štiri zatiči, ki izhajajo iz nje. Obe očesni projekciji sta ultrazvočni val (v nadaljevanju ameriški val) oddajnik in sprejemnik. Oddajnik oddaja ameriški val s frekvenco 40 Hz, ta val potuje po zraku in se odbije nazaj, ko zazna predmet. Sprejemnik opazuje povratne valove. Zdaj vemo, koliko časa je potreben, da se ta val odbije in vrne, hitrost ameriškega vala pa je univerzalna (3400 cm / s). Na podlagi teh informacij in spodnjih formul za srednje šole lahko izračunamo prevoženo razdaljo.
Razdalja = hitrost × čas
Zdaj, ko vemo, kako deluje ameriški senzor, povejmo, kako ga je mogoče povezati s katerim koli MCU / CPU s pomočjo štirih nožic. Ti štirje zatiči so Vcc, Trigger, Echo in Ground. Modul deluje na + 5V, zato se za napajanje modula uporablja Vcc in ozemljitveni zatič. Druga dva zatiča sta vhodno / izhodna zatiča, s pomočjo katerih komuniciramo z našim MCU. Sprožilec pin je treba razglasiti kot izhodni pin in je visoka za 10uS, bo ta posreduje val v ZDA v zrak kot 8 cikla zvočni počil. Ko opazimo val, se bo zatič Echo pomaknil visoko za natančen čas, ki ga je ameriški val vzel nazaj v senzorski modul. Zato bo ta Echo pin razglašen za vhodin časovnik bo uporabljen za merjenje, kako dolgo je bil zatič visok. To bi lahko nadalje razumeli spodnji časovni diagram.
Upam, da ste prišli do okvirnega načina povezovanja tega senzorja s PIC. V tej vadnici bomo uporabili modul časovnika in modul LCD in predvidevam, da ste oba seznanjeni, če ne, se vrnite na spodnjo vadnico, saj bom večino informacij, povezanih z njo, preskočil.
- Povezava LCD z mikrokrmilnikom PIC
- Razumevanje časovnikov v mikrokrmilniku PIC
Shema vezja:
Popoln diagram vezja za povezovanje ultrazvočnega senzorja s PIC16F877A je prikazan spodaj:
Kot je prikazano, vezje vključuje samo LCD zaslon in sam ultrazvočni senzor. Ameriški senzor lahko napaja + 5V, zato ga neposredno napaja napetostni regulator 7805. Senzor ima en izhodni zatič (sprožilni zatič), ki je priključen na zatič 34 (RB1), vhodni zatič (eho zatič) pa je povezan z zatičem 35 (RB2). Popolna pin povezava je prikazana v spodnji tabeli.
S. Št: |
Številka PIN-a PIC |
Pripnite ime |
Povezan z |
1. |
21. |
RD2 |
RS LCD |
2. |
22. |
RD3 |
E LCD |
3. |
27. |
RD4 |
D4 LCD |
4. |
28. |
RD5 |
D5 LCD |
5. |
29. |
RD6 |
D6 LCD |
6. |
30. |
RD7 |
D7 LCD |
7. |
34 |
RB1 |
Sprožilec ZDA |
8. |
35 |
RB2 |
Odmev ZDA |
Programiranje vašega mikrokrmilnika PIC:
Celoten program za to vadnico je podan na koncu te strani, spodaj sem razložil kodo v majhne pomene, ki jih boste razumeli. Kot smo že omenili, program vključuje koncept povezave LCD in časovnika, ki v tej vadnici ne bo podrobneje razložen, saj smo jih že obravnavali v prejšnjih vajah.
V notranjosti je glavna funkcija, ki jo začnemo z inicializacijo IO zatičev in drugih registrov kot običajno. Določimo IO zatiče za LCD in ameriški senzor ter sprožimo tudi register Timer 1, tako da nastavimo, da deluje na pred skalarju 1: 4 in uporablja notranjo uro (Fosc / 4)
TRISD = 0x00; // PORTD je deklariran kot izhod za povezovanje LCD TRISB0 = 1; // Določimo pin RB0 kot vhod za uporabo kot prekinitveni pin TRISB1 = 0; // Sprožilni zatič ameriškega senzorja je poslan kot izhodni zatič TRISB2 = 1; // Odmevni zatič ameriškega senzorja je nastavljen kot vhodni zatič TRISB3 = 0; // RB3 je izhodni zatič za LED T1CON = 0x20; // 4 preskalarne in notranje ure
Timer 1 je 16-bitni časovnik, ki se uporablja v PIC16F877A, register T1CON nadzoruje parametre modula časovnika, rezultat pa bo shranjen v TMR1H in TMR1L, saj bo 16-bitni rezultat prvih 8 shranil v TMR1H in naslednjih 8 v TMR1L. Ta časovnik lahko vklopite ali izklopite z uporabo TMR1ON = 0 oziroma TMR1ON = 1.
Zdaj je časovnik pripravljen za uporabo, vendar moramo poslati ameriške valove iz senzorja, za to pa moramo imeti sprožilni zatič visoko za 10 uS, to stori naslednja koda.
Sprožilec = 1; __zakasni_us (10); Sprožilec = 0;
Kot je prikazano na časovnem diagramu zgoraj, bo odsev Echo ostal nizek, dokler se val ne vrne nazaj, nato pa se bo dvignil visoko in ostal visok za natančen čas, potreben za vrnitev valov nazaj. Ta čas mora izmeriti modul Timer 1, kar lahko storite v spodnji vrstici
medtem ko (Echo == 0); TMR1ON = 1; medtem ko (Echo == 1); TMR1ON = 0;
Ko je čas izmerjen, se dobljena vrednost shrani v registre TMR1H in TMR1L, te registre je treba zbrati, da dobijo 16-bitno vrednost. To se naredi s spodnjo vrstico
time_taken = (TMR1L - (TMR1H << 8));
Ta time_taken bo v obliki bajtov, da dobimo dejansko časovno vrednost, moramo uporabiti spodnjo formulo.
Time = (16-bitna vrednost registra) * (1 / Notranja ura) * (Pre-scale) Notranja ura = Fosc / 4 Kjer je v našem primeru Fosc = 20000000Mhz in Pre-scale = 4 Zato bo vrednost notranje ure 5000000Mhz in vrednost časa bo Time = (16-bitna vrednost registra) * (1/5000000) * (4) = (16-bitna vrednost registra) * (4/5000000) = (16-bitna vrednost registra) * 0,0000008 sekunde (ALI) Čas = (16-bitna vrednost registra) * 0,8 mikro sekunde
V našem programu je vrednost 16-bitnega registra shranjena v spremenljivki time_taken, zato je spodnja vrstica uporabljena za izračun time_taken v mikro sekundah
zajet čas = zajet čas * 0,8;
Nato moramo najti, kako izračunati razdaljo. Kot vemo razdalja = hitrost * čas. Tu pa je treba rezultat deliti z 2, saj val pokriva tako oddajno kot sprejemno razdaljo. Hitrost vala (zvoka) je 34000cm / s.
Distance = (Speed * Time) / 2 = (34000 * (16-bitna vrednost registra) * 0.0000008) / 2 Distance = (0.0272 * 16-bitna vrednost registra) / 2
Tako lahko razdaljo izračunamo v centimetrih, kot spodaj:
razdalja = (0,0272 * zajeto) / 2;
Po izračunu vrednosti oddaljenosti in porabljenega časa jih moramo preprosto prikazati na LCD zaslonu.
Merjenje razdalje s pomočjo PIC in ultrazvočnega senzorja:
Po vzpostavitvi povezav in nalaganju kode mora biti vaša poskusna nastavitev videti nekako tako, kot je prikazano na spodnji sliki.
PIC Perf plošča, prikazana na tej sliki, je bila narejena za našo vadnico PIC, v kateri smo se naučili uporabljati PIC mikrokrmilnik. Morda se boste želeli vrniti k tistim vadnicam mikrokrmilnika PIC, ki uporabljajo MPLABX in XC8, če ne veste, kako zapisati program s programom Pickit 3, saj bom preskočil vse te osnovne informacije.
Zdaj postavite predmet pred senzor in ta naj prikaže, kako daleč je predmet od senzorja. Opazite lahko tudi čas, prikazan v mikro sekundah, da se val odda in vrne nazaj.
Predmet lahko premaknete na želeno razdaljo in preverite vrednost, ki je prikazana na LCD-prikazovalniku. Z natančnostjo 0,5 cm sem lahko izmeril razdaljo od 2 cm do 350 cm. To je povsem zadovoljiv rezultat! Upam, da ste uživali v vadnici in se naučili, kako nekaj narediti sami. Če dvomite, jih spustite v spodnji odsek za komentarje ali uporabite forume.
Preverite tudi povezavo ultrazvočnega senzorja z drugimi mikrokrmilniki:
- Merjenje razdalje na osnovi arduino in ultrazvočnega senzorja
- Izmerite razdaljo z uporabo ultrazvočnega senzorja Raspberry Pi in HCSR04
- Merjenje razdalje s pomočjo mikrokrmilnika HC-SR04 in AVR