Teknik 1 · område 2 · pass 5
Motorerna
Samma hjärna, ny kropp. Pico:n flyttar från breadboarden till
roboten, och samma Pin och PWM som styrde en lysdiod och en
buzzer styr nu två motorer. Det nya i Python är funktioner – och det
nya i teknik är att du mäter något och jämför med vad du räknat ut.
1. Flytten
- Pico:n ur breadboarden: dra rakt upp med båda tummarna så att inga ben böjs.
- In i robotens långa header. USB-kontakten ska peka åt samma håll som på lärarens robot – titta på den. Tryck ner jämnt tills den bottnar.
- Roboten upp på en låda så att hjulen är i luften. Den ska inte köra iväg medan du testar.
- USB-kabel i Pico:n. Strömbrytaren på. Motorerna drivs av batterierna – USB räcker bara till Pico:n.
- VS Code: Pico Connected, som vanligt.
2. Varför en drivkrets
En pinne på Pico:n orkar några milliampere. En motor vill ha hundratals. Därför sitter det ett chip mellan dem – TB6612, drivkretsen från monteringspasset. Det tar Pico:ns svaga signal och släpper igenom batteriets ström till motorn. Två saker styrs:
| Vad | Hur | Samma som |
|---|---|---|
| Fart | PWM. Pinnen slår på och av 1000 gånger i sekunden; duty_u16 bestämmer hur stor del av tiden den är på. Motorn ser medelvärdet | Buzzern förra veckan – där var det tonhöjd, här är det fart |
| Riktning | Två pinnar per motor: fram och bak. Den som är 1 bestämmer åt vilket håll strömmen går genom motorn. Inuti chipet är det fyra brytare i ett H – en H-brygga | En vanlig Pin.OUT, som lysdioden |
3. Sex pinnar
Vänster motor fart GP16 fram GP17 bak GP18
Höger motor fart GP21 fram GP20 bak GP19
Tre per motor: en fart, två riktningar. Numren är fasta – de sitter i robotens kretskort och går inte att välja.
4. fram() och stopp()
Ny fil kor.py. Skriv av:
from machine import Pin, PWM
from time import sleep
fart_v = PWM(Pin(16))
fart_v.freq(1000)
v_fram = Pin(17, Pin.OUT)
v_bak = Pin(18, Pin.OUT)
fart_h = PWM(Pin(21))
fart_h.freq(1000)
h_fram = Pin(20, Pin.OUT)
h_bak = Pin(19, Pin.OUT)
def fram(fart):
v_fram.value(1)
v_bak.value(0)
h_fram.value(1)
h_bak.value(0)
fart_v.duty_u16(int(fart * 65535 / 100))
fart_h.duty_u16(int(fart * 65535 / 100))
def stopp():
fart_v.duty_u16(0)
fart_h.duty_u16(0)
fram(50)
sleep(1)
stopp()
| Ord | Betyder |
|---|---|
| funktion | def fram(fart): ger ett namn åt raderna under. Ett recept: skriv det en gång, använd det hur många gånger som helst |
| parameter | fart i parentesen. Det som varierar mellan gångerna. fram(50) är halv fart, fram(100) full |
| anrop | Raderna längst ner. Funktionen körs inte förrän någon anropar den – därför måste def stå före anropet i filen |
int(fart * 65535 / 100) | Förra veckans omräkning baklänges: 0–100 blir 0–65535. int() för att duty_u16 vill ha ett heltal |
Kör. Hjulen snurrar framåt i en sekund.
Då är riktningspinnarna förväxlade. Byt 17 och 18 (eller 19 och 20) i koden. Det är kalibrering nummer ett. Snurrar bara ett hjul: kontrollera att motorkabeln sitter i huvudkortet.
5. back, vanster, hoger – skriv själv
Du har fram som mönster. De tre andra ser likadana ut – det enda som
skiljer är vilka riktningspinnar som är 1 och 0:
| Funktion | v_fram | v_bak | h_fram | h_bak | Vad som händer |
|---|---|---|---|---|---|
fram | 1 | 0 | 1 | 0 | Båda hjulen framåt |
back | 0 | 1 | 0 | 1 | Båda bakåt |
vanster | 0 | 1 | 1 | 0 | Vänster hjul bakåt, höger framåt – roboten vrider sig på stället |
hoger | 1 | 0 | 0 | 1 | Tvärtom |
Alla tre tar fart som parameter och sätter båda duty_u16,
precis som fram. Testa sedan en följd:
fram(50), sleep(1), vanster(40),
sleep(0.5), stopp().
Annars snurrar motorerna tills batteriet tar slut. Det gäller varje program du skriver för roboten från och med nu.
6. Kalibrera och beräkna
Nu på golvet. En startlinje av tejp. Programmet: fram(50),
sleep(1), stopp().
- Mät. Kör tre gånger från startlinjen. Mät sträckan varje gång. Medelvärdet är din sträcka på en sekund.
- Kör den rakt? Oftast inte – den ena motorn är lite starkare.
Lägg en faktor på den starkare:
fart_h.duty_u16(int(fart * 1.05 * 65535 / 100)). Prova 1.03, 1.05, 1.08 tills den går rakt. Det heter kalibrering: mäta, justera, mäta igen. - Hastigheten. Sträcka delat med tid. 23 cm på 1 s = 23 cm/s. Skriv upp ert tal.
- Förutsäg. Hur lång
sleepbehövs för 50 cm? 50 / 23 ≈ 2,2 s. Skriv in. Kör en gång. Mät hur långt den faktiskt kom. - Felet. Skillnaden mellan 50 och det ni mätte. Skriv upp det.
Modellen sträcka = hastighet × tid är rätt, men den vet inte om att
batteriet sjunker, att motorerna är olika, att hjulen spinner vid start och att
roboten rullar en bit efter stopp(). Att veta vad modellen
inte vet är det som kallas rimlighetsbedömning – och det är en av sakerna
dokumentationen frågar efter. Hastigheten, förutsägelsen och felet ska in i
loggboken.
7. main.py
Hittills har roboten bara kört medan USB-kabeln sitter i. En fil som heter exakt
main.py startar automatiskt när Pico:n får ström.
# samma pinnar och funktioner som i kor.py ovanför ...
sleep(3)
fram(50)
sleep(1)
stopp()
- Spara som
main.py. Högerklicka filen i VS Code → Upload file to Pico. Kontrollera att den syns i Pico:ns filträd. - Dra ur USB. Strömbrytare av, på. Roboten väntar tre sekunder – så att du hinner ställa ner den – kör en sekund, stannar.
Och det går inte att stoppa från VS Code utan att koppla in kabeln igen. Alltid
sleep + stopp(), eller ett villkor som avslutar loopen.
Vill du bli av med ett main.py: koppla in USB, tryck Stop, radera
filen från Pico:n i filträdet.
Klart när — det här ska alla ha
Om du hinner — utmaning
Kryssen sparas i din webbläsare.
8. Felsökning
9 rader
| Symptom | Trolig orsak | Åtgärd |
|---|---|---|
| Pico Connected, men ingenting händer | Strömbrytaren är av – USB driver Pico:n, inte motorerna | Slå på strömbrytaren |
| Ingen kontakt alls med Pico:n i roboten | Pico:n sitter åt fel håll i headern | Ta ur, vänd, sätt i som på lärarens robot |
Hjulen snurrar bakåt på fram | Riktningspinnarna förväxlade | Byt 17 ↔ 18 eller 19 ↔ 20 |
| Bara ett hjul snurrar | En motorkabel sitter löst, eller fel PWM-pinne | Kabeln i huvudkortet. Fart är 16 och 21 |
NameError: fram isn't defined | Anropet står ovanför def fram | Flytta anropet nedanför funktionerna |
TypeError: can't convert float | int() saknas | duty_u16(int(...)) |
| Roboten kör och kör | stopp() saknas, eller while True utan slut | Stop i VS Code. stopp() sist |
Roboten svänger på fram | Motorerna är olika starka | Faktor på den starkare, avsnitt 6 |
main.py startar inte utan USB | Filen ligger på datorn, inte på Pico:n | Upload file to Pico. Kontrollera filträdet |
Ord på den här sidan
| Ord | Betyder |
|---|---|
| funktion | Ett namn åt flera rader kod. Skrivs en gång med def, används med namnet |
| parameter | Det som skickas in i funktionen och varierar mellan anropen. fart |
| anrop | Att använda funktionen: fram(50) |
| drivkrets | Chip som förstärker hjärnans signal så att den orkar driva en motor. TB6612 |
| H-brygga | Fyra brytare runt en motor som bestämmer åt vilket håll strömmen går. Sitter inuti drivkretsen |
| kalibrering | Mäta, justera, mäta igen – tills det stämmer |
| rimlighetsbedömning | Att veta vad en beräkning inte tar hänsyn till, och hur mycket fel det kan ge |
| main.py | Filen som Pico:n kör själv när den får ström |
Ordträning