Оглавление:
- Автор John Day [email protected].
- Public 2024-01-30 11:51.
- Последнее изменение 2025-06-01 06:10.
В этих очень коротких инструкциях вы настроите своего собственного 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 Слово "Ризех" это персидское слово, означающее «крошечный». Ризе - это очень маленький ро
