Sljedbenik linije GiggleBot pomoću Pythona: 5 koraka
Sljedbenik linije GiggleBot pomoću Pythona: 5 koraka
Anonim
Sljedbenik linije GiggleBot pomoću Pythona
Sljedbenik linije GiggleBot pomoću Pythona
Sljedbenik linije GiggleBot pomoću Pythona
Sljedbenik linije GiggleBot pomoću Pythona
Sljedbenik linije GiggleBot pomoću Pythona
Sljedbenik linije GiggleBot pomoću Pythona

Ovaj put programiramo u MicroPythonu Dexter Industries GiggleBot da slijedi crnu liniju pomoću ugrađenog senzora sljedbenika linija.

GiggleBot se mora upariti s BBC micro: bitom kako bi se mogao pravilno kontrolirati.

Ako je ovaj vodič za vas previše napredan i programiranje GiggleBot -a je za sada previše, uvijek možete proći kroz početni vodič koji vam pokazuje kako se ovdje može programirati robot u MakeCode -u. Povezani vodič će vas provesti kroz same osnove.

Korak 1: Potrebne komponente

Potrebne komponente
Potrebne komponente

Potrebne su sljedeće hardverske komponente:

  1. x3 AA baterije - u mom slučaju koristim punjive baterije koje imaju sveukupno niži napon.
  2. Robot Dexter Industries GiggleBot za micro: bit.
  3. BBC mikro: bit.

Naravno, potreban vam je i mikro USB kabel za programiranje BBC micro: bita - ovaj kabel općenito dolazi u paket BBC micro: bita ili uvijek možete koristiti onaj koji se koristi za punjenje (Android) pametnih telefona.

Ovdje nabavite GiggleBot za micro: bit

Korak 2: Postavite pjesme

Postavite pjesme
Postavite pjesme

Morat ćete proći kroz ispis nekih pločica i dizajniranje vlastitih pjesama. Možete koristiti naše vlastite pločice kako biste bili 100% sigurni da ponavljate naše uvjete. Ili, ako se osjećate avanturistički, možete upotrijebiti neku crnu traku i sami napraviti. Evo PDF -a za pločice koje smo koristili.

Gornji zapis sastoji se od sljedećeg broja različitih pločica:

  • 12 pločica tipa #1.
  • 5 pločica tipa #2.
  • 3 predloška pločica tipa #5.
  • 3 predloška pločica tipa #6 - ovdje ćete imati jednu dodatnu pločicu.

Zatim ih ispišite i izrežite. Pokušajte ih postaviti kao na gornjoj fotografiji i imajte na umu da se s desne gornje strane staze dvije pločice moraju preklapati jedna s drugom - to se očekuje u slučaju da se pitate radite li nešto pogrešno.

Korak 3: Postavljanje okruženja

Postavljanje okoliša
Postavljanje okoliša

Da biste mogli programirati BBC micro: bit u MicroPythonu, morate za njega postaviti uređivač (Mu Editor) i postaviti GiggleBot MicroPython Runtime kao vrijeme izvođenja. Za to morate slijediti upute na ovoj stranici. Od ovog trenutka koristi se verzija v0.4.0 vremena izvođenja.

Korak 4: Programiranje GiggleBot -a

Prije nego prijeđemo na to, vrijeme izvođenja GiggleBot MicroPython sadrži klasično vrijeme izvođenja za BBC micro: bit i druge knjižnice koje podržavaju GiggleBot i druge senzore Dexter Industries.

Nakon što ga postavite, otvorite sljedeću skriptu u uređivaču Mu i kliknite Flash. Ovo će aktivirati GiggleBot MicroPython Runtime i skriptu koju ste upravo otvorili na svom BBC micro: bit -u. Scenarij je također prikazan dolje.

Nakon što je proces bljeskanja gotov, složite BBC micro: bit u GiggleBot s neopikselima ploče prema naprijed, postavite ga na stazu i uključite.

Uočite da su u skripti PID i ostale 2 konstante (zadana vrijednost brzine i minimalna konstanta brzine) već postavljene.

Napomena: Sljedećoj skripti možda nedostaju razmaci, a čini se da je to zbog problema u prikazivanju GitHub gista. Pritisnite suštinu da biste se prebacili na njegovu stranicu GitHub gdje možete kopirati i zalijepiti kôd.

GiggleBot PID linijski sljedbenik - podešen s neopikselima

iz microbit uvoza*
iz gigglebot uvoza*
from utime import sleep_ms, ticks_us
uvozni ustrukt
# inicijalizira GB neopiksela
neo = init ()
# vrijeme
update_rate = 50
# dobitak/konstanta (pod pretpostavkom da je napon baterije oko 4,0 volta)
Kp = 25,0
Ki = 0,5
Kd = 35,0
okidačka_točka = 0,3
postotak min_brzine = 0,3
osnovna_brzina = 70
zadana vrijednost = 0,5
last_position = zadana vrijednost
integral = 0,0
run_neopixels = Istina
center_pixel = 5# gdje se središnji piksel osmijeha nalazi na GB
# tirkizna = tuple (karta (lambda x: int (x / 5), (64, 224, 208))) # boja za crtanje pogreške s neopikselima
# tirkizna = (12, 44, 41) # što je upravo gornja tirkizna komentirana iznad ovoga
error_width_per_pixel = 0.5/3# max pogreška podijeljena s brojem segmenata između svakog neopiksela
defupper_bound_linear_speed_reducer (aps_pogreška, okidač_točka, gornja granica, najmanja_motorna snaga, najveća_motorna snaga):
globalna osnovna_brzina
ako aps_pogreška> = okidač_točka:
# x0 = 0,0
# y0 = 0,0
# x1 = gornja granica - točka okidača
# y1 = 1,0
# x = aps_pogreška - okidač_točka
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
# isto kao
y = (abs_error - trigger_point) / (upper_bound - trigger_point)
snaga motora = osnovna brzina * (najmanja snaga motora + (1- godina) * (najveća snaga motora - najmanja snaga motora))
povratna snaga motora
drugo:
povratna osnovna brzina * najveća_motorna snaga
run = False
prethodna_pogreška = 0
whileTrue:
# ako pritisnete gumb a, počnite slijediti
ako je button_a.is_pressed ():
run = True
# ali ako je pritisnut gumb b, zaustavite sljedbenik linije
ako je button_b.is_pressed ():
run = False
integral = 0,0
prethodna_pogreška = 0,0
pixels_off ()
Stop()
sleep_ms (500)
ako je runTrue:
# pročitajte linijske senzore
start_time = ticks_us ()
desno, lijevo = osjetnik_čitanja (LINE_SENSOR, OBA)
# redak je s lijeve strane kada je položaj <0,5
# linija nalazi se s desne strane kada je položaj> 0,5
# linija je u sredini kada je položaj = 0,5
# to je ponderirana aritmetička sredina
probati:
položaj = desno /lebdi (lijevo + desno)
osimZeroDivisionError:
položaj = 0,5
# raspon mora biti (0, 1), a ne [0, 1]
ako je položaj == 0: položaj = 0,001
ako je položaj == 1: položaj = 0,999
# koristite PD kontroler
pogreška = položaj - zadana vrijednost
integral += pogreška
ispravak = Kp * pogreška + Ki * integral + Kd * (pogreška - prethodna_pogreška)
prethodna_pogreška = pogreška
# izračunajte brzine motora
motor_brzina = gornja_graničena_linearna_brzina_reducer (aps (pogreška), zadana vrijednost * okidač_točka, zadana vrijednost, min_brzina_procent, 1,0)
leftMotorSpeed = brzina_motora + ispravak
rightMotorSpeed = brzina_motora - ispravak
# osvijetli neopiksele prema zadanoj pogrešci
ako je run_neopixels isTrueand total_counts %3 == 0:
za i inb '\ x00 / x01 / x02 / x03 / x04 / x05 / x06 / x07 / x08':
neo = (0, 0, 0)
za i inb '\ x00 / x01 / x02 / x03':
ifabs (pogreška)> error_width_per_pixel * i:
ako je pogreška <0:
# neo [center_pixel + i] = tirkizna
neo [center_pixel + i] = (12, 44, 41)
drugo:
# neo [center_pixel - i] = tirkizna
neo [center_pixel + i] = (12, 44, 41)
drugo:
postotak = 1- (širina_greške_po_pikselu * i -abs (pogreška)) / greška_širine_po_pikselu
# osvjetljava trenutni piksel
ako je pogreška <0:
# neo [center_pixel + i] = tuple (karta (lambda x: int (x * postotak), tirkizna))
neo [center_pixel + i] = (int (64* posto /5), int (224* posto /5), int (208* posto /5))
drugo:
# neo [center_pixel - i] = tuple (karta (lambda x: int (x * postotak), tirkizna))
neo [center_pixel - i] = (int (64* posto /5), int (224* posto /5), int (208* posto /5))
pauza
neo.show ()
probati:
# isjecite brzine motora
ako je ostavljenoMotorSpeed> 100:
leftMotorSpeed = 100
rightMotorSpeed = rightMotorSpeed - leftMotorSpeed +100
ako je rightMotorSpeed> 100:
rightMotorSpeed = 100
leftMotorSpeed = leftMotorSpeed - rightMotorSpeed +100
ako je ostavljenoMotorSpeed <-100:
leftMotorSpeed = -100
ako je rightMotorSpeed <-100:
rightMotorSpeed = -100
# aktivirajte motore
set_speed (leftMotorSpeed, rightMotorSpeed)
voziti()
# ispis ((pogreška, brzina_motora))
osim:
# u slučaju da dođemo u neki problem koji se ne može riješiti
proći
# i održavati frekvenciju petlje
end_time = ticks_us ()
delay_diff = (end_time - start_time) /1000
if1000.0/ update_rate - delay_diff> 0:
spavanje (1000.0/ update_rate - delay_diff)

pogledajte rawgigglebot_tuned_line_follower.py hostirano sa ❤ na GitHubu

Korak 5: Pustite ga da radi

Postoje dva gumba na BBC mikro: bit: gumb A i gumb B:

  • Pritiskom na gumb A GiggleBot slijedi liniju (ako postoji).
  • Pritiskom na gumb B zaustavljate GiggleBot i resetirate sve kako biste ga mogli ponovno koristiti.

Preporučuje se da ne podižete GiggleBot dok slijedi liniju, a zatim ga vratite na njega jer bi se pogreška pri izračunavanju mogla akumulirati i potpuno poremetiti rutu robota. Ako ga želite podići, pritisnite gumb B, a zatim ga vratite ponovno pritisnite A.