Aby każdy projekt ożył, musimy użyć czujników. Czujniki działają jak oczy i uszy we wszystkich wbudowanych aplikacjach, pomagają cyfrowemu mikrokontrolerowi zrozumieć, co faktycznie dzieje się w prawdziwym świecie analogowym. W tym samouczku nauczymy się, jak połączyć czujnik ultradźwiękowy HC-SR04 z mikrokontrolerem PIC.
HC-SR04 to czujnik ultradźwiękowy, który może być stosowany do mierzenia odległości w dowolnym miejscu między 2 cm do 450 cm (teoretycznie). Ten czujnik sprawdził się w wielu projektach, które obejmują wykrywanie przeszkód, pomiar odległości, mapowanie środowiska itp. Na końcu tego artykułu dowiesz się, jak działa ten czujnik i jak połączyć go z mikrokontrolerem PIC16F877A w celu pomiaru odległości i wyświetlania na ekranie LCD. Brzmi interesująco, prawda! Więc zacznijmy…
Wymagane materiały:
- MCU PIC16F877A z konfiguracją programowania
- Wyświetlacz LCD 16 * 2
- Czujnik ultradźwiękowy (HC-SR04)
- Przewody łączące
Jak działa czujnik ultradźwiękowy?
Zanim przejdziemy dalej, powinniśmy wiedzieć, jak działa czujnik ultradźwiękowy, abyśmy mogli znacznie lepiej zrozumieć ten samouczek. Poniżej przedstawiono czujnik ultradźwiękowy zastosowany w tym projekcie.
Jak widać, ma dwa okrągłe oczy jak wypustki i wychodzące z niego cztery szpilki. Dwie projekcje przypominające oko to nadajnik i odbiornik fali ultradźwiękowej (zwanej dalej falą amerykańską). Nadajnik emituje falę amerykańską o częstotliwości 40 Hz, która przemieszcza się w powietrzu i jest odbijana, gdy wykryje obiekt. Odbiornik obserwuje powracające fale. Teraz znamy czas potrzebny na odbicie i powrót tej fali, a także prędkość fali amerykańskiej jest uniwersalna (3400 cm / s). Korzystając z tych informacji i poniższych wzorów z liceum, możemy obliczyć pokonany dystans.
Odległość = prędkość × czas
Teraz, gdy wiemy, jak działa czujnik amerykański, pozwól nam, jak można go połączyć z dowolnym MCU / CPU za pomocą czterech pinów. Te cztery piny to odpowiednio Vcc, Trigger, Echo i Ground. Moduł pracuje pod napięciem + 5V, stąd Vcc i pin uziemienia służą do zasilania modułu. Pozostałe dwa piny to piny I / O, za pomocą których komunikujemy się z naszym MCU. Kołek spustowy powinien być zadeklarowany jako kołek wyjściowy i wysokocząsteczkowy przez 10us, to przekazuje fali USA na powietrzu, 8 cykli dźwięku serii. Po zaobserwowaniu fali pin Echo przejdzie w stan wysoki na dokładny przedział czasu, jaki zajęła fala amerykańska, aby powrócić do modułu czujnika. Stąd ten pin Echo zostanie zadeklarowany jako wejściea zegar będzie używany do pomiaru, jak długo pin był wysoki. Można to lepiej zrozumieć dzięki poniższemu diagramowi czasowemu.
Mam nadzieję, że doszedłeś do wstępnego sposobu połączenia tego czujnika z PIC. Będziemy używać modułu Timer i modułu LCD w tym samouczku i zakładam, że znasz oba, jeśli nie, wróć do odpowiedniego samouczka poniżej, ponieważ pominę większość informacji z nim związanych.
- Połączenie LCD z mikrokontrolerem PIC
- Zrozumienie timerów w mikrokontrolerze PIC
Schemat obwodu:
Pełny schemat połączeń dla połączenia czujnika ultradźwiękowego z PIC16F877A przedstawiono poniżej:
Jak pokazano, obwód składa się tylko z wyświetlacza LCD i samego czujnika ultradźwiękowego. Czujnik amerykański może być zasilany napięciem + 5 V, dlatego jest zasilany bezpośrednio przez regulator napięcia 7805. Czujnik ma jeden pin wyjściowy (pin wyzwalający), który jest podłączony do pinu 34 (RB1), a pin wejściowy (pin Echo) jest podłączony do pinu 35 (RB2). Pełne połączenie pinów przedstawiono w poniższej tabeli.
S.No: |
Numer pinu PIC |
Nazwa pinu |
Połączony z |
1 |
21 |
RD2 |
RS LCD |
2 |
22 |
RD3 |
E z LCD |
3 |
27 |
RD4 |
D4 wyświetlacza LCD |
4 |
28 |
RD5 |
D5 wyświetlacza LCD |
5 |
29 |
RD6 |
D6 wyświetlacza LCD |
6 |
30 |
RD7 |
D7 wyświetlacza LCD |
7 |
34 |
RB1 |
Wyzwalacz US |
8 |
35 |
RB2 |
Echo US |
Programowanie mikrokontrolera PIC:
Kompletny program dla tego samouczka znajduje się na końcu tej strony, poniżej wyjaśniłem kod w małych znaczących fragmentach, abyś mógł je zrozumieć. Jak wspomniano wcześniej, program zawiera koncepcję interfejsu LCD i timera, które nie zostaną szczegółowo wyjaśnione w tym samouczku, ponieważ omówiliśmy je już w poprzednich samouczkach.
Wewnątrz, główną funkcję zaczynamy od inicjalizacji pinów IO i innych rejestrów jak zwykle. Definiujemy piny IO dla LCD i czujnika US, a także inicjujemy rejestr Timera 1 ustawiając go na pracę na pre-skalarach 1: 4 i używając zegara wewnętrznego (Fosc / 4)
TRISD = 0x00; // PORTD zadeklarowany jako wyjście do interfejsu LCD TRISB0 = 1; // Zdefiniuj pin RB0 jako wejście do użycia jako pin przerwania TRISB1 = 0; // Pin wyzwalający czujnika US jest wysyłany jako pin wyjściowy TRISB2 = 1; // Pin echa czujnika US jest ustawiony jako pin wejściowy TRISB3 = 0; // RB3 jest pinem wyjściowym dla LED T1CON = 0x20; // 4 presskalarne i wewnętrzny zegar
Timer 1 jest 16-bitowym timerem używanym w PIC16F877A, rejestr T1CON steruje parametrami modułu timera, a wynik będzie przechowywany w TMR1H i TMR1L, ponieważ jest to wynik 16-bitowy, pierwszych 8 będzie przechowywanych w TMR1H, a następne 8 w TMR1L. Ten timer można włączać i wyłączać odpowiednio za pomocą TMR1ON = 0 i TMR1ON = 1.
Teraz zegar jest gotowy do użycia, ale musimy wysłać fale US z czujnika, aby to zrobić, musimy utrzymywać pin wyzwalający wysoki przez 10uS, odbywa się to za pomocą następującego kodu.
Wyzwalacz = 1; __delay_us (10); Wyzwalacz = 0;
Jak pokazano na powyższym schemacie czasowym, pin Echo pozostanie nisko, aż fala powróci, a następnie wzrośnie wysoko i pozostanie wysoko przez dokładny czas potrzebny do powrotu fal. Ten czas musi być mierzony przez moduł Timer 1, co można zrobić w poniższej linii
while (Echo == 0); TMR1ON = 1; while (Echo == 1); TMR1ON = 0;
Po zmierzeniu czasu wynikowa wartość zostanie zapisana w rejestrach TMR1H i TMR1L, rejestry te muszą zostać połączone w celu zebrania wartości 16-bitowej. Odbywa się to za pomocą poniższej linii
time_taken = (TMR1L - (TMR1H << 8));
To time_taken będzie w postaci bajtów, aby uzyskać rzeczywistą wartość czasu, musimy użyć poniższego wzoru.
Czas = (wartość rejestru 16-bitowego) * (1 / Zegar wewnętrzny) * (Skala wstępna) Zegar wewnętrzny = Fosc / 4 Gdzie w naszym przypadku Fosc = 20000000 MHz i Skala wstępna = 4 Stąd wartość zegara wewnętrznego będzie 5000000 MHz, a wartością czasu będzie Czas = (wartość rejestru 16-bitowego) * (1/5000000) * (4) = (wartość rejestru 16-bitowego) * (4/5000000) = (wartość rejestru 16-bitowego) * 0,0000008 sekund (LUB) Czas = (wartość rejestru 16-bitowego) * 0,8 mikrosekundy
W naszym programie wartość 16-bitowego rejestru jest przechowywana w zmiennej time_plaken, stąd poniższa linia służy do obliczenia czasu_pobjętego w mikro sekundach
time_taken = time_taken * 0,8;
Następnie musimy dowiedzieć się, jak obliczyć odległość. Jak wiemy, odległość = prędkość * czas. Ale tutaj wynik należy podzielić przez 2, ponieważ fala obejmuje zarówno odległość transmisji, jak i odległość odbioru. Prędkość naszej fali (dźwięku) wynosi 34000 cm / s.
Odległość = (prędkość * czas) / 2 = (34000 * (wartość rejestru 16-bitowego) * 0,0000008) / 2 Odległość = (0,0272 * wartość rejestru 16-bitowego) / 2
Zatem odległość można obliczyć w centymetrach jak poniżej:
odległość = (0,0272 * czas_ zajęty) / 2;
Po wyliczeniu wartości odległości i czasu, po prostu musimy je wyświetlić na ekranie LCD.
Pomiar odległości za pomocą PIC i czujnika ultradźwiękowego:
Po wykonaniu połączeń i przesłaniu kodu, Twoja konfiguracja eksperymentalna powinna wyglądać tak, jak pokazano na poniższym obrazku.
Płyta PIC Perf, pokazana na tym zdjęciu, została stworzona na potrzeby naszej serii samouczków PIC, w których nauczyliśmy się obsługi mikrokontrolera PIC. Możesz wrócić do samouczków mikrokontrolera PIC przy użyciu MPLABX i XC8, jeśli nie wiesz, jak nagrać program za pomocą Pickit 3, ponieważ pominę te wszystkie podstawowe informacje.
Teraz umieść obiekt przed czujnikiem i powinien wyświetlać, jak daleko obiekt znajduje się od czujnika. Możesz również zauważyć, że czas potrzebny do przesłania i powrotu fali jest wyświetlany w mikrosekundach.
Możesz przesunąć obiekt na preferowaną odległość i sprawdzić wartość wyświetlaną na wyświetlaczu LCD. Udało mi się zmierzyć odległość od 2cm do 350cm z dokładnością do 0,5cm. To całkiem zadowalający wynik! Mam nadzieję, że spodobał Ci się samouczek i nauczyłeś się, jak zrobić coś samodzielnie. Jeśli masz jakiekolwiek wątpliwości, umieść je w sekcji komentarzy poniżej lub skorzystaj z forum.
Sprawdź również połączenie czujnika ultradźwiękowego z innymi mikrokontrolerami:
- Pomiar odległości oparty na Arduino i czujnikach ultradźwiękowych
- Zmierz odległość za pomocą Raspberry Pi i czujnika ultradźwiękowego HCSR04
- Pomiar odległości za pomocą HC-SR04 i mikrokontrolera AVR