För att alla projekt ska få liv måste vi använda sensorer. Sensorer fungerar som ögon och öron för alla inbäddade applikationer, det hjälper den digitala mikrokontrollern att förstå vad som faktiskt händer i denna riktiga analoga värld. I denna handledning kommer vi att lära oss hur man gränssnitt ultraljudssensor HC-SR04 med PIC-mikrokontroller.
Den HC-SR04 är en ultraljudssensor, som kan användas för att mäta avstånd var som helst mellan 2 cm till 450cm (teoretiskt). Denna sensor har visat sig vara värdig genom att passa in i många projekt som involverar detektering av hinder, avståndsmätning, miljökartläggning etc. I slutet av den här artikeln kommer du att lära dig hur den här sensorn fungerar och hur man gränssnitt den med PIC16F877A mikrokontroller för att mäta avståndet och displayen på LCD-skärmen. Låter intressant rätt !! Så låt oss komma igång…
Material som krävs:
- PIC16F877A MCU med programmeringsinställningar
- LCD 16 * 2-skärm
- Ultraljudsensor (HC-SR04)
- Anslutande ledningar
Hur fungerar en ultraljudssensor?
Innan vi går vidare bör vi veta hur en ultraljudssensor fungerar så att vi kan förstå denna handledning mycket bättre. Ultraljudsgivaren som används i detta projekt visas nedan.
Som du kan se har den två cirkulära ögon som utsprång och fyra stift som kommer ut ur den. De två ögonliknande projektionerna är Ultrasonic Wave (nedan kallad US Wave) sändare och mottagare. Sändaren avger en amerikansk våg med en frekvens på 40Hz, denna våg färdas genom luften och reflekteras tillbaka när den känner av ett objekt. De mottagande vågorna observeras av mottagaren. Nu vet vi hur lång tid det tar för den här vågen att reflekteras och komma tillbaka och den amerikanska vågens hastighet är också universell (3400 cm / s). Med hjälp av denna information och nedanstående formler för gymnasiet kan vi beräkna avståndet.
Avstånd = Hastighet × Tid
Nu när vi vet hur en amerikansk sensor fungerar, låt oss hur den kan anslutas till vilken MCU / CPU som helst med de fyra stiften. Dessa fyra stift är Vcc, Trigger, Echo respektive Ground. Modulen fungerar på + 5V och därför används Vcc och jordstift för att driva modulen. De andra två stiften är I / O-stiften som vi kommunicerar med till vår MCU. Den avtryckarstiftet bör förklaras som ett utgångsstift och görs hög för en 10US, kommer detta att sända den amerikanska vågen in i luften som 8 cykel sonic skur. När vågen har observerats kommer Echo-stiftet att gå högt under det exakta tidsintervall som den amerikanska vågen tog för att återgå till sensormodulen. Därför kommer detta Echo-stift att deklareras som ingångoch en timer kommer att användas för att mäta hur länge stiftet var högt. Detta kan vidare förstås av tidsdiagrammet nedan.
Hoppas att du har kommit fram till ett preliminärt sätt att koppla ihop denna sensor med PIC. Vi kommer att använda timermodulen och LCD-modulen i denna handledning och jag antar att du är bekant med båda, om inte, vänligen fall tillbaka till respektive handledning nedan eftersom jag kommer att hoppa över de flesta information som är relaterade till den.
- LCD-gränssnitt med PIC Microcontroller
- Förstå timers i PIC Microcontroller
Kretsschema:
Det fullständiga kretsschemat för gränssnitt mellan ultraljudssensor och PIC16F877A visas nedan:
Som visat involverar kretsen inget annat än en LCD-skärm och själva ultraljudssensorn. Den amerikanska sensorn kan drivas med + 5V och följaktligen drivs den direkt av 7805 spänningsregulator. Sensorn har en utgångsstift (Trigger pin) som är ansluten till pin 34 (RB1) och ingångsstiftet (Echo pin) är ansluten till pin 35 (RB2). Den fullständiga stiftanslutningen illustreras i tabellen nedan.
S. nej: |
PIC-stiftnummer |
Pin-namn |
Anslutna till |
1 |
21 |
RD2 |
RS på LCD |
2 |
22 |
RD3 |
E av LCD |
3 |
27 |
RD4 |
D4 på LCD |
4 |
28 |
RD5 |
D5 på LCD |
5 |
29 |
RD6 |
D6 på LCD |
6 |
30 |
RD7 |
D7 på LCD |
7 |
34 |
RB1 |
Trigger of US |
8 |
35 |
RB2 |
Echo of US |
Programmera din PIC Microcontroller:
Det fullständiga programmet för den här handledningen ges i slutet av denna sida, längre ner har jag förklarat koden i små betydelse fulla bitar för dig att förstå. Som sagt tidigare involverar programmet begreppet LCD-gränssnitt och Timer som inte kommer att förklaras i detaljer i denna handledning eftersom vi redan har täckt dem i de tidigare självstudierna.
Inuti huvudfunktionen börjar vi med att initialisera IO-stiften och andra register som vanligt. Vi definierar IO-stiften för LCD- och US-sensorer och initierar också Timer 1-registret genom att ställa in det för att fungera på 1: 4 förskalare och använda intern klocka (Fosc / 4)
TRISD = 0x00; // PORTD deklareras som utgång för gränssnitt mellan LCD TRISB0 = 1; // Definiera RB0-stiftet som ingång för att använda som avbrottsstift TRISB1 = 0; // Trigger pin of US sensor is sent as output pin TRISB2 = 1; // Echo-stift på amerikansk sensor är inställt som ingångsstift TRISB3 = 0; // RB3 är utgångsstift för LED T1CON = 0x20; // 4 pres-skalär och intern klocka
Timern 1 är en 16-bitars timer som används i PIC16F877A, T1CON-registret styr timermodulens parametrar och resultatet lagras i TMR1H och TMR1L eftersom det är ett 16-bitarsresultat kommer de första 8 att lagras i TMR1H och nästa 8 i TMR1L. Denna timer kan slås på eller av med TMR1ON = 0 respektive TMR1ON = 1.
Nu är timern redo att användas, men vi måste skicka de amerikanska vågorna ur sensorn. För att göra detta måste vi hålla utlösarstiftet högt i 10uS, detta görs med följande kod.
Trigger = 1; __fördröjning (10); Trigger = 0;
Som visas i tidsdiagrammet ovan kommer Echo-stiftet att förbli lågt tills vågen återvänder och sedan gå högt och förbli högt under den exakta tid det tar för vågorna att återvända. Denna tid måste mätas med Timer 1-modulen, vilket kan göras med nedanstående rad
medan (Echo == 0); TMR1ON = 1; medan (Echo == 1); TMRlON = 0;
När tiden har uppmätts kommer det resulterande värdet att sparas i registren TMR1H och TMR1L, dessa register måste klubbas för att samlas för att få 16-bitarsvärdet. Detta görs genom att använda raden nedan
time_taken = (TMR1L - (TMR1H << 8));
Denna time_taken kommer att finnas i formbyte, för att få det aktuella tidsvärdet måste vi använda formeln nedan.
Tid = (16-bitars registervärde) * (1 / Intern klocka) * (Förskalning) Intern klocka = Fosc / 4 Var i vårt fall Fosc = 20000000Mhz och Förskalning = 4 Därav kommer värdet för Intern klocka 5000000Mhz och tidens värde blir Time = (16-bitars registervärde) * (1/5000000) * (4) = (16-bitars registervärde) * (4/5000000) = (16-bitars registervärde) * 0.0000008 sekunder (ELLER) Tid = (16-bitars registervärde) * 0,8 mikrosekunder
I vårt program lagras värdet på 16- bitarregistret i variabeln time_taken och följaktligen används nedanstående rad för att beräkna time_taken i mikrosekunder
time_taken = time_taken * 0,8;
Därefter måste vi hitta hur man beräknar avståndet. Som vi vet avstånd = hastighet * tid. Men här bör resultatet delas med 2 eftersom vågen täcker både sändningsavståndet och mottagningsavståndet. Hastigheten på oss vinkar (ljud) är 34000 cm / s.
Distans = (Hastighet * Tid) / 2 = (34000 * (16-bitars registervärde) * 0,0000008) / 2 Avstånd = (0,0272 * 16-bitars registervärde) / 2
Så avståndet kan beräknas i centimeter som nedan:
distance = (0,0272 * time_taken) / 2;
Efter att ha beräknat värdet på avståndet och den tid det tar måste vi helt enkelt visa dem på LCD-skärmen.
Mätavstånd med PIC och ultraljudssensor:
Efter att ha upprättat anslutningarna och laddat upp koden ska din experimentella inställning se ut så här som visas i bilden nedan.
PIC Perf-kortet, som visas på den här bilden, gjordes för vår PIC-handledningsserie, där vi lärde oss hur man använder PIC-mikrokontroller. Du kanske vill gå tillbaka till dessa PIC Microcontroller-handledning med MPLABX och XC8 om du inte vet hur man bränner ett program med Pickit 3, eftersom jag hoppar över all denna grundläggande information.
Placera nu ett objekt framför sensorn och det ska visa hur långt objektet är från sensorn. Du kan också lägga märke till att den tid det tar visas i mikrosekunder för vågen att sända och återvända.
Du kan flytta objektet på önskat avstånd och kontrollera det värde som visas på LCD-skärmen. Jag kunde mäta avstånd från 2 cm till 350 cm med en noggrannhet på 0,5 cm. Detta är ett ganska tillfredsställande resultat! Hoppas att du gillade självstudien och lärde dig att göra något på egen hand. Om du är osäker, släpp dem i kommentarsektionen nedan eller använd forumen.
Kontrollera även gränssnittet mellan ultraljudssensorn och andra mikrokontroller:
- Arduino & Ultraljudsbaserad avståndsmätning
- Mät avstånd med Raspberry Pi och HCSR04 ultraljudssensor
- Avståndsmätning med HC-SR04 och AVR Microcontroller