Mundarija:
- 1 -qadam: kerakli komponentlar
- 2 -qadam: treklarni sozlash
- 3 -qadam: Atrof -muhitni sozlash
- 4 -qadam: GiggleBot dasturlash
- 5 -qadam: uni ishga tushirish
Video: Python yordamida GiggleBot liniyasi izdoshi: 5 qadam
2024 Muallif: John Day | [email protected]. Oxirgi o'zgartirilgan: 2024-01-30 13:25
Bu safar biz MicroPython-da Dexter Industries GiggleBot-da o'rnatilgan chiziqli kuzatuvchi sensori yordamida qora chiziqni kuzatib borishni dasturlashtirmoqdamiz.
GiggleBot mos ravishda boshqarilishi uchun BBC mikro: bit bilan bog'lanishi kerak.
Agar bu darslik siz uchun juda rivojlangan bo'lsa va GiggleBot -ni dasturlash hozircha juda ko'p bo'lsa, siz har doim robotni MakeCode -da qanday dasturlash mumkinligini ko'rsatadigan boshlang'ich darsidan o'tishingiz mumkin. Bog'langan o'quv qo'llanma sizga asosiy bilimlarni beradi.
1 -qadam: kerakli komponentlar
Quyidagi apparat komponentlari talab qilinadi:
- x3 AA batareyalari - menimcha, umuman past kuchlanishli qayta zaryadlanuvchi batareyalardan foydalanayapman.
- Micro: bit uchun Dexter Industries GiggleBot roboti.
- BBC mikro: bit.
Albatta, BBC micro: bit dasturlash uchun sizga mikro USB kabeli ham kerak bo'ladi - bu kabel odatda BBC micro: bit paketida bo'ladi yoki siz har doim (Android) smartfonlarini zaryad qilish uchun ishlatishingiz mumkin.
Micro: GiggleBot -ni bu erdan oling
2 -qadam: treklarni sozlash
Siz ba'zi plitkalarni bosib chiqarishingiz va o'z treklaringizni loyihalashingiz kerak bo'ladi. Siz bizning shartlarimizni takrorlayotganingizga 100% ishonch hosil qilish uchun o'z kafellarimizdan foydalanishingiz mumkin. Yoki o'zingizni sarguzashtli his qilsangiz, qora lentani ishlatib, o'zingiz qilishingiz mumkin. Mana biz ishlatgan plitkalar uchun PDF.
Yuqoridagi trek quyidagi plitalardan iborat:
- โ1 turdagi 12 ta plitka.
- โ2 turdagi 5 ta plitka.
- โ5 plitka tipidagi 3 ta shablon.
- 6 -sonli 3 ta plitka shablonlari - bu erda siz bitta qo'shimcha kafelga ega bo'lasiz.
Keyin ularni chop eting va kesib oling. Ularni yuqoridagi rasmdagi kabi joylashtirishga harakat qiling va shuni yodda tutingki, yo'lning o'ng yuqori qismida 2 ta plitka bir -birining ustiga chiqib ketishi kerak - agar siz noto'g'ri ish qilyapsizmi deb o'ylayotgan bo'lsangiz.
3 -qadam: Atrof -muhitni sozlash
Siz MicroPython -da BBC micro: bit dasturlash imkoniyatiga ega bo'lishingiz uchun unga muharrir (Mu muharriri) o'rnatishingiz va GiggleBot MicroPython ish vaqtini uning ish vaqti sifatida belgilashingiz kerak. Buning uchun siz ushbu sahifadagi ko'rsatmalarga amal qilishingiz kerak. Hozirgi vaqtda ish vaqtining v0.4.0 versiyasi ishlatiladi.
4 -qadam: GiggleBot dasturlash
Ishga kirishdan oldin, GiggleBot MicroPython ish vaqti BBC micro: bit va boshqa kutubxonalar uchun GiggleBot va boshqa Dexter Industries sensorlarini qo'llab -quvvatlash uchun klassik ish vaqtini o'z ichiga oladi.
Uni o'rnatgandan so'ng, Mu tahrirlovchisida quyidagi skriptni oching va Flash -ni bosing. Bu GiggleBot MicroPython Runtime -ni va BBC micro: bit -da ochgan skriptni o'chirib qo'yadi. Skript ham quyida ko'rsatilgan.
Yonish jarayoni tugagach, BBC micro: bit -ni GiggleBot -ga taxtaning neopiksellari oldinga qaragan holda joylashtiring, uni yo'lga qo'ying va yoqing.
E'tibor bering, skriptda PID va boshqa 2 ta sobit (tezlikni sozlash nuqtasi va minimal tezlik konstantalari) allaqachon o'rnatilgan.
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 - NeoPixels bilan sozlangan
mikrobit importidan* |
gigglebot importidan* |
utime import dan sleep_ms, ticks_us |
ustruct import |
# GB neopiksellarini ishga tushirish |
neo = boshlang'ich () |
# vaqt |
update_rate = 50 |
# daromad/doimiy (batareya quvvati 4,0 volt atrofida bo'lsa) |
Kp = 25.0 |
Ki = 0,5 |
Kd = 35.0 |
trigger_point = 0.3 |
min_speed_percent = 0.3 |
tayanch_ tezlik = 70 |
belgilangan nuqta = 0,5 |
last_position = belgilangan nuqta |
integral = 0,0 |
run_neopixels = To'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 |
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 |
pixel_off () |
STOP() |
uyqu (500) |
agar run isTrue bo'lsa: |
# chiziqli sensorlarni o'qing |
start_time = ticks_us () |
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 |
# diapazon [0, 1] emas, [0, 1] bo'lishi kerak |
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 |
# berilgan xato bo'yicha neopixellarni yoritadi |
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 [markaz_piksel + i] = turkuaz |
neo [center_pixel + i] = (12, 44, 41) |
boshqa: |
# neo [markaz_piksel - i] = turkuaz |
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 (64* foiz /5), int (224* foiz /5), int (208* foiz /5)) |
boshqa: |
# neo [center_pixel - i] = tuple (xarita (lambda x: int (x * foiz), firuza)) |
neo [center_pixel - i] = (int (64* foiz /5), int (224* foiz /5), int (208* foiz /5)) |
tanaffus |
neo.show () |
harakat qilib ko'ring: |
# vosita tezligini qisqartiring |
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 |
if1000.0/ update_rate - delay_diff> 0: |
uxlash (1000.0/ update_rate - delay_diff) |
rawgigglebot_tuned_line_follower.py faylini GitHub โค tomonidan joylashtirilganini ko'rish
5 -qadam: uni ishga tushirish
BBC mikro -da ikkita tugma mavjud: bit: A tugmasi va B tugmasi:
- A tugmachasini bosish GiggleBot -ni chiziq bo'ylab harakatlanishini belgilaydi (agar mavjud bo'lsa).
- B tugmachasini bosish GiggleBot -ni to'xtatadi va hamma narsani qayta o'rnatadi, shunda siz uni qayta ishlatishingiz mumkin.
GiggleBotni ketma -ket ketayotganda ko'tarmaslik, keyin uni qayta qo'yish tavsiya etiladi, chunki hisoblash xatosi to'planib, robotning yo'nalishini butunlay buzishi mumkin. Agar siz uni ko'tarishni xohlasangiz, B tugmachasini bosing va keyin uni qayta qo'yganingizda A tugmasini yana bosing.
Tavsiya:
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
Arduino Uno va L298N yordamida chiziq izdoshi robot: 5 qadam
Arduino Uno va L298N yordamida Line Follower roboti: Line Flower - bu boshlang'ich elektronika uchun ideal bo'lgan juda oddiy robot
Arduino yordamida oddiy chiziq izdoshi: 5 qadam
Arduino yordamida oddiy chiziq izdoshi: Arduino chizig'ini kuzatuvchi robot Bu darsda biz oq fonda qora chiziqni ta'qib qiladigan va o'z yo'lidagi egri chiziqlarga etib kelganida to'g'ri burilishni amalga oshiradigan robotdan keyingi Arduino liniyasi ishini muhokama qilamiz. Arduino Line Follower Co
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
GiggleBot liniyasi izdoshlarini sozlash - Kengaytirilgan: 7 qadam
GiggleBot chizig'ining izdoshlarini sozlash - Kengaytirilgan: Ushbu qisqa ko'rsatmalarda siz o'zingizning GiggleBot -ni qora chiziqni kuzatib borishga sozlaysiz. Boshqa GiggleBot Line Follower qo'llanmasida biz sozlash ssenariysi bo'yicha ishlash uchun qiymatlarni qattiq kodladik. Siz buni shunday qilishni xohlashingiz mumkin