Оглавление:

Программирование Micro: Bit Robot & Joystick: Bit Controller с MicroPython: 11 шагов
Программирование Micro: Bit Robot & Joystick: Bit Controller с MicroPython: 11 шагов

Видео: Программирование Micro: Bit Robot & Joystick: Bit Controller с MicroPython: 11 шагов

Видео: Программирование Micro: Bit Robot & Joystick: Bit Controller с MicroPython: 11 шагов
Видео: ВЕБИНАР 12 июня: Программирование LEGO® Educations EV3 на Python — первые шаги 2024, Ноябрь
Anonim
Программирование Micro: Bit Robot & Joystick: Bit Controller с MicroPython
Программирование Micro: Bit Robot & Joystick: Bit Controller с MicroPython

В рамках нашего летнего лагеря робототехники Robocamp 2019 молодые люди в возрасте от 10 до 13 лет паяют, программируют и строят «робота-противовеса» BBC на основе micro: bit, а также программируют micro: bit для использования в качестве пульта дистанционного управления.

Если вы в настоящее время находитесь в Robocamp, переходите к шагу 3, так как первые два шага мы выполнили как группа

Это пошаговое руководство по созданию робота micro: bit, взаимодействующего с контроллером joystick: bit.

Это не самый быстрый путь, чтобы заставить все работать, но пробует что-то небольшими порциями, чтобы вы могли тестировать код в процессе работы, ставить на него свой собственный штамп и понимать, почему мы делаем то, что делаем. !

Для этого задания мы используем нашего собственного робота, но он будет работать с любым роботом, использующим аналогичный драйвер двигателя, например L9110s.

Файлы дизайна для нашего робота можно найти здесь:

Это руководство написано для новичков, но если вы никогда раньше не использовали micro: bit с MicroPython, мы рекомендуем сначала попробовать более простую программу, такую как наш именной значок Instructable: https://www.instructables.com/id/Felt -Микробит-Нам…

Запасы

2x BBC micro: бит

Робот, работающий с BBC micro: bit (см. Объяснение выше)

джойстик: битовый контроллер (взяли наш от Cool Components)

Шаг 1. Настройка робота

У вас есть несколько вариантов написания кода MicroPython для вашего micro: bit:

  • Mu, который вы можете скачать и установить отсюда:
  • Онлайн-редактор, который вы можете найти здесь:

Эти инструкции предполагают, что вы используете Mu

Откройте Mu и подключите micro: bit к компьютеру. Му должен распознать, что вы используете micro: bit, и выбрать micro: bit «Mode», но если это не так, измените его вручную.

выбрать режим
выбрать режим

Получите копию кода тестирования двигателя робота отсюда:

Если вы не привыкли к Github, это может показаться неинтуитивным! Получить этот код можно двумя простыми способами:

  1. Сохраните файл Raw на свой компьютер, затем загрузите его в Mu:
  2. Скопируйте и вставьте весь данный код в новый файл в Mu.
сохранить необработанный файл
сохранить необработанный файл

Теперь нажмите кнопку «Flash» на панели инструментов Mu, чтобы отправить новый код в micro: bit.

Это не сработает, если не вставлен micro: bit

Желтый индикатор на задней панели micro: bit начнет мигать. Когда он закончится, ваш код будет передан.

НАСТРОЙКА НАПРАВЛЕНИЯ ДВИГАТЕЛЯ

Эта программа будет включать двигатели в разных направлениях, когда вы нажимаете кнопку «A» на микробите.

Вы хотите, чтобы произошло следующее:

  • Когда отображается 'A', левый мотор двигается вперед.
  • Когда отображается 'B', левый двигатель движется назад.
  • Когда отображается 'C', правый двигатель движется вперед.
  • Когда отображается 'D', правый двигатель движется назад.

Вероятно, это не так, поскольку это зависит от того, как вы подключили своего робота!

В верхней части кода вы найдете список переменных, которые определяют, какой вывод на micro: bit управляет направлением двигателя.

Если вы используете одного из наших роботов (файлов), поменяйте местами имена переменных, чтобы робот двигался в правильном направлении:

поменять местами переменные контактов
поменять местами переменные контактов

Если вы используете собственного робота, проверьте, к каким контактам подключен драйвер двигателя, прежде чем редактировать код.

ТЕСТИРОВАНИЕ ПРИВОДА

Теперь проверьте, как движется ваш робот, заменив тестовый код в основном цикле некоторым собственным кодом.

Вы говорите роботу вести машину, вызывая функцию drive (). Это принимает два аргумента - значение для левого двигателя и значение для правого двигателя в диапазоне от 0 (выкл.) До 1023 (максимальная скорость).

Например, вызывая drive (500, 500), вы говорите обоим двигателям включиться в прямом направлении примерно на половинной скорости.

Попробуйте несколько вариантов, чтобы понять, насколько прямолинейно он едет и насколько хорошо поворачивает.

Подсказка: моторные тесты проводились как внутри цикла while True, так и внутри оператора if - моторы не включались, пока вы не нажали кнопку A на micro: bit, и он постоянно проверяет, нажали ли вы кнопку A.

Подсказка: моторы не выключатся, пока вы им не скажете! Они всегда будут продолжать выполнять свои последние инструкции.

ДОПОЛНИТЕЛЬНО: УЛУЧШЕНИЕ ВОЖДЕНИЯ ПО ПРЯМОЙ ЛИНИИ

Если ваш робот не будет двигаться по прямой, один из ваших двигателей может вращаться быстрее, чем другой.

Убедившись, что ничто физически не мешает колесу свободно вращаться, вы можете отредактировать код в функции движения, чтобы уменьшить скорость более быстрого двигателя.

Прокрутите вверх, чтобы найти определение функции привода, и посмотрите на две верхние инструкции:

def drive (L, R):

# Ниже приведена корректировка для корректировки несоответствия скорости двигателя L = int (L * 1) R = int (R * 1)

Эти две строки в настоящее время принимают значения L и R, умножают их на 1, затем убедитесь, что они все еще целые числа (int).

Например, если ваш левый мотор работает быстрее, измените * 1 на его линии на * 0,9 и посмотрите, улучшит ли это ситуацию.

Вы не сможете сделать его идеальным, но можете продолжать регулировать, пока он не станет ровнее.

НАСТРОЙКА РАДИО

Теперь настройте радио, добавив следующие строки в начало кода:

импортное радио

radio.config (канал = 7, группа = 0, очередь = 1) radio.on ()

Это позволит вашему роботу получать инструкции от другого micro: bit, но в данный момент он будет получать инструкции от любого другого micro: bit.

Это потому, что канал 7 и группа 0 являются каналами по умолчанию.

Измените эти числа, выбрав канал от 0 до 82 и группу от 0 до 255. Теперь ваш micro: bit будет получать инструкции только от других с такой же информацией о конфигурации.

queue = 1 означает, что micro: bit будет сохранять только одно входящее сообщение за раз - это дает немного более быстрое время ответа, чем значение по умолчанию, равное 3.

Теперь вам нужно отредактировать код основного цикла, чтобы вместо выполнения инструкций при нажатии кнопки дождаться входящего радиосообщения и ответить соответствующим образом.

Попробуйте в качестве теста следующий код (он ничего не сделает, пока вы не настроите джойстик на шаге 2):

в то время как True:

message = radio.receive () если message == 'forward': drive (500, 500)

Шаг 2: настройка джойстика

Отключите micro: bit вашего робота и вместо этого вставьте micro: bit вашего джойстика

Получите копию кода настройки джойстика отсюда:

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

В конце программы запустите основной цикл:

в то время как True:

если button_a.was_pressed (): radio.send ('вперед')

Этот код еще не использует джойстик: бит. Он использует кнопку A на бите micro: для отправки сообщения.

Убедитесь, что и у вашего робота, и у вашего контроллера micro: bits есть питание, затем нажмите кнопку, чтобы отправить сообщение.

Если сообщение успешно получено, и ваш робот движется… молодец! Вы закончили с инструкциями по настройке.

СОВЕТЫ ПО УСТРАНЕНИЮ НЕИСПРАВНОСТЕЙ

Если вы получаете сообщение об ошибке на вашем контроллере micro: bit… отладьте код вашего контроллера

Если вы получаете сообщение об ошибке на вашем роботе micro: bit… ваше радиосообщение было успешно отправлено! Но робот не может этого понять, поэтому убедитесь, что сообщение, которое вы отправили, и сообщение, которое вы сказали роботу прослушать, совпадают.

Если вообще ничего не происходит

  • Убедитесь, что вы ввели правильный код для каждого micro: bit - легко случайно прошить не тот!
  • Убедитесь, что номера вашего канала и группы совпадают на каждом micro: bit

Шаг 3: Проверка значений джойстика

Следующие несколько шагов используют код контроллера

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

Замените основной цикл следующим кодом:

в то время как True:

joystick = joystick_push () печать (джойстик) сон (500)

Загрузите этот код на свой micro: bit, затем нажмите кнопку REPL на панели инструментов Mu. Это откроет терминал в нижней части редактора, который даст вам ссылку на micro: bit в реальном времени.

откройте REPL
откройте REPL

Это не сработает, если не вставлен micro: bit

При открытом REPL нажмите кнопку сброса на задней панели micro: bit.

Изображение
Изображение

Вы должны увидеть, как некоторые значения выводятся на ваш экран «напечатанными»:

значения в терминале
значения в терминале

Нажмите ручку джойстика и посмотрите, что произойдет с числами.

Запишите значения, полученные, когда джойстик находится в центральном положении - в моем случае (518, 523).

Нажмите кнопку REPL на панели инструментов Mu еще раз, чтобы закрыть ее - вы не сможете прошить новый код в micro: bit, пока он открыт.

Шаг 4: настройка переменных X и Y

Вы хотите изменить значения, заданные функцией джойстика, чтобы:

  • в центре это ноль
  • вверх положительный
  • вниз отрицательный.

Это соответствует инструкциям, которые нужны роботу - положительное число для движения вперед и отрицательное число для движения назад.

Посмотрите на числа, которые вы получили на последнем шаге. Первое число - это x, а второе число - y.

Отредактируйте определение joystick_push (), которое уже есть в программе, чтобы вычесть ваши значения из оригинала:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 return x, y

Используйте свои номера, они могут отличаться от моих

Запрограммируйте новый код, откройте REPL, нажмите кнопку сброса micro: bit и проверьте свои значения.

Вы получаете (0, 0)?

Шаг 5: преобразование X и Y в значения для левого и правого двигателей

На данный момент этот джойстик вряд ли пригодится для управления роботом. Если продвинуть вперед до конца, вы получите такое значение, как (0, 500).

Если вы дадите эти числа роботу, он включит правый мотор, но не левый, чего вы не хотите!

На этой диаграмме показано, что происходит со значениями x и y, когда вы перемещаете джойстик, и что мы хотим, чтобы робот делал, когда вы перемещаете джойстик.

диаграмма
диаграмма

Вам нужно использовать математику, чтобы смешать значения x и y, чтобы получить что-то более полезное.

п

МАТЕМАТИКА

Начнем с того, что полностью переместим джойстик вперед.

Пример возможных значений:

х = 0

у = 500

Чтобы быть полезным для робота, вы хотите получить такие значения:

left = 500

вправо = 500

Давайте попробуем сложить x и y по-разному, чтобы увидеть, какие числа мы получим:

х + у = 0 + 500 = 500

х - у = 0-500 = -500 у + х = 500 + 0 = 500 у - х = 500-0 = 500

Теперь посмотрим, что произойдет, если мы сдвинем джойстик до упора вправо.

Пример возможных значений:

х = 500

у = 0

Чтобы робот повернул направо, нужно, чтобы левый мотор двигался вперед, а правый двигался назад:

left = 500

вправо = -500

Давайте снова попробуем нашу формулу:

х + у = 500 + 0 = 500

х - у = 500-0 = 500 у + х = 0 + 500 = 500 у - х = 0-500 = -500

Сравните два набора формул, чтобы определить, какой вариант даст вам правильное левое значение, а какой вариант - правильное правильное значение.

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

п

РАСШИРЕНИЕ ФУНКЦИИ ДЖОЙСТИКА

Разверните и отредактируйте функцию джойстика, чтобы создать две новые переменные для left и right и вернуть эти значения вместо x и y:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 left = right = возврат влево, вправо

Запрограммируйте новый код, откройте REPL, нажмите кнопку сброса micro: bit и проверьте свои значения.

Получаете ли вы ожидаемые ценности?

Если вам нужна дополнительная помощь, ознакомьтесь с нашим примером кода здесь:

Шаг 6: Отправка значений в виде радиосообщения

Теперь у вас есть несколько значений, готовых для отправки вашему роботу.

Отредактируйте свой основной цикл, чтобы он проверял значения джойстика, но затем вместо того, чтобы печатать значения, он готовил их к отправке в виде радиосообщения.

в то время как True:

joystick = joystick_push () message = str (joystick [0]) + "" + str (joystick [1])

На самом деле это еще не отправит сообщение!

Что происходит в этой новой строке кода?

  • джойстик [0] означает первый бит информации, который выходит из функции джойстика (слева)
  • джойстик [1] - следующий бит информации (справа)
  • str () преобразует оба этих числа в строковый формат (текст вместо чисел) - это необходимо для передачи информации по радио.

Вы привыкли видеть, что + означает сложение - он может как складывать числа, так и объединять строки, что означает, что он будет связывать два бита информации вместе.

Пример:

150 + 100 = 250

str (150) + str (100) = 150100

Таким образом, конкатенация будет связывать ваши левые и правые значения вместе.

Чтобы разделить два бита информации (чтобы робот знал, что это два бита информации), соедините между ними дополнительную строку, используя "". Знаки речи вокруг пробела означают, что это уже строка.

Наконец, расширьте свой код, чтобы отправить это вновь созданное сообщение по радио:

radio.send (сообщение)

сон (10)

Сон замедляет отправку сообщений, чтобы принимающий micro: bit не был перегружен слишком большим количеством информации!

Вставьте этот код в micro: bit вашего контроллера и отладьте все ошибки, прежде чем переходить к следующему шагу

Шаг 7. Получение сообщений на вашем роботе

Вернитесь к коду вашего робота с самого начала - не забудьте отключить контроллер micro: bit, чтобы случайно не прошить на него код робота

Прокрутите вниз до основного цикла - удалите тестовый код и добавьте его вместо этого:

в то время как True:

message = radio.receive () print (сообщение) sleep (100)

Это устанавливает переменную, равную входящему сообщению, и печатает сообщение в REPL - чтобы проверить, что сообщения проходят должным образом.

Прошиваем ваш новый код, подключенный к REPL, затем нажимаем джойстик.

У вас должно получиться что-то вроде этого:

Значения REPL
Значения REPL

СОВЕТЫ ПО УСТРАНЕНИЮ НЕИСПРАВНОСТЕЙ

Если вы получаете сообщение об ошибке на вашем контроллере micro: bit… отладьте код вашего контроллера

Если вы получаете сообщение об ошибке на вашем роботе micro: bit… ваше радиосообщение было успешно отправлено! Но робот не может этого понять, поэтому убедитесь, что сообщение, которое вы отправили, и сообщение, которое вы сказали роботу прослушать, совпадают.

Если вообще ничего не происходит

  • Убедитесь, что вы ввели правильный код для каждого micro: bit - легко случайно прошить не тот!
  • Убедитесь, что номера вашего канала и группы совпадают на каждом micro: bit

Шаг 8: Использование входящих сообщений для управления двигателями робота

Теперь вы получаете два числа, которые передаются по радио в виде строки.

Вам нужно разделить это сообщение на две строки, затем снова преобразовать строки в числа и передать это в функцию привода. Много чего происходит сразу!

Перед тем как это сделать, вам необходимо убедиться, что получаемое вами сообщение имеет правильный формат.

Если сообщения не отправляются, вместо этого вы получите «Нет». Если вы попытаетесь разделить это, вы получите сообщение об ошибке.

в то время как True:

message = radio.receive (), если message не None: message = message.split () drive (int (message [0]), int (message [1]))

Что здесь происходит?

  • Новый код будет запущен, если сообщение отличное от «Нет».
  • message.split () проверяет наличие пробела в сообщении (которое мы добавили на последнем шаге) и использует его для разделения сообщения на две части.
  • int (message [0]), int (message [1]) делает противоположное тому, что мы делали на предыдущем шаге - получает каждую часть информации индивидуально и преобразует ее в целое число (целое число).
  • int (сообщение [0]) используется как значение для левого двигателя в функции привода, а int (сообщение [1]) используется как значение для правого двигателя.

Убедитесь, что он работает - моторы крутятся, когда вы нажимаете джойстик?

Если нет - время для отладки!

Если да, то замечательно! У вас есть рабочий робот с дистанционным управлением!

Прежде чем переходить к следующему шагу, потренируйтесь с роботом. Едет ли он так, как вы ожидаете?

Следующие шаги покажут вам, как использовать кнопки на джойстике для добавления дополнительных функций вашему роботу

Если вы хотите увидеть нашу версию этого кода:

  • Робот:
  • Контроллер:

Шаг 9: Использование кнопок - получение дополнительных сообщений

На данный момент ваш код попытается разделить любое сообщение, кроме None. Это означает, что если он получит, например, «привет», то вы получите сообщение об ошибке.

Чтобы ваш micro: bit мог интерпретировать другие сообщения, ему необходимо сначала проверить каждое ожидаемое сообщение, а затем разделить сообщение, только если ему не было сказано делать с ним что-либо еще.

Разверните свой код так:

если сообщение не None:

if message == 'hello': display.show (Image. HAPPY) elif message == 'duck': display.show (Image. DUCK) else: message = message.split () drive (int (message [0]), int (сообщение [1]))

Во-первых, он проверит, получил ли он сообщение «привет». Если это так, он отобразит счастливое изображение, затем вернется к началу цикла и проверьте следующее сообщение.

Если сообщение не приветствуется, оно проверяет, является ли сообщение «утка».

Если сообщение не «привет» ИЛИ «утка», оно выполнит последнее действие в списке, а именно разделит сообщение и включит моторы. Он не будет пытаться разделить сообщение, если оно получило «привет» или «утка», что означает, что вы не получите сообщение об ошибке ни в одном из этих двух сообщений.

Двойной знак равенства важен - он означает 'равно', по сравнению с одинарным знаком равенства, который что-то устанавливает (так message = 'hello' означает, что мы устанавливаем переменную в 'hello', message == 'hello' означает, что мы спрашиваем, равно ли сообщение "привет").

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

Ссылка на рабочий код:

Шаг 10: Отправка дополнительных сообщений с помощью кнопок контроллера

Отключите micro: bit вашего робота и вместо этого вставьте micro: bit вашего джойстика

Вернитесь к коду вашего контроллера для редактирования.

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

В верхней части цикла мы все еще хотим, чтобы он проверял текущие значения джойстика, но мы также хотим, чтобы он проверял, нажата ли кнопка в данный момент:

в то время как True:

джойстик = joystick_push () button = button_press ()

button_press () возвращает значение A, B, C, D, E или F в зависимости от того, какая кнопка в данный момент нажата (если ничего не нажимается, возвращается None).

Теперь мы можем сделать оператор if-elif-else, как мы это делали для кода робота - используя две кнопки и отправляя значение джойстика, если никакая кнопка не нажимается.

если кнопка == 'A':

radio.send ('hello') sleep (500) elif button == 'B': radio.send ('duck') sleep (500) else: message = str (joystick [0]) + "" + str (джойстик [1]) radio.send (сообщение) сна (10)

Когда кнопка нажата, отправьте одно из сообщений, на которые вы указали роботу на предыдущем шаге.

Сообщение будет отправляться всякий раз, когда будет нажата кнопка, а компьютеры намного быстрее людей! Таким образом, он может отправлять сообщение много раз, прежде чем вы успеете убрать палец с кнопки.

Сон после отправки сообщения замедляет его, так что он больше не будет проверять кнопку так быстро - попробуйте несколько чисел здесь, чтобы получить идеальное количество времени для вас - слишком медленно, и оно тоже не будет реагировать быстро, и ваш робот получит столько сообщений о кнопках, что может перестать реагировать на джойстик!

Это работает?

Если вы получаете сообщения об ошибках, хорошо подумайте, что вы только что изменили и что происходит.

Если вы получаете сообщение об ошибке на роботе при нажатии кнопки на контроллере - вы знаете, что сообщение передается, но это сбивает робота с толку. Убедитесь, что отправленное вами сообщение и сообщение, которое вы приказали роботу искать, совпадают.

Ссылка на рабочий код:

Шаг 11: Дальнейшие действия

Теперь у вас есть знания, необходимые для работы с двигателями вашего робота и с контроллером джойстика: бит

Используйте эти знания, чтобы улучшить две программы и сделать их своими. Некоторые идеи ниже!

У вас есть шесть кнопок на вашем контроллере! Что вы хотите, чтобы они сделали?

  • Как насчет того, чтобы запрограммировать танец, который ваш робот будет выполнять по команде? Напишите алгоритм команд drive (), разделенных командами sleep ()!
  • Вы хотите изменить направление движения робота, чтобы он мог легко двигаться вверх ногами? Подумайте о значениях x и y вашего джойстика. Что они представляют и как вы можете ими манипулировать?
  • Есть ли у вашего робота (или вы могли бы добавить!) Дополнительные функции, такие как светодиоды, динамик или датчики?

Идеи по улучшению кода

  • Не могли бы вы помочь своему роботу справиться с неизвестными сообщениями с помощью кода try / except?
  • Математика, используемая для вычисления левого и правого значений с помощью джойстика, не дает нам полного диапазона значений (привод робота может принимать число до 1023). Можете ли вы отредактировать этот код, чтобы увеличить диапазон?
  • Есть и другие методы смешивания значений джойстика - можете ли вы придумать лучший способ сделать это?

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