Съдържание:
- Стъпка 1: Теория на операцията
- Стъпка 2: Части и инструменти
- Стъпка 3: Запояване и сглобяване
- Стъпка 4: Програмиране A: Arduino
- Стъпка 5: Програмиране B: Python и потребителски интерфейс
Видео: MIDI барабанен комплект на Python и Arduino: 5 стъпки (със снимки)
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:50
Винаги съм искал да си купя барабанен комплект от малък. Тогава цялото музикално оборудване нямаше всички цифрови приложения, каквито имаме в днешно време, следователно цените заедно с очакванията бяха твърде високи. Наскоро реших да купя най -евтиния комплект барабани от eBay, с единствения приоритет: Възможност да го съборя и да прикрепя свой собствен хардуер и софтуер към устройството.
Покупката изобщо не беше разочароваща: Преносим комплект за барабани с 9 различни звукови накладки, два педала за превключване за ударния барабан и хай-хет и микро-USB гнездо за захранване. Това, което наистина беше демотивиращо, това са изходните звуци (Действителната употреба на този комплект е да свържете външен високоговорител и да му се насладите). И така, реших да го конвертирам в свой собствен програмируем чрез USB, MIDI барабанен комплект на базата на Arduino и потребителски интерфейс на базата на Python, за удобна употреба и лесни модификации като избор на сила на звука, бележка и канал.
Характеристики на устройството:
- Ниска цена
- Създаване на комплект барабани от всякакви цифрови входове - дори набор от бутони
- Поддръжка на комуникация и захранване само чрез USB интерфейс - Интеграция на USB към UART конвертор и Arduino устройство
- Минимални части за правилна работа
- Лесен за използване интерфейс, базиран на Python
- Пълна поддръжка на MIDI с регулируема скорост, бележки и щифтове Arduino
- Запазване и зареждане на персонализирани конфигурации на барабана, съхранявани в паметта на устройството
Нека преминем към проекта …
Стъпка 1: Теория на операцията
Блокова диаграма
Първо, нека се съсредоточим върху структурата на проекта и да го разделим на отделни блокове:
Roll-Up барабанен комплект
Основното звено на проекта. Състои се от 9 отделни барабанни тампона, където всеки тампон е масив от бутони, които променят логическото си състояние, докато са ударени. Поради неговата структура, има възможност да се конструира този конкретен комплект барабани от всякакви бутони. Всяка барабанна подложка е свързана към издърпващия се резистор на основната електронна платка, като по този начин, докато барабанната подложка се удря многократно, специфичен превключвател е свързан към земята на веригата и логическото LOW присъства на линията на барабанните тампони. Когато няма приложено налягане, превключвателят на барабанната подложка е отворен и поради издърпващия се резистор към захранващата линия, логическата HIGH присъства на линията на барабанните тампони. Тъй като целта на проекта е да създаде цялостно цифрово MIDI устройство, всички аналогови части на основната платка могат да бъдат пренебрегнати. Важно е да се отбележи, че барабанният комплект има два педала за ударни барабани и хай-хет, които също са свързани към издърпващите се резистори и споделят същата логика на действие като всички барабанни накладки (Ще го обсъдим малко по-късно).
Arduino Pro-Micro
Мозъкът на барабанен комплект. Целта му е да открие дали има сигнал, излизащ от барабанната подложка, и да осигури подходящ MIDI изход с всички необходими параметри: Забележка, скорост и продължителност на сигнала. Поради цифровата природа на барабанните подложки, те могат просто да бъдат свързани към цифрови входове arduino (общо 10 пина). За да съхраним всички желани настройки и MIDI информация, ще използваме нейната памет-EEPROM, следователно всеки път, когато включваме устройството, MIDI информацията се зарежда от EEPROM, което го прави препрограмируемо и преконфигурируемо. Също така, Arduino Pro-Micro се предлага в много малка опаковка и може лесно да се разпредели във вътрешния корпус на барабанния комплект.
FTDI USB към сериен конвертор
За да програмираме и дефинираме функциите на нашето устройство с помощта на компютърно приложение, е необходимо да преобразуваме USB интерфейса в сериен, тъй като Arduino Pro-Micro няма USB. Тъй като комуникацията между устройствата се основава на UART, FTDI устройството се използва в този проект, поради своята простота на използване, независимо от допълнителните му свойства.
PC приложение - Python
Що се отнася до разработването на потребителски интерфейси и проекти за бързо изграждане, Python е превъзходно решение. Целта на приложението на потребителския интерфейс е да направи много по -удобно да предефинира MIDI свойствата за нашия комплект барабани, да съхранява информация, програмно устройство и да осъществява комуникация между системите, без да е необходимо компилиране на кода отново и отново. Тъй като използваме сериен интерфейс за комуникация с барабанен комплект, в интернет има много безплатни модули, които поддържат всякакви видове серийни комуникации. Освен това, както ще бъде обсъдено по -късно, UART интерфейсът се състои от общо три пина: RXD, TXD и DTR. DTR се използва за извършване на нулиране на модула Arduino, така че когато се интересуваме от стартиране на MIDI приложение или свързване на потребителски интерфейс към програмиращо устройство, няма абсолютно никаква нужда от повторно свързване на USB кабел или каквото и да е друго.
Стъпка 2: Части и инструменти
Части
- Roll-Up барабанен комплект
- 2 x Sustain педала (обикновено са включени в пакета DK).
- FTDI - USB към сериен конвертор
- Arduino Pro Micro
- Micro-USB кабел
Инструменти
- Поялник/станция
- Калай за запояване
- Едножилен проводник с тънък диаметър
- Пинсети
- Фреза
- Клещи
- Нож
- Отвертка
- 3D принтер (по избор - за персонализирани педални платформи)
Софтуер
- Arduino IDE
- Python 3 или по -висока
- JetBrains Pycharm
- MIDI интерфейс без коса
- loopMIDI
Стъпка 3: Запояване и сглобяване
Тъй като има три модула, които трябва да бъдат комбинирани, процесът на запояване и сглобяване е кратък и прост:
-
Свържете заедно Arduino Pro-Micro с FTDI устройство, уверете се, че връзките са в съответствие с I/O, определени на всяко устройство:
- VBUS-VBUS
- GND-GND
- DTR-DTR
- RXD-TXD
- TXD-RXD
- Отстранете всички винтове от пластмасовия корпус на барабана, уверете се, че можете да се съсредоточите върху кабела от подложка към платката и неговите издърпващи се резистори
-
Запоявайте тънки проводници за модул Arduino-FTDI, които сме конструирали по-рано:
- Цифрови входове: D [2:11]
- VBUS
- D+
- Д-
- GND
- Поставете модула в кутията на батерията, така че проводниците да плават от същата страна като издърпващите се резистори на подложките
- Запоявайте всички цифрови входове към клемите на барабанната подложка, както е показано на последната фигура.
- Запоявайте микро-USB шина (VBUS, D+, D-, GND) към FTDI устройство, уверете се, че няма грешки при проследяването на тези проводници.
- Прикрепете модула Arduino-FTDI с горещо лепило към кутията на батерията
- Сглобете устройството с подходяща приставка за винтове
Направихме го, устройството е сглобено. Нека да продължим към кода …
Стъпка 4: Програмиране A: Arduino
Нека опишем нашата скица стъпка по стъпка:
На първо място, трябва да се включат две необходими библиотеки за правилната работа. EEPROM вече е предварително инсталиран в Arduino IDE, но модулът debouncer за ударния барабан трябва да се инсталира отделно
#включи #включи
Тези ключове се използват главно за отстраняване на грешки в последователности. Ако искате да изпробвате връзката на терминалите Arduino към барабанните накладки и да определите всички цифрови входове, тези превключватели трябва да бъдат дефинирани
/ * Превключватели за програмисти: Декомментирайте желания режим за отстраняване на грешки или инициализиране * ///#дефинирайте LOAD_DEFAULT_VALUES // Заредете константни стойности вместо EEPROM //#дефинирайте PRINT_PADS_PIN_NUMBERS // Отпечатайте PIN номер, който е свързан към подложка, която е била ударена през сериен порт
Постоянните полета представляват всички стойности по подразбиране, включително изброяването на барабанните тампони. За да стартирате устройството за първи път, трябва да знаете точната връзка на Hi-Hat и Kick педалите
/ * Изброяване на типа барабан */
изброяване DRUM_POSITION {KICK = 0, SNARE, HIHAT, RIDE, CYMBAL1, CYMBAL2, TOM_HIGH, TOM_MID, TOM_LO, HIHAT_PEDAL};
/ * Стойности по подразбиране */
const uint8_t DRUM_NOTES [10] = {36, 40, 42, 51, 49, 55, 47, 45, 43, 48}; const uint8_t DRUM_VELOCITIES [10] = {110, 100, 100, 110, 110, 110, 110, 110, 110, 110}; const uint8_t DRUM_PINS [10] = {8, 6, 4, 3, 11, 9, 5, 10, 2, 7};
/ * Продължителност на изтичане на барабана */
const uint8_t KICK_DB_DURATION = 30;
EEPROM се използва за съхраняване/зареждане на всички данни, идващи от компютърно приложение. Обхватът на адресите, описан по -горе, показва точно местоположение за MIDI информация за всеки барабанен тампон
/* Съпоставяне на адреси на EEPROM
Бележки: | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 |
Щифтове: | 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13 | Скорости | 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23 | */ const uint8_t ЗАБЕЛЕЖКИ_ADDR = 0x00; const uint8_t VELOCITIES_ADDR = 0x14; const uint8_t PINS_ADDR = 0x0A;
Глобалните променливи се използват за определяне на състоянието на всяка подложка и съответно осъществяване на MIDI комуникация
/ * Глобални променливи */
uint8_t drumNotes [10], drumVelocities [10], drumPins [10]; // MIDI променливи
uint8_t uartBuffer [64]; // UART буфер за събиране и съхраняване на MIDI Data Debouncer удар (DRUM_PINS [KICK], KICK_DB_DURATION); // Обект Debouncer за летлив bool на ударния барабан previousState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Предишни логически състояния на барабанната подложка променливи bool currentState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Текущи логически състояния на барабана
Функции на EEPROM
/* Съхранявайте настройките в EEPROM*/
void storeEEPROM () {
memcpy (drumNotes, uartBuffer, 10); memcpy (drumPins, uartBuffer + 10, 10); memcpy (drumVelocities, uartBuffer + 20, 10); for (uint8_t i = 0; i <10; i ++) EEPROM.write (NOTES_ADDR+i, drumNotes ); за (uint8_t i = 0; i <10; i ++) EEPROM.write (PINS_ADDR+i, drumPins ); for (uint8_t i = 0; i <10; i ++) EEPROM.write (VELOCITIES_ADDR+i, drumVelocities ); }
/* Заредете настройките от EEPROM*/
void loadEEPROM () {for (uint8_t i = 0; i <10; i ++) drumNotes = EEPROM.read (NOTES_ADDR+i); for (uint8_t i = 0; i <10; i ++) drumPins = EEPROM.read (PINS_ADDR+i); for (uint8_t i = 0; i <10; i ++) drumVelocities = EEPROM.read (VELOCITIES_ADDR+i); }
Инициализиране на променливи и режим на програмиране, в случай на педали и зареждане на Arduino се активират едновременно
void enterProgrammingMode () {
bool confirmBreak = false; uint8_t lineCnt = 0; uint8_t charCnt = 0; char readChar = 0; while (! confirmBreak) {if (Serial.available ()) {uartBuffer [charCnt] = Serial.read (); if (charCnt> = 29) confirmBreak = true; else charCnt ++; }} Serial.println ("OK"); storeEEPROM (); }
void initValues () {
#ifdef LOAD_DEFAULT_VALUES memcpy (drumNotes, DRUM_NOTES, 10); memcpy (drumVelocities, DRUM_VELOCITIES, 10); memcpy (drumPins, DRUM_PINS, 10); #else loadEEPROM (); #endif}
MIDI комуникационни манипулатори със закъснение от 1 ms време на задържане на бележка
/ * Възпроизвеждане на функция MIDI бележка */
void midiOut (изброяване DRUM_POSITION drumIn) {
if (drumIn == HIHAT) {// Ако HI-HAT е ударен, трябва да се провери дали педалът е натиснат, ако (! digitalRead (drumPins [HIHAT_PEDAL])) {noteOn (0x90, drumNotes [HIHAT_PEDAL], drumVelocities [HIHAT_PEDAL]); забавяне (1); noteOn (0x90, drumNotes [HIHAT_PEDAL], 0); } else {noteOn (0x90, drumNotes [HIHAT], drumVelocities [HIHAT]); забавяне (1); noteOn (0x90, drumNotes [HIHAT], 0); }} else {// Редовна барабанна MIDI предаване noteOn (0x90, drumNotes [drumIn], drumVelocities [drumIn]); забавяне (1); noteOn (0x90, drumNotes [drumIn], 0); }}
void noteOn (int cmd, int pitch, int velocity) {Serial.write (cmd); Serial.write (височина); Serial.write (скорост); }
setup () и loop () функции с безкраен цикъл на работа на устройството:
void setup () {
Serial.begin (115200);
for (uint8_t i = 0; i <10; i ++) {pinMode (i+2, INPUT); } #ifdef PRINT_PADS_PIN_NUMBERS while (true) {// Безкраен цикъл за отстраняване на грешки за (uint8_t i = 0; i <10; i ++) {if (! digitalRead (i+2)) {Serial.print ("Pin No: D"); Serial.print (i + '0'); // Преобразуване на номер в ASCII символ}}} #else initValues (); / * Режим на програмиране: Ако по време на зареждане са натиснати два педала - режимът е активиран */ if (! DigitalRead (drumPins [KICK]) &&! DigitalRead (drumPins [HIHAT_PEDAL])) enterProgrammingMode (); #endif}
void loop () {for (uint8_t i = 1; i <9; i = i + 1) {currentState = digitalRead (drumPins ); if (! currentState && previousState ) midiOut (i); // Сравняваме състояния и откриваме падащ ръб previousState = currentState ; } kick.update (); // Kick drum използва персонализиран алгоритъм за деблокиране if (kick.edge ()) if (kick.falling ()) midiOut (KICK); }
Стъпка 5: Програмиране B: Python и потребителски интерфейс
Потребителският интерфейс на Python е малко сложен за разбиране на пръв поглед, затова ще се опитаме да обясним неговите основи, как да използваме, каква функция има всеки бутон и как да програмираме правилно устройството Arduino.
Потребителски интерфейс - Приложение
Потребителският интерфейс е графично представяне за нашия програмист за барабани, което го прави наистина лесен за използване и удобен за програмиране на Arduino устройство по всяко време. Потребителският интерфейс се състои от няколко графични модула, които са обвързани с предложената им работа. нека ги прегледаме един по един:
- Изображение с набор от барабани: Потребителският интерфейс на Python използва координати на X-Y изображение, за да определи кой тип барабан е избран. Ако е избран валиден регион на барабана, се появява вторично IO съобщение с полета за бележка, скорост и Arduino терминал за специален барабанен тампон. След като тези параметри бъдат проверени от потребителя и одобрени, тези стойности могат да бъдат предадени директно на устройството Arduino.
- Изображение на външен контролер: За да можете да използвате MIDI барабанен комплект с VST/среда за създаване на музика, трябва да стартирате преводач Serial-To-MIDI. Използвах Hairless, който е достъпен безплатно и може да се стартира директно от нашия потребителски интерфейс, само чрез натискане на изображението му.
- Списък на COM портовете: За да комуникирате с Arduino, трябва да посочите прикачения му COM порт. Списъкът се обновява чрез натискане на бутона Обновяване.
- Зареждане/запазване на конфигурация: Има определени по подразбиране MIDI стойности, дефинирани в кода, които могат да бъдат променяни от потребителя чрез взаимодействие с потребителския интерфейс. Конфигурацията се дефинира във файла config.txt в определен формат, който може да бъде запазен или зареден от потребителя.
- Бутон за програмно устройство: За да съхраните всички модифицирани MIDI стойности в Arduino EEPROM, трябва да натиснете два крачни педала (Kick drum и Hi-hat педал) след това, изчакайте предаването на данните да завърши. Ако има проблеми с комуникацията, ще се покаже подходящ изскачащ прозорец. Ако предаването е успешно, потребителският интерфейс ще покаже своето успешно съобщение.
- Бутон за изход: Просто излезте от приложението, с разрешение на потребителя.
Акценти на Python Code
Има много неща, които се случват в кода, така че ще разгледаме по -скоро писаните функции, отколкото целия код.
На първо място, за да използвате потребителския интерфейс, трябва да изтеглите няколко модула, за да работи кодът:
импортиране, освен импортиране на нишки импортиране на tkinter като tk от tkinter импортиране на съобщение кутия от tkinter импортиране * от PIL внос ImageTk, импортиране на изображение numpy като np импортиране на сериен импорт glob
Някои от модулите са включени в стандартния пакет на Python. Няколко модула трябва да бъдат инсталирани чрез PIP инструмент:
pip install Pillow
pip install numpy pip install ScreenInfo
Силно се препоръчва да стартирате приложението чрез PyCharm. В бъдещите издания планирам да експортирам изпълним файл за проекта.
Кратко обяснение на кода
Ще бъде много по -лесно да разберем кода, ако погледнем неговите редове от гледна точка на функции и класове:
1. Основната функция - тук кодът започва
if _name_ == '_main_': drumkit_gui ()
2. Константи на Drum Kit, координати и MIDI информация по подразбиране
клас барабани: DRUM_TYPES = ["Kick", "Hihat", "Snare", "Crash 1", "Crash 2", "Tom High", "Tom Mid", "Tom Low", "Ride", "Hihat Pedal "," Контролер "]
COORDINATES_X = [323, 117, 205, 173, 565, 271, 386, 488, 487, 135, 79]
COORDINATES_Y = [268, 115, 192, 40, 29, 107, 104, 190, 71, 408, 208] DIMS_WIDTH = [60, 145, 130, 120, 120, 70, 70, 130, 120, 70, 145] DIMS_LENGTH = [60, 60, 80, 35, 35, 40, 40, 70, 35, 100, 50]
DRUM_ENUM = ["Kick", "Snare", "Hihat", "Ride", "Crash 1", "Crash 2", "Tom High", "Tom Mid", "Tom Low", "Hihat Pedal"]
DRUM_NOTES = [36, 40, 42, 51, 49, 55, 47, 45, 43, 48] DRUM_VELOCITIES = [110, 100, 100, 110, 110, 110, 110, 110, 110, 110] DRUM_PINS = [8, 6, 4, 3, 11, 9, 5, 10, 2, 7]
3. UI функции - Работа с потребителски интерфейс и графични обекти
def set_active (потребителски интерфейс)
def вторичен_ui (тип барабан)
class SelectionUi (tk. Frame)
клас Application (tk. Frame)
def drumkit_gui ()
def event_ui_clicked (събитие)
def getorigin (себе си, събитие)
4. Серийна комуникация
def get_serial_ports ()
def communication_with_arduino (порт)
5. Работа с файлове: Съхранявайте/зареждайте настройките от txt файла
def save_config ()
def load_config ()
6. Стартиране на външно приложение hairless.exe от кода, използвайки възможностите на Python Threading
клас ExternalExecutableThread (threading. Thread)
def run_hairless_executable ()
За да стартирате кода, има списък с файлове, които трябва да бъдат прикачени към папката на проекта:
- config.txt: Файл с настройки
- hairless.exe: MIDI конвертор без коса
- drumkit.png: Изображение, което определя всички щракащи барабанни накладки в нашия потребителски интерфейс (Трябва да се изтегли от набора от изображения на тази стъпка)
- drumgui.py: Кодът на проекта
Това е всичко, което трябва да подчертаем, за да работи. Много е важно да добавите файлове към проекта: изображение на барабана, изпълним файл hairless.exe и файл с настройки config.txt.
И.. Ето, свършихме!:)
Надявам се да намерите тази инструкция за полезна.
Благодаря за четенето!:)
Препоръчано:
Практически комплект за SMD запояване или Как се научих да спра да се притеснявам и да обичам евтиния китайски комплект: 6 стъпки
Практически комплект за SMD запояване или Как се научих да спра да се притеснявам и да обичам евтиния китайски комплект: Това не е инструкция за запояване. Това е инструкция за това как да се изгради евтин китайски комплект. Поговорката е, че получавате това, за което плащате, и ето какво получавате: Лошо документирано. Съмнително качество на частите. Няма поддръжка.Защо да купувате
CNC барабанен плотер: 13 стъпки (със снимки)
CNC барабанен плотер: а. Статии {размер на шрифта: 110.0%; тегло на шрифта: удебелен; стил на шрифта: курсив; декорация на текст: няма; background-color: red;} a.articles: hover {background-color: black;} Тази инструкция описва плотер A4/A3, направен от част от пластмасова пи
Прост барабанен робот Arduino: 5 стъпки
Прост Arduino Drum Robot: Ще призная. Направих този проект от чиста скука, след като бях заседнал вътре за няколко дни по време на поредица от малки, но проблемни снежни бури. Гледайки моя arduino, няколко сервоустройства и малко касета, основната идея за един скапан барабанен робот започна
Направи си сам електронни барабани (барабанен модул Req'd): 4 стъпки
DIY Electronic Drums (Drum Module Req'd): Така че миналата година трябваше да премълча нещата за своите съквартиранти и като барабанист, който отне малко сдържаност. Разрових се из интернет и намерих страхотни уеб сайтове, след като прочетох за DIY барабан, настроен на Hack-a-day, и какво знаете, мон
Как да си направите собствен барабанен бот !!: 14 стъпки
Как да си направим собствен бот за барабани !!: Този робот е вдъхновен от робот, на когото е отделено много внимание, наречен Yellow Drum Machine, ще го свържа по -късно, когато го намеря. Този робот използва стъпалата на резервоарите, за да се разхожда, използва своя ултразвуков сонар, за да открие пречки, Той ще