Mät avstånd med ultraljud med Arduino

Ultraljudssensorer används för att känna av hinder och mäta avstånd. De fungerar genom att skicka ut en kort ljudpuls (ej hörbar för människor) och om ljudet träffar en vägg eller annat hårt objekt så reflekteras det tillbaka som ett eko. Sensorn tar emot ekot och avståndet till objektet kan sedan räknas ut genom att mäta tiden från att man skickade pulsen till att man får tillbaka ekot. Detta gör man genom följande formel:

d = vljud × t / 2

Där d är avståndet till objektet, vljud är ljudets hastighet i luft vilket är cirka 340 m/s och t är tiden mellan pulsen och ekot.

Exempel: du skickar ut en puls och sensorn signalerar att den fått tillbaka ett eko efter 0,014 sekunder. Detta betyder att avståndet till objektet som gav ekot är:

d = 340 × 0.014 / 2 = 2,38 meter

Som du ser så handlar det om väldigt korta tider, men en mikrokontroller är, som tur är, väldigt bra på att mäta korta tider.

Nedan följer ett kodexempel för Arduino som använder en ultraljudssensor av typen HC-SR04 som är väldigt populär och lätt att använda. Sensorn är kopplad till pinnarna 2 och 3 och skriver ut avståndet till närmaste detekterade objekt på serieporten. Ladda upp sketchen till Arduino-kortet och starta sedan ”serielll monitor” i Arduino IDE med kommunikationshastighet 9600 baud för att se resultatet.

Kopplingen

Koden

const int usTriggerPin = 2;
const int usEchoPin = 3;

void setup() {
  pinMode(usTriggerPin, OUTPUT);
  pinMode(usEchoPin, INPUT);
  Serial.begin(9600);
}

void loop() {
  long t;
  int dist;
  // En kort triggger-puls till ultraljudsmodulen får den att skicka ut en ultraljudssignal.
  // Pulsen måste vara minst 10 us lång.
  digitalWrite(usTriggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(usTriggerPin, LOW);
  // Vänta på eko i högst 24ms (24000us) vilket motsvarar
  // ett detekteringsavstånd på drygt 4 meter.
  t = pulseIn(usEchoPin, HIGH, 24000);
  Serial.print("Avstånd: ");
  if (t == 0) {
    // inget eko
    Serial.println("---");
  }
  else {
    // Totala avståndet fram och tillbaka är tiden gånger ljudets hastighet.
    // Avståndet till hindret är således hälften.
    // Dividera med 1000 för att få mm istället för m.
    // L efter konstanterna garanterar att long (32 bitar) används i beräkningen.
    dist = (int)(t * 340L / 1000L / 2L);
    Serial.print(dist);
    Serial.println("mm");
  }
  
  // Vänta en halv sekund innan vi gör en ny mätning.
  delay(500);
}

Lämna ett svar