Ultraljudssensorer

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 kopplad till pinnarna 2 och 3 och skriver ut avståndet till närmaste detekterade objekt på seriaporten. Ladda upp sketchen till Arduino-kortet och starta sedan "serial monitor" med kommunikationshastighet 9600 baud för att se resultatet.

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;
  // Skicka ut en 10us lång puls
  digitalWrite(usTriggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(usTriggerPin, LOW);
  // Vänta på att ljudet passerat mottagaren innan vi börjar mäta
  delayMicroseconds(400);
  // 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 {
    // Lägg till de första 400us
    t += 400;
    // 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");
  }
  delay(500);
}

Lämna ett svar

E-postadressen publiceras inte. Obligatoriska fält är märkta *

Kundvagn