Автор: tesanoff
Вдогонку к заметке про 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 мс.
Кстати о музыке из м/ф «Ловушка для кошек»
Я тут внезапно осознал, что:
- Основную мелодию без проблем можно сыграть на баяне правой рукой, благо, в моем новом синтезаторе есть отличнейшие тембры духовых инструментов.
- В композиции имеется второй голос (см. на подыгрывающих летучих мышей-вампиров); там немного другой тембр. И этот второй голос можно без проблем сыграть левой рукой на выборке!
- Басовую линию при этом сыграть уже не получится. А если утащить второй голос в правую руку, чтобы левой играть бас, то тогда оба голоса будут звучать одним тембром, что не совсем правильно. Буду думать и пробовать.
- А ударное сопровождение сам бог велел засунуть в авто-аккомпанемент. В ту его версию, которая будет во 2-й версии баяна на контроллере RP2040 (с проигрыванием MIDI файлов с флеш-карты SD).
Освоил чтение и запись во внешнюю 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/
Возьму эту реализацию за основу и сделаю для неё интерфейсный класс-обёртку, который будет скрывать всю эту удивительную логику адресации, а заодно будет оптимизировать запись данных.
Освоено подключение OLED дисплея к RP2040-Zero
Сегодня запаял контактные гребенки в плату и проверил работу OLED дисплея с RP2040. В результате убедился, что:
- Дисплей отлично работает от 3.3 В.
- Переназначать выводы I2C интерфейса очень просто.
- Библиотека GyverOLED приколочена гвоздями к первому интерфейсу I2C (в RP2040 их два). Для того, чтобы она работала на втором интерфейсе надо либо по всей библиотеке заменить
Wire
наWire1
, либо сделать адаптацию библиотеки для RP2040-Zero (не хочу делать ни то, ни другое).
В общем, вопрос с подключением дисплея и использованием библиотеки GyverOLED на RP2040-Zero закрыт.
И видос:
Минутка хорошей музыки
Я нашёл отличный редактор MIDI
Для написания мелодий ударных инструментов для автоаккомпанемента.
Как можно догадаться, это онлайн-редактор. Прямо из браузера. Максимально простой с одной стороны, и позволяющий редактировать поток «сырых» MIDI команд. Это важно для того, чтобы убрать разные левые команды, которые будут мешать нормальной работе движка автоаккомпанемента.
И, что хорошо, он умеет соединяться с внешними звуковыми модулями, подключенными по USB и проигрывать на них текущую мелодию. Писать мелодию надо с тем же синтезатором, на котором она будет проигрываться.
Я даже думаю, что будет правильным встраивать выбор т.н. «драмсета» (не соображу, каким должен быть русский аналог этого слова) в сам MIDI-файл.
Приехали микроконтроллеры для 2-й версии баяна
Почти все детальки теперь есть:
- сами платы RP2040 Zero (взял 3 штуки на всякий случай — по 167 р. за штуку)
- модули SD карты (2 штуки на всякий случай — почему бы нет? Они стоят по 70 р. за штуку)
- панельки для EEPROM памяти
- 5 микросхем EEPROM памяти на 16 kb — по 16 рублей за штуку
В микроконтроллере своей EEPROM памяти нет, надо будет лепить внешнюю.
Вообще, я для экспериментов на макетке заказал ещё спец-модуль (за 80 р.). Но он еще из Китая не выехал; почему-то почтой отправили. Однако, если дело дойдёт до написания интерфейса к EEPROM раньше, чем приедет модуль, придётся втыкать в макетку голую микросхему, и городить обвязку самому. Там несложно.
И модули преобразователя напряжения не приехали ещё. Этому микроконтроллеру надо 3.3 В. Так что 2-я версия баяна будет вся 3-х вольтовая. Регистры и датчики Холла, очень надеюсь, нормально заработают от 3 вольт (судя по даташитам, должны заработать без проблем).
Один микроконтроллер я уже распаковал и проверил. К компу подключается, прошивка в него загружается. Единственное — если грузить прошивку в него с помощью arduino-cli, то надо контроллер втыкать в USB порт с нажатой кнопкой «boot», иначе оно контроллер не видит. (Arduino IDE отлично загружает прошивку без кнопки, но я в IDE работать не люблю; у меня всё настроено в VIM-e).
В качестве проверочной программы я использовал пример кода, работающего на двух ядрах контроллера. Оно реально работает. Прикольно. Эта штука очень пригодится, потому что я намерен авто-аккомпанемент вынести на второе ядро; как раз это ресурсоёмкая изолированная задача, которую стоит отделить от основного функционала.
Теперь надо осваивать новый контроллер:
- научиться подключать OLED экранчик
- научиться подключать EEPROM память
- научиться читать SD-карты памяти
- подключить радиомодуль
В общем, задачи есть.
Очень рекомендую
Вчера вороне бог послал кусочек сыра. В виде звукового модуля MB Music Pro.DX.
Я, конечно, знал, что он хорош (на сайте есть примеры звучания). Но личный опыт — это личный опыт.
Отчаянно рекомендую этот модуль всем, кто всё ещё выбирает себе синтезатор, но ещё не выбрал. В нём просто премиальный набор звуков. И даже аккордеоны там присутствуют в достаточном количестве, и даже «простой баянный» звук там есть (называется «Reed Organ», но мной этот звук воспринимается именно как баянный). Само собой, органные звуки на высоте все без исключения.
Басовые звуки — моё почтение! Контрабасов (струнных) аж три, и звучат они очень натурально.
Чтение MIDI-файлов
Я нашёл вчера вечером шикарный исходник для чтения MIDI файлов: https://github.com/velipso/basicmidi.
Оно компилируется, работает, и позволяет заглянуть в потроха MIDI файлов.
Правда, оно написано но новой модной версии С++, позволяющей удивительные (для старого меня) конструкции — см. рис. 1. И требующей установить компилятор clang.
Понятно, придётся всё это адаптировать к ардуиновскому С++. Но пока я считаю, что это самый короткий путь для меня чтобы получить код, сканирующий любой MIDI файл и позволяюший мне узнать про этот файл всё, что мне надо.
Отдельное удивление вызвал факт, что программа LMMS (которую я использую для создания MIDI файлов) задаёт темп воспроизведения не в заголовке MIDI файла (как я ожидал после изучения формата MIDI файлов), а с помощью МЕТА-команды. Это несколько усложняет дело, но уже хорошо, что я знаю, как там задаётся темп на самом деле.