Jak łatwo zbudować MIDI USB Host

Pokazujemy jak prosto zbudować magiczne pudełeczko dzięki któremu będzie można połączyć urządzenia MIDI USB z klasycznymi sprzętami MIDI 5 DIN. Zysk jest spory, bo wydamy ok. 120 zł zamiast 400 zł.

For English speaking visitors: PDF plus some info how to opto-isolate 5 DIN MIDI input.

Potrzeba zbudowania takiego urządzenia pojawiła się, kiedy w moje ręce trafił Fishman Triple Play. Świetny kontroler, ale w formie takiej jakiej jest sprzedawany może być wykorzystany tylko z komputerem. A szkoda przecież marnować jego potencjału, kiedy w racku zajmują miejsce sprzętowe syntezatory. Na szczęście TriplePlay jaki i sporo innych urządzeń (np. seria kontrolerów Korg Nano), w których producent zrezygnował z klasycznego MIDI, nie wymagają żadnych sterowników do działania z jakimkolwiek komputerem, tabletem czy telefonem. Oznacza to, że są zgodne z tzw. specyfikacją MIDI  Class Compilant Device.

hostKomercyjnie dostępne rozwiązanie Kenton MIDI USB Host kosztuje 400 zł. Można jednak zbudować projekt bazujący na platformie Arduino, którego sercem jest jednoukładowy kontroler AT Mega 328. Jej główną zaletą jest cena: za oryginalne Arduino ok. 95 zł, a gdy sięgniemy po zgodne z nim projekty typu Funduino, koszty będą jeszcze niższe (ok. 50 zł). W sumie na realizację wydamy od 120 do 200 zł plus cena obudowy.

Komponenty

Zanim zaczniemy warto jednak zapoznać się z Arduino korzystając choćby z „łopatologicznego” wprowadzenia jakie można znaleźć na stronie Majsterkowo.pl . Konieczna także będzie także podstawowa umiejętność lutowania. Do zbudowania własnego Hosta MIDI USB potrzebować będziemy poniższych komponentów:host2

  • 1x  płytka Arduino Uno lub Uno R3 (np.: http://nettigo.pl/products/251)
  • 1x  USB Host Shield dla Arduino (np.: ze sklepu dx.com, gdzie są darmowe przesyłki do Polski)
  • 2x  gniazda 5 DIN dla wejścia i wyjścia MIDI
  • 2x rezystory 220 Ohm
  • kable, płytki prototypowe (te znajdziemy w zestawie startowym Arduino, który kosztuje ok. 30-40 zł)

Przygotowania

Rozpoczynamy od zainstalowania środowiska programistycznego Arduino IDE 1.0.5 oraz potrzebnych bibliotek.

Na przykładzie USB Host Shielda  pokaże jak należy zainstalować biblioteki. Z GitHuba ściągamy plik master.zip, rozpakowujemy do katalogu, który nazywamy  np. USB_Host_Shield_20 (nazwa nie może mieć żadnych znaków specjalnych). W aplikacji IDE sprawdzamy w Plik | Preferencje, gdzie na dysku znajduje się katalog ze szkicami Arduino. Otwieramy go i jeżeli to konieczne tworzymy w nim folder o nazwie „libraries”. Następnie przenosimy do niego katalog USB_Host_Shield_20. Podobny proces powtarzamy dla dwóch kolejnych bibliotek. Aby zainstalowane biblioteki były widoczne dla środowiska programistycznego konieczne jest  ponowne uruchomienie Arduino IDE.

Składamy projekt

Łączymy Arduino z tarczą USB Host. W gniazdach 5 DIN do złączy  5, 2, 4 przylutowujemy przewody, którymi według poniższego schematu podłączymy je do Arduino.

  • 5 – podłączamy do gniazd TX lub RX; Wyjście MIDI będzie połączone z portem TX (transmisja), a wejście MIDI z  portem RX (odbiór)
  • 2 – łączymy z masą (GND)
  • 3 – do tego złącza podajemy napięcie +5 V, które musi popłynąć przez rezystor 220 Ohm.

W montażu powinien pomóc poniższy schemat przygotowany we Fritzingu. Kable czarne oznaczają masę (GND), czerwone napięcie +5 V, a zielony i żółty odpowiednio porty TX i RX.

fritzUwaga! Żeby nasza konstrukcja była zgodna ze sztuką i wymaganiami specyfikacji MIDI, wejście MIDI powinno zostać odseparowane galwanicznie od reszty układu (lub nie powinniśmy go podłączać). W tym celu stosuje się szybkie transoptory (optoizolatory) Sharp PC-900 albo HP 6N138. Z kolei, żeby kabel MIDI nie zamienił się w antenę nadawczą, powinno się zastosować dla każdej z linii przewodów tzw. kondensator sprzęgający. Układ wciąż pozostaje prosty, a koszt wykonania wzrasta o dodatkowe 5-10 zł. Schemat jak to zrobić znajdziecie tutaj.

Programujemy

Uruchamiamy Arduino IDE i z biblioteki szkiców  (sketch) wybieramy  „biderctional_converter” (Menu File > Examples > USBH> biderctional_converter).  Kompilujemy szkic i tym samym sprawdzamy czy mam odpowiednie biblioteki i czy są one dobrze zainstalowane.

Podłączamy płytkę Arduino do komputera i ładujemy do niej szkic. Arduino możemy odłączyć od komputera i zasilać je albo przez USB (np. z ładowarki do telefonu) albo korzystając z zasilacza 7-12 V.

Jeśli wszystko zostało wykonanie poprawnie to możemy podłączyć do naszego projektu urządzenie USB MIDI Class  Compilant (np. Fishman TriplePlay), a do gniazd MIDI 5 „klasyczne” urządzenie MIDI, takie jak np. syntezator. Biblioteka autorstwa Yuuichi Akagawy nie wspiera komunikacji pomiędzy podłączonymi urządzeniami a komputerem. Nie oferuje tego również urządzenie Kentona, ale taką funkcjonalność znajdziemy np. w iConnectMIDI i w warunkach studyjnych bywa to przydatne.

4 thoughts on “Jak łatwo zbudować MIDI USB Host

  1. Dariusz Kowalczyk
    11 lipca 2014 at 12:59

    Można tez użyć hub-a na USB i telefonu Iphone albo Ipada z aplikacja Midibridge
    https://itunes.apple.com/us/app/midibridge/id449160859?mt=8.
    Pozwala to krosować więcej urządzeń.

  2. 4 września 2014 at 10:52

    Wielkie Dzieki!
    Super projekt i biore sie do roboty zaraz jak tylko wroce z wakacji! Biorac pod uwage, ze jest wrzesien 2014 a projekt jest z kwietnia 2014 chyba nic sie nie zmienilo jesli chodzi o soft. Pozdrawiam!

  3. Andrzej Pająk
    5 września 2014 at 21:25

    Karol jak będzie problem to napisz.

  4. mirek
    25 lutego 2015 at 17:24

    Hi I tried it but ,I have nanokontrol and no boot.
    What I doing wrong,
    here is code
    USB Usb;
    USBH_MIDI Midi(&Usb);

    void MIDI_poll();
    void doDelay(unsigned long t1, unsigned long t2, unsigned long delayTime);

    void setup()
    {
    Serial1.begin(31250);

    //Workaround for non UHS2.0 Shield
    pinMode(7,OUTPUT);
    digitalWrite(7,HIGH);

    if (Usb.Init() == -1) {
    while(1); //halt
    }//if (Usb.Init() == -1…
    delay( 200 );
    }

    void loop()
    {
    unsigned long t1;

    Usb.Task();
    t1 = micros();
    if( Usb.getUsbTaskState() == USB_STATE_RUNNING )
    {
    MIDI_poll();
    }
    //delay(1ms)
    doDelay(t1, micros(), 1000);
    }

    // Poll USB MIDI Controler and send to serial MIDI
    void MIDI_poll()
    {
    byte outBuf[ 3 ];
    uint8_t size;

    do {
    if( (size=Midi.RecvData(outBuf)) > 0 ){
    //MIDI Output
    Serial1.write(outBuf, size);
    }
    }while(size>0);
    }

    // Delay time (max 16383 us)
    void doDelay(unsigned long t1, unsigned long t2, unsigned long delayTime)
    {
    unsigned long t3;

    if( t1 > t2 ){
    t3 = (4294967295 – t1 + t2);
    }else{
    t3 = t2 – t1;
    }

    if( t3 < delayTime ){
    delayMicroseconds(delayTime – t3);
    }

    Thank you Mirek

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *