Sadržaj:
2025 Autor: John Day | [email protected]. Zadnja izmjena: 2025-01-13 06:57
Ovaj put u MicroPythonu programiramo Dexter Industries GiggleBot da slijedi crnu liniju pomoću ugrađenog senzora za praćenje linija.
GiggleBot mora biti uparen 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č vodi vas 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.
- Dexter Industries GiggleBot robot 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.
Nabavite GiggleBot za micro: bit ovdje
Korak 2: Postavite staze
Morat ćete proći kroz štampanje 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 crnu traku i sami je 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 šablona pločica tipa #5.
- 3 predloška tipa pločice #6 - ovdje ćete završiti s jednom dodatnom pločicom.
Zatim ih odštampajte i izrežite. Pokušajte ih postaviti kao na gornjoj fotografiji i imajte na umu da se na desnoj gornjoj strani 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 postaviti uređivač za njega (Mu Editor) i postaviti GiggleBot MicroPython Runtime kao vrijeme izvođenja. Da biste to učinili, 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 što prijeđemo na to, vrijeme izvođenja GiggleBot MicroPython sadrži klasično vrijeme izvođenja za BBC micro: bit i druge biblioteke koje podržavaju GiggleBot i druge senzore Dexter Industries.
Nakon što ga postavite, otvorite sljedeću skriptu u uređivaču Mu i kliknite na Flash. Ovo će aktivirati GiggleBot MicroPython Runtime i skriptu koju ste upravo otvorili na svom BBC micro: bit -u. Skripta je takođe prikazana dole.
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.
Primijetite 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 nekog problema u prikazivanju GitHub gista. Kliknite na suštinu da biste se prebacili na njenu stranicu GitHub gdje možete kopirati i zalijepiti kôd.
GiggleBot PID Line Follower - Podešen sa NeoPixels
iz microbit uvoza* |
iz gigglebot uvoza* |
from utime import sleep_ms, ticks_us |
import ustruct |
# inicijalizira GB neopiksela |
neo = init () |
# tajming |
update_rate = 50 |
# dobitak/konstanta (pod pretpostavkom da je napon baterije oko 4,0 volta) |
Kp = 25,0 |
Ki = 0,5 |
Kd = 35,0 |
trigger_point = 0.3 |
min_brzina_procent = 0,3 |
osnovna_brzina = 70 |
zadana vrijednost = 0,5 |
last_position = zadata vrijednost |
integral = 0,0 |
run_neopixels = Tačno |
center_pixel = 5# gdje se središnji piksel osmijeha nalazi na GB |
# tirkizna = tuple (mapa (lambda x: int (x / 5), (64, 224, 208))) # boja koju ćete koristiti za iscrtavanje greške s neopikselima |
# tirkizna = (12, 44, 41) # što je upravo gornja tirkizna komentirana iznad ovoga |
error_width_per_pixel = 0.5/3# max greš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_moć): |
globalna osnovna_brzina |
ako je aps_pogreška> = okidač_točka: |
# x0 = 0,0 |
# y0 = 0,0 |
# x1 = gornja granica - tač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)) |
povratak snage motora |
drugo: |
povratna osnovna brzina * najveća_motorna snaga |
run = False |
prethodna_pogreška = 0 |
whileTrue: |
# ako pritisnete dugme a, počnite da pratite |
ako je button_a.is_pressed (): |
run = True |
# ali ako je pritisnuto dugme b, zaustavite pratioce linija |
if button_b.is_pressed (): |
run = False |
integral = 0,0 |
prethodna_pogreška = 0.0 |
pixels_off () |
stop () |
sleep_ms (500) |
ako je run isTrue: |
# pročitajte linijske senzore |
start_time = ticks_us () |
desno, lijevo = senzor za čitanje (LINE_SENSOR, OBA) |
# linija je s lijeve strane kada je pozicija <0,5 |
# linija je s desne strane kada je položaj> 0,5 |
# linija je u sredini kada je pozicija = 0,5 |
# to je ponderisana aritmetička sredina |
probaj: |
položaj = desno /lebdi (lijevo + desno) |
osimZeroDivisionError: |
položaj = 0,5 |
# raspon mora biti (0, 1), a ne [0, 1] |
ako je pozicija == 0: pozicija = 0,001 |
ako je pozicija == 1: pozicija = 0.999 |
# koristite PD kontroler |
greška = položaj - zadata vrijednost |
integral += greška |
ispravak = Kp * greška + Ki * integral + Kd * (greška - prethodna_pogreška) |
prethodna_pogreška = greška |
# izračunajte brzine motora |
motor_brzina = gornja_graničena_linearna_brzina_reducer (abs (greška), zadana vrijednost * okidač_točka, zadana vrijednost, min_brzina_procent, 1,0) |
leftMotorSpeed = brzina_motora + korekcija |
rightMotorSpeed = brzina_motora - ispravka |
# osvetli neopiksele prema datoj greš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 (greška)> error_width_per_pixel * i: |
ako je greš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- (greška_širina_po_pikselu * i -abs (greška)) / greška_širine_po_pikselu |
# osvetljava trenutni piksel |
ako je greška <0: |
# neo [center_pixel + i] = tuple (mapa (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 (mapa (lambda x: int (x * postotak), tirkizna)) |
neo [center_pixel - i] = (int (64* posto /5), int (224* posto /5), int (208* posto /5)) |
break |
neo.show () |
probaj: |
# 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) |
drive () |
# print ((greška, brzina_motora)) |
osim: |
# u slučaju da upadnemo u neki problem koji nije moguće riješiti |
pass |
# 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 GitHub -u
Korak 5: Pustite ga da radi
Postoje dva dugmeta na BBC mikro: bit: dugme A i dugme B:
- Pritisak na dugme A postavlja GiggleBot da prati liniju (ako postoji).
- Pritiskom na dugme B zaustavljate GiggleBot i resetujete sve tako da ga možete ponovo koristiti.
Preporučuje se da ne podižete GiggleBot dok slijedi liniju, a zatim ga vratite na njega jer bi se greška pri izračunavanju mogla akumulirati i potpuno poremetiti rutu robota. Ako želite da ga podignete, pritisnite dugme B, a zatim kada ga vratite ponovo pritisnite A.