Съдържание:
- Стъпка 1: Необходими компоненти
- Стъпка 2: Настройване на песни и среда
- Стъпка 3: Настройване на GiggleBot
- Стъпка 4: Настройка на тунера (дистанционно)
- Стъпка 5: Настройване на GiggleBot
- Стъпка 6: GiggleBot работи с изключени NeoPixels
- Стъпка 7: GiggleBot работи с включени неопиксели
Видео: Настройка на GiggleBot Line Follower - Разширени: 7 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:52
В тази много кратка инструкция ще настроите своя собствен GiggleBot да следва черна линия. В този друг урок GiggleBot Line Follower ние кодирахме строго настройващите стойности, за да работят според този сценарий. Може да искате да го накарате да се държи по -добре, като измислите други печалби.
В този урок ние ви показваме 2 скрипта, които могат да се заредят на различни BBC micro: бита, така че един от тях да бъде поставен в GiggleBot, а с другия, двата бутона се използват за преминаване през меню и настройване на различни параметри. Изпращането на тези актуализирани параметри се извършва по радиото.
Стъпка 1: Необходими компоненти
Ще ви трябва следното:
- Робот GiggleBot за micro: bit.
- x3 AA батерии
- x2 BBC micro: bits - единият за GiggleBot, а другият действа като дистанционно за настройка на параметрите.
- Батерия за BBC micro: bit - като тази, която се предлага в пакета BBC micro: bit.
Вземете робота GiggleBot за BBC micro: bit тук
Стъпка 2: Настройване на песни и среда
Вие също трябва да изградите вашите песни (изтегляне, отпечатване, изрязване и ленти) и след това да настроите средата (IDE и време на изпълнение).
Тъй като този урок е много свързан с този друг урок, озаглавен GiggleBot Line Follower, просто отидете там и следвайте стъпки 2 и 3 и след това се върнете тук.
Що се отнася до IDE, можете да използвате редактора Mu и за времето на изпълнение трябва да изтеглите GiggleBot MicroPython Runtime. Времето за изпълнение може да бъде изтеглено от неговата документация тук. Преминете към главата за стартиране на документацията и следвайте тези инструкции за настройка на средата. Към този момент се използва версия v0.4.0 на времето за изпълнение.
Стъпка 3: Настройване на GiggleBot
Преди да преминете времето за изпълнение към GiggleBot, уверете се, че сте избрали желаната от вас скорост и скоростта на актуализация за GiggleBot: по подразбиране скоростта е зададена на 100 (променлива base_speed), а скоростта на актуализация - 70 (update_rate променлива).
Като се има предвид текущата реализация, най -високата скорост на актуализация, която може да бъде постигната, е 70 и ако run_neopixels е зададено на True, тогава само 50 е постижимо. Така че по някакъв начин бихте могли да кажете, че скоростта на актуализиране по подразбиране е точно на ръба на това, което BBC micro: bit може да направи.
Само за запис, сензорът за последовател на линия може да връща актуализации 100 пъти в секунда.
Забележка: В следния скрипт може да липсват интервали и това изглежда се дължи на някакъв проблем при показването на GitHub Gists. Щракнете върху същността, за да ви отведе до страницата на GitHub, където можете да копирате и поставите кода.
GiggleBot PID Line Follower Tuner (изисква дистанционно, за да го настроите) - xjfls23
от внос на microbit* |
от gigglebot import* |
от utime import sleep_ms, ticks_us |
внос на радио |
ustruct за импортиране |
# инициализирайте радио и GB неопиксели |
radio.on () |
neo = init () |
# време |
update_rate = 70 |
# стойности на печалба по подразбиране |
Kp = 0.0 |
Ki = 0.0 |
Kd = 0,0 |
зададена стойност = 0,5 |
trigger_point = 0.0 |
min_speed_percent = 0.2 |
базова_скорост = 100 |
last_position = зададена точка |
интеграл = 0,0 |
run_neopixels = False |
center_pixel = 5# където централният пиксел на усмивката се намира на GB |
# тюркоаз = кортеж (карта (ламбда x: int (x / 5), (64, 224, 208))) # цвят, който да се използва за изчертаване на грешката с неопикселите |
# тюркоаз = (12, 44, 41) # което е точно горното тюркоазено коментирано над това |
error_width_per_pixel = 0.5/3# максимална грешка, разделена на броя сегменти между всеки неопиксел |
defupper_bound_linear_speed_reducer (абсорбция на грешка, тригерна точка, горна граница, най -малка_моторна мощност, най -висока_моторна мощност): |
глобална base_speed |
if abs_error> = trigger_point: |
# x0 = 0,0 |
# y0 = 0,0 |
# x1 = горна_граница - точка на задействане |
# y1 = 1,0 |
# x = abs_error - точка на задействане |
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0) |
# същото като |
y = (abs_error - trigger_point) / (upper_bound - trigger_point) |
мощност на двигателя = базова_скорост * (най -малка_моторна_мощност + (1- y) * (най -висока_моторна_мощност - най -малка_моторна_мощност)) |
връщане на моторната мощност |
иначе: |
връщане на базовата_скорост * най -високата_моторна_мощност |
run = False |
предишна_грешка = 0 |
общо_време = 0.0 |
общо_сметки = 0 |
whileTrue: |
# ако е натиснат бутон а, започнете да следвате |
ако button_a.is_pressed (): |
run = True |
# но ако е натиснат бутон b, спрете последователя на реда |
ако button_b.is_pressed (): |
run = False |
интеграл = 0,0 |
предишна_грешка = 0.0 |
display.scroll ('{} - {}'. формат (total_time, total_counts), delay = 100, wait = False) |
общо_време = 0.0 |
общо_сметки = 0 |
pixels_off () |
Спри се() |
sleep_ms (500) |
ако изпълнението е True: |
# прочетете линейните сензори |
start_time = ticks_us () |
# проверете дали сме актуализирали Kp/Kd печалбите с дистанционно |
опитвам: |
Kp, Ki, Kd, trigger_point, min_speed_percent = ustruct.unpack ('fffff', radio.receive_bytes ()) |
set_eyes () |
с изключение наTypeError: |
пропуск |
надясно, наляво = сензор за четене (LINE_SENSOR, ДВЕТЕ) |
# ред е вляво, когато позиция <0,5 |
# ред е вдясно, когато позиция> 0,5 |
# ред е в средата, когато позиция = 0,5 |
# това е средно претеглена аритметична стойност |
опитвам: |
позиция = дясно /плаващо (ляво + дясно) |
с изключение на ZeroDivisionError: |
позиция = 0,5 |
ако позиция == 0: позиция = 0.001 |
ако позиция == 1: позиция = 0,999 |
# използвайте PD контролер |
грешка = позиция - зададена точка |
интеграл += грешка |
корекция = Kp * грешка + Ki * интеграл + Kd * (грешка - предишна_грешка) |
previous_error = грешка |
# изчислете оборотите на двигателя |
motor_speed = upper_bound_linear_speed_reducer (abs (грешка), зададена точка * тригерна точка, зададена стойност, min_speed_percent, 1.0) |
leftMotorSpeed = скорост на мотора + корекция |
rightMotorSpeed = скорост на мотора - корекция |
# запалете неопикселите, за да покажете в каква посока трябва да върви GiggleBot |
ако run_neopixels еTrueand total_counts %3 == 0: |
за i inb '\ x00 / x01 / x02 / x03 / x04 / x05 / x06 / x07 / x08': |
neo = (0, 0, 0) |
за i inb '\ x00 / x01 / x02 / x03': |
ifabs (грешка)> error_width_per_pixel * i: |
ако грешка <0: |
neo [center_pixel + i] = (12, 44, 41) |
иначе: |
neo [center_pixel - i] = (12, 44, 41) |
иначе: |
процент = 1- (грешка_ширина_на_пиксел * i -abs (грешка)) / грешка_ширина_на_пиксел |
# осветява текущия пиксел |
ако грешка <0: |
# neo [center_pixel + i] = кортеж (карта (ламбда x: int (x * процент), тюркоаз)) |
neo [center_pixel + i] = (int (12* процента), int (44* процента), int (41* процента)) |
иначе: |
# neo [center_pixel - i] = кортеж (карта (ламбда x: int (x * процент), тюркоаз)) |
neo [center_pixel - i] = (int (12* процента), int (44* процента), int (41* процента)) |
прекъсване |
neo.show () |
опитвам: |
# закрепете двигателите |
ако е оставенMotorSpeed> 100: |
leftMotorSpeed = 100 |
rightMotorSpeed = rightMotorSpeed - leftMotorSpeed +100 |
ако rightMotorSpeed> 100: |
rightMotorSpeed = 100 |
leftMotorSpeed = leftMotorSpeed - rightMotorSpeed +100 |
ако е оставенMotorSpeed <-100: |
leftMotorSpeed = -100 |
ако rightMotorSpeed <-100: |
rightMotorSpeed = -100 |
# задействайте двигателите |
set_speed (leftMotorSpeed, rightMotorSpeed) |
задвижване () |
# печат ((грешка, скорост на двигателя)) |
с изключение: |
# в случай, че попаднем в някакъв непоправим проблем |
пропуск |
# и поддържайте честотата на контура |
end_time = ticks_us () |
delay_diff = (end_time - start_time) /1000 |
общо_време += забавяне_диф |
общо_сметки += 1 |
if1.0/ update_rate - delay_diff> 0: |
сън (1.0/ update_rate - delay_diff) |
вижте rawgigglebot_line_follower_tuner.py, хоствано с ❤ от GitHub
Стъпка 4: Настройка на тунера (дистанционно)
Следващото нещо, което трябва да направим, е да прехвърлим скрипта за изпълнение + към втория BBC micro: bit. Този втори micro: bit ще действа като дистанционно към GiggleBot, което ще се използва за настройка на следните параметри:
- Kp = пропорционално усилване за PID контролера.
- Ki = интегрална печалба за PID контролера.
- Kd = деривативно усилване за PID контролера.
- trigger_point = точката, изразена в проценти между минималната и максималната скорост на GiggleBot, където скоростта започва да се намалява линейно, докато достигне минималната скорост.
- min_speed_percent = минималната скорост, изразена в проценти от максималната скорост.
Останалите 2 променливи, които могат да бъдат настроени, са директно кодирани в скрипта, който се намира на GiggleBot: update_rate и base_speed, който представлява максималната скорост. Както е описано в документацията, максималната скорост, която може да бъде зададена за GiggleBot, е 100, което също е стойността по подразбиране за нашия GiggleBot.
Забележка: В следния скрипт може да липсват интервали и това изглежда се дължи на някакъв проблем при показването на GitHub Gists. Щракнете върху същността, за да ви отведе до страницата на GitHub, където можете да копирате и поставите кода.
GiggleBot Remote PID Line Follower Tuner (изисква другата част) - xjfls23
от внос на microbit* |
от utime import sleep_ms |
внос на радио |
ustruct за импортиране |
# 1 -ви елемент е Kp печалбата |
# 2 -ри елемент е усилването на Ki |
# 3 -ият елемент е Kd печалбата |
# 4 -ти елемент е точката на задействане за двигателите да намалят скоростта (0 -> 1) |
# 5 -ти елемент е минималната скорост на двигателите, изразена в проценти (0 -> 1) |
печалби = [0.0, 0.0, 0.0, 1.0, 0.0] |
stepSize = 0,1 |
# 0 и 1 за 1 -ви елемент |
# 2 и 3 за 2 -ри елемент |
currentSetting = 0 |
defshowMenu (): |
display.scroll ('{} - {}'. format (currentSetting, печалби [int (currentSetting /2)]), забавяне = 100, чакане = False) |
radio.on () |
showMenu () |
whileTrue: |
updated = False |
ако 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 () |
sleep_ms (200) |
вижте rawgigglebot_line_follower_configurator.py хоствано с ❤ от GitHub
Стъпка 5: Настройване на GiggleBot
Поставете GiggleBot на пистата, включете го и го оставете да работи. Междувременно ще трябва постоянно да го връщате на пистата и да настройвате печалбите/параметрите с другия BBC micro: bit, който държите в ръката си.
За да стартирате GiggleBot, натиснете бутон A на BBC micro: bit на GiggleBot и за да го спрете и по този начин да нулирате състоянието му, натиснете бутона B.
На дистанционния BBC micro: bit натискането на бутон А ще ви преведе през всяка опция в менюто му, а бутон B увеличава/намалява съответната стойност. Това е все едно да настроите часовника на таблото на стара кола. Опциите са следните:
- Опциите 0-1 са за Kp печалба.
- 2-3 опции са за печалбата Ki.
- 4-5 опции са за Kd печалба.
- 6-7 опции са за задаване на зададената стойност за момента, в който двигателите започнат да се забавят.
- 8-9 опции са за настройка на минималната скорост.
Имайте предвид, че четните числа в менюто са за увеличаване на съответните стойности, а за нечетните е точно обратното.
Също така, когато натиснете бутон B на BBC micro: bit на GiggleBot, ще видите на екрана, направен от Neopixel, броя на изминалите милисекунди от последното нулиране и броя на циклите, през които роботът е преминал - с тези 2 можете да изчислите скоростта на актуализиране на робота.
И накрая и най -важното, измислих 2 настройки за GiggleBot. Единият от тях е за това, когато светодиодите на Neopixel са изключени, а другият е за случаите, когато е друго. Светодиодите Neopixel се използват, за да покажат в коя посока е натрупана грешката.
1 -ви набор от настройки на параметрите (с изключени NeoPixel светодиоди)
- Kp = 32,0
- Ki = 0,5
- Kd = 80,0
- trigger_setpoint = 0,3 (което е 30%)
- min_speed_percent = 0.2 (което е 20%)
- base_speed = 100 (известен още като максимална скорост)
- update_rate = 70 (работи при 70Hz)
2 -ри набор от настройки на параметрите (с включени NeoPixel светодиоди)
- Kp = 25,0
- Ki = 0,5
- Kd = 35,0
- trigger_setpoint = 0,3 (което е 30%)
- min_speed_percent = 0.3 (което е 30%)
- base_speed = 70 (известен още като максимална скорост)
- update_rate = 50 (работи при 50Hz)
- Също така променливата run_neopixels трябва да бъде зададена на True в скрипта, който се зарежда в BBC micro: bit на GiggleBot. Това ще накара светодиодите NeoPixel да мигат по такъв начин, че да показват в коя посока се натрупва грешката.
Стъпка 6: GiggleBot работи с изключени NeoPixels
Това е пример за стартиране на GiggleBot с първите параметри за настройка, намерени в предишната стъпка. В този пример светодиодите на NeoPixel са изключени.
Стъпка 7: GiggleBot работи с включени неопиксели
Това е пример за стартиране на GiggleBot с втория набор от параметри за настройка, намерен в стъпка 5. В този пример са включени светодиодите NeoPixel.
Забележете как в този пример GiggleBot има по -трудно време да следва линията - това е така, защото светодиодите на Neopixel "изяждат" процесорното време на BBC micro: bit. Ето защо трябваше да намалим скоростта на актуализиране от 70 на 50.
Препоръчано:
PID Line Follower Atmega328P: 4 стъпки
PID Line Follower Atmega328P: ВЪВЕДЕНИЕ Тази инструкция е за създаване на ефективен и надежден Line Follower с PID (пропорционално-интегрално-производно) управление (математическо), работещо в мозъка му (Atmega328P). Линейният последовател е автономен робот, който следва или
Arduino Line Follower Wallrides Класна бяла дъска: 8 стъпки (със снимки)
Arduino Line Follower Wallrides Бяла дъска за класната стая: Следването на линията на земята е твърде скучно! Опитахме се да погледнем под различен ъгъл на последователите на линиите и да ги пренесем в друга равнина - към училищната дъска. Вижте какво се получи от това
Част 3: GPIO: ARM Монтаж: Line Follower: TI-RSLK: 6 стъпки
Част 3: GPIO: ARM Монтаж: Line Follower: TI-RSLK: Здравейте. Това е следващата вноска, в която продължаваме да използваме ARM монтаж (вместо език от по-високо ниво). Вдъхновението за този Instructable е Lab 6 от Комплектът за обучение по роботика на Texas Instruments, или TI-RSLK. Ще използваме микрофона
GoPiGo3 Line Follower: 8 стъпки
GoPiGo3 Line Follower: В този урок ние вземаме последовател на линия и го използваме на GoPiGo3, за да го накараме да следва черна линия
GiggleBot Line Follower Използване на Python: 5 стъпки
GiggleBot Line Follower Използване на Python: Този път ние програмираме в MicroPython Dexter Industries GiggleBot да следва черна линия, използвайки своя вграден сензор за последователен ред. GiggleBot трябва да бъде сдвоен с BBC micro: bit, за да може да бъдат контролирани по подходящ начин. Ако