Afstand

Fra Kommunikation-IT Holstebro HTX
Skift til: navigering, søgning
Modul til afstandsmåling med ultralyd

Afstandsmåling kan foretages på forskellige måder, men dette modul tager udgangspunkt i en refleksions-måling ved hjælp af ultralyd.

Modulet der anvendes her er et færdigt modul købt på internettet[1].

Modulet skal have et start-signal og giver så en puls tilbage, der svarer til den tid der går inden refleksionen er modtaget.

Der findes en kort og ikke særligt fyldestgørende dokumentation på modulet i denne PDF-fil

Teori for måling af afstand ved hjælp af ultralyd

Modulet udsender en kort puls med ultralyd, der så reflekteres af det objekt man vil måle afstanden til, og den transporttid der måles er afstanden til objektet og tilbage igen (skulle gerne være den samme), så afstanden kan beregnes ud fra denne tid.

Tiden der kan måles i PIC'en er afhængig af afstanden og lydens hastighed, der i dette tilfælde blot sættes til 343 m/s som er lydens hastighed ved normalt lufttryk og 20 grader C.

Afstand-lyd.PNG

Som det vises her kan tiden udtrykkes ved den målte afstand gennemløbes 2 gange med lydens hastighed. Dette kan reduceres, således at man kan regne afstanden ud fra den målte tid, og som det er vist her, så vil en måling på 8 millisekunder give afstand på 1,372 meter.

Skal man måle afstanden i forskellige temperaturer, så kan det være nødvendigt at måle temperaturen og korrigere for det ud fra følgende sammenhæng:

Afstand-lyd2.PNG

Princip for HC-SR04

Opbygningen af HC-SR04 er lavet omkring en lille selvstændig PIC-kreds der sidder på modulet.

Den er programmeret til at opfange et triggersignal på TRIG benet, hvorefter den udsender en frekvens på 40 kHz i en kort puls. Denne frekvens forstærkes og sendes til ultralyds-tranduceren, som sender lyden afsted.

Utralyds-mokrofonen opfanger så den reflekterede lyd og laver en svingning, der forstærkes og filtreres, så PIC'en kan opfange signalet og registrere tiden.

Registreringen af tiden sker ved at PIC'en sætter et ben ECHO højt når pulsen er sendt afsted, og sætter det lavt igen når refleksionen modtages, så det man skal måle er den tidsmæssige længde af pulsen på ECHO.

Ben Navn Betydning PIC-ben
1 Vcc +5V forsyning 9
2 Trig Trigger-impuls der starter sendingen af ultralydspulsen Valgfrit 1-8
3 Echo Pulsen der angiver hvor lang tid der går inden refleksionen måles Valgfrit 1-8 / INT-ben
4 GND Stel 10

Specifikationer for HC-SR04

Specifikationerne er fra databladet for HC-SR04. Afstandsområdet er ikke helt fast, det afhænger af de fysiske forhold.

Forsynings spænding 5V DC
Krævet forsynings-strøm < 2mA
Vinkel-spredning på måling < 15°
Afstands område 2 cm – 500 cm
Opløsning på afstand 0.3 cm

Målinger på HC-SR04

Som en del af udviklingen er der målt på modulet, hvor den røde kurve er trigger-signalet på Trig, der starter målingen, og den blå kurve er det signal der kommer retur på Echo.

Afstand-maal1.png

Hvis man forøger afstanden til det objekt der reflekteres på, så ses det tydeligt at tiden for echo-pulsen forøges

Afstand-maal2.png

Praktiske problemer ved målingen

Når man skal foretage en afstandsmåling, så er der en række praktiske problemer man skal overveje, som relaterer til at det er en refleksion af ultralyd man måler med. De vigtigste er:

  • Refleksioner fra andet
  • Det reflekterende objekt
  • Afstanden til det reflekterede

En klassisk fejl er at man placerer HC-SR04 modulet i et fumlebræt og placerer det på bordet, og så prøver man at få det til at reflektere på noget der står på bordet et stykke fra modulet. Her vil ultralyden reflektere i en vis grad fra overfladen af bordet, og da det er meget tæt på modulet, så er det denne refleksion det vil se, og ikke det objekt man tror man måler på.

Løsningen på dette er at hæve fumlebrættet et stykke op over bordet, når man måler.

Man skal også være opmærksom på hvilken overflade det er man forsøger at måle afstand til - en hård glat overflade vil normalt reflektere bedst, men det kan selvfølgelig også være andre ting, men en del materialer er gode til at absorbere lyd, så der ikke sker en refleksion f.x. tøj og lignende.

Vil man måle afstand til sådanne objekter kan man overveje at placere en plade eller en film oven på, så der sker en bedre refleksion.

Afstanden til objektet har også stor betydning for målingen. Normalt vil lyd udbreddes kugleformet - det er ikke helt tilfældet her, da både sender og modtager har en vis retnings-bestemmelse/retnings-følsomhed. Der vil alligevel ske en vis spredning af lyden så energien formindskes med afstanden til det reflekterede. Refleksionen vil heller ikke være fuldstændig, og vil også sprede lyden ud, så det kun er meget lidt af den udsendte energi der kommer tilbage. Der er selvfølgelig taget højde for dette i konstruktionen af modulet, men det kan være en fordel at overveje det.

Hvis man ønsker at måle afstande omkring grænsen for modulets rækkevidde, så er det en god ide at oveveje at få en effektiv refleksion af lyden på måleobjektet.

Andre versioner af afstandsmåling

Man kunne bygge sit eget modul, hvor den PIC man anvender kunne sende pulsen med de 40 kHz selv, og have en forstærker der sender det til ultralyds-transduceren. Modulet kunne så have sit eget filter, som opfangede refleksionen og lavede en puls til PIC'en.

Simpel anvendelse af afstandsmåling

For at illustrere at målemetoden virker, så er der lavet et eksempel-program, der kan måle afstanden og skrive det i er LCD-display.

I programmet defineres en variabel der anvendes til at måle tiden med, og der defineres to ben, der kan arbejde med Trig og Echo som hhv. output og input.

var dword tid = 0

alias trig is pin_a4
alias echo is pin_a2

pin_a2_direction = input
pin_a4_direction = output

Så laves der indstillinger på den interner 16 bit timer/counter timer 1, så den kan tælle mikrosekunder direkte ved at starte og stoppe timeren.

-- Indstil timer 1 til at tælle mikrosekunder (baseret på 4 MHz)
T1CON_TMR1CS = false
T1CON_NT1SYNC = true
T1CON_TMR1ON = true
T1CON_TMR1GE = false
T1CON_T1CKPS = 0

Selve målingen foretages ud fra følgende pseudokode:

udfør uendeligt
   Lav en puls på Trig-benet
   Vent på starten af Echo
   Start timer1
   Vent så længe Echo er høj
      Hvis timer1 løber over, så afbryd
   Registrer tiden i timer1
   Udskriv tiden og den omregnede afstand i cm

Dette er implementeret ved hjælp af følgende kode:

forever loop
   -- Lav en puls på trig
   trig = high
   delay_10us(2)
   trig = low
   -- Vent på at echo-pulsen kommer
   while ! echo loop
   end loop
   -- Nulstil timer1 med et offset
   TMR1 = 45  -- offset i tid
   -- Start timeren
   PIR1_TMR1IF = false
   T1CON_TMR1ON = true
   -- Vent hele echo-pulsen
   while echo loop
      -- exit loop, hvis timeren kommer over 65535 (godt 11 meter)
      if PIR1_TMR1IF then
         exit loop
      end if
   end loop
   -- Aflæs timer-værdien
   tid = dword(TMR1)
   ALCD_cursor_position(0,0) -- start of first line
   -- Skriv det aflæste direkte
   ALCD_Dec_5(word(tid))
   -- omregn til mm
   tid = (tid * 10) / 59
   -- udskriv med en decimal altså i cm
   ALCD_dwDecP(tid, 6, 1)
   ALCD_write_char("c")
   ALCD_write_char("m")
   delay_1ms(20)
end loop

Softwaren kan hentes i denne ZIP-fil.

Software modulet HC-SR04.jal

Der er ikke skrevet software til modulet endnu, men det kunne implementeres ud fra følgende principper:

En funktion der trigger modulet, hvis der ikke er en måling i gang. Funktionen returnerer true, hvis målingen er sat i gang.

if trig_hc_sr04 then
   -- måling er i gang
end if

Hele måledelen skal så opbygges i interrupt, hvor man kan anvende det kanttriggede interrupt af f.x. port A.

I interrupt-rutinen kan man så registrere om man skal starte tidsmålingen (hvis der er sendt trigger, og den sidste måling er aflæst), samt at pulsen er i gang.

Ved slutningen af pulsen kan man så aflæse tiden og registrere at målingen er afsluttet

Man kan så med en funktion aflæse afstanden som vist her:

if aflaes_hc_sr04(afstand) then
   -- display den aflæste afstand
end if

Funktionen returnerer afstanden i mm, hvis funktionen svarer med true, ellers er der ikke en måling klar.

Anvendelse af HC-SR04

Man skal include modulet som vist:

include HC-SR04

Herefter kan de to funktioner anvendes som vist.

Interface-fil til HC-SR04

Skal beskrives

-- Pins and the corresponding directions
alias     HC_SR04_trig      is pin_a2
alias     HC_SR04_echo      is pin_a4
alias     HC_SR04_trig_dir  is pin_a2_direction
alias     HC_SR04_echo_dir  is pin_a4_direction
-- Interrupt source definition
alias     HC_SR04_echo_int  is IOCA_IOCA4
Moduler på Holstebro HTX
Tastaturer Displays AD-konvertering I/O-ekspander Serielt Interface Færdige Andre
RC-tast - AD-tast - M_tast ALCD - LCD ADC_holst - ADC
mcp3201 - mcp3208
input - output Seriel_holst - Serial hardware
Serial hw int cts - Serial software
Stepmotor - RFID
RGB - RF-link - Afstand
Humidity - Analog temp - Dig temp
Accelerometer
Rotary Encoder

Oversigt over Hardware Moduler på Holstebro HTX

Keyes-moduler på Holstebro HTX
Simple Digitale Digitalt kodede 5 benede
Switch modul - Reedrør - Hall sensor - Optisk Skift - Photo Gate
Vibration sensor - Vibration switch - Tilt sensor - Kviksølv kontakt - Linje følger
IR Modtager - Humidity
Digital Temperatur
Rotary Encoder
XY Joystick
digitale 4 benede Justerbare analoge/digitale Simple digitale Analoge input
Magic Cup Light
LED 3-farve - RGB
RF-link - Afstand
Reed Magnetsensor - Temperatur Niveau
Metal detektor - Flamme - Hall Kontakt
Almindelig Mikrofon - Følsom Mikrofon
LED 2-farve - Aktiv Buzzer
Blink LED - IR LED - Laser
Relæ modul - Passiv Buzzer
Analog Temperatur
LDR - Finger Pulsmåler
Lineær Magnetfelt

Referencer

  1. Et af de steder hvor man kan skaffe HC-SR04