[W] Własny kontroler MIDI, cz. 8 - touchpad z laptopa
Kontroler XY jest bardzo ciekawą formą ekspresji - sterujemy jednocześnie dwoma różnymi parametrami syntezatora lub innego instrumentu. Bywa to bardzo inspirujące, a niektóre instrumenty VST wręcz taki "kontroler" mają umieszczony w swoim interfejsie użytkownika i pozwalają kontrolować go myszką. Moim zamierzeniem było zatem zbudowanie fizycznego kontrolera, gdzie po prostu palcem mógłbym przesuwać po jakimś "ekranie". Trochę podobnie działa omówiony w części trzeciej analogowy joystick. Z joystickiem jest jednak ten problem, że ma wyraźną pozycję "spoczynkową" na środku, przez co trudno zachować płynność ruchu...
Touchpad z laptopa
Początkowo próbowałem zastosować po prostu dotykowy ekran, ale ze względu na rosnące trudności zniechęciłem się (najpierw kupiłem za mały ekran, potem wyszło na jaw, że w ogóle wymaga on napięcia 3,3V, czego Arduino Pro Micro nie zapewnia; potem kupiłem niewłaściwe elementy konwertujące napięcie 5V na 3,3V)... Postanowiłem zatem spróbować z prawdziwym touchpadem.
Trudno znaleźć touchpada typowo dla Arduino, za to wpadłem gdzieś na informację, że sporo (zwłaszcza starszych) touchpadów od laptopów działa w standardzie PS/2. A z kolei PS/2, jako standard myszy i klawiatury, jest w Arduino obsługiwany. Pomysł więc narodził się sam: kupuję tani, używany touchpad od laptopa, przypinam do Arduino i gotowe. Banał, no nie?
Dosyć szybko wyszedł pierwszy problem: jak dowiedzieć się, które touchpady obsługują PS/2? A nawet gdyby to wiedzieć, jak sprawdzić, gdzie (w jakim laptopie) dany touchpad był mocowany? Bo w aukcjach da się namierzać w zasadzie tylko modele laptopów, a nie modele touchpadów. Rozwiązałem ten problem "metodą statystyczną" - postanowiłem po prostu kupić za grosze kilka touchpadów z różnych laptopów, różniące się wyglądem - powinny być to więc zupełnie różne modele, zatem wśród nich może trafię (statystycznie) na PS/2. Ceny używanych touchpadów potrafią zejść do 10-15zł, więc kosztowo nie ma tragedii.
Kiedy zamówiona paczka z touchpadami do mnie dotarły i zacząłem się przyglądać zawartości, wyszedł na jaw inny problem.
Jak zidentyfikować touchpad?
Ano właśnie. Wcześniej zakładałem, że touchpady będą miały jakieś oznaczenia symboliczne, numery seryjne, cokolwiek, co po wpisaniu do przeglądarki pozwoli "namierzyć" delikwenta. Były to jednak nadzieje płonne. Wśród pięciu touchpadów udało mi się wprawdzie dojść do nazw producentów i poznać oznaczenia symboliczne, ale często wymagało to żmudnego sprawdzania po numerkach na płytce, taśmach czy kontrolerze.
Co gorsza, nie mając żadnej dokumentacji do touchpadów, nie mogłem nie tylko sprawdzić zgodności z PS/2 czy wartości obsługiwanego napięcia (3,3V lub 5V), ale kompletnie nie wiadomo było, który pin jest od czego i czy można bezpiecznie łączyć poszczególne piny z Arduino. Na szczęście natknąłem się na film z kanału BusBits, który sporo rzeczy wyklarował i mogłem metodą prób i błędów zacząć namierzać poszczególne piny.
W ten sposób wykryłem w touchpadzie o symbolu TM-03114-001 z komputera HP, że pole T25 to napięcie, T23 - masa, T12 to CLK, a T11 - DATA. To są wszystkie wartości potrzebne przy transmisji PS/2.
Program
Przylutowałem do odpowiednich pól w touchpadzie kabelki i podłączyłem do płytki stykowej - chociaż nie powiem, żebym czuł jakąś pewność siebie. Początkowo okazało się, że odwrotnie zindentyfikowałem sygnały CLK i DATA, ale wystarczyło w programie zamienić wartości stałych i oto całość zadziałała!
#include <PS2Mouse.h> #include <MIDIUSB.h> #define CLK_PIN 8 #define DATA_PIN 9 PS2Mouse mouse(DATA_PIN, CLK_PIN); const int CHANNEL = 0; const byte CCX = 1; const byte CCY = 11; int lastX = 0; int lastY = 0; int refresh = false; void setup() { Serial.begin(9600); while(!Serial); mouse.begin(); } void loop() { uint8_t stat; int x,y; mouse.getPosition(stat,x,y); refresh = false; int currX = normalize(lastX - x / 2); int currY = normalize(lastY - y / 2); if (currX != lastX) { controlChange(currX, CCX); lastX = currX; } if (currY != lastY) { controlChange(currY, CCY); lastY = currY; } delay(5); if (refresh) { MidiUSB.flush(); } } int normalize(int value) { if (value < 0) { return 0; } else if (value > 127) { return 127; } return value; } void controlChange(byte value, byte cc) { midiEventPacket_t event = {0x0B, 0xB0 | CHANNEL, cc, value}; MidiUSB.sendMIDI(event); refresh = true; }
Po uruchomieniu tego prościutkiego kodu na Arduino touchpad faktycznie zaczął działać i przekazywać dane. Przesuwanie palcem powodowało wysyłkę danych, więc nie pozostawało nic innego, jak zapakować całość w jakąś obudowę i korzystać!
Obudowa
Ano właśnie - przez brak obudowy kontroler ten przeleżał w stanie niezłożonym przez prawie dwa tygodnie. Kiedy już zdobyłem odpowiednie (jak się wydawało) pudełeczko, nie potrafiłem w wieczku wyciąć odpowiednie otworu. Dopiero weekendowa wizyta w garażu pozwoliła otwór wyciąć i jako-tako obrobić. Kabel USB wpuściłem do środka przez otwór i zamocowałem na stałe (tzn. da się go odłączyć, ale dopiero po rozkręceniu obudowy).
Elementy składowe kontrolera
Sama obudowa to jednak nie wszystko - trzeba było jeszcze jakość umieścić w niej wszystkie elementy. Aby touchpad trzymał się na miejscu, a jednocześnie nie wymagał stosowania nieestetycznych śrub, przygotowałem akrylową płytkę z otworami, która przytrzymuje touchpad na miejscu (tzn. jest on mocno dociśnięty do obudowy).
Po drugiej stronie płytki jest już samo Arduino, na zdjęciu poniżej już przylutowane do kabelków wychodzących z touchpada:
Arduino przylutowane i gotowe do programowania
Chociaż na zdjęciu powyżej także widoczna jest pianka, ostatecznie zastosowałem dwie filcowe przekładki - były cieńsze, a miałem już mało miejsca w obudowie. Także kabelek USB widoczny na zdjęciu musiałem wymienić na jasny, bo ten kupiony specjalnie dla kontrolera okazał się być kabelkiem wyłącznie do ładowania - Arduino nie było widoczne w systemie.
Kontroler gotowy do pracy
Przez taką dziwną, bardzo amatorską konstrukcję, miałem spore problemy ze skręceniem całości, bo ciągle coś mi się wysuwało, przesuwało i blokowało zamknięcie obudowy. Ostatecznie jednak kontroler dał się zmontować i po dopracowaniu programu - działa.
Koniec?
Ten kontroler na jakiś czas kończy moją burzliwą i owocną przygodę z Arduino - zaowocowała ona trzema konkretnymi kontrolerami i doświadczeniem. Mam wprawdzie w głowie jeszcze pewne pomysły, ale nie wiem, czy znajdę teraz motywację do ich urzeczywistniania - kontrolerów mam więcej niż wolnych gniazd USB. Ale wiadomo, że nigdy nie wiadomo.
Komentarze
Prześlij komentarz