sobota, 2 kwietnia 2011

Arduino: Dalmierz ultradźwiękowy HC-SR04


Autor: Piotr Rzeszut (Piotrva)
Redakcja: Dondu

Zobacz inne artykułu z cyklu: Arduiono ... czyli prościej się nie da :-)

O odległości pomiarze opowieść...

A więc za siedmioma kondensatorami, za siedmioma ścieżkami był sobie procesor, który chciał poznawać świat. Sam jednak był elektroniczny i miał problemy z nieelektronowymi wartościami...

I tak oto narodził się problem pomiaru wartości nieelektrycznych w systemach mikroprocesorowych. Jedne z takich wartości (jak np. temperatura, natężenie światła, pole magnetyczne) są prostsze do pomiaru (gdyż bezpośrednio wpływają na parametry elektroniczne różnych materiałów - np. ich rezystancję), a inne, jak wspomniana odległość do innego przedmiotu, stwarzają nieco więcej kłopotu, gdyż, co nietrudno zauważyć, odległość zwykle nie może wpływać na żaden parametr elementów elektronicznych....

Artykuł powstał dzięki wsparciu:


Odrobinka teorii na początek, ...

Co więc zrobić? Odpowiedzi na to pytanie może być wiele, na przykład zastosowanie elementów mechanicznych i enkoderów optycznych, zastosowanie magnesu i mierzenie zmian natężenia pola magnetycznego... Wszystkie one jednak wymagają przymocowania "czegoś" do obiektu, którego odległość chcemy ocenić, co przy budowie robota jest niedopuszczalne...

Z pomocą przychodzą nam jednak fale akustyczne, a konkretnie zjawisko... echa. Każdy z nas przecież słyszał kiedyś echo, a z lekcji fizyki powinniśmy wiedzieć dlaczego ono powstaje.

Otóż fale akustyczne rozchodzą się w powietrzu z prędkością około 340 m/s (prędkość ta zależy od "parametrów" powietrza takich jak temperatura, ciśnienie czy wilgotność). Ponadto mogą one odbijać się od wielu obiektów (niektóre, jak np. tkaniny, gąbka będą pochłaniać fale akustyczne). Tak więc jeśli klaśniemy to dźwięk ten będzie rozchodził się z prędkością 340 m/s i jeśli natrafi na jakąś przeszkodę (np. betonową ścianę budynku) to odbije się od niej i wróci do nas po pewnym czasie - jest to eksperyment łatwy do powtórzenia np. na osiedlu.


Zasada działania pomiaru odległości na podstawie echa.
Źródło: www.kerrywong.com


Czas ten jest ściśle związany z odległością od tej przeszkody - fala dźwiękowa musi pokonać drogę do przeszkody, a następnie z powrotem do nas, zatem jeśli znamy czas i prędkość dźwięku w danych warunkach możemy precyzyjnie obliczyć odległość obiektu, od którego nastąpiło odbicie.


Wzór na wyliczenie odległości od przeszkody
na podstawie czasu po jakim usłyszymy echo.

Czy oznacza to, że nasze urządzenie będzie wydawać jakieś dźwięki podczas pomiaru? Dokładnie TAK.
Na szczęście, aby nie uprzykrzać życia sąsiadom i innym domownikom tudzież współużytkownikom laboratorium zastosujemy ultradźwięki - czyli dźwięki o tak wysokiej częstotliwości, że nie są one już słyszalne przez człowieka, standardowo w tego typu systemach stosuje się częstotliwość około 40kHz.

Zastosowanie ultradźwięków ma też uzasadnienie praktyczne - zwykle takie fale akustyczne nie są emitowane w środowisku - stąd zastosowanie fali o częstotliwości np. 1kHz mijałoby się z celem, gdyż wtedy byle klaśnięcie czy dźwięki z ulicy zakłócałyby pomiar.

... trochę "złomu"...

A więc czas na wybór sprzętu. Rzecz jasna moglibyśmy się pokusić o własnoręczną budowę takiego układu - a więc odbiornika i nadajnika fal ultradźwiękowych, ale wymagałoby to rzecz jasna sporej ilości czasu oraz wiedzy dotyczącej dosyć złożonych zagadnień... Tu na szczęście z pomocą przychodzą nam gotowe moduły i mój wybór padł na moduł HC-SR04. Koszt takiego cacuszka na chwilę pisania artykułu to około 10-11zł, co jest ceną niższą niż odpowiedniej klasy nadajnik i odbiornik ultradźwiękowy, a dostajemy jeszcze płytkę z układami realizującymi prawie cały proces pomiaru za nas...


Moduł HC-SR04

Moduł ten można kupić np. w sklepie Electropark.pl.

... obrazek, kabelków parę ...


Zrzut z analizatora stanów logicznych pokazujący
sekwencję pomiarową.


Powyższy obrazek w tym temacie wyraża więcej niż 1000 słów, podobnie jak pewne pralinki, jednak myślę, że parę zdań na jego temat muszę powiedzieć, tworząc kompletny opis działania modułu HC-SR04.

Po pierwsze moduł nasz posiada 4 wyprowadzenia:
  1. Vcc - oczywiście pin zasilający układ napięciem 5V
  2. Trig - pin służący do wyzwalania pomiaru (wejście modułu)
  3. Echo - pin na którym obserwować będziemy wynik pomiaru (wyjście modułu)
  4. Gnd - rzecz jasna łączymy go z masa układu
A stany logiczne 2 z nich zostały przedstawione na wspomnianym tajemniczym obrazku. Jak widzimy krótki (trwający minimum 10μs) impuls stanu wysokiego na pinie Trig powoduje rozpoczęcie pomiaru.

Wtedy układy modułu HC-SR04 zaczną nadawać ultradźwięki przez pewien odcinek czasu - dźwięk wydobywać się będzie z jednego z metalowych "głośniczków". Jednocześnie układ rozpocznie "pomiar czasu". W momencie kiedy odbite od przeszkody ultradźwięki trafią do odbiornika (drugi metalowy element) układ uznaje pomiar za zakończony.

Zmierzony czas między rozpoczęciem nadawania i rozpoczęciem odbioru tej fali dźwiękowej przekłada się na czas trwania impulsu stanu wysokiego na pinie Echo.

Dzięki temu jedyne zadania dla naszego ciekawskiego procesora to wygenerowanie impulsu wyzwalającego pomiar i potem zmierzenie szerokości impulsu na pinie Echo oraz dokonanie paru prostych wyliczeń. I już mamy naszą odległość!!! Proste, prawda?

Tak więc zanim zaczniemy pisać program wykonajmy 4 połączenia i umieśćmy moduł na stabilnej podstawie - idealnie do tego celu nada się płytka stykowa.

Oprócz pinów zasilających musimy jeszcze podłączyć pozostałe linie z procesorem. Ja zdecydowałem się na podłączenie pinu Trig do pinu D8 Arduino, a Echo - D9.

Przed połączeniem wgraj do układu program do obsługi tego czujnika - w przeciwnym wypadku, jeśli aktualnie wgrany do Arduino program korzystał z tych pinów, może dojść do uszkodzenia.


Połączenia między modułem a płytką Ardiono


... i programu linijek kilka!

Rzecz jasna to będzie serce naszego układu - bez programu ani rusz.

Jak już wcześniej wspomniałem przedstawiony poniżej program będzie miał za zadanie wygenerować impuls "Trig" i zmierzyć czas "Echo". Mimo iż zadanie to nie jest trudne to dzięki bibliotekom Arduino sprowadza się jedynie do kilku linijek kodu przedstawionych poniżej.

/*
 * HC-SR04 DEMO
 * Autor: Piotr Rzeszut (http://piotr94.net21.pl)
 * Data: 08.04.2014
 * Artykuł pobrany z blogu: http://mikrokontrolery.blogspot.com
*/

//definiuję piny, do ktorych podepnę odpowiednie linie modułu HC-SR04
const int trig_pin = 8;
const int echo_pin = 9;


void setup(){
  Serial.begin(9600);//inicjalizacja komunikacji szeregowej 
  Serial.println("Dalmierz HC-SR04");
  
  //konfiguruję pin wyzwalania jako wyjście i ustawiam na nim stan niski
  pinMode(trig_pin, OUTPUT);
  digitalWrite(trig_pin, LOW);
  
  //pin do pomiaru szerokości impulsu konfiguruję jako wejście i dodatkowo włączam podciąganie
  pinMode(echo_pin, INPUT);
  digitalWrite(echo_pin, HIGH);
}

//deklaruję potrzebne zmienne
unsigned long pulse;
float distance;

void loop(){
  //w pętli powtarzam czynności
  //1. generuję impuls stanu wysokiego o czasie trwania 10us na pinie wyzwalania
  digitalWrite(trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig_pin, LOW);
  
  //2. mierzę czas stanu wysokiego na lini Echo - otrzymana wartość jest podana w mikrosekundach
  pulse = pulseIn(echo_pin, HIGH);
  
  //3. przeliczam czas na odległość
  //   a) na podstawie danych teoretycznych (prędkość dźwięku 340 m/s)
  //distance = ((float)pulse / 2.0) * 0.034;
  //   b) na podstawie przeprowadzonej kalibracji
  distance = (float)pulse * 0.0170 + 1.3052;
  //następnie dane wysyłam do komputera
  Serial.print(pulse);
  Serial.print("\t");
  Serial.println(distance);
  //4. czekam chwilę, żeby mieć czas na odczytanie danych z ekranu
  delay(500);
}

Do pobrania: program_ard.c (kopia)


Mały dodatek - czyli kalibracja

W komentarzach w programie wspomniałem o kalibracji. Otóż odbierając dane z naszego czujnika musimy liczyć się z 2 problemami. Po pierwsze prędkość dźwięku zależy od warunków takich jak ciśnienie, wilgotność itp. Po drugie - przyjmując 0 na naszej skali odległości nie wiemy tak na prawdę gdzie ono występuje dla czujnika (tj. gdzie jest element odbierający i nadający).

Do tego celu świetnie nada się arkusz kalkulacyjny Excel i możliwość dopasowania prostej (dla zainteresowanych polecam poczytać o regresji liniowej) do punktów na wykresie. W załączniku znajduje się arkusz pozwalający na wykonanie takiej kalibracji na podstawie kilku punktów. Procedura jest niezwykle prosta: ustawiamy przed czujnikiem linijkę, metr itp., następnie umieszczamy w pewnej odległości jakąś dużą przeszkodę (pudełko, książkę) i do arkusza wprowadzamy zmierzoną odległość i czas echa pokazywany przez program. Pomiaru takiego dokonujemy dla różnych odległości z zakresu 10-30 cm Potem wartości wyliczone w arkuszu (widoczne nad dopasowaną prostą) wprowadzamy do programu w odpowiednim miejscu i viola!

Do pobrania: kalibracja.zip (kopia)

Oczywiście zauważycie zapewne jedną rzecz - czujnik dla bardzo małych odległości i bardzo dużych odległości będzie popełniał błędy. Dla małych odległości związane one będą z dystansem między nadajnikiem i odbiornikiem (fale dźwiękowe będą musiały pokonać znaczącą wtedy drogę między tymi elementami), zaś dla dużych odległości problemem będzie spadające natężenie impulsu akustycznego.

Tak więc to chyba wszystkie informacje potrzebne Wam, aby móc dokonywać pomiarów odległości i zastosować taki układ np. w konstruowanym robocie.

Powodzenia!

Zobacz inne artykułu z cyklu: Arduiono ... czyli prościej się nie da :-)

9 komentarzy:

  1. Witam, Dziękuję za fajny artykuł. Rozumiem, że dane wysyłane są przez RS-232 ustawionego na 9600kbps. Ale jakie są pozostałe parametry transmisji?

    OdpowiedzUsuń
  2. Czy zdarzyło Ci się aby czujnik przy jednej konkretnej odległości zawsze pokazywał głupoty?

    OdpowiedzUsuń
  3. Witam,

    1. Parametry: 9600bps, 1 stopbit, brak parzystości, brak kontroli przepływu - standardwo.
    2. Jeśli odległość była bardzo duża lub bardzo mała to tak - w innych wypadkach tylko jeśli czujnik leżał blisko podłoża lub miał coś w zasięgu (kant mebli, myszkę, jakieś pomięte papiery) to zdarzało się, że łapał echo od tych przedmiotów.

    OdpowiedzUsuń
  4. Gdzie jest ten arkusz do kalibracji ?

    OdpowiedzUsuń
  5. Hmm, widać Dondu zapomniał wstawić załącznika ;)

    OdpowiedzUsuń
    Odpowiedzi
    1. Faktycznie :)
      Już dodałem, przepraszam i przy okazji Wesołych Świąt!

      Usuń
  6. Czy orientuje się ktoś w jaki sposób urządzenie wytwarza ultradźwięki? Metodą mechaniczną czyj est tam jakiś generator piezoelektryczny ? Pytam bo potrzebuję takiej informacji do inżynierki. Z góry dziękuję za odpowiedź :).

    OdpowiedzUsuń
    Odpowiedzi
    1. Mogą być dwa rodzaje:
      1. piezoelektryczny,
      2. magnetostrykcyjny.

      Te drugie mają skomplikowaną budowę, wysoką cenę i ... nie miałem nigdy okazji takiego mieć w ręku. Dlatego te zastosowane w HC-SR04 są na 99,9% piezoelektryczne, co można łatwo potwierdzić wylutowując transmiter i sprawdzając jego rezystancję, która powinna być nieskończona. Jeśli to sprawdzisz napisz proszę o rezultatach.

      Usuń