- Wymagane materiały:
- Schemat obwodu:
- Jak faktycznie działa moduł HC-SR04:
- Pomiar odległości między dwoma czujnikami ultradźwiękowymi (HC-SR04):
- Program czujnika nadajnika:
- Program dla czujnika odbiornika:
- Pracujący:
- Pomysł improwizowany - kalibracja sensora przy użyciu znanej odległości:
Czujnik ultradźwiękowy (HC-SR04) jest powszechnie używany do określania odległości obiektu od jednego określonego punktu. Było to dość łatwe z Arduino, a kod jest również dość prosty. Ale w tym artykule spróbujemy czegoś innego z tymi popularnymi czujnikami HC-SR04. Spróbujemy obliczyć odległość między dwoma czujnikami ultradźwiękowymi, to znaczy jeden czujnik będzie działał jako nadajnik, a drugi jako odbiornik. W ten sposób możemy śledzić lokalizację jednego nadajnika za pomocą wielu odbiorników ultradźwiękowych. Śledzenie to nazywa się triangulacją i może być używane do automatycznego dokowania robotów śledzących bagaż i innych podobnych zastosowań. Znajdowanie odległości między dwoma amerykańskimi czujnikami może wydawać się dość prostym zadaniem, ale stanąłem przed kilkoma wyzwaniami, o których mowa w tym projekcie.
Technika omówiona w tym artykule nie jest dość dokładna i może nie być przydatna w żadnym rzeczywistym systemie bez modyfikacji. W czasie tworzenia tej dokumentacji nie znalazłem nikogo, kto uzyskałby wyniki tak bliskie jak moje, więc właśnie podzieliłem się moimi poglądami na temat tego, jak to działa, aby ludzie, którzy próbują tego, nie musieli ponownie wymyślać koła.
Wymagane materiały:
- Arduino (2Nos) - Dowolny model
- Moduł HCSR04 (2Nos)
Schemat obwodu:
Chociaż zamierzamy sprawić, że jeden czujnik US (ultradźwiękowy) będzie działał jako nadajnik, a drugi jako odbiornik, konieczne jest połączenie wszystkich czterech pinów czujników z Arduino. Dlaczego powinniśmy? Więcej o tym zostanie omówione później, ale na razie schemat obwodu będzie wyglądał następująco
Jak widać schemat obwodu zarówno nadajnika, jak i odbiornika są identyczne. Zobacz także: Interfejs czujnika ultradźwiękowego Arduino
Jak faktycznie działa moduł HC-SR04:
Zanim przejdziemy dalej, pozwól nam zrozumieć, jak działa czujnik HC-SR04. Poniższy diagram czasowy pomoże nam zrozumieć działanie.
Czujnik ma dwa piny Trigger i Echo, które służą do pomiaru odległości, jak pokazano na schemacie czasowym. Najpierw do zainicjowania pomiaru powinniśmy wysłać falę ultradźwiękową z nadajnika, można to zrobić ustawiając pin wyzwalacza wysoko na 10uS. Jak tylko to się stanie, pin nadajnika wyśle 8 impulsów dźwiękowych fal amerykańskich. Ta fala amerykańska uderzy w obiekt odbije się i zostanie odebrana przez odbiornik.
Tutaj wykres czasowy pokazuje, że gdy odbiornik otrzyma falę, spowoduje to, że pin Echo będzie wysoki na czas, który jest równy czasowi potrzebnemu na przejście fali od czujnika US i dotarcie z powrotem do czujnika. Ten diagram czasowy nie wydaje się być prawdziwy.
Zakryłem część Tx (nadajnika) mojego czujnika i sprawdziłem, czy puls Echo jest wysoki i tak, idzie wysoko. Oznacza to, że impuls Echo nie czeka na odebranie fali US (ultradźwiękowej). Gdy transmituje falę amerykańską, idzie ona wysoko i pozostaje wysoko, dopóki fala nie powróci. Więc prawidłowy diagram czasowy powinien wyglądać mniej więcej tak, jak pokazano poniżej (Przepraszam za moje słabe umiejętności pisania)
Sprawdzenie, aby HC-SR04 działał tylko jako nadajnik:
Sprawienie, by HC-SR04 działał tylko jako nadajnik, jest całkiem proste. Jak pokazano na schemacie czasowym, musisz zadeklarować pin wyzwalacza jako pin wyjściowy i pozostawić go na wysokim poziomie przez 10 mikrosekund. To zainicjuje wybuch fali ultradźwiękowej. Dlatego zawsze, gdy chcemy przesłać falę, musimy tylko sterować pinem wyzwalającym czujnika nadajnika, dla którego kod podano poniżej.
Sprawdzenie, aby HC-SR04 działał tylko jako odbiornik:
Jak pokazano na schemacie taktowania, nie możemy kontrolować wzrostu pinu Echo, ponieważ jest on powiązany ze stykiem wyzwalacza. Nie ma więc możliwości, aby HC-SR04 działał tylko jako odbiornik. Ale możemy użyć hackowania, po prostu zakrywając część nadajnika czujnika taśmą (jak pokazano na poniższym obrazku) lub zakrywając, że fala amerykańska nie może wydostać się poza obudowę nadajnika, a pin Echo nie zostanie dotknięty tą falą amerykańską.
Teraz, aby pin echa poszedł wysoko, musimy po prostu pociągnąć ten atrapę pinezki wyzwalającej na 10 mikrosekund. Gdy czujnik odbiornika odbierze falę amerykańską przesłaną przez czujnik nadajnika, pin echa obniży się.
Pomiar odległości między dwoma czujnikami ultradźwiękowymi (HC-SR04):
Jak dotąd zrozumieliśmy, jak sprawić, by jeden czujnik działał jako nadajnik, a drugi jako odbiornik. Teraz musimy przesłać falę ultradźwiękową z czujnika nadajnika i odebrać ją za pomocą czujnika odbiornika i sprawdzić czas potrzebny na przejście fali z nadajnika do odbiornika, brzmi łatwo, prawda? Ale niestety! Mamy tu problem i to nie zadziała.
Moduł nadajnika i moduł odbiornika są daleko od siebie i gdy moduł odbiornika odbierze falę amerykańską z modułu nadajnika, nie będzie wiedział, kiedy nadajnik wysłał tę konkretną falę. Nie znając czasu rozpoczęcia, nie możemy obliczyć potrzebnego czasu, a tym samym odległości. Aby rozwiązać ten problem, impuls echa modułu odbiornika musi iść w stan wysoki dokładnie wtedy, gdy moduł nadajnika transmituje falę amerykańską. Innymi słowy, moduł nadajnika i moduł odbiornika powinny wyzwalać się w tym samym czasie. Można to osiągnąć następującą metodą.
Na powyższym schemacie Tx reprezentuje czujnik nadajnika, a Rx oznacza czujnik odbiornika. Jak pokazano, czujnik nadajnika będzie wysyłał fale US z okresowym znanym opóźnieniem, to wszystko, co musi zrobić.
W czujniku odbiornika musimy jakoś sprawić, by pin wyzwalacza podążał w górę dokładnie w momencie, gdy pin nadajnika idzie wysoko. Tak więc początkowo losowo ustawiamy wyzwalacz odbiornika na wysoki, który pozostanie wysoki, dopóki pin echa nie spadnie. Ten pin echa obniży się tylko wtedy, gdy otrzyma falę amerykańską z nadajnika. Gdy tylko spadnie niski poziom, możemy założyć, że czujnik nadajnika właśnie został uruchomiony. Teraz, przy tym założeniu, gdy tylko echo zejdzie na niskim poziomie, możemy poczekać na znane opóźnienie, a następnie wyzwolić wyzwalanie odbiorników. Spowoduje to częściową synchronizację wyzwalacza zarówno nadajnika, jak i odbiornika, a zatem można odczytać czas trwania impulsu bezpośredniego echa za pomocą funkcji pulseIn () i obliczyć odległość.
Program czujnika nadajnika:
Pełny program modułu nadajnika znajduje się na dole strony. Nie robi nic poza okresowym wyzwalaniem czujnika nadajnika.
digitalWrite (trigPin, HIGH); delayMicroseconds (10); digitalWrite (trigPin, LOW);
Aby wyzwolić czujnik, musimy ustawić pin wyzwalacza na wysokim poziomie przez 10uS. Kod umożliwiający to samo pokazano powyżej
Program dla czujnika odbiornika:
W czujniku odbiornika zakryliśmy oko nadajnika czujnika, aby był atrapa, jak omówiono wcześniej. Teraz możemy wykorzystać wspomnianą wyżej technikę do pomiaru odległości między dwoma czujnikami. Pełny program znajduje się na dole tej strony. Poniżej wyjaśniono kilka ważnych kwestii
Trigger_US (); while (digitalRead (echoPin) == WYSOKI); delayMicroseconds (10); Trigger_US (); duration = pulseIn (echoPin, HIGH);
Początkowo wyzwalamy czujnik US za pomocą funkcji Trigger_US (), a następnie czekamy, aż pin echa pozostanie wysoko, używając pętli while. Gdy spadnie niski, czekamy na z góry określony czas, ten czas powinien wynosić od 10 do 30 mikrosekund, co można określić metodą prób i błędów (lub możesz użyć improwizowanego pomysłu podanego poniżej). Po tym opóźnieniu ponownie uruchom USA za pomocą tej samej funkcji, a następnie użyj funkcji pulseIn () do obliczenia czasu trwania fali.
Teraz, używając tych samych starych wzorów, możemy obliczyć odległość jak poniżej
odległość = czas trwania * 0,034;
Pracujący:
Wykonaj połączenia zgodnie z opisem w programie. Zakryj część Tx czujnika odbiornika, jak pokazano na rysunku. Następnie prześlij kod nadajnika i kod odbiornika podane poniżej odpowiednio do nadajnika i odbiornika Arduino. Otwórz szeregowy monitor modułu odbiornika i powinieneś zauważyć odległość między dwoma modułami, jak pokazano na poniższym filmie.
Uwaga: ta metoda to tylko ideologia i może nie być dokładna ani satysfakcjonująca. Możesz jednak wypróbować zaimprowizowany pomysł poniżej, aby uzyskać lepsze wyniki.
Pomysł improwizowany - kalibracja sensora przy użyciu znanej odległości:
Wyjaśniona do tej pory metoda wydaje się dziwnie satysfakcjonująca, ale była wystarczająca dla mojego projektu. Chciałbym jednak również podzielić się wadami tej metody i sposobem ich przezwyciężenia. Jedną z głównych wad tej metody jest to, że zakładamy, że pin Echo odbiornika opada nisko natychmiast po przesłaniu przez czujnik nadajnika fali amerykańskiej, co nie jest prawdą, ponieważ fala zajmie trochę czasu, zanim dotrze z nadajnika do odbiornika. Dlatego wyzwalacz nadajnika i wyzwalacz odbiornika nie będą w doskonałej synchronizacji.
Aby temu zaradzić, możemy początkowo skalibrować czujnik przy użyciu znanej odległości. Jeśli znana jest odległość, będziemy znać czas, w jakim fala amerykańska dotrze do odbiornika z nadajnika. Zachowajmy ten czas jako Del (D), jak pokazano poniżej.
Teraz będziemy dokładnie wiedzieć, po jakim czasie powinniśmy ustawić pin wyzwalacza odbiornika na wysoki, aby uzyskać synchronizację z wyzwalaczem nadajnika. Ten czas trwania można obliczyć za pomocą Known Delay (t) - Del (D). Nie mogłem przetestować tego pomysłu ze względu na ograniczenia czasowe, więc nie jestem pewien, na ile dokładnie to zadziała. Więc jeśli zdarzy ci się spróbować, daj mi znać o wynikach w sekcji komentarzy.