Site Tools


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;
}

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: 2014/04/02 08:57 (external edit)