Sisukord:
- 1. samm: toimimise teooria
- 2. samm: osad ja instrumendid
- Samm: jootmine ja kokkupanek
- Samm: programmeerimine A: Arduino
- Samm: programmeerimine B: Python ja kasutajaliides
Video: MIDI trummikomplekt Pythonis ja Arduinos: 5 sammu (koos piltidega)
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:46
Tahtsin lapsest saati alati trummikomplekti osta. Siis ei olnud kõigil muusikaseadmetel kõiki digitaalseid rakendusi, nagu meil täna on palju, seega olid hinnad koos ootustega liiga kõrged. Hiljuti otsustasin osta eBayst odavaima trummikomplekti, mille ainus prioriteet: võimalus see maha võtta ja oma riist- ja tarkvara seadme külge kinnitada.
Ost ei valmistanud pettumust: kaasaskantav üleskeeratav trummikomplekt 9 erineva helipadjaga, kaks jalglüliti pedaali lööktrumli ja hi-hat ning mikro-USB toitepesa jaoks. Mis oli tõesti demotiveeriv, on see väljundhelid (selle komplekti tegelik kasutusala on välise kõlari ühendamine ja selle nautimine). Niisiis otsustasin selle muundada enda programmeeritavaks USB kaudu, Arduino -põhise MIDI trummikomplekti ja Pythonil põhineva kasutajaliidese jaoks, et seda oleks mugav kasutada ja hõlpsasti muuta, näiteks helitugevust, märkmeid ja kanalivalikuid.
Seadme omadused:
- Madal hind
- Trummikomplekti loomine mis tahes digitaalsisendist - isegi mitmesugustest nuppudest
- Sidetugi ja toide ainult USB -liidese kaudu - USB -liides UART -muunduri ja Arduino -seadmega
- Minimaalsed osad nõuetekohaseks tööks
- Lihtne kasutada Pythoni põhist kasutajaliidest
- Täielik MIDI tugi reguleeritava kiiruse, noodi ja Arduino tihvtidega
- Salvestage ja laadige seadme mällu salvestatud kohandatud trumli konfiguratsioonid
Jätkame projektiga…
1. samm: toimimise teooria
Plokiskeem
Kõigepealt keskendume projekti struktuurile ja jagame selle eraldi plokkideks:
Kokkupandav trummikomplekt
Projekti põhiüksus. See koosneb 9 -st eraldi trummipadjast, kus iga padjake koosneb nuppudest, mis muudavad tabamise ajal oma loogilist olekut. Selle struktuuri tõttu on võimalik see konkreetne trummikomplekt konstrueerida mis tahes nuppudest. Iga trummipadi on ühendatud peamise elektroonilise plaadi tõmbetakistiga, nii et trummipadja korduva löögi ajal on konkreetne lüliti ühendatud vooluahela maandusega ja trummelpadjal on loogiline LOW. Kui rõhku ei rakendata, on trummelpadja lüliti avatud ja tõmbetakistuse tõttu elektriliinile on trummelpadjal real loogiline HIGH. Kuna projekti eesmärk on luua täielik digitaalne MIDI -seade, võib peamise trükkplaadi kõik analoogosad tähelepanuta jätta. Oluline on märkida, et trummikomplektil on kaks pedaali trummel- ja hi-mütsi jaoks, mis on samuti ühendatud tõmbe takistite külge ja millel on sama toimimisloogika nagu kõigil trummipadjadel (arutame seda veidi hiljem).
Arduino Pro-Micro
Trummikomplekti aju. Selle eesmärk on tuvastada, kas trummelpadjast tuleb signaali, ja pakkuda sobivat MIDI -väljundit kõigi vajalike parameetritega: Märkus, signaali kiirus ja kestus. Trummipadjade digitaalse olemuse tõttu saab neid lihtsalt siduda arduino digitaalsisenditega (kokku 10 tihvti). Kõigi soovitud seadete ja MIDI-teabe salvestamiseks kasutame selle mälu-EEPROM-i, seega laaditakse iga kord seadme sisselülitamisel EEPROM-ist MIDI-teave, muutes selle uuesti programmeeritavaks ja uuesti konfigureeritavaks. Samuti on Arduino Pro-Micro saadaval väga väikeses pakendis ja seda saab hõlpsasti trummikomplekti sisemises korpuses paigutada.
FTDI USB jadamuundur
Seadme funktsioonide programmeerimiseks ja määratlemiseks arvutirakenduse abil on vaja USB-liides teisendada jadaühenduseks, kuna Arduino Pro-Micro-l pole USB-d. Kuna seadmetevaheline suhtlus põhineb UART -l, kasutatakse selles projektis FTDI -seadet, kuna see on kasutamislihtsus sõltumata selle lisaomadustest.
Arvutirakendus - Python
Kasutajaliideste ja kiiresti valmivate projektide arendamisel on Python suurepärane lahendus. UI -rakenduse eesmärk on muuta meie trummikomplekti jaoks MIDI -atribuutide uuesti määratlemine, teabe, programmeerimisseadme salvestamine ja süsteemide vahelise suhtluse tegemine palju mugavamaks, ilma et oleks vaja koodi uuesti ja uuesti koostada. Kuna me kasutame trummikomplektiga suhtlemiseks jadaliidest, on Internetis palju tasuta mooduleid, mis toetavad igat tüüpi jadaühendust. Lisaks, nagu hiljem arutatakse, koosneb UART -liides kokku kolmest tihvtist: RXD, TXD ja DTR. DTR -i kasutatakse Arduino mooduli lähtestamiseks, seega kui oleme huvitatud MIDI -rakenduse käivitamisest või kasutajaliidese ühendamisest programmeerimisseadmega, pole USB -kaablit ega üldse vaja uuesti ühendada.
2. samm: osad ja instrumendid
Osad
- Kokkupandav trummikomplekt
- 2 x hoolduspedaalid (tavaliselt DK pakendis).
- FTDI - USB -jadamuundur
- Arduino Pro Micro
- Micro-USB kaabel
Instrumendid
- Jootekolb/jaam
- Tina jootmine
- Õhuke ühetuumaline traat
- Pintsetid
- Lõikur
- Tang
- Nuga
- Kruvikeeraja
- 3D -printer (valikuline - kohandatud pedaaliplatvormide jaoks)
Tarkvara
- Arduino IDE
- Python 3 või kõrgem
- JetBrains Pycharm
- Karvutu MIDI liides
- loopMIDI
Samm: jootmine ja kokkupanek
Kuna ühendada tuleb kolm moodulit, on jootmis- ja kokkupanekuprotsess lühike ja lihtne:
-
Ühendage Arduino Pro-Micro koos FTDI-seadmega, veenduge, et ühendused vastavad iga seadme jaoks määratud I/O-le:
- VBUS-VBUS
- GND-GND
- DTR-DTR
- RXD-TXD
- TXD-RXD
- Eemaldage trumli plastkorpuse kõik kruvid, veenduge, et saaksite keskenduda padja-plaadi kaablile ja selle tõmbetakistustele
-
Jootke õhukesed juhtmed Arduino-FTDI mooduli jaoks, mille oleme varem ehitanud:
- Digitaalsed sisendid: D [2:11]
- VBUS
- D+
- D-
- GND
- Sisestage moodul akuümbrise sisse nii, et juhtmed hõljuksid samal poolel kui padjade tõmbetakistid
- Jootke kõik digitaalsisendid trummelpadja klemmidesse, nagu on näidatud viimasel joonisel.
- Jootke mikro-USB-siin (VBUS, D+, D-, GND) FTDI-seadmesse, veenduge, et nende juhtmete jälgimisel pole vigu.
- Kinnitage Arduino-FTDI moodul kuumliimiga akuümbrise külge
- Pange seade kokku sobiva kruvikinnitusega
Oleme seda teinud, seade on kokku pandud. Jätkame koodiga …
Samm: programmeerimine A: Arduino
Kirjeldage meie visandit samm-sammult:
Esiteks tuleb nõuetekohaseks toimimiseks lisada kaks vajalikku raamatukogu. EEPROM on Arduino IDE-sse juba eelinstallitud, kuid lööktrumli debouncer-moodul tuleb paigaldada eraldi
#kaasama #kaasama
Neid lüliteid kasutatakse peamiselt silumisjärjestustes. Kui soovite proovida Arduino klemmide ühendust trummelpadjakestega ja määrata kõik digitaalsed sisendid, tuleks need lülitid määratleda
/ * Arendaja lülitid: tühistage soovitud režiim silumiseks või lähtestamiseks * ///#define LOAD_DEFAULT_VALUES // Laadige konstantsed väärtused EEPROM asemel //#define PRINT_PADS_PIN_NUMBERS // Prindinõela number, mis on ühendatud jadaporti kaudu tabatud padjaga
Pidevad väljad tähistavad kõiki vaikeväärtusi, sealhulgas trummelpadja loendit. Seadme esmakordseks käivitamiseks on vaja teada Hi-Hat ja Kick pedaalide täpset ühendamist
/ * Trumli tüübi loend */
enum DRUM_POSITION {KICK = 0, SNARE, HIHAT, RIDE, CYMBAL1, CYMBAL2, TOM_HIGH, TOM_MID, TOM_LO, HIHAT_PEDAL};
/* Vaikeväärtused */
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};
/ * Löögitrumli tagasilöögi kestus */
const uint8_t KICK_DB_DURATION = 30;
EEPROM -i kasutatakse kõigi arvutirakendusest pärinevate andmete salvestamiseks/laadimiseks. Eespool kirjeldatud aadresside ulatus näitab iga trummelpadja MIDI -teabe täpset asukohta
/* EEPROM Aadresside kaardistamine
Märkused: | 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09 |
Tihvtid: | 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13 | Kiirused | 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x20, 0x21, 0x22, 0x23 | */ const uint8_t MÄRKUSED_ADDR = 0x00; const uint8_t VELOCITIES_ADDR = 0x14; const uint8_t PINS_ADDR = 0x0A;
Globaalseid muutujaid kasutatakse iga padja oleku määramiseks ja vastavalt MIDI -side loomiseks
/ * Globaalsed muutujad */
uint8_t drumNotes [10], drumVelocities [10], drumPins [10]; // MIDI muutujad
uint8_t uartBuffer [64]; // UART puhver MIDI Data Debouncer kick kogumiseks ja salvestamiseks (DRUM_PINS [KICK], KICK_DB_DURATION); // Lööktrumli lenduva booli väljalülitusobjekt previousState [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; // Trummipadja eelmine loogika ütleb lenduva booli praeguse oleku [9] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; // Trummipadja praeguse loogika olekud
EEPROMi funktsioonid
/* Salvestage seaded EEPROM -i*/
void storeEEPROM () {
memcpy (drumNotes, uartBuffer, 10); memcpy (drumPins, uartBuffer + 10, 10); memcpy (drumVelocities, uartBuffer + 20, 10); jaoks (uint8_t i = 0; i <10; i ++) EEPROM.write (NOTES_ADDR+i, drumNotes ); jaoks (uint8_t i = 0; i <10; i ++) EEPROM.write (PINS_ADDR+i, drumPins ); jaoks (uint8_t i = 0; i <10; i ++) EEPROM.write (VELOCITIES_ADDR+i, drumVelocities ); }
/* Laadige seaded EEPROM -ist*/
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); }
Muutujate lähtestamine ja programmeerimisrežiim, pedaalide ja Arduino alglaadimise korral aktiveeritakse samaaegselt
void enterProgrammingMode () {
bool ConfirmBreak = vale; 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; muidu 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); #muu koormusEEPROM (); #endif}
MIDI -sidetöötlejad, mille viivitus on 1 ms
/ * Esita MIDI märkmete funktsioon */
void midiOut (enum DRUM_POSITION drumIn) {
if (drumIn == HIHAT) {// Kui tabati HI-HAT, tuleb kontrollida, kas pedaal on alla vajutatud, kui (! digitalRead (drumPins [HIHAT_PEDAL]))) {noteOn (0x90, drumNotes [HIHAT_PEDAL], drumVelocities [HIHAT_PEDAL]); viivitus (1); noteOn (0x90, drumNotes [HIHAT_PEDAL], 0); } else {noteOn (0x90, drumNotes [HIHAT], drumVelocities [HIHAT]); viivitus (1); noteOn (0x90, drumNotes [HIHAT], 0); }} else {// Tavaline trummi MIDI edastusmärkusOn (0x90, drumNotes [drumIn], drumVelocities [drumIn]); viivitus (1); noteOn (0x90, drumNotes [drumIn], 0); }}
tühine märkusOn (int cmd, int samm, int kiirus) {Serial.write (cmd); Serial.write (samm); Serial.write (kiirus); }
setup () ja loop () funktsioonid koos lõpmatu seadme tööahelaga:
tühine seadistus () {
Seriaalne algus (115200);
jaoks (uint8_t i = 0; i <10; i ++) {pinMode (i+2, INPUT); } #ifdef PRINT_PADS_PIN_NUMBERS while (true) {// Infinite silumisahel (uint8_t i = 0; i <10; i ++) {if (! digitalRead (i+2)) {Serial.print ("Pin No: D"); Seeriatrükk (i + '0'); // Teisenda number ASCII märgiks}}} #else initValues (); / * Programmeerimisrežiim: Kui käivitamise ajal vajutatakse kahte pedaali - režiim on aktiveeritud */ 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); // Võrdle olekuid ja tuvasta langev serv previousState = currentState ; } kick.update (); // Lööktrumm kasutab kohandatud tagasilöögialgoritmi if (kick.edge ()) if (kick.falling ()) midiOut (KICK); }
Samm: programmeerimine B: Python ja kasutajaliides
Pythoni kasutajaliidest on esmapilgul pisut keeruline mõista, seetõttu proovime selgitada selle põhitõdesid, kuidas seda kasutada, mis funktsiooni igal nupul on ja kuidas Arduino seadet õigesti programmeerida.
Kasutajaliides - rakendus
UI on meie trummikomplekti programmeerija graafiline esitus, mis muudab selle kasutamise lihtsaks ja mugavaks Arduino seadme programmeerimiseks igal ajal. Kasutajaliides koosneb mitmest graafilisest moodulist, mis on seotud nende soovitatud toiminguga. vaatame need ükshaaval üle:
- Trummikomplekti pilt: Pythoni kasutajaliides kasutab X-Y kujutise koordinaate, et määrata, milline trumli tüüp valiti. Kui valiti kehtiv trummipiirkond, kuvatakse sekundaarne IO -teade koos märkmeväljade, kiiruse ja Arduino terminaliga spetsiaalse trummelpadja jaoks. Kui kasutaja on need parameetrid kontrollinud ja heaks kiitnud, saab need väärtused otse Arduino seadmesse edastada.
- Välise kontrolleri pilt: MIDI trummikomplekti kasutamiseks koos VST/muusika loomise keskkonnaga on vaja käivitada jada-MIDI tõlk. Olen kasutanud Hairlessit, mis on tasuta saadaval ja mida saab otse meie kasutajaliidesest käivitada, lihtsalt vajutades selle pilti.
- COM -portide loend: Arduinoga suhtlemiseks on vaja täpsustada selle lisatud COM -port. Nimekirja värskendatakse, vajutades nuppu Värskenda.
- Laadi/salvesta konfiguratsioon: Koodis on määratletud MIDI vaikeväärtused, mida kasutaja saab kasutajaliidesega suheldes muuta. Konfiguratsioon on määratletud failis config.txt kindlas vormingus, mille kasutaja saab salvestada või laadida.
- Programmeerimisseadme nupp: kõigi muudetud MIDI väärtuste salvestamiseks Arduino EEPROM-i tuleb pärast seda vajutada kahte jalgpedaali (trummel- ja mütsipedaal), oodake andmete edastamise lõpuleviimist. Kui esines kommunikatsiooniprobleeme, kuvatakse õige hüpikaken. Kui edastamine õnnestub, näitab kasutajaliides edukat sõnumit.
- Väljumisnupp: lihtsalt väljuge rakendusest kasutaja loal.
Pythoni koodi esiletõstmised
Koodis toimub palju asju, seega laiendame kirjalikke funktsioone, mitte kogu koodi.
Esiteks, kasutajaliidese kasutamiseks tuleb koodi toimimiseks alla laadida mitu moodulit:
importi osimporti keermestust importima tkinter tk -st tkinterist impordi sõnumikast tkinteri importimisest * PIL -i importimisest ImageTk, pildi importimise numpy np -impordi seeriaimpordi globaalsena
Mõned moodulid on Pythoni vaikepaketis. PIP -tööriista kaudu tuleks installida mitu moodulit:
pip paigaldada padi
pip install numpy pip install ScreenInfo
On tungivalt soovitatav käivitada rakendus PyCharmi kaudu. Tulevastes väljaannetes kavatsen projekti jaoks käivitatava faili eksportida.
Lühike koodi selgitus
Koodist on palju lihtsam aru saada, kui vaatame selle ridu funktsioonide ja klasside vaatenurgast:
1. Põhifunktsioon - siit algab kood
kui _name_ == '_main_': drumkit_gui ()
2. Trummikomplekti konstandid, koordinaadid ja MIDI vaiketeave
klassi trummid: DRUM_TYPES = ["Kick", "Hihat", "Snare", "Crash 1", "Crash 2", "Tom High", "Tom Mid", "Tom Low", "Ride", "Hihat Pedal" "," Kontroller "]
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. Kasutajaliidese funktsioonid - kasutajaliidese ja graafiliste objektide käsitlemine
def set_active (kasutajaliides)
def sekundaarne_ui (trumli_tüüp)
klassi SelectionUi (tk. Frame)
klassi rakendus (tk. raam)
def drumkit_gui ()
def event_ui_clicked (sündmus)
def getorigin (mina, sündmus)
4. Jadaühendus
def get_serial_ports ()
def suhelda_arduinoga (port)
5. Töö failidega: salvestage/laadige seaded txt -failist
def save_config ()
def load_config ()
6. Välise rakenduse hairless.exe käivitamine koodist, kasutades Pythoni niidivõimalusi
klass ExternalExecutableThread (threading. Thread)
def run_hairless_executable ()
Koodi käivitamiseks on projektide kaustale lisatavate failide loend:
- config.txt: seadete fail
- hairless.exe: karvutu MIDI -muundur
- drumkit.png: pilt, mis määratleb kõik meie kasutajaliidese klõpsatavad trummelpadjad (tuleb alla laadida selle sammu piltide komplektist)
- drumgui.py: projekti kood
See on kõik, mida peame selle toimimiseks rõhutama. Väga oluline on projekti lisada faile: trummikomplekti pilt, käivitatav fail hairless.exe ja seadete fail config.txt.
Ja.. Siin me oleme teinud!:)
Loodetavasti leiate sellest juhendist kasu.
Täname lugemise eest!:)
Soovitan:
QR -koodi skanner OpenCV kasutamine Pythonis: 7 sammu
QR-koodi skanner OpenCV kasutamine Pythonis: Tänapäeva maailmas näeme, et QR-koodi ja vöötkoodi kasutatakse peaaegu kõikjal, alates toote pakendamisest kuni veebimakseteni, ja tänapäeval näeme menüü nägemiseks isegi restoranis QR-koode. kahtlen, et see on nüüd suur mõte. Kuid kas olete kunagi häbenenud
Caesari šifriprogramm Pythonis: 4 sammu
Caesari šifriprogramm Pythonis: Caesari šifr on iidne ja laialt kasutatav šifr, mida on lihtne krüptida ja dekrüpteerida. See toimib tähestiku tähtede nihutamisega, et luua täiesti uus tähestik (ABCDEF võib nihutada üle 4 tähe ja muutuda EFGHIJ -ks). Caesar C
Niiskuse ja temperatuuri vaatleja, kes kasutab Raspberry Pi koos SHT25 -ga Pythonis: 6 sammu
Niiskuse ja temperatuuri vaatleja, kes kasutab Raspberry Pi koos SHT25 -ga Pythonis: olles Raspberry Pi entusiast, mõtlesime sellega mõnele suurejoonelisemale eksperimendile. Selles kampaanias teeme niiskuse ja temperatuuri vaatleja, mis mõõdab suhtelist niiskust ja temperatuuri Vaarika Pi abil ja SHT25, Humidi
Kodune elektrooniline trummikomplekt Arduino Mega2560 -ga: 10 sammu (piltidega)
Kodune elektrooniline trummikomplekt Arduino Mega2560 -ga: see on minu Arduino projekt. Kuidas ehitada Arduinoga e-trummikomplekti? Tere kallis lugeja! -Miks sellist projekti teha? Esiteks sellepärast, et kui sulle sellised asjad meeldivad, naudid sa tööprotsessi väga. Teiseks, kuna see on tõesti odav kaaslane
Ilmajaam Raspberry Pi abil koos BME280 -ga Pythonis: 6 sammu
Ilmajaam, mis kasutab Raspberry Pi-d koos BME280-ga Pythonis: kas eesmärk on stseen (Ilm on hea jutuvestja) Kliima soojenemise ja kliimamuutustega seotud probleemide tõttu muutub ülemaailmne ilmastikumuster kogu maailmas ebakorrapäraseks, põhjustades mitmeid ilmastikuga seotud probleeme loodusõnnetused (põud, äärmus