User Tools

Site Tools


projects:trackball

Trackball of Doom

English version HERE

zaraz po otwarciu

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

projects/trackball.txt · Last modified: 2016/10/09 17:38 by ar

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki