А это уже можно выбросить

Старые платы датчиков своё отработали. И плата панели управления тоже (половина кнопок начала глючить).

Только экранчик отпаяю, конечно. Он ещё хороший.

Рис. 1

Или вот, к примеру, лагман

  • говядина нежирная — 1 кг, можно чуть больше
  • пекинская капуста (нужны белые, плотные части; зелень срезать и использовать в каком-нибудь другом блюде) — примерно 8 листьев
  • болгарский перец (разноцветный, чтобы красивее) — 3 больших стручка
  • репчатый лук — 2 больших луковицы
  • стебли сельдерея (много не надо, достаточно 3-4 штуки)
  • киндза — 1 пучок
  • чеснок — 2 головки
  • томатная паста — 100 г
  • соль
  • зира

Источник рецепта здесь.

Мясо и овощи режем соломкой. Готовим в воке или в глубокой сковороде.

Сначала обжариваем мясо (минут 5). Добавляем размолотую в ступке зиру. Затем добавляем пекинскую капусту и лук. Прогреваем пару минут, добавляем томатную пасту. Жарим ещё 1-2 минуты. Добавляем болгарский перец, жарим, помешивая, 1-2 минуты. Добавляем стебли киндзы, нарезанный пластинками чеснок, сельдерей. Овощи доводим до полуготовности. Заливаем мясо и овощи водой или бульоном, и варим на среднем огне до полной готовности овощей (минут 10).

Лапшу я использую готовую (у нас в местном магазине продается «Лагманная», хорошая). Просто варим, как написано на упаковке.

Кладем в тарелку лапшу, сверху накладываем мясо+овощи (т.н. «ваджу»), посыпаем зеленью киндзы.

Это офигенно.

Рис. 1

Отличная библиотека для работы с JSON-файлами

Мой баян хранит пресеты в EEPROM. Естественно, в двоичном виде; это очень удобно: читаешь прямо из EEPROM прямо в нужную структуру — и всё.

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

Захотелось иметь возможность делать резервную копию всех 48 пресетов, которые хранятся в EEPROM. Резервную копию в виде файла на SD-карте (которая всё равно уже есть в системе). И раз уж это будет файл, то пусть он будет текстовым, чтобы его можно было редактировать при необходимости.

Раз так, то не надо изобретать свой велосипед, а надо использовать готовое. Мне нравится формат JSON; там ничего лишнего.

И, оказывается, как раз для меня сделали отличную библиотеку для работы с JSON-файлами: ArduinoJson. Очень рекомендую, если кто-то собирается решать задачу, похожую на мою.

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

Рис. 1

P.S. Забыл объяснить, что MIDI-система теперь умеет сохранять резервный JSON-файл, и, что более интересно, читать из него пресеты и записывать их обратно в EEPROM. Причем данные могут сохраняться из «старого» формата пресета и восстанавливаться в «новый»; при этом те поля, которых нет в JSON-файле, просто инициализируются значениями по-умолчанию. И теперь мне больше не придётся вручную, по бумажке, восстанавливать настроенные ранее пресеты.

MIDI-баян V3 собран

Сегодня я закончил сборку 3-й версии MIDI-баяна. Ключевая особенность этой версии — клавиатуры, чувствительные к скорости нажатия (как на пианино).

Последняя операция была — установка сменных вкладышей в ограничители потока воздуха. Поскольку штатных резонаторов в моём баяне нет, я использую напечатанные на 3Д принтере ограничители потока воздуха. А для того, чтобы расход воздуха можно было регулировать, в ограничителях используются сменные вкладыши (107 штук всего). Сейчас диаметр отверстий во вкладышах 1.5 мм. При таких отверстиях расход воздуха очень маленький — как на настоящих концертных баянах. Непривычно, но пусть будет пока так. Если захочу, чтобы было похоже на мой старый Рубин-5 — просто рассверлю вкладыши до 2 или до 2.5 мм.

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

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

В целом — авантюру по созданию MIDI-баяна с клавиатурой, чувствительной к скорости нажатия, я считаю успешной. Сохранились все те возможности, которые были дальше и добавились новые. В том числе возможность для добавления кое-каких эффектов (об этом — позднее).

Stay tuned, как говорится.

P.S. Всего каких-то 2 года разработки — и я получил то, что изначально хотел. 🙂

Почти собрана правая половина

«Почти» — потому что я пока ещё не брался за герметизацию. Пока только прикручены модули (включая панель управления на ажурке) и протянуты шлейфы.

«Резонаторы» (ограничители потока воздуха) тоже прикручены, но в них пока не установлены вкладыши (с отверстиями 2.5 мм). Но без них тоже нельзя, т.к. один из них является основой, к которой крепится плата центрального модуля и держатель аккумуляторов.

Всё включается, запускается и работает. (Очень удобно, что контроллер клавиатуры мигает 3 раза синим цветом после того, как устанавливает связь с центральным модулем и получает от него настройки. Сразу видно, если клавиатура не подцепилась нормально.)

Следующий этап — крепление шлейфа левой клавиатуры к меху и подключение левой половины.

Рис. 1

Правая тоже готова

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

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

Теперь — монтировать панель управления на правую ажурку.

Правая пошла

Наклеил магниты и начерно прикинул платы для первичной настройки.

Ну, что я могу сказать? Звучит. Нужно будет ещё какое-то время всё дополнительно попроверять, после чего можно будет монтировать платы на герметик.

Рис. 1

Программные таймеры в FreeRTOS — практическое использование

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

Вместо этого, я сделал обёртку вокруг программных таймеров FreeRTOS, которая делает всего одну простую вещь. Мои таймеры всего лишь в нужные моменты устанавливают нужные биты в указанных прн создании таймеров группах событий. Т.е. таймеры выполняют поручения вида «сделай так, чтобы в этой группе событий через столько-то миллисекунд установился этот бит (или несколько битов, если это зачем-то нужно)».

Интерфейс моего класса-обёртки в результате получился примитивный:

class MyTimers {
public:
    enum TimerType {normal, oneOff, autoReload};

    /// returns the ID of created timer
    int createTimer(EventGroupHandle_t event_group, EventBits_t flags, int  period, TimerType timer_type = normal);

    /// starts the specified timer
    void startTimer(int timer_id);

    /// stops the specified timer
    void stopTimer(int timer_id);

    /// changes period for the specified timer
    void changePeriod(int timer_id, int period);

    /// stops & deletes the specified timer
    void deleteTimer(int timer_id);

А реакция на выставленные флаги происходит в самих задачах.

Такой подход в моём случае себя полностью оправдал. С такими таймерами работать оказалось очень удобно.

Смонтировал платы левой клавиатуры

Закончена установка плат левой клавиатуры.

Метод монтажа — на тонкий слой автомобильного герметика. Герметик выполняет две функции:

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

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

В целом, я думал, что в левой клавиатуре всё будет хуже. Из-за конструктивных особенностей механики в ней есть люфты, и я ожидал, что в аккордах будет большая разница в громкости разных нот. По факту оказалось, что разница есть, но приемлемая. Гораздо заметнее — неодновременность начала звучания нот аккордов. Но с этим ничего не поделаешь, т.к. левая механика такого баяна не может обеспечить идеальную точность движения всех клапанов (да это и не нужно при штатном использовании инструмента).

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

Первые осмысленные звуки MIDI-баяна V3

Я тут потихоньку монтирую платы 3-й версии в баян. Временно закрепил платы на деке, проверяю работу электроники и механики, исправляю ошибки.

Только что я дошел до стадии, когда что-то уже можно показать общественности (см. видео ниже).

Промежуточный вывод: левая механика достаточно сильно люфтит и не обеспечивает большую точность движений. Поэтому для левой клавиатуры я буду считать очень хорошим результатом, когда можно будет получать 3 отчётливо различимых на слух градации: «слабо», «нормально», «сильно». Но большего я от левой клавиатуры и не ждал.

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

P.S. После доработки звучание приблизилось к тому, что ожидалось изначально: