Управление моторами в Strudel
Strudel в первую очередь создан для сочинения музыки, но с его помощью можно задавать паттерны и для других вещей — в том числе для моторов.
Для этого мы будем использовать микроконтроллер под названием «Inventor 2040W» — это Pico W с дополнительными портами, часть из которых предназначена для управления моторами.

Технические детали
Их можно спокойно пропустить!
- Inventor 2040W подключается к интернету по беспроводной сети и может питаться от батареи или по USB. Будем надеяться, что батарей хватит!
- На нём работает некоторый код, который слушает сообщения по сетевому протоколу «интернета вещей» (он называется MQTT). Получив сообщение, он приводит в движение мотор.
- Он подключается к небольшому серверу (на нём работает программа под названием mosquitto) на ноутбуке Алекса.
- Strudel может отправлять эти сообщения вместо воспроизведения звуков — именно так мы задаём с его помощью паттерны движения.
Первое движение
Давайте запустим мотор!
-
Запомните букву, написанную на наклейке с обратной стороны микроконтроллера.
-
Подключите батарею к микроконтроллеру.
-
Подключите мотор к разъёму «servo» (не «motor») под номером 1: жёлтый (самый светлый) провод должен быть ближе всего к «1», а коричневый (самый тёмный) — с внешней стороны.
-
Запустите код ниже, чтобы задать некоторые значения, заменив
xвrobot('x')на букву с вашего микроконтроллера.
$: move("-60 80").motor("0").robot('x');
Если вы обновите страницу, букву придётся снова заменить, чтобы она соответствовала вашему роботу.
Если ваш мотор внезапно начинает двигаться, возможно, кто-то другой по ошибке ввёл вашу букву!
Обратите внимание: выше мы считаем моторы начиная с «0», поэтому мотор 1 на плате в коде соответствует мотору 0.
Паттерны движения
Многие возможности Strudel для работы со звуковыми паттернами работают и с
паттернами моторов. Попробуйте поэкспериментировать с мининотацией в
команде move:
$: move("-10 0 10 [20 30]*2").motor("0").slow(2).robot('x')
Инструкции move принимают значения в диапазоне от -90 до 90.
Если в какой-то момент моторы перестают работать, а код выглядит правильным, попробуйте нажать кнопку «reset» на микроконтроллере.
Можно создавать плавные движения на основе разных «форм волны», например плавной синусоиды:
$: move(sine.range(-30, 30).segment(16)).motor("0").slow(2).robot('x');
Движение всё ещё довольно резкое, потому что команда «segment» берёт из синусоиды всего 16 позиций. Попробуйте увеличить это число до 32 или 64. Сильно выше поднимать не стоит: микроконтроллер может захлебнуться в очереди накопившихся инструкций!
Попробуйте заменить sine на другие формы волны: хорошо подходят saw (пилообразная волна) и tri (треугольная
волна), а ещё есть rand (случайная волна) и perlin (разновидность сглаженной случайности).
Паттерны для нескольких моторов
Команду motor можно задавать паттерном отдельно от move:
$: move("-10 0 10 [20 30]*2").motor("0 1").slow(2).robot('x');
Как вариант, два мотора можно задать отдельными паттернами. Код ниже отправляет одинаковый паттерн на первые два мотора, но второй работает медленнее:
$: move("-10 0 10 [20 30]*2").motor("0").slow(2).robot('x');
$: move("-10 0 10 [20 30]*2").motor("1").slow(3).robot('x');