Sisukord:

MIDI trummikomplekt Pythonis ja Arduinos: 5 sammu (koos piltidega)
MIDI trummikomplekt Pythonis ja Arduinos: 5 sammu (koos piltidega)

Video: MIDI trummikomplekt Pythonis ja Arduinos: 5 sammu (koos piltidega)

Video: MIDI trummikomplekt Pythonis ja Arduinos: 5 sammu (koos piltidega)
Video: How is COVID-19 Affecting Dairy Production in Ontario? | #CDFS20 2024, November
Anonim
Image
Image
MIDI trummikomplekt Pythonis ja Arduinos
MIDI trummikomplekt Pythonis ja Arduinos
MIDI trummikomplekt Pythonis ja Arduinos
MIDI trummikomplekt Pythonis ja Arduinos

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

Operatsiooni teooria
Operatsiooni teooria
Operatsiooni teooria
Operatsiooni teooria
Operatsiooni teooria
Operatsiooni 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

Jootmine ja kokkupanek
Jootmine ja kokkupanek
Jootmine ja kokkupanek
Jootmine ja kokkupanek
Jootmine ja kokkupanek
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

Programmeerimine A: Arduino
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

Programmeerimine B: Python ja kasutajaliides
Programmeerimine B: Python ja kasutajaliides
Programmeerimine B: Python ja kasutajaliides
Programmeerimine B: Python ja kasutajaliides
Programmeerimine B: Python ja kasutajaliides
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:

  1. 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.
  2. 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.
  3. COM -portide loend: Arduinoga suhtlemiseks on vaja täpsustada selle lisatud COM -port. Nimekirja värskendatakse, vajutades nuppu Värskenda.
  4. 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.
  5. 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.
  6. 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: