Sadržaj:

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

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

Video: Sljedbenik linije GiggleBot pomoću Pythona: 5 koraka
Video: Gerasimov komandovao sa linije fronta: Neuspeh ukrajinskih snaga nakon pokušaja velike ofanzive 2024, Novembar
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 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 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. Dexter Industries GiggleBot robot 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.

Nabavite GiggleBot za micro: bit ovdje

Korak 2: Postavite staze

Postavite numere
Postavite numere

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

Postavljanje okruženja
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.

Preporučuje se: