Mündəricat:

GiggleBot Xətt İzləyicisini tənzimləmək - Ətraflı: 7 addım
GiggleBot Xətt İzləyicisini tənzimləmək - Ətraflı: 7 addım

Video: GiggleBot Xətt İzləyicisini tənzimləmək - Ətraflı: 7 addım

Video: GiggleBot Xətt İzləyicisini tənzimləmək - Ətraflı: 7 addım
Video: Micro:bit-Xətt izləyən 2024, Noyabr
Anonim
GiggleBot Xətt İzləyicisini tənzimləmək - Qabaqcıl
GiggleBot Xətt İzləyicisini tənzimləmək - Qabaqcıl

Bu çox qısa Təlimatlarda, öz GiggleBot -unuzu qara bir xətti izləmək üçün tənzimləyəcəksiniz. Bu digər dərslik GiggleBot Line Follower-da, tənzimləmə dəyərlərini o ssenariyə uyğun işləmək üçün kodlaşdırdıq. Başqa qazanclar əldə edərək daha yaxşı davranmaq istəyə bilərsiniz.

Bu dərslikdə, hər ikisini fərqli BBC mikro -ya yükləyə bilən 2 skript göstəririk: bitlərdən biri GiggleBot -a qoyulur, digəri ilə birlikdə 2 düymə bir menyudan keçmək və fərqli tənzimləmək üçün istifadə olunur. parametrlər. Bu yenilənmiş parametrlərin göndərilməsi radio vasitəsilə həyata keçirilir.

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

Aşağıdakılara ehtiyacınız olacaq:

  1. Micro: bit üçün GiggleBot robotu.
  2. x3 AA Batareyalar
  3. x2 BBC micro: bit - biri GiggleBot üçün, digəri parametrləri tənzimləmək üçün uzaqdan idarə edən.
  4. BBC micro: bit üçün bir batareya, BBC micro: bit paketinin içərisində olan batareyaya bənzəyir.

BBC micro: GiggleBot Robotunu buradan əldə edin

Addım 2: Parçaların və Ətrafın Qurulması

Parçaların və Ətrafın Qurulması
Parçaların və Ətrafın Qurulması
Parçaların və Ətrafın Qurulması
Parçaların və Ətrafın Qurulması

Əslində izlərinizi qurmalısınız (yükləyin, çap edin, kəsin və yapışdırın) və sonra mühiti qurun (IDE və iş vaxtı).

Bu dərslik GiggleBot Line Follower adlı digər dərsliklə çox əlaqəli olduğundan, ora gedin və 2 və 3 -cü addımları izləyin və sonra bura qayıdın.

IDE -yə gəldikdə, Mu redaktorundan istifadə edə bilərsiniz və iş vaxtı üçün GiggleBot MicroPython İşləmə müddətini yükləməlisiniz. İş vaxtını sənədlərindən buradan yükləyə bilərsiniz. Sənədlərin Başlanğıc bölümünə keçin və ətraf mühitin qurulması ilə bağlı təlimatları izləyin. Bu andan etibarən, iş vaxtının v0.4.0 versiyası istifadə olunur.

Addım 3: GiggleBot qurmaq

İş vaxtını GiggleBot -a yandırmadan əvvəl, GiggleBot üçün istədiyiniz sürəti və yeniləmə sürətini seçdiyinizə əmin olun: standart olaraq sürət 100 (base_speed dəyişən) və yeniləmə dərəcəsi 70 (update_rate dəyişən) olaraq təyin olunur.

Mövcud tətbiqetməni nəzərə alsaq, əldə edilə bilən ən yüksək yeniləmə sürəti 70 -dir və run_neopixels True olaraq təyin edildikdə, yalnız 50 -yə çatmaq olar. Beləliklə, bir şəkildə, standart yeniləmə nisbətinin BBC micro: bit -in edə biləcəyinin kənarında olduğunu söyləyə bilərsiniz.

Yalnız qeyd üçün, xətt izləyicisi sensoru saniyədə 100 dəfə yeniləmələri geri qaytara bilər.

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 Tuner (tənzimləmək üçün pult tələb olunur) - xjfls23

microbit idxalından*
gigglebot idxalından*
utime import_su_ms, ticks_us
radio idxal edin
idxal idarəsi
# radio və GB neopikselləri işə salın
radio.on ()
neo = başlanğıc ()
# zamanlama
update_rate = 70
# default mənfəət dəyərləri
Kp = 0.0
Ki = 0.0
Kd = 0.0
təyin nöqtəsi = 0.5
trigger_point = 0.0
min_speed_percent = 0.2
əsas_sürət = 100
last_position = setpoint
inteqral = 0.0
run_neopixels = Yanlış
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
total_time = 0.0
total_counts = 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
display.scroll ('{} - {}'. format (total_time, total_counts), gecikmə = 100, gözləyin = Yanlış)
total_time = 0.0
total_counts = 0
pixel_off ()
dayan ()
yuxu_ms (500)
run isTrue olarsa:
# xətt sensorlarını oxuyun
start_time = ticks_us ()
# Kp/Kd qazanclarını bir pultla yenilədiyimizi yoxlayın
cəhd edin:
Kp, Ki, Kd, trigger_point, min_speed_percent = ustruct.unpack ('fffff', radio.receive_bytes ())
set_eyes ()
istisna olmaqlaTypeError:
keçmək
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
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ş
# GiggleBotun hansı istiqamətə getməsi lazım olduğunu göstərmək üçün neopikselləri yandı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] = (12, 44, 41)
başqa:
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 (12* faiz), int (44* faiz), int (41* faiz))
başqa:
# neo [center_pixel - i] = tuple (xəritə (lambda x: int (x * faiz), firuzə))
neo [center_pixel - i] = (int (12* faiz), int (44* faiz), int (41* faiz))
fasilə
neo.show ()
cəhd edin:
# motorları klipləyin
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
Total_time += gecikmə_diff
total_counts += 1
if1.0/ update_rate - delay_diff> 0:
yuxu (1.0/ update_rate - delay_diff)

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

Addım 4: Tunerin Qurulması (Uzaqdan)

Etməli olduğumuz növbəti iş vaxtı + skriptini 2 -ci BBC mikro: bitinə yandırmaqdır. Bu ikinci micro: bit, aşağıdakı parametrləri tənzimləmək üçün istifadə ediləcək GiggleBot üçün uzaqdan idarəetmə funksiyasını yerinə yetirəcək:

  1. Kp = PID nəzarətçisi üçün mütənasib qazanc.
  2. Ki = PID nəzarətçisi üçün ayrılmaz qazanc.
  3. Kd = PID nəzarətçisi üçün törəmə gəlir.
  4. trigger_point = GiggleBotun minimum sürətinə çatana qədər xətti olaraq azalmağa başladığı minimum və maksimum sürətlər arasındakı faizlərlə ifadə olunan nöqtə.
  5. min_speed_percent = maksimum sürətin faizi ilə ifadə olunan minimum sürət.

Ayarlanabilen digər 2 dəyişən, GiggleBot -un üstündəki skriptdə birbaşa kodlanır: maksimum sürəti ifadə edən update_rate və base_speed. Sənədlərdə göstərildiyi kimi, GiggleBot üçün təyin edilə bilən maksimum sürət 100 -dir, bu da GiggleBotumuz üçün standart dəyərdir.

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 Remote PID Line Follower Tuner (digər hissəni tələb edir) - xjfls23

microbit idxalından*
yuxu_ms idxalından
radio idxal edin
idxal idarəsi
# 1 -ci element Kp qazancdır
# 2 -ci element Ki qazancdır
# 3 -cü element Kd qazancdır
# 4 -cü element, mühərriklərin sürəti aşağı salması üçün tətik nöqtəsidir (0 -> 1)
# 5 -ci element, faizlərlə ifadə olunan motorlar üçün minimum sürətdir (0 -> 1)
qazanc = [0.0, 0.0, 0.0, 1.0, 0.0]
stepSize = 0.1
1 -ci element üçün # 0 və 1
2 -ci element üçün # 2 və 3
currentSetting = 0
defshowMenu ():
display.scroll ('{} - {}'. format (currentSetting, mənfəət [int (currentSetting /2)]), gecikmə = 100, gözləmə = Yanlış)
radio.on ()
showMenu ()
whileTrue:
yeniləndi = Yanlış
əgər button_a.is_pressed ():
currentSetting = (currentSetting +1) % (2*5)
yeniləndi = Doğrudur
əgər button_b.is_pressed ():
əgər cari Ayar %2 == 0:
Cari Ayar 0 və ya 2 olduqda # qazancı artırın.
ifint (currentSetting /2) [0, 2]:
mənfəət [int (currentSetting /2)] += 10* stepSize
başqa:
mənfəət [int (currentSetting /2)] += stepSize
başqa:
cari Ayar 1 və ya 3 olduqda # qazancı artırın.
ifint (currentSetting /2) [0, 2]:
mənfəət [int (currentSetting /2)] -= 10* stepSize
başqa:
mənfəət [int (currentSetting /2)] -= stepSize
radio.send_bytes (ustruct.pack ('fffff', *mənfəət))
yeniləndi = Doğrudur
yenilənirsə:
showMenu ()
yuxu_ms (200)

GitHub tərəfindən ❤ ilə evlənmiş rawgigglebot_line_follower_configurator.py faylına baxın

Addım 5: GiggleBotun tənzimlənməsi

GiggleBotun tənzimlənməsi
GiggleBotun tənzimlənməsi

GiggleBotu yola qoyun, yandırın və işləməsinə icazə verin. Bu arada, onu daim yola salmalı və qazancları/parametrləri digər BBC mikro: əlinizdə tutduğunuz bit ilə tənzimləməlisiniz.

GiggleBot -u işə salmaq üçün GiggleBot -un BBC mikro: bitindəki A düyməsini basın və onu dayandırın və beləliklə B düyməsindəki vəziyyətini sıfırlayın.

Uzaq BBC mikro: bitində A düyməsini basmaq sizi menyusundakı hər bir seçimdən keçirəcək və B düyməsi müvafiq dəyəri artırır/azaldır. Saatı köhnə bir avtomobilin tablosuna qoymaq kimidir. Seçimlər belədir:

  1. 0-1 variantları Kp qazanc üçündür.
  2. Ki qazanmaq üçün 2-3 seçim var.
  3. Kd qazanmaq üçün 4-5 seçim var.
  4. 6-7 variant, mühərriklərin yavaşlamağa başladığı an üçün təyin olunan nöqtəni təyin etmək üçündür.
  5. Minimum sürəti təyin etmək üçün 8-9 seçim var.

Unutmayın ki, menyudakı cüt ədədlər müvafiq dəyərləri artırmaq üçündür və tək ədədlər isə tam əksinədir.

Ayrıca, GiggleBot -un BBC mikro: bitindəki B düyməsini basarkən, Neopixel istehsalı olan ekranda son sıfırlamadan bu yana keçən millisaniyələrin sayını və robotun keçdiyi dövrlərin sayını görəcəksiniz - bu 2 ilə hesablaya bilərsiniz robotun yeniləmə sürəti.

Nəhayət və ən əsası, GiggleBot üçün 2 tuning hazırladım. Onlardan biri Neopixel LED -ləri söndürüldükdə, digəri isə əks halda. Neopixel LED -ləri xətanın hansı istiqamətdə yığıldığını göstərmək üçün istifadə olunur.

Parametrlərin tənzimlənməsinin birinci dəsti (NeoPixel LEDləri söndürüldükdə)

  1. Kp = 32.0
  2. Ki = 0.5
  3. Kd = 80.0
  4. trigger_setpoint = 0.3 (30%-dir)
  5. min_speed_percent = 0.2 (20%-dir)
  6. base_speed = 100 (aka maksimum sürət)
  7. update_rate = 70 (70Hz -də işləyir)

Parametrlərin tənzimlənməsinin 2 -ci dəsti (NeoPixel LEDləri yandırılmış halda)

  1. Kp = 25.0
  2. Ki = 0.5
  3. Kd = 35.0
  4. trigger_setpoint = 0.3 (30%-dir)
  5. min_speed_percent = 0.3 (bu 30%-dir)
  6. base_speed = 70 (aka maksimum sürət)
  7. update_rate = 50 (50Hz -də işləyir)
  8. Ayrıca, dəyişən run_neopixels, GiggleBotun BBC micro: bitinə yüklənən skriptdə True olaraq təyin edilməlidir. Bu, NeoPixel LED -lərini xətanın hansı istiqamətə yığıldığını göstərəcək şəkildə yanıb -söndürəcək.

Addım 6: GiggleBot NeoPixels söndürüldükdə işləyir

Bu, əvvəlki addımda tapılan 1 -ci tənzimləmə parametrləri ilə GiggleBotun işə salınmasının bir nümunəsidir. Bu nümunədə NeoPixel LEDləri söndürülmüşdür.

Addım 7: GiggleBot Neopixels Açıq Qaçaraq

Bu, 5 -ci addımda tapılan 2 -ci tənzimləmə parametrləri ilə GiggleBotun işə salınması nümunəsidir. Bu nümunədə NeoPixel LED -ləri yandırılmışdır.

Bu nümunədə GiggleBotun xətti izləməkdə daha çətin bir vaxt keçirdiyinə diqqət yetirin - bunun səbəbi Neopixel LED -lərinin BBC micro: bit -in CPU vaxtını "yeməsi" dir. Bu səbəbdən yeniləmə sürətini 70 -dən 50 -yə endirməli olduq.

Tövsiyə: