Sisällysluettelo:

GiggleBot -linjan seuraajan viritys - edistynyt: 7 vaihetta
GiggleBot -linjan seuraajan viritys - edistynyt: 7 vaihetta

Video: GiggleBot -linjan seuraajan viritys - edistynyt: 7 vaihetta

Video: GiggleBot -linjan seuraajan viritys - edistynyt: 7 vaihetta
Video: Get Started with GiggleBot and MakeCode 2024, Marraskuu
Anonim
GiggleBot -linjan seuraajan viritys - edistynyt
GiggleBot -linjan seuraajan viritys - edistynyt

Tässä hyvin lyhyessä ohjeessa aiot virittää oman GiggleBotisi seuraamaan mustaa viivaa. Tässä toisessa opetusohjelmassa GiggleBot Line Follower me koodasimme viritysarvot toimimaan tämän skenaarion mukaisesti. Haluat ehkä saada sen käyttäytymään paremmin keksimällä muita etuja.

Tässä opetusohjelmassa näytämme sinulle kaksi komentosarjaa, jotka molemmat voidaan ladata eri BBC -mikro -bitteihin niin, että toinen niistä asetetaan GiggleBotiin ja toisen kanssa, kahta painiketta käytetään menun selaamiseen ja erilaisten virittämiseen. parametrit. Nämä päivitetyt parametrit lähetetään radion kautta.

Vaihe 1: Tarvittavat komponentit

Tarvitset seuraavat:

  1. GiggleBot -robotti micro: bitille.
  2. x3 AA -paristoa
  3. x2 BBC micro: bittiä - toinen GiggleBotille ja toinen kauko -ohjaimena parametrien virittämiseen.
  4. BBC micro: bit -akku - kuten BBC micro: bit -paketti.

Hanki GiggleBot -robotti BBC: n mikro: bitille täältä

Vaihe 2: Jälkien ja ympäristön määrittäminen

Jälkien ja ympäristön määrittäminen
Jälkien ja ympäristön määrittäminen
Jälkien ja ympäristön määrittäminen
Jälkien ja ympäristön määrittäminen

Sinun on myös itse rakennettava raitasi (ladattava, tulostettava, leikattava ja teipattava laatat) ja määritettävä sitten ympäristö (IDE ja ajonaikainen).

Koska tämä opetusohjelma liittyy hyvin tähän muuhun opetusohjelmaan nimeltä GiggleBot Line Follower, mene vain sinne ja seuraa vaiheita 2 ja 3 ja palaa sitten tänne.

IDE: n osalta voit käyttää Mu -editoria ja ajon aikana sinun on ladattava GiggleBot MicroPython Runtime. Ajonaika voidaan ladata sen dokumentaatiosta täältä. Siirry asiakirjojen Aloittaminen -lukuun ja noudata näitä ohjeita ympäristön määrittämisestä. Tästä hetkestä lähtien ajonaikaista versiota v0.4.0 käytetään.

Vaihe 3: GiggleBotin käyttöönotto

Ennen kuin suoritusaika vilkkuu GiggleBotille, varmista, että olet valinnut GiggleBotille haluamasi nopeuden ja päivitysnopeuden: nopeus on oletusarvoisesti 100 (base_speed muuttuja) ja päivitysnopeus 70 (update_rate muuttuja).

Nykyinen toteutus huomioon ottaen suurin saavutettavissa oleva päivitysnopeus on 70 ja jos run_neopixels -asetuksena on True, vain 50 on saavutettavissa. Joten tavallaan voit sanoa, että oletuspäivitysnopeus on aivan BBC micro: bitin kynnyksellä.

Ainoastaan tiedoksi, linjan seurantatunnistin voi palauttaa päivitykset 100 kertaa sekunnissa.

Huomautus: Seuraavassa komentosarjassa saattaa olla tyhjiä välilyöntejä, ja tämä näyttää johtuvan jostakin ongelmasta GitHub Gistsin näyttämisessä. Napsauta ydintä viedäksesi sen GitHub-sivulle, jossa voit kopioida ja liittää koodin.

GiggleBot PID Line -seuranta -viritin (vaatii virittämisen kaukosäätimellä) - xjfls23

mikrobitin tuonnista*
gigglebot -tuonnista*
utime -tuonnista sleep_ms, ticks_us
tuoda radio
tuontirakenne
# alustavat radio- ja GB -neopikselit
radio.on ()
neo = init ()
# ajoitus
update_rate = 70
# oletusarvoa
Kp = 0,0
Ki = 0,0
Kd = 0,0
asetuspiste = 0,5
liipaisupiste = 0,0
min_nopeusprosentti = 0,2
perusnopeus = 100
last_position = asetusarvo
integraali = 0,0
run_neopixels = Väärä
center_pixel = 5# missä hymyn keskipiste sijaitsee GB: ssä
# turkoosi = tuple (kartta (lambda x: int (x / 5), (64, 224, 208))) # väri, jota käytetään virheen piirtämiseen neopikseleillä
# turkoosi = (12, 44, 41) # joka on täsmälleen yllä oleva turkoosi, joka kommentoitiin edellä
error_width_per_pixel = 0.5/3# max virhe jaettuna kunkin neopikselin välisten segmenttien määrällä
defupper_bound_linear_speed_reducer (abs_error, trigger_point, ylä_raja, pienin_moottorin teho, suurin_moottorin_teho):
globaali perusnopeus
jos abs_error> = trigger_point:
# x0 = 0,0
# y0 = 0,0
# x1 = yläraja - liipaisupiste
# y1 = 1,0
# x = abs_error - trigger_point
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
# sama kuin
y = (abs_error - trigger_point) / (ylä_raja - trigger_point)
moottorin_teho = perusnopeus * (pienin_moottorin_teho + (1- y) * (suurin_moottorin_teho - pienin_moottorin_teho))
paluu moottorin_teho
muu:
paluu base_speed * suurin_moottorin_teho
run = epätosi
edellinen_virhe = 0
kokonaisaika = 0,0
total_counts = 0
Vaikka totta:
# jos painiketta a painetaan, aloita seuranta
jos button_a.is_pressed ():
ajaa = totta
# mutta jos painiketta b painetaan, pysäytä linjan seuraaja
jos button_b.is_pressed ():
run = epätosi
integraali = 0,0
edellinen_virhe = 0,0
display.scroll ('{} - {}'. muoto (yhteensä_aika, kokonaislukumäärä), viive = 100, odota = epätosi)
kokonaisaika = 0,0
total_counts = 0
pixels_off ()
lopettaa()
uni_ms (500)
jos suoritus on tosi:
# lue linja -anturit
start_time = ticks_us ()
# Tarkista, olemmeko päivittäneet Kp/Kd -vahvistukset kaukosäätimellä
yrittää:
Kp, Ki, Kd, trigger_point, min_speed_percent = ustruct.unpack ('fffff', radio.recept_bytes ())
set_eyes ()
paitsiTyyppiVirhe:
kulkea
oikea, vasen = luku_anturi (LINE_SENSOR, MOTH)
# viiva on vasemmalla, kun asento <0,5
# viiva on oikealla, kun sijainti> 0,5
# viiva on keskellä, kun asema = 0,5
# se on painotettu aritmeettinen keskiarvo
yrittää:
sijainti = oikea /kelluva (vasen + oikea)
paitsi ZeroDivisionError:
sijainti = 0,5
jos sijainti == 0: sijainti = 0,001
jos sijainti == 1: sijainti = 0,999
# Käytä PD -ohjainta
virhe = sijainti - asetusarvo
integraali += virhe
korjaus = Kp * virhe + Ki * integraali + Kd * (virhe - edellinen_virhe)
edellinen_virhe = virhe
# laskea moottorin nopeudet
moottorin_nopeus = ylempi_rajainen_linja_nopeuden pienennys (abs (virhe), asetuspiste * liipaisupiste, asetuspiste, min_nopeusprosentti, 1.0)
leftMotorSpeed = moottorin_nopeus + korjaus
rightMotorSpeed = moottorin_nopeus - korjaus
# sytytä neopikselit näyttääksesi mihin suuntaan GiggleBotin on mentävä
jos 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 (virhe)> error_width_per_pixel * i:
jos virhe <0:
neo [center_pixel + i] = (12, 44, 41)
muu:
neo [center_pixel - i] = (12, 44, 41)
muu:
prosenttia = 1- (error_width_per_pixel * i -abs (error)) / error_width_per_pixel
# sytyttää nykyisen pikselin
jos virhe <0:
# neo [center_pixel + i] = tuple (kartta (lambda x: int (x * prosenttiosuus), turkoosi))
neo [center_pixel + i] = (int (12* prosenttia), int (44* prosenttia), int (41* prosenttia))
muu:
# neo [center_pixel - i] = tuple (kartta (lambda x: int (x * prosenttiosuus), turkoosi))
neo [center_pixel - i] = (int (12* prosenttia), int (44* prosenttia), int (41* prosenttia))
tauko
neo.show ()
yrittää:
# leikkaa moottorit
jos vasenMoottorin nopeus> 100:
leftMotorSpeed = 100
rightMotorSpeed = rightMotorSpeed - leftMotorSpeed +100
jos oikeaMotorSpeed> 100:
rightMotorSpeed = 100
leftMotorSpeed = leftMotorSpeed - rightMotorSpeed +100
jos vasenMoottorin nopeus <-100:
leftMotorSpeed = -100
jos oikeaMotorSpeed <-100:
rightMotorSpeed = -100
# käynnistä moottorit
set_speed (leftMotorSpeed, rightMotorSpeed)
ajaa()
# print ((virhe, moottorin_nopeus))
paitsi:
# jos joudumme korjaamattomaan ongelmaan
kulkea
# ja säilytä silmukan taajuus
end_time = ticks_us ()
delay_diff = (päättymisaika - alkamisaika) /1000
total_time += delay_diff
total_counts += 1
if1.0/ update_rate - delay_diff> 0:
lepotila (1.0/ päivitysnopeus - viiveen_ero)

katso rawgigglebot_line_follower_tuner.py, jota ylläpitää GitHub ❤

Vaihe 4: Virittimen asentaminen (etä)

Seuraavaksi meidän on tehtävä flash -ajonaikainen skripti toiselle BBC: n mikro: bitille. Tämä toinen mikro: bitti toimii GiggleBotin kaukosäätimenä, jota käytetään seuraavien parametrien virittämiseen:

  1. Kp = suhteellinen vahvistus PID -säätimelle.
  2. Ki = kiinteä vahvistus PID -säätimelle.
  3. Kd = PID -säätimen johdannaisvahvistus.
  4. trigger_point = GiggleBotin minimi- ja maksiminopeuksien välinen prosentteina ilmaistu piste, jossa nopeus alkaa pienentyä lineaarisesti, kunnes se saavuttaa miniminopeuden.
  5. min_speed_percent = miniminopeus prosentteina enimmäisnopeudesta.

Muut kaksi muuta säädettävää muuttujaa, jotka voidaan virittää, koodataan suoraan GiggleBot -komentosarjassa: päivitysnopeus ja perusnopeus, joka edustaa suurinta nopeutta. Kuten asiakirjoissa on kuvattu, GiggleBotille asetettava enimmäisnopeus on 100, mikä on myös GiggleBotin oletusarvo.

Huomautus: Seuraavassa komentosarjassa saattaa olla tyhjiä välilyöntejä, ja tämä näyttää johtuvan jostakin ongelmasta GitHub Gistsin näyttämisessä. Napsauta ydintä viedäksesi sen GitHub-sivulle, jossa voit kopioida ja liittää koodin.

GiggleBot Remote PID Line -seuranta -viritin (vaatii toisen osan) - xjfls23

mikrobitin tuonnista*
utime -tuonnista sleep_ms
tuoda radio
tuontirakenne
# Ensimmäinen elementti on Kp -vahvistus
# Toinen elementti on Ki -vahvistus
# Kolmas elementti on Kd -vahvistus
# Neljäs elementti on moottorin liipaisupiste, joka laskee nopeutta (0 -> 1)
Viides elementti on moottorien miniminopeus prosentteina ilmaistuna (0 -> 1)
voitot = [0,0, 0,0, 0,0, 1,0, 0,0]
stepSize = 0,1
# 0 ja 1 1. elementille
# 2 ja 3 2. elementille
currentSetting = 0
defshowMenu ():
display.scroll ('{} - {}'. muoto (currentSetting, voitot [int (currentSetting /2)]), delay = 100, wait = False)
radio.on ()
showMenu ()
Vaikka totta:
päivitetty = väärä
jos button_a.is_pressed ():
currentSetting = (currentSetting +1) % (2*5)
päivitetty = Totta
jos button_b.is_pressed ():
if currentSetting %2 == 0:
# lisää vahvistusta, kun nykyinen Asetus on 0 tai 2 tai..
ifint (currentSetting /2) kohdassa [0, 2]:
voitot [int (currentSetting /2)] += 10* stepSize
muu:
voitot [int (currentSetting /2)] += stepSize
muu:
# lisää vahvistusta, kun nykyinen Asetus on 1 tai 3 tai..
ifint (currentSetting /2) kohdassa [0, 2]:
voitot [int (currentSetting /2)] -= 10* stepSize
muu:
voitot [int (currentSetting /2)] -= stepSize
radio.send_bytes (ustruct.pack ('fffff', *voitot))
päivitetty = Totta
jos päivitetään:
showMenu ()
uni_ms (200)

katso rawgigglebot_line_follower_configurator.py, jota ylläpitää GitHub ❤

Vaihe 5: GiggleBotin viritys

GiggleBotin viritys
GiggleBotin viritys

Aseta GiggleBot radalle, käynnistä se ja anna sen käydä. Sillä välin sinun on jatkuvasti palautettava se radalle ja säädettävä voitot/parametrit toisella BBC: n mikro: bitillä, jota pidät kädessäsi.

Käynnistä GiggleBot painamalla GiggleBotin BBC micro: bitin painiketta A, pysäyttääksesi sen ja palauttaaksesi sen tilan painamalla painiketta B.

Kaukosäätimen BBC micro: bit -näppäimellä A -painikkeen painaminen vie sinut läpi kaikki valikon vaihtoehdot ja painike B lisää/pienentää vastaavaa arvoa. Se on kuin kellon asettaminen vanhan auton kojelautaan. Vaihtoehdot ovat seuraavat:

  1. 0-1 vaihtoehtoa ovat Kp-vahvistukselle.
  2. 2-3 vaihtoehtoa ovat Ki-vahvistukselle.
  3. 4-5 vaihtoehtoa ovat Kd-vahvistukselle.
  4. 6-7 vaihtoehtoa ovat asetuspisteen asettaminen hetkelle, jolloin moottorit alkavat hidastua.
  5. 8-9 vaihtoehtoa ovat vähimmäisnopeuden asettamiseen.

Muista, että parilliset numerot valikossa ovat vastaavien arvojen lisäämiseksi ja parittomille päinvastoin.

Lisäksi kun painat GiggleBotin BBC micro: bitin painiketta B, näet sen Neopixel -valmistetulla näytöllä viimeisen nollauksen jälkeen kuluneet millisekunnit ja kuinka monta kertaa robotti on käynyt läpi - näillä kahdella voit laskea robotin päivitysnopeus.

Lopuksi ja mikä tärkeintä, olen keksinyt kaksi viritystä GiggleBotille. Toinen niistä on tarkoitettu Neopixel -merkkivalojen sammuttamiseen ja toinen silloin, kun on toisin. Neopixel -merkkivaloja käytetään osoittamaan mihin suuntaan virhe on kertynyt.

Ensimmäinen parametrien viritys (kun NeoPixel -merkkivalot eivät pala)

  1. Kp = 32,0
  2. Ki = 0,5
  3. Kd = 80,0
  4. trigger_setpoint = 0.3 (mikä on 30%)
  5. min_nopeusprosentti = 0,2 (mikä on 20%)
  6. base_speed = 100 (eli suurin nopeus)
  7. update_rate = 70 (käynnissä @70 Hz)

Toinen parametrien viritys (NeoPixel -merkkivalot päällä)

  1. Kp = 25,0
  2. Ki = 0,5
  3. Kd = 35,0
  4. trigger_setpoint = 0.3 (mikä on 30%)
  5. min_nopeusprosentti = 0,3 (mikä on 30%)
  6. base_speed = 70 (eli suurin nopeus)
  7. update_rate = 50 (käynnissä @50 Hz)
  8. Myös muuttujan run_neopixels on asetettava arvoon True siinä komentosarjassa, joka ladataan GiggleBotin BBC -mikrobitille. NeoPixel -merkkivalot vilkkuvat siten, että ne osoittavat mihin suuntaan virhe kertyy.

Vaihe 6: GiggleBot käynnissä, kun NeoPixels on pois päältä

Tämä on esimerkki GiggleBotin käyttämisestä ensimmäisellä viritysparametrilla, jotka löytyivät edellisestä vaiheesta. Tässä esimerkissä NeoPixel -merkkivalot ovat sammuneet.

Vaihe 7: GiggleBot käynnissä, kun neopikselit on kytketty päälle

Tämä on esimerkki GiggleBotin suorittamisesta vaiheessa 5 löydetyn toisen viritysparametrisarjan kanssa. Tässä esimerkissä NeoPixel -merkkivalot ovat päällä.

Huomaa, kuinka tässä esimerkissä GiggleBotilla on vaikeampi seurata linjaa - tämä johtuu siitä, että Neopixel -LEDit "syövät" BBC: n mikro: bitin CPU -aikaa. Siksi meidän piti vähentää päivitysnopeutta 70: stä 50: een.

Suositeltava: