← Område 2 Guide · Motorerna Felsökning

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

  1. Pico:n ur breadboarden: dra rakt upp med båda tummarna så att inga ben böjs.
  2. 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.
  3. Roboten upp på en låda så att hjulen är i luften. Den ska inte köra iväg medan du testar.
  4. USB-kabel i Pico:n. Strömbrytaren på. Motorerna drivs av batterierna – USB räcker bara till Pico:n.
  5. 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:

VadHurSamma som
FartPWM. 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ärdetBuzzern förra veckan – där var det tonhöjd, här är det fart
RiktningTvå 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-bryggaEn 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()
OrdBetyder
funktiondef 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
parameterfart i parentesen. Det som varierar mellan gångerna. fram(50) är halv fart, fram(100) full
anropRaderna 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.

Snurrar de bakåt?

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:

Funktionv_framv_bakh_framh_bakVad som händer
fram1010Båda hjulen framåt
back0101Båda bakåt
vanster0110Vänster hjul bakåt, höger framåt – roboten vrider sig på stället
hoger1001Tvä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().

Alltid stopp() sist

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().

  1. 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.
  2. 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.
  3. Hastigheten. Sträcka delat med tid. 23 cm på 1 s = 23 cm/s. Skriv upp ert tal.
  4. Förutsäg. Hur lång sleep behö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.
  5. Felet. Skillnaden mellan 50 och det ni mätte. Skriv upp det.
Varför stämmer det inte?

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()
  1. Spara som main.py. Högerklicka filen i VS Code → Upload file to Pico. Kontrollera att den syns i Pico:ns filträd.
  2. 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.
Ett while True i main.py kör tills batteriet tar slut

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

SymptomTrolig orsakÅtgärd
Pico Connected, men ingenting händerStrömbrytaren är av – USB driver Pico:n, inte motorernaSlå på strömbrytaren
Ingen kontakt alls med Pico:n i robotenPico:n sitter åt fel håll i headernTa ur, vänd, sätt i som på lärarens robot
Hjulen snurrar bakåt på framRiktningspinnarna förväxladeByt 17 ↔ 18 eller 19 ↔ 20
Bara ett hjul snurrarEn motorkabel sitter löst, eller fel PWM-pinneKabeln i huvudkortet. Fart är 16 och 21
NameError: fram isn't definedAnropet står ovanför def framFlytta anropet nedanför funktionerna
TypeError: can't convert floatint() saknasduty_u16(int(...))
Roboten kör och körstopp() saknas, eller while True utan slutStop i VS Code. stopp() sist
Roboten svänger på framMotorerna är olika starkaFaktor på den starkare, avsnitt 6
main.py startar inte utan USBFilen ligger på datorn, inte på Pico:nUpload file to Pico. Kontrollera filträdet

Ord på den här sidan

OrdBetyder
funktionEtt namn åt flera rader kod. Skrivs en gång med def, används med namnet
parameterDet som skickas in i funktionen och varierar mellan anropen. fart
anropAtt använda funktionen: fram(50)
drivkretsChip som förstärker hjärnans signal så att den orkar driva en motor. TB6612
H-bryggaFyra brytare runt en motor som bestämmer åt vilket håll strömmen går. Sitter inuti drivkretsen
kalibreringMäta, justera, mäta igen – tills det stämmer
rimlighetsbedömningAtt veta vad en beräkning inte tar hänsyn till, och hur mycket fel det kan ge
main.pyFilen som Pico:n kör själv när den får ström

Ordträning