Start Elkretssimulator


Avståndsmätare

Ultrasonic Sensor

Låt oss bygga en liten avståndsmätare till ett robotprojekt.



Princip ljudeko

En riktig radar använder mikrovågor medans denna avståndsmätare använder ljudvågor. Men principen här är densamma som för en radar. Vi skickar ut en ljudvåg och lyssnar ifall något studsar tillbaka. Om något studsar tillbaka så kan vi mäta tiden det tar innan det studsar tillbaka och på så vis räkna ut avståndet.





Uppkoppling

En rätt så enkel inkoppling. Finns inte så mycket prata om.



Mäta pulslängd med pulseIn

För att förstå hur vi skall designa vårt dataprogram så måste vi förstå hur själva modulen fungerar. Vi triggar alltså en ljudvåg genom att skicka en signal 10 uS (10 mikrosekunder, dvs 10 miljontedelars sekunder eller 0.000010 sekunder) lång på trigger-pinnen. Efter det kommer vi få tillbaka en signal på echo -pinnen. Denna signal mäter vi längen (duration) på. När vi mätt längden så kan vi från denna tid räkna ut hur långt avståndet är med hjälp av ljudhastigheten. Längden på pulsen som vi får tillbaka på echo -pinnen är tiden det tagit för signalen att studsa mot föremålet.



Mäta pulslängd med pulseIn

Om vi tittar på ovanstående timing-diagram, så vill vi alltså mäta längden på pulsen vi får som eko (echo) tillbaka. Detta kan vi göra med funktionen pulseIn. Funktionen returnerar det antal microsekunder som pulsen är HIGH i vårt fall.

Så hur omvandlar vi denna pulslängd till ett avstånd? Ljudets hastighet är 340 m/s. Eftersom vi får tiden från pulseIn i mikrosekunder är det käckt veta ljudets hastighet per mikrosekund, sedan behöver vi bara multiplicera med detta.

340 m/s = 0.34 m/millisekund = 0.00034 m/mikrosekund = 0.034 cm/mikrosekund.

Nu får vi sträckan fram och tillbaka mellan radarn och föremålet. Så vi måste också dividera med 2, då vi inte vill ha dubbla sträckan utan bara den ena vägen (="avståndet").

Kod

// Sensorns pinnar
const int triggerPin = 3;
const int echoPin = 4;

long timeMicroseconds;
float dist_cm;

void setup()
{
  Serial.begin(9600);  
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop()
{
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);

  timeMicroseconds = pulseIn(echoPin, HIGH);
  dist_cm = (float)timeMicroseconds * 0.034 / 2;

  Serial.print(dist_cm);
  Serial.println(" cm");

  delay(100);
}

Vi kanske inte vill lasta ner processorn helt i onödan eftersom det finns ett smartare sätt att skriva där vi undviker float. Samma som ovan kan då skrivas såhär:

// Sensorns pinnar
const int triggerPin = 3;
const int echoPin = 4;

long timeMicroseconds;
long dist_cm;

void setup()
{
  Serial.begin(9600);  
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
}

void loop()
{
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(triggerPin, LOW);

  timeMicroseconds = pulseIn(echoPin, HIGH);
  dist_cm = timeMicroseconds / 58;

  Serial.print(dist_cm);
  Serial.println(" cm");

  delay(100);
}

Test

Lite labbande verkar ge att den kan mäta avstånd från någon centimeter upp till kanske 2 meter. Om man tänker sig ett robotprojekt räcker detta gott och väl för att hitta väggar och dörr-öppningar och eventuella föremål som står ivägen.