Оглавление:
- Шаг 1. Необходимые компоненты
- Шаг 2: Настройка треков и окружения
- Шаг 3. Настройка GiggleBot
- Шаг 4: Настройка тюнера (удаленная)
- Шаг 5: настройка GiggleBot
- Шаг 6: GiggleBot работает с выключенным NeoPixels
- Шаг 7. GiggleBot работает с включенными неопикселями
Видео: Настройка последователя линии GiggleBot - продвинутый уровень: 7 шагов
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:51
В этих очень коротких инструкциях вы настроите своего собственного GiggleBot, чтобы он работал по черной линии. В этом другом руководстве GiggleBot Line Follower мы жестко запрограммировали значения настройки для работы в соответствии с этим сценарием. Возможно, вы захотите заставить его вести себя лучше, придумав другие преимущества.
В этом уроке мы показываем вам 2 скрипта, которые могут быть загружены на разные BBC micro: биты, так что один из них помещается в GiggleBot, а с другим 2 кнопки используются для перехода по меню и настройки различных параметры. Отправка этих обновленных параметров осуществляется по радио.
Шаг 1. Необходимые компоненты
Вам понадобится следующее:
- Робот GiggleBot для micro: bit.
- x3 батарейки типа АА
- 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
из микробитового импорта * |
из импорта gigglebot * |
из utime импортировать sleep_ms, ticks_us |
импортное радио |
импортное устройство |
# инициализировать радио и неопиксели 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 |
base_speed = 100 |
last_position = заданное значение |
интеграл = 0,0 |
run_neopixels = Ложь |
center_pixel = 5 # где центральный пиксель улыбки расположен на ГБ |
# turquoise = tuple (map (lambda x: int (x / 5), (64, 224, 208))) # цвет для отображения ошибки с помощью неопикселей |
# turquoise = (12, 44, 41) # это именно та бирюза, которая прокомментирована выше |
error_width_per_pixel = 0.5 / 3 # максимальная ошибка, деленная на количество сегментов между каждым неопикселем |
defupper_bound_linear_speed_reducer (abs_error, trigger_point, upper_bound, smallest_motor_power, high_motor_power): |
глобальная base_speed |
если abs_error> = точка_пуска: |
# x0 = 0,0 |
# y0 = 0,0 |
# x1 = upper_bound - точка_пуска |
# y1 = 1.0 |
# x = abs_error - точка_пуска |
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0) |
# такой же как |
y = (abs_error - точка_пуска) / (верхняя граница - точка_пуска) |
мощность_двигателя = базовая_скорость * (наименьшая_мощность_двигателя + (1- год) * (наибольшая_мощность_двигателя - наименьшая_мощность_двигателя)) |
вернуть motor_power |
еще: |
вернуть base_speed * high_motor_power |
run = False |
previous_error = 0 |
total_time = 0,0 |
total_counts = 0 |
whileTrue: |
# если нажата кнопка a, то начинаем подписку |
если button_a.is_pressed (): |
run = True |
# но если кнопка b нажата, останавливает следящий за строкой |
если button_b.is_pressed (): |
run = False |
интеграл = 0,0 |
previous_error = 0,0 |
display.scroll ('{} - {}'. format (total_time, total_counts), delay = 100, wait = False) |
total_time = 0,0 |
total_counts = 0 |
Pixel_off () |
останавливаться() |
sleep_ms (500) |
если запустить isTrue: |
# считываем линейные датчики |
start_time = ticks_us () |
# проверьте, обновили ли мы прирост Kp / Kd с помощью пульта дистанционного управления |
пытаться: |
Kp, Ki, Kd, точка_пуска, min_speed_percent = ustruct.unpack ('fffff', radio.receive_bytes ()) |
set_eyes () |
exceptTypeError: |
проходить |
справа, слева = read_sensor (LINE_SENSOR, BOTH) |
# строка слева при позиции <0,5 |
# строка справа при позиции> 0,5 |
# строка находится посередине, когда position = 0.5 |
# это взвешенное среднее арифметическое |
пытаться: |
позиция = вправо / плавающее (влево + вправо) |
exceptZeroDivisionError: |
позиция = 0,5 |
если позиция == 0: позиция = 0,001 |
если позиция == 1: позиция = 0,999 |
# использовать контроллер PD |
error = position - уставка |
интеграл + = ошибка |
исправление = Kp * ошибка + Ki * интеграл + Kd * (error - previous_error) |
previous_error = ошибка |
# вычислить скорости двигателя |
motor_speed = upper_bound_linear_speed_reducer (абс (ошибка), заданное значение * значение триггера, заданное значение, min_speed_percent, 1.0) |
leftMotorSpeed = motor_speed + коррекция |
rightMotorSpeed = motor_speed - коррекция |
# подсвечиваем неопиксели, чтобы показать, в каком направлении должен идти GiggleBot |
если run_neopixels истинно и 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- (error_width_per_pixel * i -abs (error)) / error_width_per_pixel |
# загораем текущий пиксель |
если ошибка <0: |
# neo [center_pixel + i] = кортеж (map (lambda x: int (x * процент), бирюзовый)) |
neo [center_pixel + i] = (int (12 * процентов), int (44 * процентов), int (41 * процентов)) |
еще: |
# neo [center_pixel - i] = tuple (map (lambda x: int (x * процент), бирюзовый)) |
neo [center_pixel - i] = (int (12 * процентов), int (44 * процентов), int (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) |
водить машину() |
# print ((ошибка, скорость_двигателя)) |
Кроме: |
# на случай, если мы столкнемся с какой-то неустранимой проблемой |
проходить |
# и поддерживать частоту контура |
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) |
просмотреть rawgigglebot_line_follower_tuner.py, размещенный на ❤ на GitHub
Шаг 4: Настройка тюнера (удаленная)
Следующее, что нам нужно сделать, это прошить runtime + скрипт на второй бит BBC micro: bit. Этот второй micro: bit будет действовать как удаленный для GiggleBot, который будет использоваться для настройки следующих параметров:
- Kp = пропорциональное усиление для ПИД-регулятора.
- Ki = интегральное усиление для ПИД-регулятора.
- Kd = производное усиление для ПИД-регулятора.
- trigger_point = точка, выраженная в процентах между минимальной и максимальной скоростью GiggleBot, где скорость начинает линейно снижаться, пока не достигнет минимальной скорости.
- min_speed_percent = минимальная скорость, выраженная в процентах от максимальной скорости.
Две другие оставшиеся переменные, которые можно настроить, напрямую жестко запрограммированы в скрипте, который находится на 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-й элемент - это точка запуска для двигателей, чтобы снизить скорость (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, gains [int (currentSetting / 2)]), delay = 100, wait = False) |
radio.on () |
showMenu () |
whileTrue: |
updated = False |
если button_a.is_pressed (): |
currentSetting = (currentSetting +1)% (2 * 5) |
updated = True |
если 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', * прирост)) |
updated = True |
если обновлено: |
showMenu () |
sleep_ms (200) |
просмотреть rawgigglebot_line_follower_configurator.py, размещенный на ❤ на GitHub
Шаг 5: настройка GiggleBot
Поместите GiggleBot на дорожку, включите и дайте ему поработать. Тем временем вам постоянно придется возвращать его на дорожку и настраивать коэффициенты усиления / параметры с помощью другого микробита BBC, который вы держите в руке.
Чтобы запустить GiggleBot, нажмите кнопку A на BBC micro: bit GiggleBot, а чтобы остановить его и, таким образом, сбросить его состояние, нажмите кнопку B.
На удаленном BBC micro: bit нажатие кнопки A проведет вас по каждому параметру в его меню, а кнопка 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)
- Кр = 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 (работает при 70 Гц)
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 (работает при 50 Гц)
- Кроме того, для переменной run_neopixels необходимо установить значение True в скрипте, который загружается в бит micro: bit BBC GiggleBot. Это заставит светодиоды NeoPixel мигать таким образом, чтобы они указывали, в каком направлении накапливается ошибка.
Шаг 6: GiggleBot работает с выключенным NeoPixels
Это пример запуска GiggleBot с первыми параметрами настройки, найденными на предыдущем шаге. В этом примере светодиоды NeoPixel выключены.
Шаг 7. GiggleBot работает с включенными неопикселями
Это пример запуска GiggleBot со вторым набором параметров настройки, найденных на шаге 5. В этом примере включены светодиоды NeoPixel.
Обратите внимание, как в этом примере GiggleBot сложнее следовать за линией - это потому, что светодиоды Neopixel «съедают» процессорное время BBC micro: bit. Поэтому пришлось снизить частоту обновления с 70 до 50.
Рекомендуемые:
Цифровой уровень с поперечным лазером: 15 шагов (с изображениями)
Цифровой нивелир с поперечным лазером: Привет всем, сегодня я собираюсь показать вам, как сделать цифровой уровень с дополнительным встроенным поперечным лазером. Около года назад я создал цифровой мультитул. Хотя в этом инструменте есть много разных режимов, для меня самый распространенный и полезный
Smart Planter - показывает уровень воды: 5 шагов (с изображениями)
Умное кашпо - указывает уровень воды: мы только что купили несколько симпатичных растений для нашего нового дома. Между всеми электронными устройствами, установленными в доме, растения действительно вызывают ощущение живости. Взамен я хотел сделать что-нибудь для растений. Вот почему я разработал этот умный план
Уровень DIY Digital Spirit: 5 шагов (с изображениями)
DIY Digital Spirit Level: в этом проекте мы более подробно рассмотрим микросхемы акселерометра и узнаем, как их можно использовать с Arduino. Впоследствии мы объединим такую ИС с парой дополнительных компонентов и корпусом, напечатанным на 3D-принтере, чтобы создать цифровой
Последователь линии GiggleBot с использованием Python: 5 шагов
GiggleBot Line Follower с использованием Python: на этот раз мы программируем в MicroPython Dexter Industries GiggleBot так, чтобы он следовал по черной линии, используя встроенный датчик следования линии. GiggleBot должен быть соединен с BBC micro: bit, чтобы он мог работать. контролироваться надлежащим образом. Если
Как сделать самого маленького в мире робота-последователя линии (робо Ризе): 7 шагов (с изображениями)
Как сделать самого маленького в мире робота-следящего за линией (робо Ризе): Как сделать самого маленького в мире робота-следящего за линией (вибробота) «roboRizeh»; вес: 5гр размер: 19x16x10 мм Автор: Naghi Sotoudeh Слово "Ризех" это персидское слово, означающее «крошечный». Ризе - это очень маленький ро