Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

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.

...

Image Added

Hvordan sensoren egentlig ser ut

Eksempler med bibliotek

NewPing

NewPing er et bibliotek som gjør det enkelt å skaffe ganske nøyaktige avlesninger. Vi har lagt det ut, og kompatibilitetsinformasjon kan finnes på informasjon om Arduino bibliotek, eller på bibliotekets egne nettsider.

ProximitySensor

Dette eksempelet måler avstanden jevnlig og skriver den ut.

Koden ligger i biblioteket vårt, PLabExamples/examples/04.ProximitySensor/ProximitySensor.

Oppkobling gjøres slik:

Image Added Image Added

 

ProximitySensorBuzzer

Dette eksempelet måler avstanden jevnlig og spiller av en kort tone basert på hvor langt det målte.

Koden ligger i biblioteket vårt, PLabExamples/examples/04.ProximitySensor/ProximitySensorBuzzer.

Oppkoblingen gjøres slik:

Image Added Image Added

TwoSonars

Dette eksempelet måler avstanden fra to ulike ultralydsensorer hvert sekund og skriver ut resultatet til seriellvindu.

Koden ligger i biblioteket vårt, PLabExamples/examples/04.ProximitySensor/TwoSonars.

Oppkoblingen gjøres slik:

Image Added Image Added

Eksempel uten bruk av bibliotek

Hvis du har lyst til å teste sensoren uten å bruke bibliotek, har vi lagt med et eksempel på dette her også. Oppkoblingen er lik som ProximitySensor eksempelet.

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.

Code Block
languagecpp
titleUltralyd avstands eksempel uten bibliotek
linenumberstrue
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.

...

languagecpp
titleUltralyd eksempel med bibliotek
linenumberstrue

...

.

...

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.

NewPing med bare en pinne

På Arduino er det begrenset med inn/utgangspinner. Det kan være litt dumt å bruke to pinner for å ordne ultralyd avstandsbedømmelse. Heldigvis er det noen som har lagd kode som viser hvordan man kan bruke NewPing biblioteket og kun bruke en pinne til både ekko og svar!

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/Forelesning_2_Individuell_Arduinopake/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

Image Removed

Oppkobling

Image Removed

Koblingsskjema for kretsen

Image Removed

...