← Område 2 Uppgift · Stanna före väggen Felsökning

Teknik 1 · område 2 · pass 6 · utmaning

Stanna före väggen

Roboten får ögon. Ultraljudssensorn framtill skickar ett klick, lyssnar efter ekot och mäter tiden. Uppgiften: kör mot en vägg och stanna 10 cm före. Du använder motorfunktionerna från förmiddagen som de är.

1. Hur ultraljud mäter

Sensorn med de två runda "ögonen" mäter inte avstånd. Den mäter tid:

  1. Pico:n skickar en kort puls på pinnen trig (GP14). Sensorn skickar ut ett klick, för högt för att höras.
  2. Pinnen echo (GP15) går hög, och stannar hög tills ekot kommer tillbaka.
  3. Hur länge echo var hög är tiden ljudet tog – fram och tillbaka.

Avståndet räknar du ut själv:

avstånd = tid × 0,034 / 2

0,034  ljudets hastighet: 340 m/s = 34 000 cm/s = 0,034 cm per mikrosekund
/ 2    ljudet gick fram och tillbaka – halva tiden per väg
1200 µs × 0,034 / 2 = 20,4 cm

2. avstand() – en funktion som svarar

Ny fil vagg.py. Skriv av:

from machine import Pin
from time import sleep, sleep_us, ticks_us, ticks_diff

trig = Pin(14, Pin.OUT)
echo = Pin(15, Pin.IN)


def avstand():
    trig.value(0)
    sleep_us(2)
    trig.value(1)
    sleep_us(10)
    trig.value(0)
    t0 = ticks_us()
    while echo.value() == 0:
        if ticks_diff(ticks_us(), t0) > 30000:
            return 999
    start = ticks_us()
    while echo.value() == 1:
        if ticks_diff(ticks_us(), start) > 30000:
            return 999
    slut = ticks_us()
    tid = ticks_diff(slut, start)
    return tid * 0.034 / 2


while True:
    print(avstand())
    sleep(0.2)

Kör. Håll handen framför sensorn – talet följer. Lägg måttbandet: stämmer det på 20 cm?

Det nyaVad det gör
returnfram() gör något. avstand() svarar – med ett tal. Det som står efter return skickas tillbaka till den som anropade, och funktionen är klar. x = avstand() lägger svaret i en variabel. Det heter returvärde
ticks_us(), ticks_diff()Klockan i mikrosekunder, och skillnaden mellan två avläsningar. Ljudet är snabbt – millisekunder räcker inte
De två while-looparnaFörsta: vänta tills ekot börjar. Andra: vänta tills det slutar. Tiden emellan är tiden
if ticks_diff(...) > 30000: return 999Timeout. Om ekot aldrig kommer – en tröja, ingenting framför – skulle loopen vänta för evigt och programmet hänga. Efter 30 ms ger vi upp och svarar 999. Det finns i båda looparna

3. Uppgiften

Kopiera pinnarna och funktionerna från kor.py in i vagg.py (ovanför avstand, eller under – bara före loopen). Byt sedan ut print-loopen mot:

while avstand() > 10:
    fram(40)
stopp()

Så länge det är mer än 10 cm kvar: kör. Sedan: stanna. Det är första gången while har ett villkor som inte är True. Lägg märke till att stopp() står efter loopen, utan indrag.

Roboten på golvet, en kartong 60 cm framför. Kör. Mät var den stannade.

Den stannar för sent?

Två orsaker. Roboten rullar en bit efter stopp() – samma sak som i förmiddags. Och vid fart 40 hinner loopen inte läsa särskilt ofta. Vad gör du med det? Lägre fart nära väggen. Eller: stanna vid 13 om den rullar 3.

4. Nivåerna

Ska — nivå E

Bör — nivå C

Utmaning — nivå A

Kryssen sparas i din webbläsare.

5. Felsökning

7 rader

SymptomTrolig orsakÅtgärd
Alltid 999Ekot kommer aldrig: fel pinnar, eller sensorn sitter löst14 är trig, 15 är echo. Tryck fast sensorn i headern
Alltid 0 eller mycket små talstart läses innan ekot börjatOrdningen: första loopen väntar tills echo är 1, sedan start = ticks_us()
Talet fladdrarSned vägg, mjukt material, sensorn pekar snettKartong rakt framför. Stretch: medelvärde av tre mätningar
Programmet hänger, Stop krävsTimeouten saknas i en av looparnaBåda while-looparna ska ha sin if ticks_diff(...) > 30000
Roboten kör in i väggenFör hög fart, eller < i stället för >Fart 30. Villkoret är avstand() > 10
Roboten stannar direkt< i villkoret, eller stopp() indragen inne i loopenstopp() efter loopen, utan indrag
NameError: fram isn't definedMotorfunktionerna är inte kopierade in i filenKlistra in pinnar och funktioner från kor.py ovanför loopen