H Controler USB MIDI pe Arduino Din sandbox. Portal de informații de securitate

Încă o dată, cântând la chitară și controlând sunetul prin Peavey ReValver și alte Amplitubes, m-am gândit să cumpăr un controler MIDI. Dispozitivele de marcă, cum ar fi Guitar Rig Kontrol 3, costă aproximativ 13.000 de ruble și sunt doar pe podea. Adică, schimbarea rapidă a pozițiilor mai multor regulatori este foarte problematică.

Diverse controlere direcționale DJ păreau mai interesante datorită abundenței de fadere și encodere. S-a decis să combin afacerile cu plăcerea și să-mi fac eu un controler MIDI.

Cerințe inițiale: 2-7 fadere, același număr de potențiometre/encodere rotative, aproximativ 10 butoane, conexiune USB.

Apoi am început să aleg componente. Am ales Arduino din cauza disponibilității sale în principiu, puteți folosi același ATmega32u4, STM, sau alt controler. Am găsit faderele și butoanele la un magazin local de radio. Codificatorul și potențiometrele au fost deja achiziționate la un moment dat. Am găsit întrerupătoarele în garaj. Am decis să fac carcasa din capacul superior al unui DVD player.

Accesorii:

  • Arduino UNO R3 1 buc.
  • Faders sp3-25a 5 buc.
  • Gură. potențiometre 3 buc.
  • Encoder 1 buc.
  • Butoane pbs-26b 16 buc.
  • Coperta DVD 1 buc.
  • Comutatoare basculante 2 buc.

Mai întâi, am îndoit corpul și am tăiat găuri în el cu un burghiu pentru fadere:

Apoi am găurit găurile pentru întrerupătoarele și gura. potențiometre, marcau poziția butoanelor. Deoarece nu aveam un burghiu de 19 mm (sau chiar o mandrina de burghiu corespunzatoare), am facut gaurile pentru nasturi la 13 mm si apoi le-am marit cu un alez.

Baza este gata, acum vă puteți gândi la cum să conectați toate aceste lucruri la Arduino. În timp ce studia această problemă Am dat peste un proiect minunat HIDUINO. Acesta este firmware-ul pentru ATmega16u2 de la bordul Arduino, datorită căruia dispozitivul este definit ca un dispozitiv MIDI USB-HID. Tot ce putem face este să trimitem date MIDI prin UART la 31250 baud. Pentru a nu aglomera codul sursă cu definiții cu coduri de evenimente MIDI, am folosit această bibliotecă.

Deoarece am folosit Arduino, am decis să fac un scut la care să fie conectate toate perifericele.
Schema de scut:

După cum puteți vedea din diagramă, butoanele sunt conectate folosind un circuit matricial. Sunt utilizate rezistențele de pull-up încorporate ale ATmega328, astfel încât logica este inversă.

Inițializarea butoanelor

for(octetul i = 0; i< COLS; i++){ //--Конфигурируем строки мтрчн клвтр как выходы pinMode(colPins[i], OUTPUT); //--подаём на них лог. 1 digitalWrite(colPins[i], HIGH); } for(byte i = 0; i < ROWS; i++){ //--Конфигурируем столбцы мтрчн клвтр как входы--------- pinMode(rowPins[i], INPUT); //--включаем встроенные в мк подтягивающие резисторы-- digitalWrite(rowPins[i], HIGH); }

Citirea valorilor

for(octetul i = 0; i< COLS; i++) //-Цикл чтения матричной клавиатуры----- { digitalWrite(colPins[i], LOW); //--На считываемый столбец выставляем 0--- for(byte j = 0; j < ROWS; j++) //--Построчно считываем каждый столбец-- { //--И при нажатой кнопке передаём ноту-- dval=digitalRead(rowPins[j]); if (dval == LOW && buttonState[i][j] == HIGH) MIDI.sendNoteOn(kpdNote[j][i],127,1); if (dval == HIGH && buttonState[i][j] == LOW) MIDI.sendNoteOff(kpdNote[j][i],127,1); buttonState[i][j] = dval; } digitalWrite(colPins[i], HIGH); }




Am uitat să pun diode pe sigiliu, a trebuit să le lipim la butoane.

Potențiometrele sunt conectate printr-un multiplexer 4052b la intrările ADC.

Citirea pozițiilor potențiometrului

for(octet chn = 0; chn< 4; chn++) //-Цикл чтения значений потенциометров { set_mp_chn(chn); //--Задаём параметры мультиплексора val=analogRead(0) / 8; //--Считываем значение с канала X if (abs(val-PrVal) >5) //--Dacă valoarea curentă este ex. din trecut ( //-- mai mult de 5, apoi trimite o nouă valoare MIDI.sendControlChange(chn,val,1); PrVal=val; ) val=analogRead(1) / 8; //--Citiți valoarea de pe canalul Y în același mod ca X dacă (abs(val-PrVal) > 5) ( MIDI.sendControlChange(chn+4,val,1); PrVal=val; ) )


Codificatorul a fost setat la o întrerupere hardware.

Citirea codificatorului

void enc() // Procesarea codificatorului ( currenttime=millis(); if (abs(ltime-currenttime)>50) // anti-bounce (b=digitalRead(4); if (b == HIGH && eval)<=122) eval=eval+5; else if (b == LOW && eval>=5) eval=eval-5; MIDI.sendControlChange(9,eval,1); ltime = milis(); ) )


placă de circuit imprimat Răspândiți-o în aspectul Sprint, apoi făcuți-o cu vechiul LUT, folosind folie autoadezivă și clorură ferică.

Scut gata:



Pentru a încărca firmware-ul pe ATmega32u4, am scurtcircuitat 2 pini ICSP, apoi am folosit Flip. Mai târziu am conectat un buton la acești pini.

Firmware-ul funcționează, tot ce rămâne este să înșurubați pereții și panoul frontal. Deoarece am marcat totul la locul lui, desenarea panoului a durat mai mult timp decât orice altceva. Arăta așa:

  • 1. Hârtia milimetrică a fost folosită ca fundal al imaginii
  • 2. Au fost marcate găuri
  • 3. Rezultatul a fost tipărit
  • 4. Toate găurile au fost tăiate
  • 5. Toate elementele au fost deșurubate și îndepărtate
  • 6. S-a montat panoul, au fost puse toate butoanele/potențiometrele
  • 7. Au existat neconcordanțe între șablon și corp
  • 8. Treceți la pasul 2 până când toate găurile se potrivesc
Panoul este realizat din PET milimetric, acoperit cu folie imprimata si laminare, gaurile sunt taiate cu laser conform fișier cdr. De la agenții de publicitate din Irkutsk, toate acestea m-au costat doar 240 de ruble.

Pereții laterali au fost tăiați din placaj.

Tipul actual de dispozitiv:

Costul componentelor:

  • Arduino UNO R3 RUR 320
  • Fadere sp3-25a 5x9=45 r.
  • Gură. potențiometre + butoane 85 rub.
  • Encoder 15 frecare.
  • Butoane pbs-26b 16x19=304 frec.
  • Panou 240 rub.
  • Multiplexor 16 rub.
  • Placaj, textolit, întrerupătoare, carcasă DVD - în cazul meu, gratuit.
Total: 1025 de ruble.

Controlerul face față sarcinilor care îi sunt atribuite și controlează sunetul în aproape orice program de procesare audio.

Planurile sunt de a acoperi placajul cu pată și de a tăia capacul de jos din plexiglas. De asemenea, adăugați un port de expansiune pentru a conecta un controler de podea.

Cod pentru Arduino și semn pe Github.

Unii muzicieni cunoscători în domeniul electronicii sau inginerii electronici cărora le place să cânte muzică, ar dori să-și conecteze dispozitivul MIDI la Arduino, dar nu știu cum să o facă corect. Acest proiect vă va ajuta să înțelegeți această problemă.


În primul rând, să înțelegem puțin ce este MIDI. MIDI înseamnă Musical Instrument Digital Interface sau în rusă interfata digitala instrumente muzicale. Codul transmis al acestei interfețe poate cripta parametrii de volum, cheie, tempo și alte caracteristici ale instrumentelor muzicale. Datele MIDI sunt transmise de obicei prin magistrale cu cinci treceri cu conectori rotunji DIN 41524, de asemenea, cu cinci pini, așa cum se arată în diagrama de mai jos. Viteza standard transmiterea de date a acestora Interfață serială este de 31,25 kbit/s. Transferul este unidirecțional, adică într-un sistem MIDI-linked, instrumentele muzicale precum sintetizatoarele pot transmite date doar către o unitate principală, cum ar fi un panou de control al sunetului surround sau un computer. Vă rugăm să rețineți că datele MIDI nu sunt audio digitizate, ci mai degrabă comenzi și valori, cum ar fi note, parametri de sunet etc.


Componente necesare

  • Conector DIN/MIDI cu 5 pini – 1 buc.
  • Optocupler 4n35 sau echivalent – ​​​​1 buc.
  • Diodă IN914 sau echivalent – ​​1 buc.
  • Rezistor 220 Ohm – 1 buc.
  • Rezistor 560 Ohm (posibil 220 și 230 în secvență) – 1 buc.
  • Placa de montare – 1 buc.
  • Arduino - 1 buc.
  • Cablu MIDI – 1 buc.
  • Dispozitiv MIDI – 1 buc.

Sistem Conexiuni Arduino la dispozitivele MIDI




Diagrama creată folosind fritizare arată conexiunile componentelor în detaliu. Totul aici este conectat destul de simplu și ușor. În centrul circuitului vedem un cip optic izolare galvanică. Acest optocupler este necesar pentru izolarea galvanică a liniei MIDI de la Circuite Arduino. Fără el poți arde Intrare Arduino. În acest caz, a fost luat un optocupler din seria 4n35, format dintr-un LED și un fototranzistor, totuși, orice alt optocupler cu caracteristici similare va face în schimb.


Aveți grijă când conectați dioda, respectați polaritatea. Această schemă a fost creat ținând cont de standardele și caracteristicile interfeței MIDI. Schema circuitului original poate fi găsită aici http://www.midi.org/techspecs/electrispec.php


Cod (schiță pentru Arduino)


Acesta este un script de interacțiune MIDI simplu care utilizează biblioteca MIDI.h (scriptul MIDI CALLBACK). Verifică dacă semnalul NoteOn (nota) a sosit și se deplasează în zona de procesare corespunzătoare. Puteți lipi codul în această zonă.


#include MIDI_CREATE_DEFAULT_INSTANCE(); void handleNoteOn(byte channel, byte pitch, byte speed) ( // loc pentru codul dvs. când este primit un semnal) void handleNoteOff(byte channel, byte pitch, byte speed) ( // loc pentru codul dvs. când nu există semnal) void setup() ( MIDI.setHandleNoteOn(handleNoteOn); MIDI.setHandleNoteOff(handleNoteOff); MIDI.begin(MIDI_CHANNEL_OMNI); ) void loop() ( MIDI.read; )

Indicator de apăsare a tastei

Folosim o bandă LED colorată pentru a indica numărul și forța de apăsare a unei taste de sintetizator.

Vei avea nevoie:

midi-ledStrip.ino #include #include #ifdef __AVR__ #include #endif // Banda LED conectată la pinul 11#definiți PIN-ul 11 // Este format din 50 de LED-uri#define NUMPIXELS 50 // Creați un obiect pentru a controla fluxul Adafruit_NeoPixel pixeli = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800) ; // Creați un obiect pentru comunicarea MIDI prin Serial1 MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, myMidi) ; // Variabile auxiliare int r, g, b, pitchPot; // Funcție care convertește nuanța în RGB. // Detalii: http://site/projects:christmastree void f_HSV_to_RGB(int hue, int sat, int val) ( int bază; if (sat == 0) ( r = val; g = val; b = val; ) else ( bază = ((255 - sat) * val) >> 8 ; comutator (nuanta / 60 ) ( cazul 0 : ( r = val; g = (((val - baza) * nuanta) / 60 ) + baza; b = baza; break ; ) cazul 1 : ( r = (((val - bază) * (60 - (nuanță % 60) ) / 60 ) + bază; g = bază; rupere ; ((val - bază) * (nuanță % 60 ) ) / 60 ) + bază; cazul 3: ( r = baza; g = (((val - baza) * (60 - (nuanta % 60 ) ) ) / 60 ) + baza; b = val; break ; ) cazul 4: ( r = ((( val - baza) * (nuanta % 60 ) ) + g = baza b = val ) caz 5 : ( r = val; b = ((val - baza); (60 - (nuanță % 60) ) / 60 ) + bază; // Managerul de evenimente NoteOn. Această funcție va fi apelată automat când // când primiți un mesaj NoteOn prin intrarea MIDI. void handleNoteOn(canal de octet, pas de octet, viteza de octet) ( // Viteza variază de la 0 la 127 // Pentru a evita reducerea intervalului de valori de nuanță a culorii (0-255), // ne deplasăm la stânga și înmulțim forța de apăsare cu 2. byte doubleVelocity = viteza<< 1 ; // Convertește nuanța în RGB f_HSV_to_RGB(doubleVelocity, 255 , 255 ) ; // Numărul notei are o valoare de la 0 la 127, // și există doar 50 de LED-uri, astfel încât banda să afișeze note // în intervalul necesar, reglați banda la notele dorite folosind potențiometrul. // Citirea valorii de la potențiometru are loc în loop(); int activePitch = pitch - pitchPot; // Setați culoarea LED-ului în poziția dorită... pixels.setPixelColor(activePitch, pixels.Color(r, g, b)); // ... și aprinde banda. pixeli.show(); ) // Managerul de evenimente NoteOff. Această funcție va fi apelată automat când // când primiți un mesaj NoteOff prin intrarea MIDI. // Mai multe detalii: http://arduinomidilib.fortyseveneffects.com/a00022.html void handleNoteOff (canal de octet, pas de octet, viteza de octet) ( // Stingeți LED-ul care a fost aprins de NoteOn int activePitch = pitch - pitchPot; pixels.setPixelColor(activePitch, pixels.Color(0, 0, 0)); pixeli.show(); ) void setup() ( // Inițializați banda LED... pixeli.begin(); // ... și stingeți toate LED-urile pixeli.show(); // Atașați handlerul de evenimente NoteOn myMidi.setHandleNoteOn (handleNoteOn) ; // Atașați handlerul de evenimente NoteOff myMidi.setHandleNoteOff (handleNoteOff) ; // Inițializați interfața MIDI pentru a asculta pe toată lumea// Canale MIDI. myMidi.begin(MIDI_CHANNEL_OMNI) ; ) bucla void() ( // Aici numim doar MIDI.read, // biblioteca va face ea însăși restul myMidi.read(); // Citiți valoarea de la potențiometru. // Avem nevoie de o valoare în intervalul (0-127), // poate fi obținut din intervalul (0-1024) prin deplasarea cu 3 biți la dreapta pitchPot = analogRead(A4) >> 3 ; )

Încă o dată, cântând la chitară și controlând sunetul prin Peavey ReValver și alte Amplitubes, m-am gândit să cumpăr un controler MIDI. Dispozitivele de marcă, cum ar fi Guitar Rig Kontrol 3, costă aproximativ 13.000 de ruble și sunt doar pe podea. Adică, schimbarea rapidă a pozițiilor mai multor regulatori este foarte problematică.

Diverse controlere direcționale DJ păreau mai interesante datorită abundenței de fadere și encodere. S-a decis să combin afacerile cu plăcerea și să-mi fac eu un controler MIDI.

Cerințe inițiale: 2-7 fadere, același număr de potențiometre/encodere rotative, aproximativ 10 butoane, conexiune USB.

Apoi am început să aleg componente. Am ales Arduino din cauza disponibilității sale în principiu, puteți folosi același ATmega32u4, STM, sau alt controler. Am găsit faderele și butoanele la un magazin local de radio. Codificatorul și potențiometrele au fost deja achiziționate la un moment dat. Am găsit întrerupătoarele în garaj. Am decis să fac carcasa din capacul superior al unui DVD player.

Accesorii:

  • Arduino UNO R3 1 buc.
  • Faders sp3-25a 5 buc.
  • Gură. potențiometre 3 buc.
  • Encoder 1 buc.
  • Butoane pbs-26b 16 buc.
  • Coperta DVD 1 buc.
  • Comutatoare basculante 2 buc.

Mai întâi, am îndoit corpul și am tăiat găuri în el cu un burghiu pentru fadere:

Apoi am găurit găurile pentru întrerupătoarele și gura. potențiometre, marcau poziția butoanelor. Deoarece nu aveam un burghiu de 19 mm (sau chiar o mandrina de burghiu corespunzatoare), am facut gaurile pentru nasturi la 13 mm si apoi le-am marit cu un alez.

Baza este gata, acum vă puteți gândi la cum să conectați toate aceste lucruri la Arduino. În timp ce studiam această problemă am dat peste un proiect minunat HIDUINO. Acesta este firmware-ul pentru ATmega16u2 de la bordul Arduino, datorită căruia dispozitivul este definit ca un dispozitiv MIDI USB-HID. Tot ce putem face este să trimitem date MIDI prin UART la 31250 baud. Pentru a nu aglomera codul sursă cu definiții cu coduri de evenimente MIDI, am folosit această bibliotecă.

Deoarece am folosit Arduino, am decis să fac un scut la care să fie conectate toate perifericele.
Schema de scut:

După cum puteți vedea din diagramă, butoanele sunt conectate folosind un circuit matricial. Sunt utilizate rezistențele de pull-up încorporate ale ATmega328, astfel încât logica este inversă.

Inițializarea butoanelor

for(octetul i = 0; i< COLS; i++){ //--Конфигурируем строки мтрчн клвтр как выходы pinMode(colPins[i], OUTPUT); //--подаём на них лог. 1 digitalWrite(colPins[i], HIGH); } for(byte i = 0; i < ROWS; i++){ //--Конфигурируем столбцы мтрчн клвтр как входы--------- pinMode(rowPins[i], INPUT); //--включаем встроенные в мк подтягивающие резисторы-- digitalWrite(rowPins[i], HIGH); }

Citirea valorilor

for(octetul i = 0; i< COLS; i++) //-Цикл чтения матричной клавиатуры----- { digitalWrite(colPins[i], LOW); //--На считываемый столбец выставляем 0--- for(byte j = 0; j < ROWS; j++) //--Построчно считываем каждый столбец-- { //--И при нажатой кнопке передаём ноту-- dval=digitalRead(rowPins[j]); if (dval == LOW && buttonState[i][j] == HIGH) MIDI.sendNoteOn(kpdNote[j][i],127,1); if (dval == HIGH && buttonState[i][j] == LOW) MIDI.sendNoteOff(kpdNote[j][i],127,1); buttonState[i][j] = dval; } digitalWrite(colPins[i], HIGH); }




Am uitat să pun diode pe sigiliu, a trebuit să le lipim la butoane.

Potențiometrele sunt conectate printr-un multiplexer 4052b la intrările ADC.

Citirea pozițiilor potențiometrului

for(octet chn = 0; chn< 4; chn++) //-Цикл чтения значений потенциометров { set_mp_chn(chn); //--Задаём параметры мультиплексора val=analogRead(0) / 8; //--Считываем значение с канала X if (abs(val-PrVal) >5) //--Dacă valoarea curentă este ex. din trecut ( //-- mai mult de 5, apoi trimite o nouă valoare MIDI.sendControlChange(chn,val,1); PrVal=val; ) val=analogRead(1) / 8; //--Citiți valoarea de pe canalul Y în același mod ca X dacă (abs(val-PrVal) > 5) ( MIDI.sendControlChange(chn+4,val,1); PrVal=val; ) )


Codificatorul a fost setat la o întrerupere hardware.

Citirea codificatorului

void enc() // Procesarea codificatorului ( currenttime=millis(); if (abs(ltime-currenttime)>50) // anti-bounce (b=digitalRead(4); if (b == HIGH && eval)<=122) eval=eval+5; else if (b == LOW && eval>=5) eval=eval-5; MIDI.sendControlChange(9,eval,1); ltime = milis(); ) )


Am așezat placa de circuit imprimat în aspectul Sprint, apoi am făcut-o cu vechiul LUT, folosind folie autoadezivă și clorură ferică.

Scut gata:



Pentru a încărca firmware-ul pe ATmega32u4, am scurtcircuitat 2 pini ICSP, apoi am folosit Flip. Mai târziu am conectat un buton la acești pini.

Firmware-ul funcționează, tot ce rămâne este să înșurubați pereții și panoul frontal. Deoarece am marcat totul la locul lui, a durat mai mult timp pentru a desena panoul decât orice altceva. Arăta așa:

  • 1. Hârtia milimetrică a fost folosită ca fundal al imaginii
  • 2. Au fost marcate găuri
  • 3. Rezultatul a fost tipărit
  • 4. Toate găurile au fost tăiate
  • 5. Toate elementele au fost deșurubate și îndepărtate
  • 6. S-a montat panoul, au fost puse toate butoanele/potențiometrele
  • 7. Au existat neconcordanțe între șablon și corp
  • 8. Treceți la pasul 2 până când toate găurile se potrivesc
Panoul este din PET milimetric, acoperit cu o peliculă imprimată și laminată, orificiile au fost tăiate cu laser dintr-un fișier CDR. De la agenții de publicitate din Irkutsk, toate acestea m-au costat doar 240 de ruble.

Pereții laterali au fost tăiați din placaj.

Tipul actual de dispozitiv:

Costul componentelor:

  • Arduino UNO R3 RUR 320
  • Fadere sp3-25a 5x9=45 r.
  • Gură. potențiometre + butoane 85 rub.
  • Encoder 15 frecare.
  • Butoane pbs-26b 16x19=304 frec.
  • Panou 240 rub.
  • Multiplexor 16 rub.
  • Placaj, textolit, întrerupătoare, carcasă DVD - în cazul meu, gratuit.
Total: 1025 de ruble.

Controlerul face față sarcinilor care îi sunt atribuite și controlează sunetul în aproape orice program de procesare audio.

Planurile sunt de a acoperi placajul cu pată și de a tăia capacul de jos din plexiglas. De asemenea, adăugați un port de expansiune pentru a conecta un controler de podea.

Cod pentru Arduino și semn pe Github.

Încă o dată, cântând la chitară și controlând sunetul prin Peavey ReValver și alte Amplitubes, m-am gândit să cumpăr un controler MIDI. Dispozitivele de marcă, cum ar fi Guitar Rig Kontrol 3, costă aproximativ 13.000 de ruble și sunt doar pe podea. Adică, schimbarea rapidă a pozițiilor mai multor regulatori este foarte problematică.

Diverse controlere direcționale DJ păreau mai interesante datorită abundenței de fadere și encodere. S-a decis să combin afacerile cu plăcerea și să-mi fac eu un controler MIDI.

Cerințe inițiale: 2-7 fadere, același număr de potențiometre/encodere rotative, aproximativ 10 butoane, conexiune USB.

Apoi am început să aleg componente. Am ales Arduino din cauza disponibilității sale în principiu, puteți folosi același ATmega32u4, STM, sau alt controler. Am găsit faderele și butoanele la un magazin local de radio. Codificatorul și potențiometrele au fost deja achiziționate la un moment dat. Am găsit întrerupătoarele în garaj. Am decis să fac carcasa din capacul superior al unui DVD player.

Accesorii:


  • Arduino UNO R3 1 buc.

  • Faders sp3-25a 5 buc.

  • Gură. potențiometre 3 buc.

  • Encoder 1 buc.

  • Butoane pbs-26b 16 buc.

  • Coperta DVD 1 buc.

  • Comutatoare basculante 2 buc.

Mai întâi, am îndoit corpul și am tăiat găuri în el cu un burghiu pentru fadere:

Apoi am găurit găurile pentru întrerupătoarele și gura. potențiometre, marcau poziția butoanelor. Deoarece nu aveam un burghiu de 19 mm (sau chiar o mandrina de burghiu corespunzatoare), am facut gaurile pentru nasturi la 13 mm si apoi le-am marit cu un alez.

Baza este gata, acum vă puteți gândi la cum să conectați toate aceste lucruri la Arduino. În timp ce studiam această problemă, am dat peste un proiect minunat. Acesta este firmware-ul pentru ATmega16u2 de la bordul Arduino, datorită căruia dispozitivul este definit ca un dispozitiv MIDI USB-HID. Tot ce putem face este să trimitem date MIDI prin UART la 31250 baud. Pentru a nu aglomera codul sursă cu definiții cu coduri de evenimente MIDI, am folosit .

Deoarece am folosit Arduino, am decis să fac un scut la care să fie conectate toate perifericele.
Schema de scut:

După cum puteți vedea din diagramă, butoanele sunt conectate folosind un circuit matricial. Sunt utilizate rezistențele de pull-up încorporate ale ATmega328, astfel încât logica este inversă.

for(octetul i = 0; i< COLS; i++){ //--Конфигурируем строки мтрчн клвтр как выходы pinMode(colPins[i], OUTPUT); //--подаём на них лог. 1 digitalWrite(colPins[i], HIGH); } for(byte i = 0; i < ROWS; i++){ //--Конфигурируем столбцы мтрчн клвтр как входы--------- pinMode(rowPins[i], INPUT); //--включаем встроенные в мк подтягивающие резисторы-- digitalWrite(rowPins[i], HIGH); }

for(octetul i = 0; i< COLS; i++) //-Цикл чтения матричной клавиатуры----- { digitalWrite(colPins[i], LOW); //--На считываемый столбец выставляем 0--- for(byte j = 0; j < ROWS; j++) //--Построчно считываем каждый столбец-- { //--И при нажатой кнопке передаём ноту-- dval=digitalRead(rowPins[j]); if (dval == LOW && buttonState[i][j] == HIGH) MIDI.sendNoteOn(kpdNote[j][i],127,1); if (dval == HIGH && buttonState[i][j] == LOW) MIDI.sendNoteOff(kpdNote[j][i],127,1); buttonState[i][j] = dval; } digitalWrite(colPins[i], HIGH); }




Am uitat să pun diode pe sigiliu, a trebuit să le lipim la butoane.

Potențiometrele sunt conectate printr-un multiplexer 4052b la intrările ADC.

for(octet chn = 0; chn< 4; chn++) //-Цикл чтения значений потенциометров { set_mp_chn(chn); //--Задаём параметры мультиплексора val=analogRead(0) / 8; //--Считываем значение с канала X if (abs(val-PrVal) >5) //--Dacă valoarea curentă este ex. din trecut ( //-- mai mult de 5, apoi trimite o nouă valoare MIDI.sendControlChange(chn,val,1); PrVal=val; ) val=analogRead(1) / 8; //--Citiți valoarea de pe canalul Y în același mod ca X dacă (abs(val-PrVal) > 5) ( MIDI.sendControlChange(chn+4,val,1); PrVal=val; ) )


Codificatorul a fost setat la o întrerupere hardware.

void enc() // Procesarea codificatorului ( currenttime=millis(); if (abs(ltime-currenttime)>50) // anti-bounce (b=digitalRead(4); if (b == HIGH && eval)<=122) eval=eval+5; else if (b == LOW && eval>=5) eval=eval-5; MIDI.sendControlChange(9,eval,1); ltime = milis(); ) )


Am așezat placa de circuit imprimat în aspectul Sprint, apoi am făcut-o la modă veche, utilizând folie autoadezivă și clorură ferică. Calitatea lipirii suferă de lipirea teribilă.

Scut gata:



Pentru a încărca firmware-ul pe ATmega32u4, am scurtcircuitat 2 pini ICSP, apoi am folosit . Mai târziu am conectat un buton la acești pini.

Firmware-ul funcționează, tot ce rămâne este să înșurubați pereții și panoul frontal. Deoarece am marcat totul la locul lui, a durat mai mult timp pentru a desena panoul decât orice altceva. Arăta așa:


  • 1. Hârtia milimetrică a fost folosită ca fundal al imaginii

  • 2. Au fost marcate găuri

  • 3. Rezultatul a fost tipărit

  • 4. Toate găurile au fost tăiate

  • 5. Toate elementele au fost derulate și îndepărtate

  • 6. S-a montat panoul, au fost puse toate butoanele/potențiometrele

  • 7. Au existat neconcordanțe între șablon și corp

  • 8. Treceți la pasul 2 până când toate găurile se potrivesc

Panoul este realizat din PET milimetric, acoperit cu o peliculă imprimată și laminată, găurile au fost tăiate cu laser cu ajutorul unui fișier CDR. De la agenții de publicitate din Irkutsk, toate acestea m-au costat doar 240 de ruble.

Pereții laterali au fost tăiați din placaj.

Tipul actual de dispozitiv:

Costul componentelor:


  • Arduino UNO R3 RUR 320

  • Fadere sp3-25a 5x9=45 r.

  • Gură. potențiometre + butoane 85 rub.

  • Encoder 15 frecare.

  • Butoane pbs-26b 16x19=304 frec.

  • Panou 240 rub.

  • Multiplexor 16 rub.

  • Placaj, textolit, întrerupătoare, carcasă DVD - în cazul meu, gratuit.

Total: 1025 de ruble.

Controlerul face față sarcinilor care îi sunt atribuite și controlează sunetul în aproape orice program de procesare audio.

Planurile sunt de a acoperi placajul cu pată și de a tăia capacul de jos din plexiglas. De asemenea, adăugați un port de expansiune pentru a conecta un controler de podea.

Cod pentru Arduino și semn pe Github.