piątek, 1 września 2017

Ultradźwiękowy czujnik odległości HC-SR04

Moduł HC-SR04 to ultradźwiękowy czujnik odległości pracujący w zakresie od kilku centymetrów do kilku metrów. Może znaleźć zastosowanie na przykład w inteligentnym samochodzie omijającym przeszkody, który nawiasem mówiąc powoli składam i uruchamiam. Jest to też chyba najtańszy z modułów do pomiaru odległości jakie znam. Na plus trzeba mu też zaliczyć bardzo prostą obsługę w kodzie w Arduino.

Moduł HC-SR04

Specyfikacja
  • zakres pracy 2 - 200cm
  • rozdzielczość 0,3cm
  • zasilanie 5V
  • średni pobór prądu: 15 mA
  • kąt pomiaru 30 stopni
  • częstotliwość pracy: 40 kHz
  • wymiary: 45 x 20 x 15 mm

Piny

Vcc, GND Zasilanie (5V), masa
Trig Wejście. Wyzwalanie pomiaru (stan wysoki na 10us)
Echo Wyjście. Sygnał echa, Pojawia się na nim stan wysoki o czasie trwania zależnym od odległości między przeszkodą a czujnikiem


Działanie

Na pin TRIG modułu podaje się stan wysoki na czas co najmniej 10us. To wyzwala pomiar odległości przy użyciu fali dźwiękowej o częstotliwości 40kHz. Fala jest wysyłana przez czujniki ultradźwiękowe i po odbiciu od napotkanej przeszkody wraca ponownie do czujników. Na wyjściu Echo jest ustawiany stan wysoki o czasie trwania zależnym (proporcjonalnym) od odległości przeszkody od modułu (czujnika). Odległość określa wzór
Time[us]  * 343[m/s] / 2
gdzie 343m/s to prędkość dźwięku w powietrzu dla temperatury 20 stopni Celsjusza.
a Time to czas trwania sygnału na wyjściu Echo
Przekładając ten wzór na cm mamy w przybliżeniu:
Time[us] / 58
a w przypadku cali:
Time[us] / 148

Uruchomienie

Układ uruchomiłem na Arduino Uno i shield'em LCD. Wyniki są prezentowane zarówno na wyświetlaczu, jak i wysyłane na terminal. Kod (funkcja) wyliczająca odległość została zaczerpnięta ze źródła 1. Uprościłem jedynie ostatnią linię wyliczającą odległość.

Pomiar odległości


#include <LiquidCrystal.h>

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

const int TrigPin = A5;
const int EchoPin = A4;

void setup() {
  pinMode(TrigPin, OUTPUT);
  pinMode(EchoPin, INPUT);
  lcd.begin(16, 2);
  Serial.begin(9600); 
}

void loop() {
  int distance = getDistance();
  lcd.setCursor(0,0);
  lcd.print("Distance [cm]:");  
  lcd.setCursor(0,1);
  lcd.print(distance);  
  Serial.print("Distance [cm]: ");
  Serial.println(distance); 
  delay(1000);
  lcd.clear();
}

/**
 * Speed of Sound: 343 m/s
 */
int getDistance() 
{
  long time;
  // Low (5us)
  digitalWrite(TrigPin, LOW);
  delayMicroseconds(5);
  // High (15us)
  digitalWrite(TrigPin, HIGH);
  delayMicroseconds(15);
  // Low  
  digitalWrite(TrigPin, LOW);
  time = pulseIn(EchoPin, HIGH, 50000);
  return round(time / 58);
}

Poza tym są dostępne biblioteki, takie jak na przykład Arduino New Ping. W tym jednak przypadku, myślę, że używanie bibliotek to lekka przesada.

Uwagi
  • można dokupić różne obejmy dla modułu, w szczególności takie, które umożliwiają montaż na ramieniu serwo
  • w instrukcji (3) mowa jest o powierzchni przeszkody nie mniejszej niż 0,5m2
  • wspomniany wyżej kąt pomiaru jest wersją optymistyczną i dotyczy pozycji horyzontalnej (poziom). W pionie wynosi będzie to mniej. W temacie HC-SR04: tests on accuracy, precision and resolution of ultrasonic measurement jeden z użytkowników pisze o ok. 4 stopniach w pionie i ok 21 stopniach w poziomie jako realne wartości kątów pomiaru. Wartości te wynikają z jego własnych pomiarów.
  • moduł może "gubić się"  w przypadku przeszkód ustawionych pod kątem do czujnika większych niż owe 30 stopni (przykład w źródle 4)
  • w czasie "zabawy" z modułem po jednej z kolejnych zmian w kodzie zacząłem otrzymywać jako wynik 0 i dociskanie kabelków/pinów nic nie zmieniało. Po dłuższym poszukiwaniu na forach, wyszło, że użycie PINu 1 może rodzić problemy (stąd zmiana na A4 i A5, co przyniosło poprawę). Cytat z forum: "I found about 2 hours later, after reading a dozen forums, that the main issue that was causing my ultrasonic sensor to return zero while using the NewPing library is that pin 1 and other pins cause the ultrasonic sensor to not function properly" :)
Opisywany miernik odległości zastosowałem w praktyce w układzie Ultradźwiękowego miernika odległości na Digispark ATtiny85.


Źródła

Brak komentarzy:

Prześlij komentarz