ebSkola

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.

  1. Piestiprini krāsu sensoru robota priekšā ar aci uz leju, 1-2 klucīšu augstumā no grīdas.
  2. Iespraud sensora vadu portā E.
  3. Ievelc programmā bloku start moving [forward].
  4. Pievieno zem tā oranžo wait until bloku ar nosacījumu [Color Sensor on E] sees [Red].
  5. Pievieno beigās bloku stop moving.
  6. 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.

  1. Izveido jaunu programmu un sāc ar bloku set movement motors to [A] and [B].
  2. Pievieno oranžo forever ciklu.
  3. Ieliec ciklā If ... Else ... bloku ar nosacījumu [Color Sensor on E] reflection < [50]%.
  4. Ieraksti "If" zarā (redz melnu) bloku start moving at [30] % steering.
  5. Ieraksti "Else" zarā (redz baltu) bloku start moving at [-30] % steering.
  6. 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.

  1. Noliec sensoru uz melnās līnijas un pieraksti, kādu procentu rāda portu skats.
  2. Noliec sensoru uz baltā laukuma un pieraksti arī šo procentu.
  3. Izrēķini abu skaitļu vidējo aritmētisko un ieraksti to "If" nosacījumā 50 vietā.
  4. Samazini stūrēšanu no 30 uz 20, ja robots raustās pārāk asi.
  5. Pievieno bloku set movement speed to [25]% un palaid pa visu trasi.
  6. 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.

  1. Izveido mainīgo (Variable) ar nosaukumu "Krustojumi" un iestati to uz 0.
  2. Nomaini forever ciklu uz repeat until [Krustojumi = 3].
  3. Pievieno ciklā vēl vienu If bloku ar nosacījumu [Color Sensor on E] sees [Green].
  4. Ieraksti tajā change [Krustojumi] by 1 un wait 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
Ar slieksni 42 robots tur sensoru tieši uz līnijas malas un brauc vienmērīgā zig-zag. Ja atstāj 50, bet klasē ir tumšāks apgaismojums, robots baltu virsmu noturēs par melnu un aizbrauks prom no līnijas.