SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

Ultradźwiękowy czujnik odległości SDM-IO

Po raz drugi powracamy do tematu ultradźwiękowych czujników odległości - tym razem przyjrzymy się modułowi SDM-IO, który w odróżnieniu od poprzednio opisywanego HC-SR04 wyróżnia się zdolnością pomiaru odległości od 0 do 150 cm oraz brakiem czułości pola martwego.

SDM-IO w trakcie pomiaru pobiera zaledwie 8mA (prawie połowę mniej niż HC-SR04) - jest również od niego mniejszy. Większa jest natomiast cena, bowiem przyjdzie nam za niego zapłacić kwotę około 29,00 zł (oferta sklepu ArduinoSolutions)

Muszę przyznać, że mocno zastanawiałem  się czy warto poświęcić więcej środków - jednak z czystym sumieniem mogę stwierdzić, że jego osiągi i parametry są zdecydowanie lepsze. Jeśli potrzebujemy czegoś bardziej dokładnego - SDM-IO stanowi doskonałą pozycję. Ale po kolei.

Trzy piny zamiast czterech

Zasadniczą różnicą pomiędzy SDM-IO, a HC-SR04 jest  wyprowadzenie  trzech pinów (zamiast czterech), gdzie tylko jeden pełni funkcję wyzwalacza pomiaru Trig i pomiaru Echo. Pozostałe dwa należy podłączyć do zasilania z przedziału 3.8 - 5.5 V oraz masy. Trig/Echo oczywiście podłączamy do dowolnego pinu cyfrowego w Arduino.

Ponieważ ten sam pin służy do wyzwolenia pomiaru jak i jego odczytu sygnału ECHO, obliczenie odległości wygląda nieco inaczej niż w HC-SR04. Zobaczmy jak to wygląda na przebiegu:

Aby rozpocząć pomiar odległości, w pierwszej kolejności musimy ustawić wyjście TRIG w stan niski (L) na czas minimum 10μS i ponownie ustawić w stan wysoki (H). Od tego momentu czujnik wyśle 8 impulsów o częstotliwości 40kHz. Kiedy odbite od przeszkody ultradźwięki ponownie trafią do czujnika, na wyjściu ECHO powinien pojawić się stan niski (L) na czas 150μS. Jeśli sygnał w stanie niskim (L) na ECHO jest dłuższy niż 10ms, oznacza to, że nie nastąpił powrót ultradźwięków do czujnika, a więc nie natrafiono na żadną przeszkodę.

Obliczenia odległości wykonujemy więc na podstawie trwania przedziału czasowego t2t3, a nie czasu trwania sygnału ECHO. Znając czasy t2 i t4 oraz długość trwania odpowiedzi ECHO, możemy obliczyć ile zajęło wysłanie impulsów dźwiękowych i ich powrotu.

t2t3 = (t4 - t2) - (t3t4)

Dopiero teraz możemy obliczyć rzeczywistą odległość:

odległość = (t2t3 * prędkość rozchodzenia się dźwięku)  /  2

Interesuje nas prędkość rozchodzenia się dźwięku w powietrzu, a więc 340 m/s:

odległość [m] = ( t2 ↔ t3 [s] * 340 [m/s] ) / 2

Natomiast dla pomiaru czasu w µS:

odległość [cm] = t2 ↔ t3 [µS] * 340 [m/s]  / 2 / 1000

ew. upraszczając:

odległość [cm] = ( t2 ↔ t3 [µS] ) / 58


Przykładowy program

Kod programu dla Arduino, który będzie mierzył odległość do celu oraz sygnalizował czerwoną diodą odległość mniejszą niż 10cm, będzie wyglądał następująco:

  1. // Konfiguracja pinow
  2. const int SDMIO = 2;
  3. const int RedLED = 8;
  4. const int GreenLED = 9;
  5.  
  6. unsigned long SDMIO_time;
  7. unsigned long SDMIO_echo_len;
  8. unsigned long SDMIO_diff;
  9.  
  10. float SDMIO_distance;
  11.  
  12. void setup()
  13. {
  14.   Serial.begin(115200);
  15.  
  16.   pinMode(RedLED, OUTPUT);
  17.   pinMode(GreenLED, OUTPUT);
  18. }
  19.  
  20. void loop()
  21. {
  22.   // Ustawienie pinu SDMIO jako wyjscie
  23.   // Stan niski na SDMIO przez 10ms (Trig)
  24.   pinMode(SDMIO, OUTPUT);
  25.   digitalWrite(SDMIO, LOW);
  26.   delayMicroseconds(10);
  27.   digitalWrite(SDMIO, HIGH);
  28.  
  29.   // Pobranie aktualnego czasu
  30.   // Ustawienie pinu SDMIO jako wejscie
  31.   SDMIO_time = micros(); // t2
  32.   pinMode(SDMIO, INPUT);
  33.  
  34.   // Odczytanie dlugosci trwania impulsu ECHO
  35.   // Powinien trwac okolo 150us, timeout po 10ms
  36.   SDMIO_echo_len = pulseIn(SDMIO, LOW, 10000); // t3 - t4
  37.  
  38.   // Obliczenie czasu trwania do powrotu impulsu
  39.   SDMIO_diff = micros() - SDMIO_time - SDMIO_echo_len;
  40.  
  41.   // Jesli mniejsze niz 10ms i uzyskano odpowiedz ECHO
  42.   if ((SDMIO_diff < 10000) &amp;&amp; (SDMIO_echo_len > 0))
  43.   {    
  44.     //SDMIO_distance = (SDMIO_diff*340/2/10000);
  45.     SDMIO_distance = float(SDMIO_diff/58.0);
  46.     Serial.print(SDMIO_distance);
  47.     Serial.println("cm");
  48.   } else
  49.   {
  50.     Serial.println("Poza zasiegiem lub brak przeszkod");
  51.   }
  52.  
  53.   // Zapal czerwona diode jesli odleglosc <= 10cm
  54.   if (SDMIO_distance <= 10)
  55.   {
  56.     digitalWrite(GreenLED, LOW);
  57.     digitalWrite(RedLED, HIGH);
  58.   } else
  59.   {
  60.     digitalWrite(GreenLED, HIGH);
  61.     digitalWrite(RedLED, LOW);
  62.   }
  63.  
  64.   // Opoznienie
  65.   delay(50);
  66. }

Wynik działania programu:

Porównanie czujnika SDM-IO oraz HC-S04

No dobrze, ale jak wypada SDM-IO w porównaniu z HC-S04? Sprawdzimy to eksperymentalnie. Na płytce stykowej umieszczono obok siebie oba czujniki, które na zmianę mierzyły odległość do badanego obiektu. Dla pewności, pomiędzy pomiarami między czujnikami zastosowałem odpowiedni odstęp czasu, aby się wzajemnie nie zakłócały.

Testy wykazały jednoznacznie ogromną przewagę SDM-IO nad HC-S04, głównie za sprawą nieczułości na wpływ martwej strefy. Otrzymane wyniki z SDM-IO są zdecydowanie bardziej stabilne i odporne na niewielkie zmiany kąta pomiędzy obiektem a czujnikiem. Podczas gdy HC-S04 przy zmianie kąta mocno przekłamywał wyniki (dźwięk odbijał się od powierzchni i nie wracał w całości do czujnika), to SDM-IO podawał odległość z minimalnym błędem, dodatkowo nie gubiąc przy tym pomiarów. SDM-IO wykazał się również większą dokładnością  pomiarów przy małych odległościach.

Jak to wygląda w praktyce, możecie zaobserwować na poniższym filmie:


Moduł przetestowany dzięki uprzejmości sklepu
ArduinoSolutions.

Reklama

Komentarze Komentarze
Avatar 1
sz4+4nik Windows 7 / Safari 537.36
17 August 2015 - 21:41 Katowice

Cześć, nie mogę nigdzie znaleźć przykładu wykorzystującego czujniki parkowania wykorzystywane w samochodach, najlepiej 3 pinowe. spotkał się ktoś z takim projektem? wogóle one działają też na zasadzie ultradźwięków?

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 45.0
26 April 2016 - 23:45 Bytom

Czujnik, czujnikowi nie równy. Wszystko zależy od typu

Avatar 1
veeveeoor Android 6.0 / Safari 537.36
16 April 2016 - 23:10 Warszawa

A jak sprawuje się ten czujnik przy końcu zakresu pomiarowego? Mam HC-SR04 który teoretycznie powinien mieć zasięg do 200cm ale już przy odległościach powyżej 100cm pomiary są bardzo przekłamane. A najgorsze jest to że się potrafi zawiesić (echo non stop w stanie wysokim) i tylko odłączenie zasilania pomaga.

Tak przy okazji do artykułu wkradł Ci się mały błąd - zasięg SDM-IO to 0 do 150cm.

Avatar 2
Korneliusz Linux Ubuntu / Mozilla Firefox 45.0
26 April 2016 - 23:48 Bytom

Jeśli mam gdzieś jeszcze ten czujnik postaram się odpowiedzieć w weekend

Avatar 1
veeveeoor Mac OS X / Mozilla Firefox 45.0
29 April 2016 - 11:32 Wrocław

Super. Będę Ci bardzo wdzięczny.

Avatar 1
veeveeoor Android 6.0 / Safari 537.36
15 May 2016 - 19:00 Warszawa

Cześć. Udało Ci się znaleźć ten czujnik?

Avatar 1
Adrian Linux x86_64 / Safari 537.36
10 August 2016 - 08:18 Brak informacji

Hej. Czy jest jakis zamiennik tego czujnika? Albo cos lepszego? Potrzebny mi jest czujnik z pomiarem odleglosci od 0. Czujnik bedzie wykorzystywany do pomiaru wody w akwarium.

Ma ktos jakis pomysl?

Avatar 2
Korneliusz Mac OS X / Safari 537.36
14 October 2016 - 14:35 Brak informacji

na elty.pl widziałem jakieś czujniki do pomiaru poziomu cieczy

Avatar 1
Łukasz Windows / Mozilla Firefox 49.0
05 October 2016 - 13:27 Poznań

Witam

Czy możliwe będzie w miarę w łatwy sposób wykorzystać czujnik zdemontowany z samochodu? Chodzi mi o pojedynczy moduł a nie podwójny (nadawczy i odbiorczy) - widziałem, że można takie zakupić ale bez układów scalonych (nie samochodowe) lub gotowce do wmontowania w zderzak (same czujniki bez centralki). Czy ewentualnie w samochodach wykorzystuje się czujniki w taki sposób, że w danym momencie jeden jest nadawcą drugi odbiorcą? Chciałbym zrobić własne czujniki parkowania do samochodu ale przedstawione w artykule nie nadają się do tego bezpośrednio ze względu na brak wodoszczelności oraz podwójną budowę nadawca - odbiorca.

Pozdrawiam

Avatar 2
Korneliusz Mac OS X / Safari 537.36
14 October 2016 - 14:35 Brak informacji

zależy jaki to czujnik

Avatar 1
Matthew Android 6.0 / Safari 537.36
07 March 2017 - 20:34 Brak informacji

Witaj.
Jak ograniczyć zmienną by wyświetlać tylko całe centymetry
(bez tych po przecinku)
na wyświetlaczu 7 segmentowym na przykład?
Coś dodać do zmiennej float ? Nie mam pomysłu, może dlatego że zaczynam dopiero z arduino...
Pozdrawiam