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