Mündəricat:

Python istifadə edərək GiggleBot Xətti İzləyicisi: 5 addım
Python istifadə edərək GiggleBot Xətti İzləyicisi: 5 addım

Video: Python istifadə edərək GiggleBot Xətti İzləyicisi: 5 addım

Video: Python istifadə edərək GiggleBot Xətti İzləyicisi: 5 addım
Video: OZUNET Python Dersleri #7: Tapşırıq - Python necə işləyir? 2024, Noyabr
Anonim
Python istifadə edərək GiggleBot Xətti İzləyicisi
Python istifadə edərək GiggleBot Xətti İzləyicisi
Python istifadə edərək GiggleBot Xətti İzləyicisi
Python istifadə edərək GiggleBot Xətti İzləyicisi
Python istifadə edərək GiggleBot Xətti İzləyicisi
Python istifadə edərək GiggleBot Xətti İzləyicisi

Bu dəfə, MicroPython Dexter Industries GiggleBot-da, daxili xətt izləyicisi sensorundan istifadə edərək qara xətti izləmək üçün proqramlaşdırırıq.

GiggleBotun uyğun bir şəkildə idarə oluna bilməsi üçün BBC mikro: bit ilə birləşdirilməlidir.

Bu dərslik sizin üçün çox inkişaf etmişsə və GiggleBot -un proqramlaşdırılması indiyə qədər çoxdursa, robotun MakeCode -da necə proqramlaşdırılacağını göstərən başlanğıc dərsindən keçə bilərsiniz. Əlaqələndirilmiş dərslik sizi əsaslarla tanış edəcək.

Addım 1: Tələb olunan komponentlər

Tələb olunan komponentlər
Tələb olunan komponentlər

Aşağıdakı hardware komponentləri tələb olunur:

  1. x3 AA batareyaları - mənim vəziyyətimdə ümumilikdə daha aşağı gərginlikli batareyaları istifadə edirəm.
  2. Mikro: bit üçün Dexter Industries GiggleBot robotu.
  3. BBC mikro: bit.

Əlbəttə ki, BBC mikro: bitini proqramlaşdırmaq üçün bir mikro USB kabelinə də ehtiyacınız var - bu kabel ümumiyyətlə BBC micro: bit paketinin içərisindədir və ya hər zaman (Android) smartfonların doldurulması üçün istifadə olunan birindən istifadə edə bilərsiniz.

Micro: GiggleBot -u buradan əldə edin

Addım 2: Parçaları qurun

Parçaları qurun
Parçaları qurun

Bəzi kafelləri çap etdirmək və öz mahnılarınızı tərtib etmək məcburiyyətində qalacaqsınız. Şərtlərimizi təkrarladığınızdan 100% əmin olduğunuz üçün öz plitələrimizdən istifadə edə bilərsiniz. Və ya macəra hiss edirsinizsə, qara lentdən istifadə edərək özünüz edə bilərsiniz. İşdə istifadə etdiyimiz plitələr üçün PDF.

Yuxarıdakı trek aşağıdakı sayda fərqli plitələrdən ibarətdir:

  • 1 nömrəli 12 plitələr.
  • 2 nömrəli 5 plitələr.
  • 5 nömrəli kafel tipli 3 şablon.
  • 6 nömrəli kafel tipli 3 şablon - burada bir əlavə kafel ilə başa çatacaqsınız.

Sonra onları çap edin və kəsin. Onları yuxarıdakı fotoşəkildə olduğu kimi yerləşdirməyə çalışın və yolun sağ üst tərəfində 2 plitənin bir -biri ilə üst -üstə düşməsi lazım olduğunu unutmayın - səhv bir şey etdiyinizi düşünürsünüzsə bu gözlənilir.

Addım 3: Ətraf mühitin qurulması

Ətraf mühitin qurulması
Ətraf mühitin qurulması

MicroPython -da BBC micro: bit proqramlaşdıra bilməyiniz üçün bunun üçün bir redaktor (Mu Redaktor) qurmalı və GiggleBot MicroPython İşləmə müddətini iş vaxtı olaraq təyin etməlisiniz. Bunun üçün bu səhifədəki təlimatları izləməlisiniz. Bu andan etibarən, iş vaxtının v0.4.0 versiyası istifadə olunur.

Addım 4: GiggleBot proqramlaşdırılması

Başa düşməzdən əvvəl, GiggleBot MicroPython iş vaxtı BBC micro: bit və digər kitabxanalar üçün GiggleBot və digər Dexter Industries Sensorlarını dəstəkləmək üçün klassik iş vaxtını ehtiva edir.

Qurduqdan sonra Mu redaktorunda aşağıdakı skripti açın və Flash düyməsini basın. Bu, GiggleBot MicroPython Runtime və yeni açdığınız skriptini BBC micro: bit -ə yandıracaq. Ssenari də aşağıda göstərilmişdir.

Yanıp sönmə prosesi başa çatdıqdan sonra, BBC micro: bit -i GiggleBot -a taxtanın neopikselləri irəli baxaraq yığın, yola qoyun və yandırın.

Skriptdə PID və digər 2 sabitin (sürət təyin nöqtəsi və minimum sürət sabitləri) artıq qurulduğuna diqqət yetirin.

Qeyd: Aşağıdakı skriptdə boş yerlər ola bilər və bu, GitHub Gists -in göstərilməsindəki bəzi problemlərlə əlaqəli görünür. Sizi kodu kopyalayıb yapışdıra biləcəyiniz GitHub səhifəsinə aparmaq üçün mahiyyəti vurun.

GiggleBot PID Line Follower - NeoPixels ilə tənzimlənmişdir

microbit idxalından*
gigglebot idxalından*
utime import_su_ms, ticks_us
idxal idarəsi
# GB neopikselləri işə salın
neo = başlanğıc ()
# zamanlama
update_rate = 50
# qazanc/sabit (batareya gərginliyinin 4,0 volt civarında olduğunu nəzərə alsaq)
Kp = 25.0
Ki = 0.5
Kd = 35.0
trigger_point = 0.3
min_speed_percent = 0.3
əsas_sürət = 70
təyin nöqtəsi = 0.5
last_position = setpoint
inteqral = 0.0
run_neopixels = Doğrudur
center_pixel = 5# təbəssümün mərkəzi pikselinin GB -də yerləşdiyi yer
# turkuaz = tuple (xəritə (lambda x: int (x / 5), (64, 224, 208))) # neopixel ilə səhv çəkmək üçün istifadə ediləcək rəng
# turkuaz = (12, 44, 41) # tam olaraq yuxarıdakı firuzə bunun üzərində şərh etdi
error_width_per_pixel = 0.5/3# maksimum səhv, hər bir neopiksel arasındakı seqmentlərin sayına bölünür
defupper_bound_linear_speed_reducer (abs_error, trigger_point, üst_bağlı, ən kiçik_motor_gücü, ən yüksək_motor_gücü):
qlobal baza sürəti
əgər abs_error> = trigger_point:
# x0 = 0.0
# y0 = 0.0
# x1 = yuxarı_bağlı - tətik nöqtəsi
# y1 = 1.0
# x = abs_error - tətik nöqtəsi
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
# eyni ilə
y = (abs_error - tətik nöqtəsi) / (yuxarı_bağlı - tetikleyici_ nöqtə)
motor_gücü = baza sürəti * (ən kiçik_motor_gücü + (1- y) * (ən yüksək_motor_ gücü - ən kiçik_motor_ gücü))
motor gücünü qaytarın
başqa:
qayıt baza sürəti * ən yüksək_motor_gücü
run = Yanlış
əvvəlki_xəta = 0
whileTrue:
# a düyməsinə basıldıqda izləməyə başlayın
əgər button_a.is_pressed ():
run = Doğru
# amma b düyməsinə basıldıqda xətt izləyicisini dayandırın
əgər button_b.is_pressed ():
run = Yanlış
inteqral = 0.0
əvvəlki_xəta = 0.0
pixel_off ()
dayan ()
yuxu_ms (500)
run isTrue olarsa:
# xətt sensorlarını oxuyun
start_time = ticks_us ()
sağ, sol = oxumaq_sensoru (LINE_SENSOR, İKİSİ)
mövqe <0.5 olduqda # xətt soldadır
mövqe> 0,5 olduqda # xətt sağdadır
mövqe = 0.5 olduqda # xətt ortadadır
# ağırlıqlı arifmetik ortalamadır
cəhd edin:
mövqe = sağ /üzmək (sol + sağ)
ZeroDivisionError istisna olmaqla:
mövqe = 0.5
# aralıq [0, 1] olmalı və [0, 1] deyil
mövqe == 0 olarsa: mövqe = 0.001
mövqe == 1 olarsa: mövqe = 0.999
# bir PD nəzarətçisindən istifadə edin
səhv = mövqe - təyin olunan nöqtə
inteqral += səhv
düzəliş = Kp * xətası + Ki * integral + Kd * (səhv - əvvəlki_hata)
əvvəlki_xəta = səhv
# motor sürətini hesablayın
motor_sürəti = yuxarı_bağlı_xətti_sürət_ötürücü (abs (səhv), təyinat nöqtəsi * tətik nöqtəsi, təyin nöqtəsi, min_sürət_fərdi, 1.0)
leftMotorSpeed = motor_sürəti + düzəliş
rightMotorSpeed = motor_sürəti - düzəliş
# verilən xətaya görə neopikselləri işıqlandırın
əgər run_neopixelsTrueand total_counts %3 == 0 olarsa:
i inb '\ x00 / x01 / x02 / x03 / x04 / x05 / x06 / x07 / x08' üçün:
neo = (0, 0, 0)
i inb '\ x00 / x01 / x02 / x03' üçün:
ifabs (səhv)> error_width_per_pixel * i:
səhv <0:
# neo [center_pixel + i] = firuzəyi
neo [center_pixel + i] = (12, 44, 41)
başqa:
# neo [center_pixel - i] = firuzəyi
neo [center_pixel + i] = (12, 44, 41)
başqa:
faiz = 1- (error_width_per_pixel * i -abs (error)) / error_width_per_pixel
# cari pikseli işıqlandırın
səhv <0:
# neo [center_pixel + i] = tuple (xəritə (lambda x: int (x * faiz), firuzə))
neo [center_pixel + i] = (int (64* faiz /5), int (224* faiz /5), int (208* faiz /5))
başqa:
# neo [center_pixel - i] = tuple (xəritə (lambda x: int (x * faiz), firuzə))
neo [center_pixel - i] = (int (64* faiz /5), int (224* faiz /5), int (208* faiz /5))
fasilə
neo.show ()
cəhd edin:
# motor sürətini kəsin
solMotorSpeed> 100:
solMotorSpeed = 100
rightMotorSpeed = sağMotorSpeed - solMotorSpeed +100
sağMotorSpeed> 100:
sağMotorSpeed = 100
leftMotorSpeed = leftMotorSpeed - sağMotorSpeed +100
solMotorSpeed <-100:
solMotorSpeed = -100
sağMotorSpeed <-100:
sağMotorSpeed = -100
# motorları işə salın
set_speed (solMotorSpeed, sağMotorSpeed)
sürmək ()
# çap ((səhv, motor sürəti))
istisna olmaqla:
# həll olunmayan bir problemlə üzləşsək
keçmək
# və döngə tezliyini qoruyun
end_time = ticks_us ()
gecikmə_diff = (bitmə vaxtı - başlanğıc_vaxt) /1000
if1000.0/ update_rate - delay_diff> 0:
yuxu (1000.0/ update_rate - delay_diff)

GitHub tərəfindən ❤ ilə ev sahibliyi edən rawgigglebot_tuned_line_follower.py -yə baxın

Addım 5: Çalışmasına icazə verin

BBC mikro -da 2 düymə var: bit: A düyməsi və B düyməsi:

  • A düyməsini basmaq GiggleBotu xətti izləməyə qoyur (əgər varsa).
  • B düyməsini basmaq GiggleBotu dayandırır və yenidən istifadə etmək üçün hər şeyi sıfırlayır.

GiggleBotu bir xətti izləyərkən qaldırmamaq və sonra yenidən taxmaq tövsiyə olunur, çünki hesablama xətası robotun marşrutunu yığa və tamamilə poza bilər. Qaldırmaq istəyirsinizsə, B düyməsini basın və sonra geri qoyduğunuzda yenidən A düyməsini basın.

Tövsiyə: