1.3 Krāsu sensors un līniju sekotājs
Stundas uzdevums: Aprīkot robotu ar krāsu sensoru, ieprogrammēt spēju atšķirt krāsas un izveidot algoritmu, kas ļauj robotam autonomi sekot melnai līnijai uz laukuma.
Datorika 7. klase (D.7.2.1., D.7.3.1., D.7.4.2.)70 min plāns: Teorija un paraugs (~10 min) · 1. uzdevums (~15 min) - pieslēdz krāsu sensoru un apstādini robotu uz sarkanas krāsas · 2. uzdevums (~25 min) - uzraksti divu stāvokļu līniju sekotāju · 3. uzdevums (~20 min) - noregulē slieksni un ātrumu uz reālās trases. Papildu uzdevumu sāc tikai tad, ja pārējie trīs ir gatavi.
Pirms sāc: paņem robotu no 1.2 stundas, vienu krāsu sensoru ar garo vadu, robotikas paklāju ar melnu līniju un sarkanu LEGO klucīti.
Teorija: Kā robots pieņem lēmumus?
Līdz šim mūsu robots darīja vienu darbību, kamēr kaut kas notika (Wait until). Bet ko darīt, ja robotam nepārtraukti jāizvēlas starp divām rīcībām? Tam mēs izmantojam "If-Else" (Ja-Tad-Citādi) blokus.
- Krāsu sensors: Šis sensors var strādāt divos režīmos. Tas var atpazīt konkrētas krāsas (Sarkans, Zils, Zaļš) VAI mērīt atstarotās gaismas intensitāti (Reflected Light) no 0% (pilnīgi melns) līdz 100% (pilnīgi balts). Līnijas sekošanai gaismas intensitātes režīms ir daudz precīzāks!
- "If - Else" (Ja - Citādi) bloks: Atrodams dzeltenajā "Control" sadaļā. Tas uzdod jautājumu. Piemērs: JA (If) es redzu melnu krāsu, TAD es griežos pa kreisi. CITĀDI (Else) [tas nozīmē - redzu baltu], es griežos pa labi.
- Cikla nozīme: Lai robots sekotu līnijai, šis "If-Else" jautājums ir jāuzdod tūkstošiem reižu sekundē. Tāpēc "If-Else" bloks vienmēr jāliek iekšā "Forever" (Mūžīgi) vai "Repeat until" (Atkārtot līdz) ciklā.
Vizuālais orientieris: dzeltenais If-Else bloks atrodas Forever ciklā, un tā nosacījumā izmanto Color Sensor mērījumu.
# LEGO SPIKE Python - krāsu sensora nolasīšana
from spike import ColorSensor, Motor
from spike.control import wait_for_seconds
sensors = ColorSensor("E")
kreisais = Motor("A")
labais = Motor("B")
while True:
krasa = sensors.get_color()
if krasa == "black":
kreisais.start_at_power(20)
labais.start_at_power(50) # pagriežas pa kreisi
else:
kreisais.start_at_power(50)
labais.start_at_power(50) # taisni
Praktiskie uzdevumi
1. uzdevums -
Apstādini robotu uz sarkanas krāsas
Beigās tavs robots brauks taisni un pats apstāsies, ieraugot sarkanu klucīti.
- Piestiprini krāsu sensoru robota priekšā ar aci uz leju, 1-2 klucīšu augstumā no grīdas.
- Iespraud sensora vadu portā E.
- Ievelc programmā bloku
start moving [forward]. - Pievieno zem tā oranžo
wait untilbloku ar nosacījumu[Color Sensor on E] sees [Red]. - Pievieno beigās bloku
stop moving. - Noliec sarkanu klucīti metra attālumā un palaid programmu.
Gatavs, kad: robots pats apstājas pie sarkanā klucīša, nevis pārbrauc tam pāri.
2. uzdevums -
Uzraksti divu stāvokļu līniju sekotāju
Beigās tavs robots pats sekos melnas līnijas malai pa visu trasi.
- Izveido jaunu programmu un sāc ar bloku
set movement motors to [A] and [B]. - Pievieno oranžo
foreverciklu. - Ieliec ciklā
If ... Else ...bloku ar nosacījumu[Color Sensor on E] reflection < [50]%. - Ieraksti "If" zarā (redz melnu) bloku
start moving at [30] % steering. - Ieraksti "Else" zarā (redz baltu) bloku
start moving at [-30] % steering. - Noliec robotu tā, lai sensors būtu uz līnijas malas, un palaid.
Gatavs, kad: robots pats nobrauc vismaz vienu līnijas taisni, nenobraucot no tās.
3. uzdevums -
Noregulē slieksni un ātrumu uz reālās trases
Beigās tavs robots nobrauks visu apli, arī līkumus, bez raustīšanās.
- Noliec sensoru uz melnās līnijas un pieraksti, kādu procentu rāda portu skats.
- Noliec sensoru uz baltā laukuma un pieraksti arī šo procentu.
- Izrēķini abu skaitļu vidējo aritmētisko un ieraksti to "If" nosacījumā 50 vietā.
- Samazini stūrēšanu no 30 uz 20, ja robots raustās pārāk asi.
- Pievieno bloku
set movement speed to [25]%un palaid pa visu trasi. - Pieraksti vienu secinājumu: kāpēc slieksnis ir atkarīgs no klases apgaismojuma.
Gatavs, kad: robots nobrauc visu apli un neapstājas līkumā.
Papildu uzdevums - Saskaiti zaļos krustojumus
Ja pamatdarbs ir gatavs, liec robotam apstāties pēc trešā zaļā krustojuma.
- Izveido mainīgo (Variable) ar nosaukumu "Krustojumi" un iestati to uz 0.
- Nomaini
foreverciklu uzrepeat until [Krustojumi = 3]. - Pievieno ciklā vēl vienu If bloku ar nosacījumu
[Color Sensor on E] sees [Green]. - Ieraksti tajā
change [Krustojumi] by 1unwait for [0.5] seconds.
Gatavs, kad: robots apstājas tieši pēc trešā zaļā krustojuma, nevis pēc pirmā.
Biežākās kļūdas (un kā tās labot):
- Robots riņķo uz vietas, kad atrod līniju: Tava stūrēšanas vērtība (steering) ir pārāk liela (piemēram, 100%), vai arī motori A un B griežas pretējos virzienos. Līnijas sekošanai pietiek ar 10% līdz 30%.
- Robots pazaudē līniju līkumos: Braukšanas ātrums ir pārāk liels, vai arī slieksnis (50%) neatbilst tavas klases apgaismojumam. Paskaties portu skatā, kādu procentu sensors rāda uz melnā un baltā, un izrēķini vidējo aritmētisko.
- Sensors "redz" līniju tikai dažreiz: Melnas līnijas meklēšanai izmanto nevis "Color" (Krāsas) režīmu, bet "Reflected Light" (Atstarotā gaisma) bloku - krāsu atpazīšana prasa ideālu apgaismojumu.
Koda piemērs (sliekšņa izrēķināšana - grūtākā daļa)
# SPIKE Word Blocks vizuālā koda tekstuālā reprezentācija
# Grūtākais nav uzrakstīt If-Else, bet atrast PAREIZO slieksni.
# 1. solis - nomēri abas virsmas portu skatā (Port View):
# uz melnās līnijas sensors rāda, piemēram, 8%
# uz baltā laukuma sensors rāda, piemēram, 76%
# 2. solis - slieksnis ir abu skaitļu vidējais aritmētiskais:
# (8 + 76) / 2 = 42 -> nosacījumā raksti 42, nevis 50
when program starts
set movement motors to [A] and [B]
set movement speed to [25]%
forever:
if [Color Sensor on E] reflection < [42]% then:
start moving at [20] % steering # redz melnu -> griežas atpakaļ uz balto
else:
start moving at [-20] % steering # redz baltu -> griežas atpakaļ uz līniju