You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 11 Next »

Avstand kan måles på mange måter, ultralyd er en av dem. Her skal vi gå nærmere inn på en sensor, HC-S04. Denne sensoren virker kort sagt slik: Når den får beskjed om det, sender den ut en kort lydpuls. Den måler hvor lang tid det tar før den får et ekko tilbake, og akkurat like lenge som det tar holder den ekkopinne høy.

Denne sensoren har, ifølge databladet, avstandsmålinger fra 2 cm til 4 m. Den tilkobles 5 volt, jord og to signalpinner fra Arduinoen. En av signalpinnene er for å fortelle den den skal starte en lydpuls, den andre er for å måle hvor lang tid lydpulsen tar før den kommer tilbake. I disse eksempelene bruker vi pinne 7 og 8, men du kan selvsagt bruke de pinnene du vil. På høyre side kan du se hvordan kretsen kobles opp. Kretsen er lik for begge eksemplene.

Vi kommer her til å vise to eksempler. Et "lavnivå" eksempel hvor du gjør oppsett og alle beregninger selv, og et eksempel som bruker et eksternt bibliotek som heter NewPing. Eksempelet med biblioteket er nok det enkleste, og det anbefales å bruke dette biblioteket for å gjøre mer avanserte oppgaver da det inneholder en del hjelpefunksjonalitet som ikke er tatt med her, men dokumentert på hjemmesiden til biblioteket.

Eksempel uten bruk av bibliotek

Koden under sender som nevnt ut en kort lydpuls før den måler hvor lang tid denne lydpulsen bruker på å komme tilbake. I følge databladet skal vi dele tiden (som er målt i mikrosekunder) på 58 for å få avstand i cm. Ser vi på de fysiske definisjonene er dette ikke helt nøyaktig, men bra nok for dette eksempelet. Dette tallet finner vi ikke igjen i koden under, men på linje 25 har vi ett magisk tall. For å forklare: Dette eksempelet viser avstanden i meter, vi får da (us / 58) / 100 = us * 1 / 5800. 1/5800 er ca. 0,00017, og vi kan derfor si lengde = us * 0,00017.

Ultralyd avstands eksempel uten bibliotek
const int echoPin = 7;
const int triggerPin = 8;

void setup() {
  Serial.begin(9600);
  
  // Definer hvilken type de forskjellige pinnene er
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
}
 

void loop() {
  // Gjør ekkokallet
  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);
  
  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);
  
  digitalWrite(triggerPin, LOW);
  // Mål hvor lang tid det tar før ekkoet kommer tilbake
  long duration = pulseIn(echoPin, HIGH);
  // Regn ut avstanden
  float distance = duration * 0.00017;  
  
  Serial.println(distance);
  delay(1000);
}

Koden kan også finnes på github kontoen vår, under Examples/UltrasoundExample. Her er koden mer kommentert, og utledningen av avstandsberegningen er mer detaljert.

I ekkokallet har vi to pauser vi ikke har sagt noe om så langt. Den første, på 2 mikrosekunder, er rett etter vi har garantert at signalpinnen for å starte sendingen av lydsignalet er lav. Denne forsikrer oss om at når vi sender signalet for å starte lydpulsen så får vi et helt rent signal. Den andre pausen, på 10 mikrosekunder, er tiden vi må holde signalet høyt for at sensoren skal starte med ekkokallet. Den kan godt være lengre, men er den kortere er det ingen garanti for at lydsignalet blir sendt.

Måten vi måler tiden på er å bruke den innebygde funksjonen pulseIn(). Denne måler hvor lang et inngangsignal er i mikrosekunder. Denne funksjonen kan, hvis vi mister ekkoet, medføre at koden henger i ett sekund ekstra. I bruk i for eksempel roboter kan dette være et problem. Vi anbefaler derfor at dere bruker et bibliotek som hjelper til og fjerner slike forsinkelser, som biblioteket som er brukt i det andre eksempelet på denne siden.

Det bør også legges merke til at det gjøres ingen sjekk på hvor lang avstand som beregnes. Som nevnt både i datablad og i denne teksten er den gyldige avstanden mellom 2 cm og 4 m. Ved faktisk bruk bør det legges inn sikkerhetssjekker på dette, gjerne i form av enkle if..else setninger.

Eksempel med bruk av biblioteket NewPing

Biblioteket NewPing finnes tilgjengelig fra Arduino sidene, og har også egen side på code.google.com. Det lastes ned herfra. Dette biblioteket kan brukes sammen med flere lignende sensorer. Det inneholder også funksjoner som gjør flere pinger og gir deg medianen tilbake. Dette minsker sannsynligheten for feil. Biblioteket forhindrer også lengre pauser hvis du for eksempel mister et ekkokall. Derfor vil vi anbefale dere å installere og bruke dette biblioteket.

Ultralyd eksempel med bibliotek
#include <NewPing.h>

const int echoPin = 7;
const int triggerPin = 8;
const int maxDistance = 300;

NewPing sonar(triggerPin, echoPin, maxDistance);

void setup() {
  Serial.begin(9600);
}

void loop() {
  // Får tiden det tar med et ping
  unsigned int time = sonar.ping();
  
  // Beregn hvor langt dette var
  float distance = sonar.convert_cm(time);

  Serial.println(distance);
  delay(1000);
}

Koden kan også finnes på github kontoen vår, under Examples/UltrasonicNewPingExample. Her er koden mer kommentert

Hvis du sammenligner koden for dette eksempelet og det andre, er denne mye kortere og enklere å lese. Den mest spesielle linja er kanskje hvor vi initialiserer sonaren. Dette instansierer et objekt av type NewPing, som har allerede satt hvilken pinne som skal brukes for å trigge, ekkoavlesning og maksimal lengde vi skal måle. I all kode etter dette kan vi være sikre på at sonar er tilgjengelig.

Når vi skal gjøre ekkokallet ser vi også at vi ikke trenger å gjøre noe oppsett selv, biblioteket gir oss metoden ping() som gjør dette for oss. Biblioteket hjelper oss også med tid til avstand beregninger, så vi slipper å tenke på det selv.

Problem med NewPing

Vi har oppdaget at det ikke er mulig å bruke NewPing sammen med tone funksjonaliteten som er innebygd i Arduino. Hvis dere trenger noe som kan gi dere lydsignal mens dere bruker dette biblioteket, kan dere se på eksempelet Lecture-examples/PLab-ProximitySensor-Buzzer.ino på GitHub kontoen vår for inspirasjon.

Konklusjon

Bruk biblioteker når de finnes! Det er mye enklere, mer pålitelig og sparer dere for mye hodebry og problemer

Oppkobling

Koblingsskjema for kretsen

Hvordan sensoren faktisk er

  • No labels