Pedał ekspresji V-USB MIDI z czujnikiem pojemnościowym



Pierwsza wersja pedału

Trzecia wersja pedału - z 10 programowalnymi przełącznikami nożnymi

English version of this document
Moim celem było zbudowanie, taniego, płynnie i cicho działającego oraz prawie niezniszczalnego nożnego manipulatora mogącego pracować jako "pedał ekspresji" MIDI dla wirtualnych efektów gitarowych (np. w programach jack-rack, guitarix or rakarrack) lub dla wirtualnych syntezatorów muzycznych (np. ZynAddSubFx lub LMMS).
Standardowe tanie pedały, używające potencjometrów najczęściej nie są zbyt ciche, ani zbyt trwałe. Dlatego postanowiłem wypróbować inne podejście - czujnik pojemnościowy. Okazuje się, że współczesne mikroprocesory pozwalają łatwo zbudować proste czujniki pojemnościowe o wystarczającej rozdzielczości i dokładności.
Użyty przeze mnie kondensator zmienny składa się z dwóch płytek miedzianych (np. niewytrawionych płytek drukowanych) o wymiarach 60mm x 90mm. Są one połączone zawiasem, dzięki czemu odległość między nimi może się zmieniać (jak to widać na poniższym rysunku). W rzeczywistości jedna z płytek jest zamontowana wewnątrz plastikowej obudowy a druga na zewnątrz, co zapobiega ich zwieraniu.
Nie byłem w stanie znaleźć dostatecznie "gładko" działającego zawiasu, więc zbudowałem go samodzielnie - z mosiężnych rurek - jednej o średnicy wewnętrznej 5mm i drugiej o średnicy zewnętrznej 5mm.
Plik SVG pokazujący konstrukcję pedału
Pomiar pojemności jest przeprowadzany w bardzo prosty sposób. Blok PWM w mikrokontrolerze generuje falę prostokątną. Zmienny kondensator czujnika tworzy całkujący układ RC z zewnętrznym rezystorem o wartości 1.5MΩ. Scałkowany (i na skutek tego opóźniony) sygnał jest podłączony do bloku "input capture" w mikrokontrolerze. Podczas pracy układu mierzone jest opóźnienie między zboczami sygnału generowanego przez blok PWM i zboczami sygnału odbieranego przez układ ICP1 (patrz schemat układu jako zbiór PDF, lub źródła schematu w formacie KiCad).
Okazało się, że takie proste rozwiązanie zapewnia rozdzielczość i dokładność wystarczającą na potrzeby pedału ekspresji MIDI, lecz wymaga kalibracji czujnika pedału przed użyciem. Aby umożliwić tę kalibrację, pedał wyposażony jest w prosty interfejs składający się z jednego przycisku i diody LED. Procedura kalibracji jest wbudowana w oprogramowanie pedału ("firmware") i przebiega następująco:
  1. Po podłączeniu pedału do interfejsu USB, dioda szybko miga. Naciśnij wtedy pedał do oporu, a potem naciśnij i przytrzymaj przycisk kalibracji (cały czas przy wciśniętym pedale)
  2. Gdy dioda zacznie świecić nieprzerwanie, zwolnij przycisk kalibracji, nadal trzymając wciśnięty pedał. Dioda zgaśnie. Gdy pierwszy krok kalibracji zakończy się, dioda zacznie migać powoli. Wtedy zwolnij pedał.
  3. Po kilku sekundach ponownie naciśnij przycisk kalibracji (przy zwolnionym pedale), rozpoczynając drugi etap kalibracji. Gdy dioda zacznie świecić nieprzerwanie, zwolnij przycisk (pedał powinien być cały czas zwolniony).
  4. Podczas drugiego kroku kalibracji dioda LED pozostanie zgaszona. Po zakończeniu kalibracji dioda będzie zapalać się na krótko (ok. 1/2 sekundy) co około 2 sekundy - oznacza to, że pedał jest gotowy do pracy.
Procedura kalibracji może być powtórzona - wystarczy nacisnąć pedał, wcisnąć ponownie przycisk kalibracji i powtórzyć powyższą procedurę od punktu 2.
Aktualnie pedał działa całkiem niezawodnie, choć jego charakterystyka jest nieliniowa (ponieważ pojemność jest odwrotnie proporcjonalna do odległości między płytami). Aby poprawić liniowość, należy (przez odpowiednią konstrukcję mechaniczną) zachować dość mały stosunek między minimalną i maksymalną odległością między płytami, lub można dodać w oprogramowaniu pedału odpowiednią procedurę linearyzującą charakterystykę.
Pełne źródła oprogramowania (firmware'u), są dostępne na licencji GPL. Oprogramowanie pedału jest w znacznej mierze oparte na projekcie V-USB-MIDI udostępnionym na licencji GPL, który z kolei jest oparty na projekcie V-USB.

Wersja 2 - z obsługą przełączników nożnych


Przygotowałem także nową, rozszerzoną wersję, pozwalającą użyć przełączników nożnych do wybierania zapisanych ustawień w programach rakarrack i guitarix (lub brzmień w programie ZynAddSubFx). Do złącza P2 można podłączyć trzy przełączniki nożne (patrz schemat, lub źródła schematu w formacie KiCad). Gdy jeden ze styków (1, 2 or 3) zostanie zwarty do masy (pin 4), pedał wysyła komunikat MIDI "program change" z numerem programu 0, 1 lub 2.
Źródła oprogramowania w wersji 2, obsługującej przełączniki nożne, są dostępne tutaj.

Wersja 3 - z programowaną obsługą 10 przełączników nożnych

Aby do maksimum wykorzystać możliwości mikrokontrolera użytego w pedale, zaprojektowałem wersję 3, pozwalającą na zamontowanie maksymalnie 10 przełączników nożnych (dostępny jest schemat jako PDF oraz źródła schematu w formacie KiCad. Nowa wersja biblioteki atmel.lib KiCad'a zawiera zmieniony symbol ATMEL8-P. Dlatego aby poprawnie odtworzyć schemat, należy ściągnąć i rozpakować starą wersję tej biblioteki w tym samym katalogu, w którym jest zapisany plik ze schematem. ). Oczywiście wymaga to odpowiednio dużej obudowy, aby pozwolić na wygodną obsługę takiej liczby przełączników.
Ponadto, aby zwiększyć możliwości urządzenia, postanowiłem dodać możliwość programowania funkcji pedału i poszczególnych przełączników. Po włączeniu pedału, pedał wysyła komunikat zmiany ustawienia regulatora 0x70, a każdy przełącznik przy wciśnięciu wysyła komunikat "program change" z odpowiednim numerem programu, a przy zwolnieniu nie wysyła żadnego komunikatu.
Możliwe jest jednak przeprogramowanie komunikatów MIDI wysyłanych zarówno przez pedał, jak i przy wciśnięciu oraz zwolnieniu poszczególnych przycisków.
Pozwala to użyć pedału do sterowania różnymi funkcjami współpracującego oprogramowania, a poszczególnych przycisków np. do sterowania funkcją "looper" w programach guitarix lub rakarrack, albo do włączania i wyłączania różnych efektów.
Programowanie funkcji odbywa się przez wysyłanie odpowiednich pakietów USB do endpointu 0 urządzenia (można też przerobić firmware tak, aby użyć do tego komunikatów System Exclusive MIDI). Osobiście używam do tego celu skryptów napisanych w języku Python i wykorzystujących bibliotekę pyusb.

Aby przeprogramować komunikat wysyłany przy zmianie pozycji pedału, musimy wysłać komunikat (zgodnie ze składnią pyusb).
dev.ctrl_transfer(0x40,0xbf,0xB1B2,0xB3B4)
Spowoduje to wysyłanie komunikatu USB MIDI składającego się z bajtów B1, B2, B3 i bajtu kodującego pozycję pedału. Jeśli B4 jest równe zero, to pozycja będzie kodowana od 0 przy zwolnionym pedale, do 127 przy maksymalnie wciśniętym pedale, a jeśli B4 jest różne od zera to pozycja będzie kodowana od 127 przy zwolnionym pedale, do 0 przy maksymalnie wciśniętym pedale.
Możliwość zmiany kodowania pozycji pozwala nam wybrać, np. czy w spoczynkowym położeniu pedału chcemy mieć maksymalne, czy minimalne natężenie sterowanego efektu.

Aby uzyskać wysyłanie przy naciśnięciu N-tego przycisku pakietu USB MIDI o kolejnych bajtach B1, B2, B3 i B4, musimy wysłać komunikat USB (zgodnie ze składnią pyusb):
dev.ctrl_transfer(0x40,0x8N,0xB1B2,0xB3B4)
Uwaga, jeśli B1 będzie równe 0, to żaden komunikat nie zostanie wysłany.

Podobnie, aby zaprogramować wysyłanie pakietu USB MIDI o kolejnych bajtach B1, B2, B3 i B4 przy zwolnieniu N-tego przycisku, musimy wysłać komunikat USB (zgodnie ze składnią pyusb):
dev.ctrl_transfer(0x40,0xcN,0xB1B2,0xB3B4)
Uwaga, jeśli B1 będzie równe 0, to żaden komunikat nie zostanie wysłany.

Przykład programu przeprogramowującego pedał można znaleźć tutaj (w wersji dla pyusb 1.0) lub tutaj (w wersji dla pyusb 0.x).

Przez odpowiednie zdefiniowanie pliku reguł "udev" w Linuksie można uzyskać automatyczne skonfigurowanie pedału po jego podłączeniu. Na przykład w moim systemie mam dodaną regułę:
ACTION=="add", SUBSYSTEM=="usb", ATTRS{product}=="V-USB-MIDI-PEDAL+SWITCH", ATTRS{bcdDevice}=="0003", MODE="660", OWNER="root", GROUP= "audio", RUN+="/usr/local/midi/setup_pedals_v3.py"
Aby dostosować ten program do własnych potrzeb warto przestudiować informacje na temat USB MIDI oraz tablicę komunikatów MIDI.

Źródła firmware'u dostosowanego do przeprogramowania komunikatów wysyłanych przez przyciski są dostępne (na licencji GPL) w wersji dla kontrolera ATmega8 oraz w wersji dla kontrolera ATmega88. Źródła wraz z historią ostatnich zmian są także dostępne w repozytorium github.

. Ponieważ przy podłączeniu do jednego komputera kilku instrumentów może mieć sens podłączenie kilku pedałów, włączyłem obsługę numeru seryjnego. Należy pamiętać, aby przed skompilowaniem firmware'u i zaprogramowaniem kolejnego urządzenia właściwie ustawić niepowtarzalny numer seryjny w pliku "usbconfig.h". Przykładowy program przeprogramowujący pedał pokazuje, jak można wykorzystać numer seryjny, aby zaprogramować poszczególne urządzenia w różny sposób.

Konstrukcja mechaniczna pedału w wersji 3

Obudowa pedału w wersji 3 została wykonana z dwóch obudów Z37 połączonych razem. Połączenie obudów nie jest zagadnieniem prostym. Użyłem do tego celu kleju dwuskładnikowego, ale nie wiem, jak długo połączenie wytrzyma instensywną eksploatację.
Regulator nożny wykonałem identycznie jak w pierwszej wersji.
Jako przełączniki nożne wykorzystałem przełączniki TL6520-112, ale można także użyć np. przełącznika PBS24-112. Układ elektroniczny jest na tyle prosty, że można go zmontować na płytce uniwersalnej.

Wnętrze zmontowanego pedału


Moje inne projekty i programy związane z interfejsem MIDI
Wojciech Zabolotny