Оглавление:

Последователь линии GiggleBot с использованием Python: 5 шагов
Последователь линии GiggleBot с использованием Python: 5 шагов

Видео: Последователь линии GiggleBot с использованием Python: 5 шагов

Видео: Последователь линии GiggleBot с использованием Python: 5 шагов
Видео: НОВЫЙ ФИЛЬМ ТОЛЬКО ВЫШЕЛ НА ЭКРАНЫ! НОВИНКА 2022! "ДЕРЖИСЬ ЗА ОБЛАКА" 1 Часть. МЕЛОДРАМЫ 2022 2024, Ноябрь
Anonim
Последователь линии GiggleBot с использованием Python
Последователь линии GiggleBot с использованием Python
Последователь линии GiggleBot с использованием Python
Последователь линии GiggleBot с использованием Python
Последователь линии GiggleBot с использованием Python
Последователь линии GiggleBot с использованием Python

На этот раз мы программируем в MicroPython Dexter Industries GiggleBot, чтобы он следил за черной линией, используя встроенный датчик следящего за линией.

GiggleBot должен быть сопряжен с BBC micro: bit для надлежащего управления.

Если этот учебник слишком сложен для вас и программировать GiggleBot пока слишком сложно, вы всегда можете просмотреть начальное руководство, которое покажет вам, как можно запрограммировать робота в MakeCode, здесь. Связанное руководство проведет вас через самые основы.

Шаг 1. Необходимые компоненты

Обязательные компоненты
Обязательные компоненты

Требуются следующие аппаратные компоненты:

  1. x3 батарейки AA - в моем случае я использую аккумуляторные батареи, которые в целом имеют более низкое напряжение.
  2. Робот Dexter Industries GiggleBot для micro: bit.
  3. Микро: бит BBC.

Конечно, вам также понадобится кабель micro USB для программирования BBC micro: bit - этот кабель обычно входит в комплект BBC micro: bit, или вы всегда можете использовать тот, который используется для зарядки (Android) смартфонов.

Получите GiggleBot для micro: bit здесь

Шаг 2: Настройте треки

Настройте треки
Настройте треки

Вам придется распечатать несколько плиток и создать свои собственные треки. Вы можете использовать наши собственные плитки, чтобы быть на 100% уверенным, что вы повторяете наши условия. Или, если вы любите приключения, вы можете использовать черную ленту и сделать свою собственную. Вот PDF-файл с плитками, которые мы использовали.

Вышеуказанная дорожка состоит из следующего количества различных плиток:

  • 12 плиток типа №1.
  • 5 плиток типа №2.
  • 3 шаблона типа плитки №5.
  • 3 шаблона типа плитки №6 - здесь вы получите одну дополнительную плитку.

Затем распечатайте их и вырежьте. Попробуйте разместить их, как на фотографии выше, и имейте в виду, что в правой верхней части дорожки 2 плитки должны перекрывать друг друга - это ожидается на тот случай, если вам интересно, что вы делаете не так.

Шаг 3: Настройка среды

Настройка среды
Настройка среды

Чтобы вы могли программировать BBC micro: bit в MicroPython, вам необходимо настроить для него редактор (Mu Editor) и установить GiggleBot MicroPython Runtime в качестве среды выполнения. Для этого вы должны следовать инструкциям на этой странице. На данный момент используется версия v0.4.0 среды выполнения.

Шаг 4: Программирование GiggleBot

Прежде чем приступить к делу, среда выполнения GiggleBot MicroPython содержит классическую среду выполнения для BBC micro: bit и других библиотек для поддержки GiggleBot и других датчиков Dexter Industries.

После настройки откройте следующий скрипт в редакторе Mu и нажмите Flash. Это запустит GiggleBot MicroPython Runtime и скрипт, который вы только что открыли для своего micro: bit BBC. Сценарий также показан ниже.

После завершения процесса прошивки сложите BBC micro: bit в GiggleBot так, чтобы неопиксели платы были обращены вперед, поместите его на дорожку и включите.

Обратите внимание, что в сценарии уже установлены ПИД-регулятор и две другие константы (заданное значение скорости и константы минимальной скорости).

Примечание. В следующем скрипте могут отсутствовать пробелы, и это, по-видимому, связано с некоторой проблемой при отображении GitHub Gists. Нажмите на суть, чтобы перейти на страницу GitHub, где вы можете скопировать и вставить код.

GiggleBot PID Line Follower - настроен с NeoPixels

из микробитового импорта *
из импорта gigglebot *
из utime импортировать sleep_ms, ticks_us
импортное устройство
# инициализировать неопиксели ГБ
neo = init ()
# тайминги
update_rate = 50
# усиления / константы (при напряжении батареи около 4,0 вольт)
Kp = 25,0
Ki = 0,5
Kd = 35,0
trigger_point = 0,3
min_speed_percent = 0,3
base_speed = 70
уставка = 0,5
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
whileTrue:
# если нажата кнопка a, то начинаем подписку
если button_a.is_pressed ():
run = True
# но если кнопка b нажата, останавливает следящий за строкой
если button_b.is_pressed ():
run = False
интеграл = 0,0
previous_error = 0,0
Pixel_off ()
останавливаться()
sleep_ms (500)
если запустить isTrue:
# считываем линейные датчики
start_time = ticks_us ()
справа, слева = read_sensor (LINE_SENSOR, BOTH)
# строка слева при позиции <0,5
# строка справа при позиции> 0,5
# строка находится посередине, когда position = 0.5
# это взвешенное среднее арифметическое
пытаться:
позиция = вправо / плавающее (влево + вправо)
exceptZeroDivisionError:
позиция = 0,5
# диапазон должен быть (0, 1), а не [0, 1]
если позиция == 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 - коррекция
# засветить неопиксели в соответствии с заданной ошибкой
если 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] = бирюзовый
neo [center_pixel + i] = (12, 44, 41)
еще:
# neo [center_pixel - i] = бирюзовый
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 (64 * процентов / 5), int (224 * процентов / 5), int (208 * процентов / 5))
еще:
# neo [center_pixel - i] = tuple (map (lambda x: int (x * процент), бирюзовый))
neo [center_pixel - i] = (int (64 * проценты / 5), int (224 * проценты / 5), int (208 * проценты / 5))
перерыв
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
if1000.0 / update_rate - delay_diff> 0:
сон (1000.0 / update_rate - delay_diff)

просмотреть rawgigglebot_tuned_line_follower.py, размещенный на ❤ на GitHub

Шаг 5: Дайте ему поработать

На BBC micro: bit: две кнопки: кнопка A и кнопка B:

  • Нажатие на кнопку A заставляет GiggleBot следовать линии (если она есть).
  • Нажатие на кнопку B останавливает GiggleBot и сбрасывает все, чтобы вы могли использовать его снова.

Настоятельно рекомендуется не поднимать GiggleBot, пока он следует по линии, а затем снова ставить его на него, потому что вычисляемая ошибка может накапливаться и полностью испортить маршрут робота. Если вы хотите поднять его, нажмите кнопку B, а затем, когда вы положите его обратно, снова нажмите A.

Рекомендуемые: