Движение в Strudel 🌀 Bulka

Управление моторами в Strudel

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

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

изображение

Технические детали

Их можно спокойно пропустить!

  • Inventor 2040W подключается к интернету по беспроводной сети и может питаться от батареи или по USB. Будем надеяться, что батарей хватит!
  • На нём работает некоторый код, который слушает сообщения по сетевому протоколу «интернета вещей» (он называется MQTT). Получив сообщение, он приводит в движение мотор.
  • Он подключается к небольшому серверу (на нём работает программа под названием mosquitto) на ноутбуке Алекса.
  • Strudel может отправлять эти сообщения вместо воспроизведения звуков — именно так мы задаём с его помощью паттерны движения.

Первое движение

Давайте запустим мотор!

  1. Запомните букву, написанную на наклейке с обратной стороны микроконтроллера.

  2. Подключите батарею к микроконтроллеру.

  3. Подключите мотор к разъёму «servo» (не «motor») под номером 1: жёлтый (самый светлый) провод должен быть ближе всего к «1», а коричневый (самый тёмный) — с внешней стороны.

  4. Запустите код ниже, чтобы задать некоторые значения, заменив 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');