Мазмуну:

GiggleBot Line Follower жөндөө - Өркүндөтүлгөн: 7 кадам
GiggleBot Line Follower жөндөө - Өркүндөтүлгөн: 7 кадам

Video: GiggleBot Line Follower жөндөө - Өркүндөтүлгөн: 7 кадам

Video: GiggleBot Line Follower жөндөө - Өркүндөтүлгөн: 7 кадам
Video: НОВИНКА!!! Радиоприемник TECSUN PL320 #tecsun 2024, Ноябрь
Anonim
GiggleBot Line Follower жөндөө - Advanced
GiggleBot Line Follower жөндөө - Advanced

Бул өтө кыска көрсөтмөлөрдө сиз өзүңүздүн GiggleBotту кара сызыкты ээрчиңиз. Бул башка окуу куралы GiggleBot Line Followerде, биз ошол сценарий боюнча иштөө үчүн тюнинг баалуулуктарын катуу коддогонбуз. Сиз башка кирешелер менен келип, аны жакшы алып барууну каалашыңыз мүмкүн.

Бул үйрөткүчтө биз сизге ар кандай Би -Би -Си микро: биттерине жүктөлүүчү 2 сценарийди көрсөтүп жатабыз, алардын бири GiggleBotко, экинчиси менен бирге, 2 баскыч менюдан өтүп, башкача жөнгө салуу үчүн колдонулат. параметрлер. Бул жаңыртылган параметрлерди жөнөтүү радио аркылуу жүргүзүлөт.

1 -кадам: Керектүү компоненттер

Сизге төмөнкүлөр керек болот:

  1. Micro: bit үчүн GiggleBot роботу.
  2. x3 AA батареялары
  3. x2 Би -Би -Си микро: биттери - бири GiggleBot үчүн, экинчиси параметрлерди жөндөө үчүн алыстан башкаруучу катары.
  4. Би -Би -Си микро: бит үчүн батарейка - Би -Би -Си микро: бит пакетине кирген сыяктуу.

BBC micro: GiggleBot роботун бул жерден алыңыз

2 -кадам: Тректерди жана Айлана -чөйрөнү орнотуу

Тректерди жана чөйрөнү орнотуу
Тректерди жана чөйрөнү орнотуу
Тректерди жана чөйрөнү орнотуу
Тректерди жана чөйрөнү орнотуу

Сиз ошондой эле тректериңизди курушуңуз керек (плиткаларды жүктөп алуу, басып чыгаруу, кесүү жана скотч), андан кийин чөйрөнү орнотуу керек (IDE жана иштөө убактысы).

Бул окуу куралы GiggleBot Line Follower аттуу башка окуу куралы менен абдан байланыштуу болгондуктан, жөн эле ошол жакка барып, 2 жана 3 -кадамдарды аткарып, кайра бул жерге келиңиз.

IDEге келсек, сиз Му редакторун колдоно аласыз жана иштөө убактысы үчүн GiggleBot MicroPython Runtime жүктөп алышыңыз керек. Иш убактысын анын документтеринен бул жерден көчүрүп алса болот. Документтердин Баштоо бөлүмүнө өтүңүз жана айлана -чөйрөнү орнотуу боюнча ошол көрсөтмөлөрдү аткарыңыз. Ушул учурга карата, иштөө убактысынын v0.4.0 версиясы колдонулат.

3 -кадам: GiggleBotту орнотуу

GiggleBotко иштөө убактысын күйгүзүүдөн мурун, GiggleBot үчүн керектүү ылдамдыкты жана жаңыртуу ылдамдыгын тандаганыңызды текшериңиз: демейки боюнча ылдамдык 100гө (base_speed өзгөрмөсү) жана жаңыртуу ылдамдыгы 70ке (update_rate өзгөрмөсү) коюлган.

Учурдагы ишке киргизүүнү эске алганда, жетүүгө мүмкүн болгон эң жогорку жаңыртуу ылдамдыгы 70 жана run_neopixels True деп коюлса, анда 50гө гана жетүүгө болот. Ошентип, сиз демейки жаңыртуу ылдамдыгы Би -Би -Си микро: бит кыла ала турган нерсенин четинде деп айта аласыз.

Жөн эле рекорд үчүн, линияны ээрчиген сенсор секундасына 100 жолу жаңыртууларды кайтара алат.

Эскертүү: Төмөнкү скриптте боштуктар жок болушу мүмкүн жана бул GitHub Gistsти көрсөтүүдөгү кандайдыр бир көйгөйдөн улам келип чыккан окшойт. Сизди GitHub баракчасына алып баруу үчүн, маңызын чыкылдатыңыз, анда сиз кодду көчүрүп-чаптай аласыз.

GiggleBot PID Line Follower Tuner (аны тууралоо үчүн алыстан башкарууну талап кылат) - xjfls23

микробиттик импорттон*
gigglebot импортунан*
utime импортунан sleep_ms, ticks_us
радио импорттоо
структураны импорттоо
# радиону жана GB неопикселин баштоо
radio.on ()
нео = init ()
# убакыт
update_rate = 70
# демейки пайда баалуулуктары
Kp = 0.0
Ки = 0.0
Kd = 0.0
белгиленген чек = 0,5
trigger_point = 0.0
min_speed_percent = 0.2
base_speed = 100
last_position = коюлган чек
интеграл = 0.0
run_neopixels = Жалган
center_pixel = 5# мында жылмайуунун борбордук пиксели ГБда жайгашкан
# бирюза = тупле (карта (lambda x: int (x / 5), (64, 224, 208)))) # түс неопикселдер менен ката тартуу үчүн колдонулат
# бирюза = (12, 44, 41) # дал ушул жогорудагы бирюза ушул жерде комментарий берди
error_width_per_pixel = 0.5/3# макс ката ар бир неопикселдин ортосундагы сегменттердин санына бөлүнөт
defupper_bound_linear_speed_reducer (abs_error, trigger_point, top_bound, small_motor_power, жогорку_motor_power):
глобалдык базалык ылдамдык
if abs_error> = trigger_point:
# x0 = 0.0
# y0 = 0.0
# x1 = жогорку_байланыш - trigger_point
# y1 = 1.0
# x = abs_error - trigger_point
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
# окшош
y = (abs_error - trigger_point) / (top_bound - trigger_point)
motor_power = base_speed * (кичинекей_мотор_күч + (1- y) * (эң жогорку_мотор_күч - эң кичине_мотор_күч))
motor_power кайтаруу
башка:
кайтуу base_speed * эң жогорку_мотордук күч
иштетүү = Жалган
previous_error = 0
total_time = 0.0
total_counts = 0
whileTrue:
# эгер кнопка a басылса, анда ээрчүүнү баштаңыз
эгер button_a.is_pressed ():
иштетүү = Чын
# бирок b баскычы басылса, линияны ээрчигенди токтотуңуз
эгер button_b.is_pressed ():
иштетүү = Жалган
интеграл = 0.0
previous_error = 0.0
display.scroll ('{} - {}'. формат (total_time, total_counts), кечигүү = 100, күтүү = False)
total_time = 0.0
total_counts = 0
pixel_off ()
токтотуу ()
_ (500)
эгер иштетүү isTrue:
# линия сенсорлорун окуу
start_time = ticks_us ()
# Kp/Kd кирешелерин алыстан башкаруу пульту менен жаңыртканыбызды текшериңиз
аракет кыл:
Kp, Ki, Kd, trigger_point, min_speed_percent = ustruct.unpack ('fffff', radio.receive_bytes ())
set_eyes ()
exceptTypeError:
өтүү
оң, сол = read_sensor (LINE_SENSOR, BOTH)
<линия <0,5 болгондо сол жакта
позиция> 0,5 болгондо # сап оң жакта
позиция = 0,5 болгондо # сызык ортосунда болот
# бул салмактуу арифметикалык орточо
аракет кыл:
позиция = оңго /калкып жүрүү (солго + оңго)
exceptZeroDivisionError:
орду = 0,5
эгер позиция == 0: позиция = 0,001
эгер позиция == 1: позиция = 0,999
# PD контроллерин колдонуңуз
ката = позиция - белгиленген чек
интеграл += ката
оңдоо = Kp * ката + Ки * интеграл + Kd * (ката - мурунку_ката)
previous_error = ката
# мотор ылдамдыгын эсептөө
motor_speed = yuqori_bound_linear_speed_reducer (abs (ката), setpoint * trigger_point, setpoint, min_speed_percent, 1.0)
leftMotorSpeed = motor_speed + тууралоо
rightMotorSpeed = motor_speed - оңдоо
# GiggleBot кайсы багытка кетиши керек экенин көрсөтүү үчүн неопикселдерди күйгүзүңүз
эгер run_neopixels isTrueand total_counts %3 == 0:
i inb '\ x00 / x01 / x02 / x03 / x04 / x05 / x06 / x07 / x08' үчүн:
нео = (0, 0, 0)
i inb '\ x00 / x01 / x02 / x03' үчүн:
ifabs (ката)> error_width_per_pixel * i:
эгер ката <0:
нео [center_pixel + i] = (12, 44, 41)
башка:
нео [center_pixel - i] = (12, 44, 41)
башка:
пайыз = 1- (error_width_per_pixel * i -abs (ката)) / error_width_per_pixel
# учурдагы пикселди жарык кылыңыз
эгер ката <0:
# нео [борбор_пиксел + i] = тупле (карта (lambda x: int (x * пайыз), бирюза))
нео [борбор_пиксел + i] = (инт (12* пайыз), инт (44* пайыз), инт (41* пайыз))
башка:
# нео [борбор_пиксел - i] = тупле (карта (lambda x: int (x * пайыз), бирюза))
нео [борбор_пиксел - i] = (инт (12* пайыз), инт (44* пайыз), инт (41* пайыз))
тыныгуу
neo.show ()
аракет кыл:
# моторлорду кысыңыз
leftMotorSpeed> 100:
leftMotorSpeed = 100
rightMotorSpeed = rightMotorSpeed - leftMotorSpeed +100
Эгерде rightMotorSpeed> 100:
rightMotorSpeed = 100
leftMotorSpeed = leftMotorSpeed - rightMotorSpeed +100
leftMotorSpeed <-100:
leftMotorSpeed = -100
Эгерде rightMotorSpeed <-100:
rightMotorSpeed = -100
# моторлорду иштетүү
set_speed (leftMotorSpeed, rightMotorSpeed)
айдоо ()
# басып чыгаруу ((ката, мотор ылдамдыгы))
тышкары:
# биз кандайдыр бир чечилбеген маселеге кирип калсак
өтүү
# жана циклдин жыштыгын сактаңыз
end_time = ticks_us ()
delay_diff = (end_time - start_time) /1000
total_time += delay_diff
total_counts += 1
if1.0/ update_rate - delay_diff> 0:
уйку (1.0/ update_rate - delay_diff)

GitHub тарабынан ❤ уюштурулган rawgigglebot_line_follower_tuner.py көрүү

4 -кадам: Тюнерди орнотуу (Алыстан)

Кийинки кылышыбыз керек, иштөө убактысы + скриптин 2 -Би -Би -Си микро: битке чагылдыруу. Бул экинчи micro: bit GiggleBotтун алыстан башкаруучусу катары иштейт, ал төмөнкү параметрлерди тууралоо үчүн колдонулат:

  1. Kp = PID контроллери үчүн пропорционалдуу пайда.
  2. Ки = PID контроллери үчүн интегралдык пайда.
  3. Pd контроллери үчүн Kd = туунду пайда.
  4. trigger_point = GiggleBotтун минималдуу жана максималдуу ылдамдыктарынын ортосундагы пайыз менен туюнтулган чекит, анда ылдамдык минималдуу ылдамдыкка жеткенге чейин сызыктуу түрдө кыскара баштайт.
  5. min_speed_percent = максималдуу ылдамдыктын пайызы менен көрсөтүлгөн минималдуу ылдамдык.

Калган 2 калган өзгөрмөлөр GiggleBotко отурган скриптте түз коддолгон: update_rate жана base_speed, бул максималдуу ылдамдыкты билдирет. Документтерде сүрөттөлгөндөй, GiggleBot үчүн эң жогорку ылдамдык 100, бул биздин GiggleBot үчүн демейки мааниси.

Эскертүү: Төмөнкү скриптте боштуктар жок болушу мүмкүн жана бул GitHub Gistsти көрсөтүүдөгү кандайдыр бир көйгөйдөн улам келип чыккан окшойт. Сизди GitHub баракчасына алып баруу үчүн, маңызын чыкылдатыңыз, анда сиз кодду көчүрүп-чаптай аласыз.

GiggleBot Remote PID Line Follower Tuner (башка бөлүгүн талап кылат) - xjfls23

микробиттик импорттон*
utime импортунан sleep_ms
радио импорттоо
структураны импорттоо
# 1чи элемент - Kp пайдасы
# 2 -элемент - Ki пайдасы
# 3 -элемент - Kd кирешеси
# 4 -элемент -бул моторлордун ылдамдыгын төмөндөтүүчү trigger_point (0 -> 1)
# 5 -элемент -моторлордун минималдуу ылдамдыгы пайыз менен көрсөтүлгөн (0 -> 1)
киреше = [0.0, 0.0, 0.0, 1.0, 0.0]
stepSize = 0.1
1 -элемент үчүн # 0 жана 1
2 -элемент үчүн # 2 жана 3
currentSetting = 0
defshowMenu ():
display.scroll ('{} - {}'. формат (currentSetting, пайда [int (currentSetting /2)])), кечигүү = 100, күтүү = False)
radio.on ()
showMenu ()
whileTrue:
жаңыртылган = Жалган
эгер button_a.is_pressed ():
currentSetting = (currentSetting +1) % (2*5)
жаңыртылган = Чын
эгер button_b.is_pressed ():
эгер currentSetting %2 == 0:
CurrentSetting 0 же 2 же.. болгондо # кирешени жогорулатуу.
ifint (currentSetting /2) [0, 2] ичинде:
кирешелер [int (currentSetting /2)] += 10* stepSize
башка:
кирешелер [int (currentSetting /2)] += stepSize
башка:
CurrentSetting 1 же 3 болгондо # кирешени жогорулатуу.
ifint (currentSetting /2) [0, 2] ичинде:
кирешелер [int (currentSetting /2)] -= 10* stepSize
башка:
кирешелер [int (currentSetting /2)] -= stepSize
radio.send_bytes (ustruct.pack ('fffff', *пайда))
жаңыртылган = Чын
жаңыртылган болсо:
showMenu ()
Sabinik (200)

GitHub тарабынан ❤ уюштурулган rawgigglebot_line_follower_configurator.py көрүү

5 -кадам: GiggleBotту жөндөө

GiggleBotту жөндөө
GiggleBotту жөндөө

GiggleBotту трекке коюңуз, күйгүзүңүз жана иштетиңиз. Ошол эле учурда, сиз аны дайыма трекке коюп, кирешеңизди/параметрлериңизди башка Би -Би -Синин микро: битин колуңузда кармап турушуңуз керек болот.

GiggleBotту баштоо үчүн, GiggleBotтун BBC микро: А баскычын басыңыз жана аны токтотуу үчүн B баскычын басуу абалын баштапкы абалга келтирүү.

Алыскы Би -Би -Си микро: битинде, А баскычын басуу сизди менюдагы ар бир вариантка алып барат жана В баскычы тиешелүү маанини жогорулатат/төмөндөтөт. Бул эски машинанын тактасына саатты коюу сыяктуу. Варианттар мындай:

  1. 0-1 варианттары Kp пайдасы үчүн.
  2. 2-3 вариант Ki пайдасы үчүн.
  3. Kdге ээ болуу үчүн 4-5 вариант бар.
  4. 6-7 варианттар мотору жайлай баштаганда белгиленген чекти коюуга арналган.
  5. Минималдуу ылдамдыкты орнотуу үчүн 8-9 вариант бар.

Унутпаңыз, менюдагы жуп сандар тиешелүү маанилерди жогорулатуу үчүн, ал эми так сан үчүн - тескерисинче.

Ошондой эле, GiggleBotтун BBC микро: битиндеги B баскычын басканда, анын Неопикселден жасалган экранында акыркы калыбына келтирүүдөн бери өткөн миллисекунддардын санын жана робот өткөн циклдердин санын көрөсүз - бул 2 менен сиз эсептей аласыз роботтун жаңыртуу ылдамдыгы.

Акырында жана эң негизгиси, мен GiggleBot үчүн 2 тюнинг ойлоп таптым. Алардын бири Neopixel диоддору өчүрүлгөндө, экинчиси башка учурда. Neopixel LEDлары ката кайсы багытта топтолгонун көрсөтүү үчүн колдонулат.

Параметрлерди жөнгө салуунун 1 -топтому (NeoPixel LED өчүрүлгөн)

  1. Kp = 32.0
  2. Ки = 0.5
  3. Kd = 80.0
  4. trigger_setpoint = 0.3 (бул 30%)
  5. min_speed_percent = 0.2 (бул 20%)
  6. base_speed = 100 (максималдуу ылдамдык)
  7. update_rate = 70 (@70Hzде иштейт)

Параметрлерди жөнгө салуунун 2 -топтому (NeoPixel LEDлери күйүк)

  1. Кп = 25.0
  2. Ки = 0.5
  3. Kd = 35.0
  4. trigger_setpoint = 0.3 (бул 30%)
  5. min_speed_percent = 0.3 (бул 30%)
  6. base_speed = 70 (максималдуу ылдамдык)
  7. update_rate = 50 (50Гцте иштейт)
  8. Ошондой эле, run_neopixels өзгөрмөсү GiggleBotтун BBC микро: битине жүктөлгөн скриптте True деп коюлушу керек. Бул NeoPixel диоддорунун жаркырашына алып келет, алар ката кайсы багытта топтолгонун көрсөтөт.

6 -кадам: GiggleBot NeoPixels өчүрүлгөндө чуркоо

Бул GiggleBotту мурунку кадамда табылган 1 -тюнинг параметрлери менен иштетүүнүн мисалы. Бул мисалда NeoPixel диоддору өчүрүлгөн.

7 -кадам: GiggleBot Neopixels күйгүзүлгөндө чуркоо

Бул 5 -кадамда табылган тюнинг параметрлеринин 2 -топтому менен GiggleBotту иштетүүнүн мисалы. Бул мисалда NeoPixel LED диоддору күйгүзүлгөн.

Бул мисалда GiggleBotтун линиясын ээрчүү кандай кыйын экенин байкаңыз - бул Neopixel LED диоддору BBC микро: битинин CPU убактысын "жеп" жатканынан. Ошондуктан жаңыртуу ылдамдыгын 70тен 50гө түшүрүүбүз керек болчу.

Сунушталууда: