Ultradźwiękowy czujnik odległości i Arduino

Tym razem wziąłem na stół – ultradźwiękowy czujnik odległości. Z uwagi na niewielką cenę gotowego modułu HC-SR04 ( pdf ), nie warto sobie zawracać głowy budową od podstaw modułu nadawczo-odbiorczego. Moduł jest popularny, tani i łatwo dostępny (choćby na Allegro).

Do obsługi takiego modułu przez Arduino, można znaleźć w necie stosowną bibliotekę (Ultrasonic.h), ale ponieważ mi nie działała jak należy (a właściwie to wcale nie działała – wywalało mi jakieś errory), postanowiłem napisać obsługę od podstaw – co okazało się niezwykle łatwe, nawet przy moim braku doświadczenia.

Czujnik steruje się  (zgodnie z dokumentacją) wyzwalając go krótkim impulsem – 10uS na wejście „Trig”, na wyjściu „Echo” dostajemy impuls, którego długość jest proporcjonalna do zmierzonej odległości. Cała zabawa sprowadza się do zmierzenia (i przeliczenia) czasu trwania tego impulsu.

Mój układ wygląda tak :

Tak wyglądają przebiegi na oscyloskopie :

(żółty –  impuls wyzwalający, a poniżej – niebieski – odpowiedź czujnika, długość impulsu proporcjonalna do odległości)

A tak kod :

#include <LiquidCrystal.h>

int TX = 0; //port nadajnik Ultrasonic
int RX = 1; //port odbiornik Ultrasonic
int CM;     //odległość w cm
long TIME;  //długość powrotnego impulsu w uS

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

void setup()
{
  lcd.begin(16,2);
  pinMode(TX, OUTPUT);
  pinMode(RX, INPUT);
}

void loop()
{
  pomiar_odleglosci();
  lcd.clear();
  lcd.setCursor(0,0); //w górnej linii LCD - czas
  lcd.print(TIME);
  lcd.setCursor(0,1); // w dolnej linii LCD - cm
  // szerokość odbitego impulsu w uS podzielone przez
  // 58 to odleglosc w cm - patrz dokumentacja
  lcd.print(TIME / 58);

  delay(100);
}

void pomiar_odleglosci ()
{
  // impuls 10 uS inicjalizujacy - patrz dokumentacja
  digitalWrite(TX, HIGH);
  delayMicroseconds(10);
  digitalWrite(TX, LOW);
  TIME = pulseIn(RX, HIGH);
}

3 thoughts on “Ultradźwiękowy czujnik odległości i Arduino

Dodaj komentarz