Я создаю эти музыкальные секвенсоры .
Только это не совсем секвенсор, это физический интерфейс для секвенсора. Секвенсор - это приложение, которое работает на ноутбуке, к которому подключается секвенсор, и позволяет пользователю создавать барабанные петли на лету. Это довольно весело, но для этого нужен ноутбук, потому что секвенсор не «встроен».
То, что я хотел бы, чтобы сделать последовательность на борту моего устройства.
Теперь давайте предположим, что я знаю, как найти соответствие классу для подключения USB MIDI, и давайте также предположим, что я могу выяснить, как подключить arduino для отправки MIDI-нот через 5-контактный порт DIN. Больше всего меня беспокоит сдвиг темпа во времени из-за непоследовательной синхронизации минутных значений во время каждого цикла цикла событий.
Некоторые вещи, которые я знаю:
Вы не должны полагаться на
delay()
контроль петли темпа. Задержка останавливает все операции прошивки, и это не может работать, потому что мне нужно опросить физический интерфейс пользователя на предмет изменений во время выполнения последовательности.Расчеты на основе
millis()
лучше, потому что прошивка может продолжать работать и действовать после истечения определенного количества.Даже при том, что ни один из моих физических элементов управления не вызывает подпрограммы прерывания, некоторые операции могут задержать
loop()
запуск основного . Если я спроектирую функцию, которая ожидает пользовательского ввода, то это, очевидно, может вызвать проблему пропуска «крайнего срока», чтобы действовать, еслиmillis()
счет окончен. Я знаю, что это проблема моего собственного дизайна ...
Вопросы:
A. Является ли основанный на AVR arduino подходящим микроконтроллером для опроса пользовательского интерфейса и запуска критически важного цикла синхронизации? Я знаю, что теперь есть Arduino на базе ARM, который работает намного быстрее. Будет ли Teensy 3.0 лучшей альтернативой? Обе эти платы имеют напряжение 3,3 В, так что это еще один набор проблем для работы ... но я пока проигнорирую это.
B. Должен ли я разделить задачу на два микропроцессора? Один для обработки опроса и обновления пользовательского интерфейса и один для критически важного цикла синхронизации.
с. Что-то другое?
Моя главная цель - вообще не использовать компьютер. Я также хочу рассчитывать на свинг, но в этом случае свинг ничего не значит, если у меня нет фиксированного и синхронизированного с точным темпом темпа. Спасибо за ваш совет!
noInterrupts();
останавливает дрожание, но также останавливает все нужные прерывания.Ответы:
Прерывания - ваш друг для выполнения чувствительных к времени задач, но только в том случае, если вы добавляете критические аспекты синхронизации к прерыванию, и не происходит никаких других прерываний с более высоким приоритетом. Микроконтроллеры на Arduino «на базе AVR» (например, ATmega328P) имеют фиксированные приоритеты прерываний, как подробно описано на странице 58ff таблицы данных . Поэтому, если вы использовали TIMER2 COMPA в качестве критического прерывания по времени, и никаких других прерываний у вас не должно быть проблем (так как он имеет самый высокий приоритет). Если вы также хотите использовать прерывания с более низким приоритетом, вам необходимо убедиться, что все они повторно включают глобальные прерывания при входе в свою подпрограмму обработки прерываний:
(стр. 14 таблицы )
В Arduinos на основе ARM это немного отличается, так как их ядро Cortex-M3 имеет «Nested Vector Interrupt Controller», где приоритеты не фиксированы (могут быть установлены в программном обеспечении), а обработка вложенных прерываний является нормой. Таким образом, для приложений, критичных по времени, Arduino на базе ARM обеспечит вам большую гибкость. Однако я не думаю, что это действительно необходимо для вашего приложения.
Главный вопрос заключается в том, насколько легко эти вещи можно реализовать с помощью библиотек Arduino. Чтобы добиться максимальной производительности, вам, вероятно, придется до некоторой степени кодировать за пределами библиотек, по крайней мере, для битов, критичных по времени, то есть избегать таких вещей, как delay () или millis () в целом.
Требуется ли разделение, зависит от того, сколько обработки вы намереваетесь выполнить. Опять же, выход за пределы библиотек потенциально может повысить производительность.
источник
Это может, при соответствующем программировании, определенно быть сделано на ATmega328P (в некоторой степени зависящей от сложности барабанной петли. Я предполагаю, что <<50 событий барабана в петле. Это разумно?).
Обратите внимание, что я сказал ATmega328P , не обязательно Arduino .
В среде Arduino в фоновом режиме происходит множество вещей по умолчанию, что делает чрезвычайно детерминированное программирование (так как вам нужно что-то критичное по времени) сложным.
Реальный вопрос, который вам нужно здесь задать, заключается в том, насколько вы заинтересованы в программировании, и насколько вы заинтересованы в разработке инструмента?
Хотя я совершенно уверен, что на одном ATmega можно делать все, что вы хотите (петлевая петля, несколько аналоговых входов, ЖК-дисплей, кнопки, интерфейс MIDI), но на самом деле вопрос в том, во сколько все это уложится? Опять же, вы хотите научиться оптимизировать встроенный код MCU или создавать инструменты? Это довольно легко , если нужно просто перейти на более быстрый MCU, но вы должны определить производительность MCU вам нужно прямо сейчас , так что шесть месяцев работы, вы не понимаете , что вы не можете вполне получить все для работы так же быстро , как вы нужно.
Если бы я был на вашем месте, первое, что я сделал бы, это заставило бы его работать без Arduino (в основном, относиться к нему как к сырому ATmega и использовать AVR studio или подобное). Затем вы сможете намного более эффективно проанализировать, какая производительность вам нужна, и сможет ли ATmega управлять ею.
Как только вы освободитесь от Arduino, вы сможете использовать разные микроконтроллеры (они, как правило, больше похожи, чем разные. Если вы можете найти один из его документации, вы, вероятно, можете сделать то же самое для других).
Я недавно много работал с устройствами ATxmega, и они действительно хороши. Вы получаете три приоритета прерываний, которые упрощают управление критичными по времени вещами. С ними также очень приятно работать (Sane периферийные конструкции! Удобные портовые конструкции! И т.д ...).
Есть также устройства LPC от NXP, основанные на ARM, а также некоторые устройства Atmel ARM (используемые в Arduino Due) или микроконтроллеры STM32 от ST. Любой из них будет иметь значительно большую производительность, чем ATmega или даже ATxmega.
Основным недостатком более крупного и более мощного процессора является цена, но если вы не будете производить тысячи таких устройств, затраты на сборку и изготовление на единицу будут значительно превышать разницу в стоимости (которая, вероятно, составит всего несколько долларов). ) что это в принципе не имеет значения.
источник
Мне нужно было почитать о таймерах, прежде чем я начал думать о точности синхронизации (также создавал миди-шаговый секвенсор с Arduino, хотя он гарантированно будет выглядеть не так круто, как эти ^^). Эта серия статей была наиболее информативной:
http://maxembedded.com/category/microcontrollers-2/atmel-avr/avr-timers-atmel-avr/
Прямо сейчас я думаю, что мое решение для получения точного времени будет.
А. Используйте AVR Arduino
Б. Держите задачу на одном микропроцессоре
C. Мудро используйте прескалеры, таймеры и прерывания, чтобы получить необходимую точность.
ОБНОВИТЬ
Использование базового миди учебника для Arduino и после просмотра этой статьи о таймерах и прескалерах, я пришел к следующему коду. Код использует таймер 1 и режим CTC для воспроизведения миди-ноты каждую четверть секунды и ноты каждую четверть секунды (что должно быть ровно 120 ударов в минуту). К сожалению, это все еще идет медленнее, чем 120 ударов в минуту, хотя это самое близкое, что я получил ...
ОБНОВИТЬ
Я боролся с этим в течение ~ 24 часов и наконец получил ответы на форуме. Я думаю, что код, который я использовал выше ^^, довольно хорош. Использование ISR, использование режима CTC, прескалеров и т. Д. После обращения к форуму я думаю, что решение заключается не столько в достижении точности на миди-секвенсоре, сколько в том, чтобы все мои аппаратные настройки (мои синтезаторы и сэмплеры) были подключены к одному и тому же. Миди-часы, будь или нет часы от Arduino.
источник
В зависимости от того, насколько постепенно вы хотите перейти от привязанного компьютера к системе на основе микроконтроллера, вы можете рассмотреть возможность размещения Raspberry Pi внутри этой коробки ( розничная цена 25-35 долларов ). Таким образом, у вас может быть полноценный (хотя и маломощный) компьютер на базе Linux с портами USB и выводами GPIO.
источник