Pentru ca orice proiect să prindă viață, trebuie să folosim senzori. Senzorii acționează ca ochi și urechi pentru toate aplicațiile încorporate, ajută microcontrolerul digital să înțeleagă ce se întâmplă de fapt în această lume analogică reală. În acest tutorial vom învăța cum să interfață senzorul cu ultrasunete HC-SR04 cu microcontroler PIC.
HC-SR04 este un senzor ultrasonic, care poate fi utilizat pentru a măsura distanța oriunde între 2cm la 450 cm (teoretic). Acest senzor s-a dovedit a fi demn de a se încadra în multe proiecte care implică detectarea obstacolelor, măsurarea distanței, cartarea mediului etc. La sfârșitul acestui articol veți afla cum funcționează acest senzor și cum să îl interfațați cu microcontrolerul PIC16F877A pentru a măsura distanța și afișarea. pe ecranul LCD. Sună interesant nu-i așa !! Deci sa începem…
Materiale necesare:
- MCU PIC16F877A cu setare de programare
- Afișaj LCD 16 * 2
- Senzor cu ultrasunete (HC-SR04)
- Conectarea firelor
Cum funcționează un senzor cu ultrasunete?
Înainte de a ajunge mai departe, ar trebui să știm cum funcționează un senzor cu ultrasunete, astfel încât să putem înțelege mult mai bine acest tutorial. Senzorul cu ultrasunete utilizat în acest proiect este prezentat mai jos.
După cum puteți vedea, are doi ochi circulari precum proiecții și patru pini care ies din el. Cele două proiecții asemănătoare ochiului sunt emițătorul și receptorul unde ultrasonice (denumite în continuare undă SUA). Transmițătorul emite o undă SUA la o frecvență de 40Hz, această undă călătorește prin aer și se reflectă înapoi atunci când simte un obiect. Undele care se întorc sunt observate de receptor. Acum știm timpul necesar pentru ca acest val să se reflecte și să revină, iar viteza valului SUA este, de asemenea, universală (3400cm / s). Folosind aceste informații și formulele de liceu de mai jos putem calcula distanța parcursă.
Distanță = Viteză × Timp
Acum, că știm cum funcționează un senzor SUA, permiteți-ne cum poate fi interfațat cu orice MCU / CPU folosind cei patru pini. Acești patru pini sunt Vcc, Trigger, Echo și respectiv Ground. Modulul funcționează pe + 5V și, prin urmare, Vcc și pinul de masă sunt utilizate pentru a alimenta modulul. Ceilalți doi pini sunt pini I / O cu care comunicăm MCU-ului nostru. PIN - ul de declanșare trebuie să fie declarat ca un pin de ieșire și a făcut mare pentru un 10us, acest lucru va transmite unda SUA în aer ca 8 ciclu de explozie sonică. Odată ce unda este observată, pinul Echo se va ridica pentru intervalul exact de timp care a fost luat de unda SUA pentru a reveni la modulul senzor. Prin urmare, acest pin Echo va fi declarat ca intrareiar un cronometru va fi folosit pentru a măsura cât timp a fost ridicat pinul. Acest lucru ar putea fi înțeles în continuare prin diagrama de sincronizare de mai jos.
Sper că ați ajuns la un mod provizoriu de interfață a acestui senzor cu PIC. Vom folosi modulul Timer și modulul LCD în acest tutorial și presupun că sunteți familiarizați cu ambele, dacă nu, vă rugăm să reveniți la tutorialul de mai jos, deoarece voi omite majoritatea informațiilor legate de acesta.
- Interfață LCD cu microcontroler PIC
- Înțelegerea cronometrelor în microcontrolerul PIC
Diagrama circuitului:
Schema completă a circuitului pentru interfața senzorului cu ultrasunete cu PIC16F877A este prezentată mai jos:
După cum se arată, circuitul nu implică altceva decât un afișaj LCD și senzorul cu ultrasunete în sine. Senzorul SUA poate fi alimentat cu + 5V și, prin urmare, este alimentat direct de regulatorul de tensiune 7805. Senzorul are un pin de ieșire (pinul de declanșare) care este conectat la pinul 34 (RB1), iar pinul de intrare (pinul Echo) este conectat la pinul 35 (RB2). Conexiunea pin completă este ilustrată în tabelul de mai jos.
S. Nu: |
Număr PIN PIC |
Nume PIN |
Conectat la |
1 |
21 |
RD2 |
RS de LCD |
2 |
22 |
RD3 |
E de LCD |
3 |
27 |
RD4 |
D4 de LCD |
4 |
28 |
RD5 |
D5 de LCD |
5 |
29 |
RD6 |
D6 de LCD |
6 |
30 |
RD7 |
D7 de LCD |
7 |
34 |
RB1 |
Declanșatorul SUA |
8 |
35 |
RB2 |
Ecoul SUA |
Programarea microcontrolerului PIC:
Programul complet pentru acest tutorial este dat la sfârșitul acestei pagini, mai jos am explicat codul în bucăți complete mici, cu sens semnificativ, pentru ca dvs. să înțelegeți. După cum sa spus mai devreme, programul implică conceptul de interfață LCD și Timer, care nu va fi explicat în detalii în acest tutorial, deoarece le-am acoperit deja în tutorialele anterioare.
În interior, funcția principală o începem cu inițializarea pinilor IO și a altor registre, ca de obicei. Definim pinii IO pentru senzorii LCD și SUA și, de asemenea, inițiem registrul Timer 1 setându-l să funcționeze pe 1: 4 pre-scalar și să utilizeze ceasul intern (Fosc / 4)
TRISD = 0x00; // PORTD declarat ca ieșire pentru interfața LCD TRISB0 = 1; // Definiți pinul RB0 ca intrare pentru a-l utiliza ca pin de întrerupere TRISB1 = 0; // Pinul de declanșare al senzorului SUA este trimis ca pin de ieșire TRISB2 = 1; // Pinul de ecou al senzorului SUA este setat ca pin de intrare TRISB3 = 0; // RB3 este pinul de ieșire pentru LED-ul T1CON = 0x20; // 4 ceas pres-scalar și intern
Timerul 1 este un temporizator pe 16 biți utilizat în PIC16F877A, registrul T1CON controlează parametrii modulului temporizator și rezultatul va fi stocat în TMR1H și TMR1L, deoarece un rezultat pe 16 biți, primele 8 vor fi stocate în TMR1H și următorii 8 în TMR1L. Acest cronometru poate fi activat sau dezactivat folosind TMR1ON = 0 și respectiv TMR1ON = 1.
Acum, cronometrul este gata de utilizare, dar trebuie să trimitem undele SUA din senzor, pentru a face acest lucru, trebuie să menținem pinul Trigger înalt pentru 10uS, acest lucru se face prin următorul cod.
Declanșator = 1; __delay_us (10); Declanșator = 0;
Așa cum se arată în diagrama de sincronizare de mai sus, știftul Echo va rămâne scăzut până când valul se va întoarce înapoi și va merge apoi în sus și va rămâne înalt pentru timpul exact necesar pentru ca valurile să se întoarcă înapoi. Acest timp trebuie măsurat prin modulul Timer 1, care poate fi realizat de linia de mai jos
while (Ecou == 0); TMR1ON = 1; while (Ecou == 1); TMR1ON = 0;
Odată ce timpul este măsurat, valoarea rezultată va fi salvată în registrele TMR1H și TMR1L, aceste registre trebuie să fie clătite pentru a se aduna pentru a obține valoarea de 16 biți. Acest lucru se face folosind linia de mai jos
time_taken = (TMR1L - (TMR1H << 8));
Acest time_taken va fi sub formă de octeți, pentru a obține valoarea reală a timpului trebuie să folosim formula de mai jos.
Timp = (valoare registru pe 16 biți) * (1 / Ceas intern) * (Pre-scară) Ceas intern = Fosc / 4 În cazul nostru, Fosc = 20000000Mhz și Pre-scale = 4 Prin urmare, valoarea Ceasului intern va fi 5000000Mhz și valoarea timpului va fi Timp = (valoare registru pe 16 biți) * (1/5000000) * (4) = (valoare registru pe 16 biți) * (4/5000000) = (valoare registru pe 16 biți) * 0,0000008 secunde (SAU) Timp = (valoare registru pe 16 biți) * 0,8 micro secunde
În programul nostru, valoarea registrului de 16 biți este stocată în variabila time_taken și, prin urmare, linia de mai jos este utilizată pentru a calcula time_taken în micro secunde
time_taken = time_taken * 0,8;
Apoi trebuie să aflăm cum să calculăm distanța. După cum știm distanță = viteză * timp. Dar aici rezultatul ar trebui împărțit la 2, deoarece unda acoperă atât distanța de transmisie, cât și distanța de recepție. Viteza undei noastre (sunetul) este de 34000cm / s.
Distanță = (Viteză * Timp) / 2 = (34000 * (valoare registru pe 16 biți) * 0,0000008) / 2 Distanță = (0,0272 * valoare registru pe 16 biți) / 2
Deci distanța poate fi calculată în centimetri ca mai jos:
distanță = (0,0272 * timp_dupus) / 2;
După calcularea valorii distanței și a timpului, trebuie doar să le afișăm pe ecranul LCD.
Măsurarea distanței utilizând PIC și senzorul cu ultrasunete:
După efectuarea conexiunilor și încărcarea codului, configurarea dvs. experimentală ar trebui să arate așa cum se arată în imaginea de mai jos.
Placa PIC Perf, prezentată în această imagine, a fost realizată pentru seria noastră de tutoriale PIC, în care am învățat cum să folosim microcontrolerul PIC. S-ar putea să doriți să reveniți la acele tutoriale PIC Microcontroller care utilizează MPLABX și XC8 dacă nu știți cum să ardeți un program folosind Pickit 3, deoarece voi sări peste toate acele informații de bază.
Acum puneți un obiect înaintea senzorului și acesta trebuie să afișeze cât de departe este obiectul de senzor. De asemenea, puteți observa afișarea timpului necesar în micro secunde pentru ca unda să poată transmite și reveni înapoi.
Puteți muta obiectul la distanța preferată și puteți verifica valoarea afișată pe ecranul LCD. Am putut măsura distanța de la 2cm la 350cm cu o precizie de 0,5cm. Acesta este un rezultat destul de satisfăcător! Sper că ți-a plăcut tutorialul și ai învățat cum să faci ceva pe cont propriu. Dacă aveți nelămuriri, aruncați-le în secțiunea de comentarii de mai jos sau folosiți forumurile.
De asemenea, verificați interfața senzorului ultrasonic cu alte microcontrolere:
- Măsurarea distanței pe baza senzorului Arduino și cu ultrasunete
- Măsurați distanța folosind senzorul cu ultrasunete Raspberry Pi și HCSR04
- Măsurarea distanței utilizând microcontrolerul HC-SR04 și AVR