Приехала рассыпуха

Сегодня забрал микросхемы согласователей уровней и рассыпуху для новой платы микроконтроллера.

Сама плата заказана (в pcbwave.com — они снова стали принимать платежи с российских карточек). Когда приедет — запаяю.

Рис. 1

Развёл плату микроконтроллера для 2 версии MIDI-баяна

Поменялся микроконтроллер, добавилась память EEPROM, микросхемы согласования логических уровней между 3.3- и 5-вольтовой логикой, и радиомодуль. И коннектор для подключения устройства чтения SD карт.

Рис. 1

Заменил кнопки на баяне

Обстоятельства заставили меня разориться и купить новые кнопки для баяна (см. рис. 1). Кнопки итальянские, с красивым перламутровым отливом, на 1 мм больше диаметром, чем родные, и гораздо более комфортные для нажатия. Покупал здесь. Кнопки Z-0031 (белые) и Z-0032 (чёрные). Демпферы Z-0051 (чёрные).

Был некий соблазн купить красные демпферы, но всё-таки я решил, что это будет цыганщина, и купил чёрные. Довольно органично смотрится.

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

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

Рис. 1

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

Читать далее «Заменил кнопки на баяне»

Теперь умеем читать MIDI файлы с SD карты

Сегодня у меня получилось завести библиотеку MD_MIDIFile на моей RP2040-Zero, на нестандартных выводах SPI.

Устройство инициализируется, файлы читаются. И содержимое файлов выводится в отладочный серийный порт.

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

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

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

Рис. 1

Радиоканал со стороны RP2040

Ранее я писал о том, что научился искать свободный радиоканал. Но делать это надо будет не на стороне приёмника (который будет сделано на Arduino nano), а на стороне передатчика, который будет сделан на RP2040.

Ну и вот сегодня я скачал библиотеку RF24, адаптированную к RP2040, и перенес написанный ранее код на RP2040-Zero.

Работает.

Можно начинать писать классы радиоинтерфейса для обеих сторон.

Рис. 1

Вдогонку к заметке про EEPROM

Я недавно писал, что нашел хороший исходник для работы с EEPROM микросхемами AT24C16.

Оказалось, что он выгодно отличается от «доступных аналогов» тем, что работает очень быстро. Как говорится, «самая быстрая запись в EEPROM на Диком Западе». 🙂

Это потому, что в этом коде есть интересная изюминка. Микросхемы эти обрабатывают запросы на запись/чтение довольно медленно. Микроконтроллер должен ждать окончания предыдущей операции прежде чем отправлять в микруху новый запрос. В 99% примеров кода, доступных в сети, народ тупо лепит задержку на пару миллисекунд. Но в этом коде нет никаких задержек, зато там есть это:

static void at24cxx_wait(int i2c_address)
{
    int resault = 0;
    do
    {
        Wire.beginTransmission(i2c_address);
        resault = Wire.endTransmission();
    } while (resault != 0);
}

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

2048 байт (полная емкость) пишутся за 231 мс.

Рис. 1

Кстати о музыке из м/ф «Ловушка для кошек»

Я тут внезапно осознал, что:

  • Основную мелодию без проблем можно сыграть на баяне правой рукой, благо, в моем новом синтезаторе есть отличнейшие тембры духовых инструментов.
  • В композиции имеется второй голос (см. на подыгрывающих летучих мышей-вампиров); там немного другой тембр. И этот второй голос можно без проблем сыграть левой рукой на выборке!
  • Басовую линию при этом сыграть уже не получится. А если утащить второй голос в правую руку, чтобы левой играть бас, то тогда оба голоса будут звучать одним тембром, что не совсем правильно. Буду думать и пробовать.
  • А ударное сопровождение сам бог велел засунуть в авто-аккомпанемент. В ту его версию, которая будет во 2-й версии баяна на контроллере RP2040 (с проигрыванием MIDI файлов с флеш-карты SD).
Рис. 1

Освоил чтение и запись во внешнюю EEPROM память

Засунул на макетку микросхему AT24C16 (см. рис. 1).

Она подключается к микроконтроллеру по интерфейсу I2C. Объем памяти — 16 кбит, т.е. 2 килобайта. Это в 2 раза больше, чем встроенный EEPROM на Arduino nano.

Имею сказать, что адресация памяти внутри этой микросхемы нифига не интуитивна. Поскольку там 2048 байт, для их адресации надо 11 бит, т.е. два байта. Я думал, что сначала в эту микруху отправляется 2-байтовый адрес, а она в ответ пришлёт байт, расположенный по этому адресу. А 3 «адресных» ноги на корпусе позволяют задать любой I2C адрес из диапазона 0x50-0x57.

Фигвам. Недостающие старшие 3 бита адреса контрабандой стырены с выводов 1-2-3 микросхемы. То есть эти самые выводы ни к чему не подключены и ни на что не влияют. Вместо этого микросхема отзывается на ВСЕ адреса из диапазона 0x50-0x57. Соответственно, по каждому из этих I2C адресов доступно 256 байт EEPROM памяти. То есть логически эта микросхема выглядит как 8 штук 256-байтных микросхем, сидящих на адресах 0x50-0x57 (с 8-битной внутренней адресацией внутри каждой «микросхемы», естественно). Огонь вообще.

Я очень удивился.

Но в результате разобрался. Сначала «на коленке» написал свою версию кода для чтения-записи, чтобы убедиться, что я логику правильно понял. А потом наткнулся на вполне пристойную реализацию программного интерфейса к этой микросхеме: https://programmersought.com/article/598311367038/

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

Рис. 1

Освоено подключение OLED дисплея к RP2040-Zero

Сегодня запаял контактные гребенки в плату и проверил работу OLED дисплея с RP2040. В результате убедился, что:

  • Дисплей отлично работает от 3.3 В.
  • Переназначать выводы I2C интерфейса очень просто.
  • Библиотека GyverOLED приколочена гвоздями к первому интерфейсу I2C (в RP2040 их два). Для того, чтобы она работала на втором интерфейсе надо либо по всей библиотеке заменить Wire на Wire1, либо сделать адаптацию библиотеки для RP2040-Zero (не хочу делать ни то, ни другое).

В общем, вопрос с подключением дисплея и использованием библиотеки GyverOLED на RP2040-Zero закрыт.

Рис. 1

И видос:

Я нашёл отличный редактор MIDI

Для написания мелодий ударных инструментов для автоаккомпанемента.

Здесь.

Как можно догадаться, это онлайн-редактор. Прямо из браузера. Максимально простой с одной стороны, и позволяющий редактировать поток «сырых» MIDI команд. Это важно для того, чтобы убрать разные левые команды, которые будут мешать нормальной работе движка автоаккомпанемента.

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

Я даже думаю, что будет правильным встраивать выбор т.н. «драмсета» (не соображу, каким должен быть русский аналог этого слова) в сам MIDI-файл.

Рис. 1