Table of Contents
Trackball of Doom
Kupiłem na Allegro trackballa sprzed 25 lat. Okazało się, że choć elektronika jest… specyficzna, łatwo przypiąć się do enkoderów i przycisków bezpośrednio, co więcej - działają :)
Efekt stoi w pomieszczeniu nr1 przy crapstation.
Level 1 - reversowanie elektroniki
Oryginalna elektronika składa się z części TI serii 54xx - to militarna wersja serii 74xx (http://en.wikipedia.org/wiki/7400_series). Poza podświetlaniem przycisków (tak, są podświetlane, nie, do niczego się to podświetlenie nie nadaje) wszystko, co widać na zdjęciu można zastąpić króciutkim programem na arduino, także ten etap można uznać za lekkie błądzenie :]
Level 2 - Emerythduino
Na taśmie trackballa wystawione są linie z fotoprzerywaczy i przycisków, które na oryginalnej płytce podłączone były przez pullupy do poszczególnych komponentów. Ponieważ atmega na naszym arduinie ma wbudowane pullupy, wystarczy przypiąć, oprogramować i radować się. Niebagatelne kabel-salad wynika głównie z faktu, że linie zasilania i masy były pierwotnie pozwierane na płytce, ale już nie po drugiej stronie taśmy. Dzięki bibliotece Mouse, dostarczonej z arduino, zrobienie z tego urządzenia HID na USB okazało się trywialne.
Poniżej sketch arduino, który obsługuje tę zabawkę:
const int enc1 = 0; const int enc2 = 1; const int enc3 = 2; const int enc4 = 3; const int toggle = 8, lmb = 9, mmb = 10, rmb = 11; int v1,v2,v3,v4, p1,p2,p3,p4, counter, dx, dy; void setup() { pinMode(enc1, INPUT); digitalWrite(enc1, HIGH); pinMode(enc2, INPUT); digitalWrite(enc2, HIGH); pinMode(enc3, INPUT); digitalWrite(enc3, HIGH); pinMode(enc4, INPUT); digitalWrite(enc4, HIGH); for(int i = 8; i < 12; ++i) { pinMode(i, INPUT); digitalWrite(i, HIGH); } Mouse.begin(); } void loop() { v1 = digitalRead(enc1); v2 = digitalRead(enc2); v3 = digitalRead(enc3); v4 = digitalRead(enc4); if((v4 ^ p4) || (v2 ^ p2)) { dy += ((v2 ^ v4) ? -1 : 1) * ((v4 ^ p4) ? 1 : -1); } if((v1 ^ p1) || (v3 ^ p3)) { dx += ((v1 ^ v3) ? -1 : 1) * ((v1 ^ p1) ? 1 : -1); } if(counter % 100 == 0) { if(digitalRead(lmb)) { Mouse.press(MOUSE_LEFT); } else if(Mouse.isPressed(MOUSE_LEFT)) { Mouse.release(MOUSE_LEFT); } if(digitalRead(mmb)) { Mouse.press(MOUSE_MIDDLE); } else if(Mouse.isPressed(MOUSE_MIDDLE)) { Mouse.release(MOUSE_MIDDLE); } if(digitalRead(rmb)) { Mouse.press(MOUSE_RIGHT); } else if(Mouse.isPressed(MOUSE_RIGHT)) { Mouse.release(MOUSE_RIGHT); } if(digitalRead(toggle)) { Mouse.move(0, 0, -dyc); } else Mouse.move(dx, dy, 0); dx = 0, dy = 0; } p1 = v1; p2 = v2; p3 = v3; p4 = v4; counter += 1; }
Pinout
Pinout, gdyż poprzednio nie został udokumentowany:
+--------+ | 1 … 49 | | 2 … 50 | +--------+ fotoprzerywacze: pion 1: czarny: 21 niebieski: 19 zółty: 22 pion 2: żółty: 35 czarny: 33 niebieski: 27 poziom 1: żółty: 31 czarny: 29 niebieski: 24 poziom 2: czarny: 23 żółty: 25 niebieski: 26 przełączniki: wg pinów na "ATA": all out: 10=11=12=14=16, 34=40=45=47=49 sw1 in: 10=11=12=14=16, 34=40=45=47=49 sw1 (toggle): 10 sw2 in: 10=11=14=16, 34=40=47=49 sw2 (prostokąt): 12, 45 sw3 in: 10=11=12=16, 34=40=45=47=49 sw3 (kółko): 14 sw4 in: 10=11=12=14, 34=40=45=47=49 sw4 (exc): 16
Inaczej mówiąc: Kursor: Do pinów 21, 23, 29, i 33 podpinamy masę. Do pinów 19, 24, 26, i 27 podpinamy 3-5V. Między parami pinów 22 i 35, i 25 i 31 dostajemy przesunięte względem siebie kwadraty.
Przyciski: Do pinu 11 podpinamy masę. Piny 10, 12, 14, 16 podpinamy gdzieś na naszym arduino, w setup robimy “pinMode(pin,INPUT_PULLUP);”, w loop() robimy digitalRead i jesteśmy szczęśliwi.
That's all, folks
Niedługo gdzieś na tubach pojawi się film pokazujący „maleństwo” w akcji, w HS można zaś się nim dość spokojnie pobawić.
— Tomek Dubrownik 2013/06/09 12:16