Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Контроллер дыхания Arduino для дешевых (USB-MIDI)

Компоненты и расходные материалы

Arduino Micro
Возможно, вы могли бы снизить стоимость с помощью клона, но я рекомендую оригинал. Только Micro (ATmega32U4) будет работать из-за встроенных возможностей USB.
× 1
половинный размер макетной платы без пайки
× 1
Датчик давления MPS20N0040D-D
Грязь дешево, и ее довольно легко найти.
× 1
Операционный усилитель LM358-N
Мы будем использовать популярный операционный усилитель LM358 для усиления сигнала датчика.
× 1
Резистор 1 МОм
× 2
Комплект проводов для подключения, 22 AWG
Вам, конечно, не нужен полный комплект, всего несколько сантиметров одножильного провода.
× 1
назальный аспиратор для младенцев
Ага, вы правильно прочитали. Мы будем использовать мундштук со стороны родителей и аспиратор со стороны ребенка. Существуют десятки однотипных ручных аспираторов (например, Physiomer Nasal Aspirator, Chicco Physioclean и т. Д.). Выберите наиболее удобный тип мундштука.
× 1
5-миллиметровая трубка для аквариума для авиалинии
Необязательно, если трубка аспиратора недостаточно длинна. Подойдут стандартные трубки для аквариумов.
× 1
3-сторонний соединитель для воздуховодов
Этот конкретный китайский OEM-производитель можно легко найти в магазинах аквариумов под разными названиями. Устанавливается прямо на датчик.
× 1

Необходимые инструменты и машины

Инструмент для зачистки и резки проводов, 32-20 AWG / 0,05-0,5 одножильные и многожильные провода, мм²

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Введение

В этом проекте мы создадим простой USB-MIDI-контроллер дыхания, работающий по принципу plug-and-play. Он разработан с использованием простых в поиске дешевых компонентов, поэтому общая стоимость остается доступной и намного ниже коммерческих эквивалентов. Это базовая версия, в которой используется только датчик давления воздуха, но в планах - модернизировать ее, включив в нее датчик прикуса и кивка / наклона в будущем.

Проект предполагает наличие некоторых базовых знаний в области электроники и Arduino, но даже новичок может построить его, поскольку пайки не требуется. Конечно, более продвинутые пользователи могут паять все на постоянной плате. Я не рассказываю об установке IDE / библиотек и инструкциях по загрузке кода, так как в Интернете есть отличные руководства.

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

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

Шаги по созданию

1. Вставьте Arduino в макетную плату, как показано на фото / схеме.

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

3. Вставьте резисторы, отрезав их ножки до нужной длины.

4. Обрежьте / зачистите кабели с твердым сердечником и поместите их в соответствующие места. Я использовал красный для 5 В, черный для заземления и желтый для сигнала, чтобы упростить понимание, но вы, конечно, можете использовать все, что у вас есть.

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

6. Нажмите на 3-контактный разъем, чтобы он вошел в датчик. Он должен оставаться на месте.

7. Установите Arduino IDE и установите две необходимые библиотеки (передискретизация и USB-MIDI) из Инструменты-> Управление библиотеками. Подключите Arduino к компьютеру с помощью USB-кабеля. Загрузите прикрепленный код.

8. Вы должны быть настроены, теперь Arduino должен отображаться как MIDI-устройство в вашем DAW / музыкальном программном обеспечении. Включите его и направьте вместе с клавиатурой в подключаемый модуль, поддерживающий контроллер дыхания.

Дополнительная информация

Одним из физических недостатков этой конструкции является то, что слюна неизбежно течет по трубке и может вызывать заметные колебания воздушного потока. Трехходовой соединитель используется для решения этой проблемы путем направления слюны в «выхлопную» трубку. Чтобы свести к минимуму застревание слюны в трубке, убедитесь, что есть непрерывный наклон от мундштука к трехходовому соединителю, отрегулировав длину трубки. Если трубка висит ниже уровня 3-стороннего соединителя, слюна будет задерживаться в ее нижней точке, вызывая колебания. Часть аспиратора со стороны ребенка, включая его фильтр, прикреплена к выхлопной трубе, чтобы минимизировать капание, а также шум и увеличить поток воздуха к датчику.

В коде есть значения, которые вы можете настроить по своему вкусу, в том числе пользовательские кривые. В комментариях описано, как это сделать. Если вам трудно достичь 127 баллов, уменьшите максимальный диапазон или, если это слишком легко, увеличьте его. Каждый раз, когда вы меняете значения, вам нужно будет повторно загрузить код.

Первые несколько показаний после загрузки Arduino усредняются для калибровки положения покоя. Не дуйте в трубку при подключении / сбросе устройства.

Вы можете изменить имя MIDI-устройства, отредактировав файлboards.txt (информация о том, как это сделать для каждой платформы, доступна в Интернете).

Код

  • Код контроллера дыхания
Код контроллера дыхания Arduino
Загрузите этот код в свой контроллер дыхания через Arduino IDE
 / * Breath Controller * /// Используемые библиотеки - установите их из Tools-> Manage Libraries # include  #include  // Режим отладки (раскомментируйте, чтобы включить) // # define DEBUG 1 // Создание интерфейса USB MIDIUSBMIDI_CREATE_DEFAULT_INSTANCE (); // Передискретизация initOversampling adc (10, 13, 6); // *********** ****** Настройка пользователя ***************** // Значения, оканчивающиеся на 1, соответствуют дутью, а значения, оканчивающимся на 2, - втягиванию в воздух // Настройка пина const int sensorPin1 =A0; // выбираем входной контакт Arduino для выхода датчика / операционного усилителя // Калибровка диапазона. Настройте это вручную так, чтобы вы могли достичь максимума, но не слишком легко. Int sensorRange1 =800; int sensorRange2 =800; // Номер контроллера вывода. Выберите из приведенной ниже таблицы // 0-127:обычные сообщения об изменении управления // 128:монофоническое послекасание // 129:Pitch Bend Up // 130:Pitch Bend Down int controllerNumber1 =2; // Контроллер отправляется при продувке. ControllerNumber2 =2; // Контроллер отправляется при рисовании в воздухе // Выходные каналы контроллераint controllerChannel1 =1; int controllerChannel2 =1; // Пороги безопасности для минимальных и максимальных значений, чтобы избежать колебаний в состоянии покоя или макс. // Если в состоянии покоя отправлено несколько сообщений, увеличьте значение lowThreshold. // Если при максимальном значении отправлено несколько сообщений, увеличьте значение highThreshold. const int lowThreshold1 =5; const int lowThreshold2 =5; const int highThreshold1 =0; const int highThreshold2 =0; // Определение кривой. Таблицы могут иметь любую длину, равную или больше 2. Значения могут быть от 0 до 127. Таблицы должны иметь одинаковое количество элементов, а таблицы «входящие» должны располагаться в порядке возрастания. // Преобразования выполняются на уровне чтения, поэтому потеря определения минимальна. Int in1 [] ={0, 127}; int out1 [] ={0, 127}; int in2 [] ={0, 127}; int out2 [] ={0, 127}; // Пример кривых (соответственно измените номер датчика) // Soft // int in1 [] ={ 0, 6,24,78,127}; // int out1 [] ={0,32,64,96,127}; // Уменьшенный диапазон // int in1 [] ={50, 100}; // int out1 [] ={50, 100}; // Цикл обновления (миллисекунды). Меньшие значения означают, что во время работы отправляется больше сообщений. Int refreshCycle =0; // ***************** Реализация *************** ** // Не изменяйте с этого момента и далее, если вы не собираетесь изменять работу датчика. // Внутреннее значение Sensorsint sensorValue1 =0; int sensorValue2 =0; // Минимальные значения датчика int sensorMin1; int sensorMin2; // Значения контроллера вывода int controllerValue1 =0; int controllerValue2 =0; // Значения предыдущего цикла, используемые для предотвращения повторения идентичных сообщений int previousControllerValue1 =0; int previousControllerValue2 =0; // Переменная преобразования диапазона initint outputRange1; int outputRange2; int sensorLow1; int sensorLow2; int sensorHigh1; int sensorHigh2; void setup () {MIDI.begin (1); # ifdef DEBUG Serial.begin (115200); // Только для режима отладки # endif // Калибровка точки покоя датчика путем усреднения 10 первых значений. Не используйте датчик при загрузке устройства. sensorMin1 =adc.read (sensorPin1); sensorMin2 =0; // Определяем выходные диапазоны для выбранных контроллеров outputRange1 =outputRange (controllerNumber1); outputRange2 =outputRange (controllerNumber2);} void loop () {// считываем значение с датчика:sensorValue1 =adc.read (sensorPin1); // Датчик приточного воздухаValue2 =sensorMin1 - sensorValue1; // Рисование в воздухе // Сохранение предыдущих значений previousControllerValue1 =controllerValue1; previousControllerValue2 =controllerValue2; // Используемые пределы диапазона для датчика вверх / вниз sensorLow1 =sensorMin1 + lowThreshold1; sensorLow2 =sensorMin2 + lowThreshold2; sensorHigh1 =sensorLow1 + sensorRange1 - highThreshold1; sensorHigh2 =min (sensorMin1, sensorRange2) - highThreshold2; // Преобразование внутренних значений в выходной диапазон (0..127 для контроллеров / послекасание 0 .. + / - 8191 для Pitchbend Up / Down) с использованием кривых, определенных в "in" и "вне" столов. controllerValue1 =map (mapToCurve (constrain (sensorValue1, sensorLow1, sensorHigh1), sensorLow1, sensorHigh1, in1, out1, sizeof (in1) / sizeof (int)), sensorLow1, sensorHigh1,0, outputRange1); controllerValue2 =map (mapToCurve (constrain (sensorValue2, sensorLow2, sensorHigh2), sensorLow2, sensorHigh2, in2, out2, sizeof (in2) / sizeof (int)), sensorLow2, sensorHigh2,0, outputRange2); // Отправляет MIDI-сообщения if ( controllerValue1! =previousControllerValue1) sendSensorOutput (controllerNumber1, controllerValue1, controllerChannel1); if (controllerValue2! =previousControllerValue2) sendSensorOutput (controllerNumber2, controllerValue2, controllerChannel2); // Отладка # ifdef DEBUG // Значения датчика (входные) (раскомментируйте для отладки) // Serial.print (sensorValue1); // Serial.print (" , "); // Serial.print (sensorValue2); // Serial.print (", "); // Контроллер (вывод) значения Serial.print (controllerValue1); Serial.print (","); Serial.println (controllerValue2); # endif // останавливаем программу на  миллисекунд:delay (refreshCycle);} // Функция, используемая для отправки MIDI-сообщений в соответствии с номером контроллераvoid sendSensorOutput (int number, int value, int channel) {если (число <128) MIDI.sendControlChange (число, значение, канал); иначе, если (число ==128) MIDI.sendAfterTouch (значение, канал); иначе, если (число ==129) MIDI.sendPitchBend (значение, канал); else if (number ==130) MIDI.sendPitchBend (-value, channel);} // Функция, используемая для определения диапазона конкретного контроллера. Это связано с тем, что диапазон изменения высоты тона больше, чем у обычных контроллеров. Int outputRange (int number) {if (number> 128) return 8191; else return 127;} // Модифицированная функция multiMap, используемая для создания кривых. Оригинал Роба Тиллаарта. Int mapToCurve (int val, int sensorLow, int sensorHigh, int * _in, int * _out, uint8_t size) {// убедитесь, что значение находится в пределах диапазона // val =constrain (val, _in [0] , _in [размер-1]); if (val <=map (_in [0], 0,127, sensorLow, sensorHigh)) return map (_out [0], 0,127, sensorLow, sensorHigh); if (val> =map (_in [размер-1], 0,127, sensorLow, sensorHigh)) return map (_out [size-1], 0,127, sensorLow, sensorHigh); // поиск правого интервала uint8_t pos =1; // _in [0] уже протестирован while (val> map (_in [pos], 0,127, sensorLow, sensorHigh)) pos ++; // регулировка диапазона от ..127 до диапазона датчика int inPos =map (_in [pos], 0,127, sensorLow, sensorHigh); int outPos =map (_out [pos], 0,127, sensorLow, sensorHigh); int inPrv =map (_in [pos-1], 0,127, sensorLow, sensorHigh); int outPrv =map (_out [pos-1], 0,127, sensorLow, sensorHigh); // это обработает все точные «точки» в массиве _in if (val ==inPos) return outPos; // интерполируем в правый сегмент для остальных return ((long) val - (long) inPrv) * ((long) outPos - (long) outPrv) / ((long) inPos - (long) inPrv) + (long) outPrv;} 

Схема

Схема Fritzing Схема электрической лаборатории

Производственный процесс

  1. ЖК-панель с Arduino для симулятора полета
  2. Веб-контроллер DMX
  3. Игровой контроллер Arduino
  4. Unopad - MIDI-контроллер Arduino с Ableton
  5. Телепорт текста
  6. Контроллер вакуумного люминесцентного дисплея
  7. Домашний контроллер Arduino, активированный Alexa
  8. Мониторинг температуры SMART для школ
  9. Изолированный аналоговый вход для Arduino
  10. Робот для супер-крутой навигации внутри помещений