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:
- Pico:n skickar en kort puls på pinnen
trig(GP14). Sensorn skickar ut ett klick, för högt för att höras. - Pinnen
echo(GP15) går hög, och stannar hög tills ekot kommer tillbaka. - Hur länge
echovar 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 nya | Vad det gör |
|---|---|
return | fram() 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-looparna | Första: vänta tills ekot börjar. Andra: vänta tills det slutar. Tiden emellan är tiden |
if ticks_diff(...) > 30000: return 999 | Timeout. 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.
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
| Symptom | Trolig orsak | Åtgärd |
|---|---|---|
| Alltid 999 | Ekot kommer aldrig: fel pinnar, eller sensorn sitter löst | 14 är trig, 15 är echo. Tryck fast sensorn i headern |
| Alltid 0 eller mycket små tal | start läses innan ekot börjat | Ordningen: första loopen väntar tills echo är 1, sedan start = ticks_us() |
| Talet fladdrar | Sned vägg, mjukt material, sensorn pekar snett | Kartong rakt framför. Stretch: medelvärde av tre mätningar |
| Programmet hänger, Stop krävs | Timeouten saknas i en av looparna | Båda while-looparna ska ha sin if ticks_diff(...) > 30000 |
| Roboten kör in i väggen | Fö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 loopen | stopp() efter loopen, utan indrag |
NameError: fram isn't defined | Motorfunktionerna är inte kopierade in i filen | Klistra in pinnar och funktioner från kor.py ovanför loopen |