Mundarija:

GiggleBot liniyasi izdoshlarini sozlash - Kengaytirilgan: 7 qadam
GiggleBot liniyasi izdoshlarini sozlash - Kengaytirilgan: 7 qadam

Video: GiggleBot liniyasi izdoshlarini sozlash - Kengaytirilgan: 7 qadam

Video: GiggleBot liniyasi izdoshlarini sozlash - Kengaytirilgan: 7 qadam
Video: GiggleBot Controlled with micro:bit 2024, Noyabr
Anonim
GiggleBot liniyasi izdoshlarini sozlash - Kengaytirilgan
GiggleBot liniyasi izdoshlarini sozlash - Kengaytirilgan

Qisqa ko'rsatmalarda siz o'zingizning GiggleBot -ni qora chiziqdan o'tishga sozlaysiz. Boshqa GiggleBot Line Follower qo'llanmasida biz sozlash ssenariysi bo'yicha ishlash uchun qiymatlarni qattiq kodladik. Siz boshqa yutuqlar bilan o'zingizni yaxshi tutishni xohlashingiz mumkin.

Ushbu qo'llanmada biz sizga BBC -ning har xil mikro -bitlariga yuklanishi mumkin bo'lgan 2 ta skriptni ko'rsatamiz: bittasi GiggleBot -ga joylashtiriladi, ikkinchisi esa menyudan o'tib, boshqasini sozlash uchun ishlatiladi. parametrlar. Ushbu yangilangan parametrlarni yuborish radio orqali amalga oshiriladi.

1 -qadam: kerakli komponentlar

Sizga quyidagilar kerak bo'ladi:

  1. Micro: bit uchun GiggleBot robot.
  2. x3 AA batareyalar
  3. x2 BBC mikro: bitlari - biri GiggleBot uchun, ikkinchisi parametrlarni sozlash uchun masofadan boshqarish pulti vazifasini bajaradi.
  4. BBC micro: bit uchun batareya - BBC micro: bit paketidagi batareyaga o'xshaydi.

BBC micro: GiggleBot robotini bu erda oling

2 -qadam: treklar va muhitni sozlash

Treklar va atrof -muhitni sozlash
Treklar va atrof -muhitni sozlash
Treklar va atrof -muhitni sozlash
Treklar va atrof -muhitni sozlash

Shuningdek, siz treklarni yaratishingiz kerak (plitkalarni yuklab oling, chop eting, kesib oling va lentaga yozing), so'ngra muhitni sozlang (IDE va ish vaqti).

Bu darslik GiggleBot Line Follower nomli boshqa darslik bilan juda bog'liq bo'lgani uchun, u erga boring va 2 va 3 -bosqichlarni bajaring va keyin bu erga qaytib keling.

IDE -ga kelsak, siz Mu muharriridan foydalanishingiz mumkin va ish vaqti uchun MicroPython GiggleBot -ni yuklab olishingiz kerak. Ish vaqtini uning hujjatlaridan bu erda yuklab olish mumkin. Hujjatlar bo'limiga o'ting va atrof -muhitni sozlash bo'yicha ko'rsatmalarga amal qiling. Hozirgi vaqtda ish vaqtining v0.4.0 versiyasi ishlatiladi.

3 -qadam: GiggleBot -ni sozlash

Ish vaqtini GiggleBot -ga yoqishdan oldin, GiggleBot uchun kerakli tezlik va yangilanish tezligini tanlaganingizga ishonch hosil qiling: sukut bo'yicha tezlik 100 (base_speed o'zgaruvchisi) va yangilanish tezligi 70 (update_rate o'zgaruvchisi) ga o'rnatiladi.

Joriy dasturni hisobga olgan holda, erishish mumkin bo'lgan eng yuqori yangilanish tezligi 70 ga teng va agar run_neopixels qiymati "True" ga o'rnatilgan bo'lsa, faqat 50 ga erishish mumkin. Shunday qilib, siz standart yangilanish tezligi BBC micro: bit qila oladigan narsaning chetida deb ayta olasiz.

Faqat rekord uchun, chiziq izdoshi sensori bir soniyada 100 marta yangilanishlarni qaytarishi mumkin.

Eslatma: Quyidagi skriptda bo'sh joylar etishmayotgan bo'lishi mumkin va bu GitHub Gistlarini ko'rsatishda ba'zi muammolarga bog'liq bo'lishi mumkin. Sizni GitHub sahifasiga olib borish uchun mohiyatni bosing, u erda siz kodni nusxa ko'chirishingiz mumkin.

GiggleBot PID liniyasi izdoshi (uni sozlash uchun masofadan boshqarish pulti kerak) - xjfls23

mikrobit importidan*
gigglebot importidan*
utime import dan sleep_ms, ticks_us
radio import qilish
ustruct import
# radio va GB neopiksellarini ishga tushirish
radio.on ()
neo = boshlang'ich ()
# vaqt
update_rate = 70
# standart daromad qiymatlari
Kp = 0,0
Ki = 0,0
Kd = 0,0
belgilangan nuqta = 0,5
trigger_point = 0,0
min_speed_percent = 0,2
tayanch_ tezlik = 100
last_position = belgilangan nuqta
integral = 0,0
run_neopixels = noto'g'ri
center_pixel = 5# bu erda tabassumning markaziy pikseli GBda joylashgan
# firuza = tuple (xarita (lambda x: int (x / 5), (64, 224, 208))) # neopixel bilan xato chizish uchun foydalanish uchun rang
# turkuaz = (12, 44, 41) # aynan yuqoridagi turkuaz bu haqda sharh bergan
error_width_per_pixel = 0.5/3# max xato har bir neopiksel orasidagi segmentlar soniga bo'linadi
defupper_bound_linear_speed_reducer (abs_error, trigger_point, yuqori_bog'li, eng kichik_motor_kuch, eng yuqori_motor_kuch):
global bazaviy tezlik
agar abs_error> = trigger_point:
# x0 = 0,0
# y0 = 0,0
# x1 = yuqori_bog'langan - tetik_ nuqtasi
# y1 = 1.0
# x = abs_error - ishga tushirish nuqtasi
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
# bilan bir xil
y = (abs_error - trigger_point) / (yuqori_bog'langan - trigger_nuqtasi)
vosita kuchi = tayanch tezligi * (eng kichik_motor_kuvvati + (1- y) * (eng yuqori_motor_ kuchi - eng kichik_motor_ kuchi))
motor kuchini qaytaring
boshqa:
qaytish base_speed * eng yuqori_motor_power
ishga tushirish = noto'g'ri
oldingi_xato = 0
jami vaqt = 0,0
total_counts = 0
whileTrue:
# agar a tugmasi bosilsa, ta'qib qilishni boshlang
agar button_a.is_pressed ():
yugurish = To'g'ri
# lekin b tugmasi bosilsa, chiziq izdoshini to'xtating
agar button_b.is_pressed () bo'lsa:
ishga tushirish = noto'g'ri
integral = 0,0
oldingi_xato = 0,0
display.scroll ('{} - {}'. format (total_time, total_counts), kechikish = 100, kutish = False)
jami vaqt = 0,0
total_counts = 0
pixel_off ()
STOP()
uyqu (500)
agar run isTrue bo'lsa:
# chiziqli sensorlarni o'qing
start_time = ticks_us ()
# masofadan boshqarish pulti yordamida Kp/Kd yutuqlarini yangilaganimizni tekshiring
harakat qilib ko'ring:
Kp, Ki, Kd, trigger_point, min_speed_percent = ustruct.unpack ('fffff', radio.receive_bytes ())
set_eyes ()
exceptTypeError:
o'tish
o'ng, chap = o'qish_sensori (LINE_SENSOR, BOTH)
Chiziq chap tomonda, <0.5 pozitsiyasi
pozitsiya> 0,5 bo'lganda # qator o'ngda
pozitsiya = 0,5 bo'lganda # qator o'rtada
# bu o'rtacha arifmetik o'rtacha
harakat qilib ko'ring:
pozitsiya = o'ng /suzish (chap + o'ng)
ZeroDivisionError tashqari:
pozitsiya = 0,5
agar pozitsiya == 0: pozitsiya = 0,001
agar pozitsiya == 1: pozitsiya = 0.999
# PD tekshirgichidan foydalaning
xato = pozitsiya - belgilangan nuqta
integral += xato
tuzatish = Kp * xato + Ki * integral + Kd * (xato - oldingi_xato)
oldingi_xato = xato
# vosita tezligini hisoblash
motor_ tezligi = yuqori_bog'langan_linear_speed_reducer (abs (xato), sozlash nuqtasi * tetik_nuqtasi, sozlash nuqtasi, min_speed_percent, 1.0)
leftMotorSpeed = motor_ tezligi + tuzatish
rightMotorSpeed = motor_speed - tuzatish
# GiggleBot qaysi tomonga ketishi kerakligini ko'rsatish uchun neopiksellarni yoqing
agar run_neopixels isTrueand total_counts %3 == 0 bo'lsa:
i inb '\ x00 / x01 / x02 / x03 / x04 / x05 / x06 / x07 / x08' uchun:
neo = (0, 0, 0)
i inb '\ x00 / x01 / x02 / x03' uchun:
ifabs (xato)> error_width_per_pixel * i:
agar xato <0:
neo [center_pixel + i] = (12, 44, 41)
boshqa:
neo [center_pixel - i] = (12, 44, 41)
boshqa:
foiz = 1- (error_width_per_pixel * i -abs (xato)) / error_width_per_pixel
# joriy pikselni yoqing
agar xato <0:
# neo [center_pixel + i] = tuple (xarita (lambda x: int (x * foiz), firuza))
neo [markaz_piksel + i] = (int (12* foiz), int (44* foiz), int (41* foiz))
boshqa:
# neo [center_pixel - i] = tuple (xarita (lambda x: int (x * foiz), firuza))
neo [center_pixel - i] = (int (12* foiz), int (44* foiz), int (41* foiz))
tanaffus
neo.show ()
harakat qilib ko'ring:
# motorlarni qisib qo'ying
leftMotorSpeed> 100 bo'lsa:
chapMotorSpeed = 100
rightMotorSpeed = rightMotorSpeed - chapMotorSpeed +100
rightMotorSpeed> 100 bo'lsa:
o'ngMotorSpeed = 100
leftMotorSpeed = leftMotorSpeed - o'ngMotorSpeed +100
chapdaMotorSpeed <-100:
chapMotorSpeed = -100
agar rightMotorSpeed <-100:
o'ngMotorSpeed = -100
# motorlarni ishga tushiring
set_speed (chapMotorSpeed, o'ngMotorSpeed)
haydash ()
# chop etish ((xato, motor tezligi))
bundan tashqari:
# hal qilinmaydigan muammoga duch kelsak
o'tish
# va pastadir chastotasini saqlang
end_time = ticks_us ()
delay_diff = (end_time - start_time) /1000
jami vaqt += kechikish_diff
jami_sayt += 1
if1.0/ update_rate - delay_diff> 0:
uxlash (1.0/ update_rate - delay_diff)

rawgigglebot_line_follower_tuner.py ni GitHub tomonidan ❤ bilan joylashtirilganini ko'rish.

4 -qadam: Tyunerni sozlash (masofadan boshqarish pulti)

Biz qilishimiz kerak bo'lgan keyingi narsa - ish vaqti + skriptini 2 -chi BBC mikro: bitiga ko'rsatish. Bu ikkinchi micro: bit quyidagi parametrlarni sozlash uchun ishlatiladigan GiggleBot masofadan boshqarish pulti vazifasini bajaradi:

  1. Kp = PID tekshiruvi uchun mutanosib daromad.
  2. Ki = PID tekshiruvi uchun ajralmas daromad.
  3. Kd = PID tekshiruvi uchun hosilaviy daromad.
  4. trigger_point = GiggleBotning minimal va maksimal tezligi orasidagi foizlarda ifodalangan nuqta, u erda tezlik minimal tezlikka yetguncha chiziqli ravishda kamaya boshlaydi.
  5. min_speed_percent = minimal tezlik maksimal tezlik foizida ifodalanadi.

Qolgan 2 ta o'zgaruvchan parametr GiggleBot -da joylashgan skriptda to'g'ridan -to'g'ri qattiq kodlangan: update_rate va base_speed, bu maksimal tezlikni ifodalaydi. Hujjatlarda tasvirlanganidek, GiggleBot uchun o'rnatiladigan maksimal tezlik 100, bu bizning GiggleBot uchun standart qiymatdir.

Eslatma: Quyidagi skriptda bo'sh joylar etishmayotgan bo'lishi mumkin va bu GitHub Gistlarini ko'rsatishda ba'zi muammolarga bog'liq bo'lishi mumkin. Sizni GitHub sahifasiga olib borish uchun mohiyatni bosing, u erda siz kodni nusxa ko'chirishingiz mumkin.

GiggleBot masofaviy PID liniyasi izdoshlari tyuneri (boshqa qismi kerak) - xjfls23

mikrobit importidan*
uyqu vaqtini import qilishdan
radio import qilish
ustruct import
# 1 -element - Kp daromad
# 2 -element - bu Ki daromad
# 3 -element - bu Kd daromadidir
# 4 -chi element -bu dvigatellarning tezlikni pasaytiradigan tetik nuqtasi (0 -> 1)
# 5 -element -bu dvigatellar uchun minimal tezlik, foizlarda ifodalangan (0 -> 1)
daromad = [0.0, 0.0, 0.0, 1.0, 0.0]
stepSize = 0.1
1 -element uchun # 0 va 1
Ikkinchi element uchun # 2 va 3
currentSetting = 0
defshowMenu ():
display.scroll ('{} - {}'. format (currentSetting, yutuqlar [int (currentSetting /2)])), kechikish = 100, kutish = False)
radio.on ()
showMenu ()
whileTrue:
yangilangan = noto'g'ri
agar button_a.is_pressed ():
currentSetting = (currentSetting +1) % (2*5)
yangilangan = To'g'ri
agar button_b.is_pressed () bo'lsa:
agar currentSetting %2 == 0:
joriy sozlash 0 yoki 2 yoki.. bo'lganda daromadni oshiradi.
ifint (currentSetting /2) [0, 2] da:
daromad [int (currentSetting /2)] += 10* stepSize
boshqa:
yutuqlar [int (currentSetting /2)] += stepSize
boshqa:
joriy sozlash 1 yoki 3 yoki.. bo'lganda daromadni oshiradi.
ifint (currentSetting /2) [0, 2] da:
daromad [int (currentSetting /2)] -= 10* stepSize
boshqa:
yutuqlar [int (currentSetting /2)] -= stepSize
radio.send_bytes (ustruct.pack ('fffff', *yutuqlar))
yangilangan = To'g'ri
yangilangan bo'lsa:
showMenu ()
uyqu (200)

rawgigglebot_line_follower_configurator.py -ni GitHub tomonidan ❤ bilan joylashtirilganini ko'rish.

5 -qadam: GiggleBot -ni sozlash

GiggleBot -ni sozlash
GiggleBot -ni sozlash

GiggleBot -ni trekka qo'ying, uni yoqing va ishga tushishiga ruxsat bering. Bu orada, siz doimo uni yo'lga qo'yishingiz va daromadingizni/parametrlaringizni boshqa BBC mikro: bit bilan sozlashingiz kerak bo'ladi.

GiggleBot -ni ishga tushirish uchun GiggleBot -ning BBC mikro: bitidagi A tugmachasini bosing va uni to'xtating va B holatidagi holatini tiklang.

Bi -bi -sining BBC micro: bit -da A tugmachasini bosish sizni menyuning har bir variantini ko'rib chiqadi va B tugmasi mos keladigan qiymatni oshiradi/kamaytiradi. Bu soatni eski mashinaning boshqaruv paneliga o'rnatishga o'xshaydi. Variantlar quyidagicha:

  1. 0-1 variantlar Kp daromad uchun.
  2. Ki daromad olish uchun 2-3 variant mavjud.
  3. Kd daromad olish uchun 4-5 variant.
  4. Dvigatellar sekinlasha boshlagan vaqt uchun belgilangan nuqtani o'rnatish uchun 6-7 variant mavjud.
  5. Minimal tezlikni sozlash uchun 8-9 variant mavjud.

Shuni yodda tutingki, menyudagi juft raqamlar mos keladigan qiymatlarni oshirish uchun, toq raqamlar esa buning aksi.

Bundan tashqari, GiggleBot -ning BBC mikro: bitidagi B tugmachasini bosganingizda, siz uning Neopikselda ishlab chiqarilgan ekranida oxirgi qayta tiklashdan keyin o'tgan millisekundlar sonini va robot o'tgan tsikllar sonini ko'rasiz - bu 2 yordamida siz hisoblashingiz mumkin. robotning yangilanish tezligi.

Nihoyat va eng muhimi, men GiggleBot uchun 2 ta sozlashni o'ylab topdim. Ulardan biri Neopixel LEDlari o'chirilgan bo'lsa, ikkinchisi aks holda. Neopixel LEDlari xato qaysi yo'nalishda to'planganligini ko'rsatish uchun ishlatiladi.

Parametrlarni sozlashning birinchi to'plami (NeoPixel LEDlari o'chirilgan holda)

  1. Kp = 32.0
  2. Ki = 0,5
  3. Kd = 80.0
  4. trigger_setpoint = 0.3 (bu 30%)
  5. min_speed_percent = 0,2 (bu 20%)
  6. base_speed = 100 (maksimal tezlik)
  7. update_rate = 70 (70Hz da ishlaydi)

Parametrlarni sozlashning ikkinchi to'plami (NeoPixel LEDlari yoniq bo'lsa)

  1. Kp = 25.0
  2. Ki = 0,5
  3. Kd = 35.0
  4. trigger_setpoint = 0.3 (bu 30%)
  5. min_speed_percent = 0.3 (bu 30%)
  6. base_speed = 70 (aka maksimal tezlik)
  7. update_rate = 50 (50Hz da ishlaydi)
  8. Bundan tashqari, run_neopixels o'zgaruvchisi GiggleBot -ning BBC micro: bit -ga yuklanadigan skriptda "True" ga o'rnatilishi kerak. Bu NeoPixel LED -lari shu tarzda yonib ketadiki, ular xato qaysi tomonga to'planishini ko'rsatadi.

6 -qadam: GiggleBot NeoPixels o'chirilgan holda ishlaydi

Bu oldingi qadamda topilgan 1 -sozlash parametrlari bilan GiggleBot -ni ishga tushirishga misol. Bu misolda NeoPixel LEDlari o'chirilgan.

7 -qadam: GiggleBot Neopixels yoqilgan holda yugurish

Bu 5 -qadamda topilgan sozlash parametrlarining 2 -to'plami bilan GiggleBotni ishga tushirishga misol. Bu misolda NeoPixel LEDlari yoqilgan.

E'tibor bering, bu misolda, GiggleBot chizig'ini kuzatib borish qiyinroq kechadi - buning sababi shundaki, Neopixel LEDlari BBC micro: bit protsessorining vaqtini "yeydi". Shuning uchun biz yangilanish tezligini 70 dan 50 gacha pasaytirishga majbur bo'ldik.

Tavsiya: