Teknik 1 · område 2 · pass 7
Bibliotek och listor
Linjeföljaren under roboten läses via en krets och en teknik som ligger långt utanför den här kursen. Någon annan har skrivit den koden. Du använder den. Det är vad ett bibliotek är – och det är så nästan all programmering fungerar.
1. Vad ett bibliotek är
from machine import Pin – det har du skrivit sedan första passet.
machine är ett bibliotek: en samling färdig kod som följer med
MicroPython. Du hämtar det du behöver med import.
Idag lägger du till två bibliotek till. De är vanliga Python-filer som läggs på
Pico:n, och sedan importeras precis som machine:
| Fil | Vad den kan | Vad du skriver |
|---|---|---|
| TRSensor.py | Läser de fem IR-sensorerna under fronten | from TRSensor import TRSensor |
| ST7789.py | Ritar text på skärmen | from ST7789 import ST7789 |
Du behöver inte förstå vad som står i filerna. Du behöver veta vad de kan – det står i en kommentar överst i varje fil.
2. Ladda upp två filer
- Klicka på filnamnen i tabellen ovanför och spara båda i mappen
teknik1. - I VS Code: högerklicka på
TRSensor.py→ Upload file to Pico. Samma medST7789.py. - Kontrollera i Pico:ns filträd att de ligger där.
Pico
├── main.py (om du har en)
├── TRSensor.py ← ny
└── ST7789.py ← ny
import letar på Pico:n. Ligger filen bara i mappen på datorn får du
ImportError: no module named 'TRSensor'. Ladda upp.
3. Fem tal i ett namn
Ny fil linje.py:
from TRSensor import TRSensor
from time import sleep
sensor = TRSensor()
while True:
varden = sensor.AnalogRead()
print(varden)
sleep(0.2)
Kör. Terminalen visar något i stil med [812, 790, 65, 780, 805]. Fem tal
i hakparenteser – det är en lista. Håll roboten över tejpen och
flytta den i sidled: ett tal i taget hoppar upp.
| Skrivsätt | Betyder |
|---|---|
varden | Hela listan, fem tal |
varden[0] | Första talet – sensorn längst till vänster |
varden[2] | Tredje talet – mitten |
varden[4] | Femte talet – längst till höger. Index börjar på noll, så det sista är 4, inte 5 |
sensor.AnalogRead() | "Fråga sensorn." Svaret är listan. Högre tal = mörkare underlag |
Varje sensor har en IR-lampa och en mottagare bredvid varandra. På vitt underlag studsar ljuset upp i mottagaren – lågt tal. På svart tejp sugs ljuset upp – högt tal. Sensorn ser alltså inte "svart", den mäter hur mycket ljus som kommer tillbaka.
4. Skärmen
Samma sak igen, ett bibliotek till:
from TRSensor import TRSensor
from ST7789 import ST7789
from time import sleep
sensor = TRSensor()
lcd = ST7789()
while True:
varden = sensor.AnalogRead()
lcd.fill(lcd.SVART)
for i in range(5):
lcd.text(str(varden[i]), 10, 10 + i * 15, lcd.VIT)
lcd.show()
sleep(0.2)
| Raden | Vad den gör |
|---|---|
lcd.fill(lcd.SVART) | Fyller hela skärmen med en färg – rensar |
lcd.text(text, x, y, färg) | Skriver text på plats x, y. Texten är 8 pixlar hög. Skärmen är 240 bred och 135 hög |
lcd.show() | Skickar det du ritat till skärmen. Inget syns förrän show() |
lcd.VIT, lcd.SVART, lcd.GRON, lcd.ROD, lcd.BLA, lcd.GUL | Färgerna |
Nu ser du sensorvärdena utan USB-kabel. Det är felsökningsverktyget resten av blocket: vad ser roboten just nu?
5. for-loopen
Raden for i in range(5): är ny. Den betyder: gör det indragna fem
gånger, med i = 0, 1, 2, 3, 4. Det är så man går genom en lista.
| Varv | i | varden[i] | 10 + i * 15 |
|---|---|---|---|
| 1 | 0 | vänster kant | 10 |
| 2 | 1 | 25 | |
| 3 | 2 | mitten | 40 |
| 4 | 3 | 55 | |
| 5 | 4 | höger kant | 70 |
str(varden[i]) gör om talet till text – lcd.text vill ha
text. 10 + i * 15 är raden på skärmen: varje varv 15 pixlar längre ner.
Skriv de fem talen bredvid varandra i stället för under varandra. Vad ska ändras – x eller y?
Klart när — det här ska alla ha
Kryssen sparas i din webbläsare.
Nästa sida: linjeföljaren – kalibrering, position och att följa linjen.
6. Felsökning
6 rader
| Symptom | Trolig orsak | Åtgärd |
|---|---|---|
ImportError: no module named 'TRSensor' | Filen ligger på datorn, inte på Pico:n | Högerklicka → Upload file to Pico. Kontrollera filträdet |
| Alla fem tal är lika och ändras inte | Sensorkortet sitter löst i headern | Tryck fast det. Det ska peka rakt ner mot golvet |
| Skärmen är svart | show() saknas | lcd.show() sist i loopen |
TypeError på lcd.text | Ett tal skickas in i stället för text | str(varden[i]) |
IndexError: list index out of range | varden[5] – listan har index 0–4 | range(5) ger 0–4. Inte 5 |
| Skärmen visar konstiga färger | Fel färgkonstant | Använd lcd.VIT osv, inte egna tal |
Ord på den här sidan
| Ord | Betyder |
|---|---|
| bibliotek | Färdig kod som någon annan skrivit, som du hämtar med import och använder |
| import | Hämta ett bibliotek så att det går att använda |
| lista | Flera värden i ett namn. Skrivs med hakparenteser: [812, 790, 65] |
| index | Numret på en plats i listan. Börjar på 0 |
| for-loop | Gör något ett bestämt antal gånger, med en variabel som räknar |
| range(5) | Talen 0, 1, 2, 3, 4 |
| str() | Gör om ett tal till text |
| IR | Infrarött ljus. Osynligt för ögat, synligt för sensorn |
Ordträning