Sadržaj:
2025 Autor: John Day | [email protected]. Zadnja promjena: 2025-01-13 06:57
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 su sljedeće hardverske komponente:
- x3 AA baterije - u mom slučaju koristim punjive baterije koje imaju sveukupno niži napon.
- Robot Dexter Industries GiggleBot za micro: bit.
- 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
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
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.