Mundarija:
- 1 -qadam: kerakli komponentlar
- 2 -qadam: treklar va muhitni sozlash
- 3 -qadam: GiggleBot -ni sozlash
- 4 -qadam: Tyunerni sozlash (masofadan boshqarish pulti)
- 5 -qadam: GiggleBot -ni sozlash
- 6 -qadam: GiggleBot NeoPixels o'chirilgan holda ishlaydi
- 7 -qadam: GiggleBot Neopixels yoqilgan holda yugurish
Video: GiggleBot liniyasi izdoshlarini sozlash - Kengaytirilgan: 7 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:25
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:
- Micro: bit uchun GiggleBot robot.
- x3 AA batareyalar
- x2 BBC mikro: bitlari - biri GiggleBot uchun, ikkinchisi parametrlarni sozlash uchun masofadan boshqarish pulti vazifasini bajaradi.
- 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
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:
- Kp = PID tekshiruvi uchun mutanosib daromad.
- Ki = PID tekshiruvi uchun ajralmas daromad.
- Kd = PID tekshiruvi uchun hosilaviy daromad.
- trigger_point = GiggleBotning minimal va maksimal tezligi orasidagi foizlarda ifodalangan nuqta, u erda tezlik minimal tezlikka yetguncha chiziqli ravishda kamaya boshlaydi.
- 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 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:
- 0-1 variantlar Kp daromad uchun.
- Ki daromad olish uchun 2-3 variant mavjud.
- Kd daromad olish uchun 4-5 variant.
- Dvigatellar sekinlasha boshlagan vaqt uchun belgilangan nuqtani o'rnatish uchun 6-7 variant mavjud.
- 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)
- Kp = 32.0
- Ki = 0,5
- Kd = 80.0
- trigger_setpoint = 0.3 (bu 30%)
- min_speed_percent = 0,2 (bu 20%)
- base_speed = 100 (maksimal tezlik)
- update_rate = 70 (70Hz da ishlaydi)
Parametrlarni sozlashning ikkinchi to'plami (NeoPixel LEDlari yoniq bo'lsa)
- Kp = 25.0
- Ki = 0,5
- Kd = 35.0
- trigger_setpoint = 0.3 (bu 30%)
- min_speed_percent = 0.3 (bu 30%)
- base_speed = 70 (aka maksimal tezlik)
- update_rate = 50 (50Hz da ishlaydi)
- 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:
Android telefonni zaryadlovchi qurilmasi uchun quvvat liniyasi filtrini loyihalash va qurish: 5 qadam
Android telefon zaryadlovchi qurilmasi uchun quvvat liniyasi filtrini loyihalashtirish va qurish: Men ko'rsatma beraman, men standart USB -ni mini -USB kabeliga qanday ulash, o'rtasiga ajratish va ortiqcha shovqinni kamaytiradigan filtr pallasini o'rnatish. odatiy android quvvat manbai tomonidan ishlab chiqarilgan xash. Menda portativ telefon bor
PID liniyasi izdoshi Atmega328P: 4 qadam
PID liniyasi izdoshi Atmega328P: KIRISh Bu ko'rsatma miyasida ishlaydigan (proportsional-integral-lotin) PID (matematik) boshqaruvi (Atmega328P) bilan samarali va ishonchli chiziq izdoshini yaratishga qaratilgan
Oddiy DTMF (ohang) telefon liniyasi dekoderini qanday qilish kerak: 3 qadam
Oddiy DTMF (ohangli) telefon liniyasi dekoderini qanday qilish mumkin: Bu DTMF signallarini har qanday telefon liniyasida dekodlash imkonini beradigan oddiy loyiha. Ushbu qo'llanmada biz MT8870D dekoderidan foydalanamiz. Biz oldindan tuzilgan ohang dekoderidan foydalanmoqdamiz, chunki, ishoning, buni orqa tomondan og'riq
GoPiGo3 liniyasi izdoshi: 8 qadam
GoPiGo3 liniyasi izdoshi: Ushbu darslikda biz chiziq izdoshini olamiz va uni qora chiziq bo'ylab harakatlanishi uchun GoPiGo3 -da ishlatamiz
Python yordamida GiggleBot liniyasi izdoshi: 5 qadam
Python yordamida GiggleBot chizig'ining izdoshi: Bu safar biz MicroPython-da Dexter Industries GiggleBot-da qora chiziqni uning o'rnatilgan izdoshi sensori yordamida kuzatamiz. GiggleBot-ni BBC mikro: bit bilan bog'lash kerak. tegishli ravishda nazorat qilinadi. Agar