Turinys:
- 1 žingsnis: reikalingi komponentai
- 2 veiksmas: takelių ir aplinkos nustatymas
- 3 veiksmas: „GiggleBot“nustatymas
- 4 veiksmas: imtuvo nustatymas (nuotolinis)
- 5 žingsnis: sureguliuokite „GiggleBot“
- 6 veiksmas: „GiggleBot“veikia išjungus „NeoPixels“
- 7 žingsnis: „GiggleBot“veikia įjungus neopikselius
Video: „GiggleBot“linijos sekėjo derinimas - išplėstinis: 7 žingsniai
2024 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2024-01-30 10:47
Šioje labai trumpoje instrukcijoje ketinate sureguliuoti savo „GiggleBot“, kad ji laikytųsi juodos linijos. Šioje kitoje pamokoje „GiggleBot Line Follower“mes sunkiai užkoduodavome derinimo vertes, kad jos veiktų pagal tą scenarijų. Galbūt norėsite, kad ji geriau elgtųsi sugalvodama kitų laimėjimų.
Šioje pamokoje mes parodome jums 2 scenarijus, kuriuos abu galima įkelti į skirtingus BBC mikro: bitus, kad vienas iš jų būtų įdėtas į „GiggleBot“, o su kitu - 2 mygtukai naudojami norint pereiti į meniu ir suderinti skirtingus parametrus. Šie atnaujinti parametrai siunčiami per radiją.
1 žingsnis: reikalingi komponentai
Jums reikės:
- „GiggleBot“robotas, skirtas „micro: bit“.
- x3 AA baterijos
- x2 BBC mikro: bitai - vienas skirtas „GiggleBot“, o kitas veikia kaip nuotolinio valdymo pultas parametrams derinti.
- „BBC micro: bit“baterija - tokia, kokia yra „BBC micro: bit“pakuotėje.
Gaukite „GiggleBot Robot“, skirtą „BBC micro: bit“, čia
2 veiksmas: takelių ir aplinkos nustatymas
Jūs taip pat turite sukurti savo takelius (atsisiųsti, spausdinti, iškirpti ir klijuoti plyteles) ir tada nustatyti aplinką (IDE ir veikimo laikas).
Kadangi ši pamoka yra labai susijusi su šia pamoka, pavadinta „GiggleBot Line Follower“, tiesiog eikite ten ir atlikite 2 ir 3 veiksmus ir grįžkite čia.
Kalbant apie IDE, galite naudoti „Mu“redaktorių, o vykdymo metu turite atsisiųsti „GiggleBot MicroPython Runtime“. Runtime galima atsisiųsti iš jo dokumentacijos čia. Pereikite prie dokumentacijos skyriaus „Pradžia“ir vadovaukitės šiomis aplinkos nustatymo instrukcijomis. Šiuo metu naudojama vykdymo laiko versija v0.4.0.
3 veiksmas: „GiggleBot“nustatymas
Prieš paleisdami „GiggleBot“vykdymo laiką, įsitikinkite, kad pasirinkote norimą „GiggleBot“greitį ir atnaujinimo greitį: pagal numatytuosius nustatymus greitis nustatytas kaip 100 (bazinio greičio kintamasis), o atnaujinimo dažnis - 70 (kintamasis atnaujinimo koeficientas).
Atsižvelgiant į dabartinį diegimą, didžiausias atnaujinimo dažnis, kurį galima pasiekti, yra 70, o jei „run_neopixels“nustatytas kaip „True“, tada pasiekiamas tik 50. Taigi tam tikra prasme galite pasakyti, kad numatytasis atnaujinimo greitis yra ties tuo, ką gali padaryti „BBC micro: bit“.
Tik įrašui, linijos sekimo jutiklis gali grąžinti atnaujinimus 100 kartų per sekundę.
Pastaba: šiame scenarijuje gali nebūti tarpų ir atrodo, kad tai įvyko dėl tam tikrų problemų rodant „GitHub Gists“. Spustelėkite esmę, kad pateksite į jo „GitHub“puslapį, kuriame galite nukopijuoti ir įklijuoti kodą.
„GiggleBot“PID linijos sekimo imtuvas (norint jį sureguliuoti reikia nuotolinio valdymo pulto) - xjfls23
iš mikrobitų importo* |
iš „Gigglebot“importo* |
iš utime importuoti sleep_ms, ticks_us |
importuoti radiją |
importo ustruktūra |
# inicijuokite radiją ir GB neopikselius |
radio.on () |
neo = init () |
# laikas |
atnaujinimo koeficientas = 70 |
# numatytosios stiprinimo vertės |
Kp = 0,0 |
Ki = 0,0 |
Kd = 0,0 |
nustatytoji vertė = 0,5 |
trigerio taškas = 0,0 |
min_speed_percent = 0,2 |
bazinis greitis = 100 |
last_position = nustatytoji vertė |
integralas = 0,0 |
run_neopixels = Netiesa |
centre_pikselis = 5#, kur centrinis šypsenos pikselis yra GB |
# turquoise = tuple (žemėlapis (lambda x: int (x / 5), (64, 224, 208))) # spalva, naudojama norint piešti klaidą naudojant neopikselius |
# turquoise = (12, 44, 41) # tai yra aukščiau nurodyta turkio spalva |
error_width_per_pixel = 0.5/3# max klaida, padalyta iš segmentų skaičiaus tarp kiekvieno neopikselio |
defupper_bound_linear_speed_reducer (abs_error, trigger_point, viršutinė_bound, mažiausia_motor_power, didžiausia_motor_power): |
pasaulinis bazinis greitis |
jei abs_error> = trigger_point: |
# x0 = 0,0 |
# y0 = 0,0 |
# x1 = viršutinė riba - trigerio taškas |
# y1 = 1,0 |
# x = abs_error - trigger_point |
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0) |
# taip pat kaip |
y = (abs_error - trigger_point) / (viršutinė_bound - trigger_point) |
variklio galia = bazinis greitis * (mažiausia_variklio galia + (1 -y) * (didžiausia_variklio galia - mažiausia_variklio galia)) |
grąžinti variklio energiją |
Kitas: |
grąžinti bazinį greitį * didžiausią_motorinę galią |
paleisti = klaidinga |
ankstesnė klaida = 0 |
bendras laikas = 0,0 |
total_counts = 0 |
o tiesa: |
# jei paspausite mygtuką a, pradėkite sekti |
jei mygtukas_a.paspaudžiamas (): |
paleisti = tiesa |
# bet jei paspaudžiamas mygtukas b, sustabdykite linijos sekimą |
jei mygtukas_b.is_pressed (): |
paleisti = klaidinga |
integralas = 0,0 |
ankstesnė klaida = 0,0 |
display.scroll ('{} - {}'. formatas (bendras laikas, bendras skaičius), uždelsimas = 100, laukimas = klaidinga) |
bendras laikas = 0,0 |
total_counts = 0 |
pixels_off () |
sustabdyti() |
miego_ms (500) |
jei paleisti isTrue: |
# perskaitykite linijos jutiklius |
pradžios_ laikas = erkės_ (() |
# patikrinkite, ar atnaujinome Kp/Kd stiprinimą nuotolinio valdymo pultu |
bandyti: |
Kp, Ki, Kd, trigger_point, min_speed_percent = ustruct.unpack ('fffff', radio.recept_bytes ()) |
set_eyes () |
išskyrusTypeError: |
praeiti |
dešinėn, kairėn = skaitymo jutiklis (LINE_SENSOR, Abi) |
# eilutė yra kairėje, kai padėtis <0,5 |
# eilutė yra dešinėje, kai padėtis> 0,5 |
# eilutė yra viduryje, kai padėtis = 0,5 |
# tai svertinis aritmetinis vidurkis |
bandyti: |
padėtis = dešinė /plūdė (kairė + dešinė) |
išskyrus „ZeroDivisionError“: |
padėtis = 0,5 |
jei pozicija == 0: pozicija = 0,001 |
jei pozicija == 1: pozicija = 0,999 |
# naudokite PD valdiklį |
klaida = padėtis - nustatytoji vertė |
integralas += klaida |
taisymas = Kp * klaida + Ki * integralas + Kd * (klaida - ankstesnė klaida) |
previous_error = klaida |
# apskaičiuokite variklio greitį |
variklio greitis = viršutinis_prilygtas_linijinis_sumažėjimo greitis |
leftMotorSpeed = motor_speed + korekcija |
rightMotorSpeed = motor_speed - korekcija |
# apšvieskite neopikselius, kad parodytumėte, kuria kryptimi turi eiti „GiggleBot“ |
jei run_neopixels isTrueand total_counts %3 == 0: |
i inb '\ x00 / x01 / x02 / x03 / x04 / x05 / x06 / x07 / x08': |
neo = (0, 0, 0) |
i inb '\ x00 / x01 / x02 / x03': |
ifabs (klaida)> error_width_per_pixel * i: |
jei klaida <0: |
neo [centre_pixel + i] = (12, 44, 41) |
Kitas: |
neo [centre_pikselis - i] = (12, 44, 41) |
Kitas: |
procentas = 1- (error_width_per_pixel * i -abs (klaida)) / error_width_per_pixel |
# užsidega dabartinis pikselis |
jei klaida <0: |
# neo [centre_pixel + i] = kortelė (žemėlapis (lambda x: int (x * procentas), turkis)) |
neo [centro_pikselis + i] = (int (12* proc.), int (44* proc.), int (41* proc.)) |
Kitas: |
# neo [centre_pixel - i] = kortelė (žemėlapis (lambda x: int (x * procentas), turkis)) |
neo [centro_pikselis - i] = (int (12* proc.), int (44* proc.), int (41* proc.)) |
pertrauka |
neo.show () |
bandyti: |
# prikabinkite variklius |
jei kairėMotorSpeed> 100: |
leftMotorSpeed = 100 |
rightMotorSpeed = rightMotorSpeed - leftMotorSpeed +100 |
jei rightMotorSpeed> 100: |
rightMotorSpeed = 100 |
leftMotorSpeed = leftMotorSpeed - dešinėMotorSpeed +100 |
jei kairėMotorSpeed <-100: |
leftMotorSpeed = -100 |
jei teisingaiMotorSpeed <-100: |
rightMotorSpeed = -100 |
# įjunkite variklius |
set_speed (leftMotorSpeed, rightMotorSpeed) |
vairuoti () |
# spausdinti ((klaida, variklio greitis)) |
išskyrus: |
# jei patektume į neištaisomą problemą |
praeiti |
# ir palaikykite ciklo dažnį |
pabaigos_ laikas = erkės_ (() |
delay_diff = (pabaigos laikas - pradžios laikas) /1000 |
total_time += delay_diff |
total_counts += 1 |
if1.0/ update_rate - delay_diff> 0: |
miego režimas (1.0/ update_rate - delay_diff) |
peržiūrėti rawgigglebot_line_follower_tuner.py, kurį priglobė „GitHub“❤
4 veiksmas: imtuvo nustatymas (nuotolinis)
Kitas dalykas, kurį turime padaryti, yra blykstės ir scenarijaus perkėlimas į antrąjį BBC mikro: bitą. Šis antrasis „micro: bit“veiks kaip „GiggleBot“nuotolinio valdymo pultas, kuris bus naudojamas šiems parametrams sureguliuoti:
- Kp = proporcingas PID valdiklio padidėjimas.
- Ki = integruotas PID valdiklio pelnas.
- Kd = PID valdiklio išvestinis pelnas.
- trigger_point = taškas, išreikštas procentais tarp minimalaus ir didžiausio „GiggleBot“greičio, kai greitis pradeda mažėti tiesiškai, kol pasiekia minimalų greitį.
- min_speed_percent = mažiausias greitis, išreikštas didžiausio greičio procentais.
Kiti 2 likę kintamieji, kuriuos galima sureguliuoti, yra tiesiogiai užkoduoti „GiggleBot“esančiame scenarijuje: atnaujinimo_dalykas ir bazinis greitis, kuris nurodo didžiausią greitį. Kaip aprašyta dokumentacijoje, didžiausias greitis, kurį galima nustatyti „GiggleBot“, yra 100, o tai taip pat yra numatytoji mūsų „GiggleBot“vertė.
Pastaba: šiame scenarijuje gali nebūti tarpų ir atrodo, kad tai įvyko dėl tam tikrų problemų rodant „GitHub Gists“. Spustelėkite esmę, kad pateksite į jo „GitHub“puslapį, kuriame galite nukopijuoti ir įklijuoti kodą.
„GiggleBot“nuotolinis PID linijos sekimo imtuvas (reikalinga kita dalis) - xjfls23
iš mikrobitų importo* |
iš utime importuoti sleep_ms |
importuoti radiją |
importo ustruktūra |
# 1 elementas yra Kp padidėjimas |
# 2 elementas yra Ki padidėjimas |
# 3 elementas yra Kd padidėjimas |
# 4 elementas yra trigerio taškas varikliams sumažinti greitį (0 -> 1) |
# 5 elementas yra mažiausias variklių greitis, išreikštas procentais (0 -> 1) |
pelnas = [0,0, 0,0, 0,0, 1,0, 0,0] |
stepSize = 0,1 |
# 0 ir 1 - 1 elementas |
2 ir 3 - 2 elementas |
currentSetting = 0 |
defshowMenu (): |
display.scroll ('{} - {}'. formatas (currentSetting, pelnas [int (currentSetting /2)]), delay = 100, wait = False) |
radio.on () |
showMenu () |
o tiesa: |
atnaujinta = klaidinga |
jei mygtukas_a.paspaudžiamas (): |
currentSetting = (currentSetting +1) % (2*5) |
atnaujinta = tiesa |
jei mygtukas_b.is_pressed (): |
if currentSetting %2 == 0: |
# padidinti pelną, kai dabartinis Nustatymas yra 0 arba 2 arba.. |
ifint (currentSetting /2) [0, 2]: |
pelnas [int (currentSetting /2)] += 10* stepSize |
Kitas: |
pelnas [int (currentSetting /2)] += stepSize |
Kitas: |
# padidinti pelną, kai dabartinis Nustatymas yra 1 arba 3 arba.. |
ifint (currentSetting /2) [0, 2]: |
pelnas [int (currentSetting /2)] -= 10* stepSize |
Kitas: |
pelnas [int (currentSetting /2)] -= stepSize |
radio.send_bytes (ustruct.pack ('fffff', *pelnas)) |
atnaujinta = tiesa |
jei atnaujinama: |
showMenu () |
miego_ms (200) |
peržiūrėti rawgigglebot_line_follower_configurator.py, kurį priglobė „GitHub“❤
5 žingsnis: sureguliuokite „GiggleBot“
Padėkite „GiggleBot“ant takelio, įjunkite ir leiskite jam veikti. Tuo tarpu turėsite nuolat jį grąžinti į takelį ir suderinti naudą/parametrus naudodami kitą BBC mikro: bitą, kurį laikote rankoje.
Norėdami paleisti „GiggleBot“, paspauskite „A“, esantį „GiggleBot“„BBC micro: bit“, ir, norėdami jį sustabdyti ir iš naujo nustatyti būseną, paspauskite mygtuką B.
Nuotoliniame „BBC micro: bit“paspaudus mygtuką A bus peržiūrėta kiekviena jo meniu parinktis, o mygtukas B padidins/sumažins atitinkamą vertę. Tai tarsi laikrodžio nustatymas seno automobilio prietaisų skydelyje. Parinktys yra tokios:
- 0-1 variantai skirti Kp padidėjimui.
- 2–3 variantai yra skirti Ki padidėjimui.
- Kd padidinimui yra 4-5 variantai.
- 6-7 parinktys yra skirtos nustatytam momentui, kai varikliai pradeda lėtėti.
- 8-9 parinktys yra skirtos minimaliam greičiui nustatyti.
Turėkite omenyje, kad lyginiai skaičiai meniu yra skirti atitinkamoms reikšmėms padidinti, o nelyginiams - visiškai priešingai.
Be to, paspaudę „B“mygtuką „GiggleBot“„BBC micro: bit“, savo „Neopixel“sukurtame ekrane pamatysite praėjusių milisekundžių skaičių nuo paskutinio atstatymo ir ciklų, kuriuos robotas atliko, skaičių - galite apskaičiuoti roboto atnaujinimo dažnis.
Galiausiai ir svarbiausia, aš sugalvojau 2 „GiggleBot“derinimus. Vienas iš jų skirtas išjungti „Neopixel“šviesos diodus, o kitas - kai yra kitaip. „Neopixel“šviesos diodai naudojami parodyti, kuria kryptimi klaida susikaupė.
Pirmasis parametrų derinimo rinkinys (išjungus „NeoPixel“šviesos diodus)
- Kp = 32,0
- Ki = 0,5
- Kd = 80,0
- trigger_setpoint = 0,3 (tai yra 30%)
- min_speed_percent = 0,2 (tai yra 20%)
- bazinis greitis = 100 (dar žinomas kaip maksimalus greitis)
- update_rate = 70 (veikia @70 Hz)
Antrasis parametrų derinimo rinkinys (su įjungtais „NeoPixel“šviesos diodais)
- Kp = 25,0
- Ki = 0,5
- Kd = 35,0
- trigger_setpoint = 0,3 (tai yra 30%)
- min_speed_percent = 0,3 (tai yra 30%)
- bazinis greitis = 70 (dar žinomas kaip maksimalus greitis)
- update_rate = 50 (veikia @50Hz)
- Be to, scenarijus, kuris įkeliamas į „GiggleBot“BBC mikro: bitą, turi būti nustatytas kaip kintamasis run_neopixels. Dėl to „NeoPixel“šviesos diodai mirksės taip, kad nurodytų, kuria kryptimi klaida kaupiasi.
6 veiksmas: „GiggleBot“veikia išjungus „NeoPixels“
Tai yra pavyzdys, kaip paleisti „GiggleBot“su 1 derinimo parametrais, rastais ankstesniame žingsnyje. Šiame pavyzdyje „NeoPixel“šviesos diodai yra išjungti.
7 žingsnis: „GiggleBot“veikia įjungus neopikselius
Tai yra pavyzdys, kaip paleisti „GiggleBot“su antruoju derinimo parametrų rinkiniu, rastu 5 veiksme. Šiame pavyzdyje įjungti „NeoPixel“šviesos diodai.
Atkreipkite dėmesį, kaip šiame pavyzdyje „GiggleBot“sunkiau sekti liniją - taip yra todėl, kad „Neopixel“šviesos diodai „valgo“BBC mikro: bitų procesoriaus laiką. Štai kodėl turėjome sumažinti atnaujinimo dažnį nuo 70 iki 50.
Rekomenduojamas:
„HackerBox 0049“: derinimas: 8 žingsniai
„HackerBox 0049“: derinimas: sveikinimai „HackerBox“įsilaužėliams visame pasaulyje! „HackerBox 0049“eksperimentuojame su skaitmeninių mikrovaldiklių sistemų derinimu, konfigūruojame „LOLIN32 ESP-32 WiFi“„Bluetooth“platformą „Arduino IDE“, taikydami „FastLED“animaciją L
„GiggleBot“linijos sekėjas naudojant „Python“: 5 žingsniai
„GiggleBot“linijos sekėjas naudodamas „Python“: Šį kartą „MicroPython“programuojame „Dexter Industries GiggleBot“, kad jis laikytųsi juodos linijos, naudodamas įmontuotą linijos sekimo jutiklį. Kad „GiggleBot“būtų suporuotas su „BBC micro: bit“, kad jis būti tinkamai kontroliuojamas. Jei
Rotacinis derinimas naudojant „Pi TV HAT“: 3 žingsniai
Rotacinis derinimas naudojant „Pi TV“skrybėlę: Šioje instrukcijoje aš jums parodysiu, kaip į skaitmeninę televiziją perkelti analoginį valdymą, naudojant sukamąjį jungiklį, kad būtų galima pakeisti kanalus „Raspberry Pi“varomame senoviniame televizoriuje. TV HAT priedas buvo išleistas neseniai ir man labai patinka konvertuoti
Pagrindinis „Java“derinimas: 9 žingsniai
Pagrindinis „Java“derinimas: Šiame instrukcijų vadove pateikiamas pagrindinis žingsnis po žingsnio tikrinamas „Java“klaidų tvarkymas. Šiame vadove nesuteikiama pagalba nustatant „Java“programavimo programinę įrangą ir tikimasi, kad šią užduotį jau atlikote anksčiau. Dėl geriausio
Automatinis derinimas: 7 žingsniai
Autotune: Bienvenue dans notre projet Autotune! Notre é quipe va vous pr é sender la r é alisation de ce projet. Notre é quipe est compos é e de 3 é l è ves ing é nieurs de Polytech Sorbonne en EISE4 (4 è me ann