見出し画像

Apple II ▷ トラックパッド(4)

▷ スケッチについて
スケッチは,Adafruit社が提供するトラックパッドのライブラリを利用しています.リンク先はスケッチの4行目に記載しています.スケッチはトラックパッドから受け取った座標データをデジタルポテンショメータに引き渡すという単純な内容です.
トラックポッドに個体差があるようで,座標のずれをCRx, CRyとして補正しています.この数値はシリアルモニタに座標データを出力しながらトラックパッドのほぼ中央でデジタルポテンショメータに引き渡すデータが127近傍になるように設定しました.ところでデジタルポテンショメータに引き渡すデータは0~255の範囲の整数ですが,まれにトラックパッドの周辺域で逸脱値が生じることがあります.こうした逸脱値は除外するようにしています.

// Track Paddle for Apple II
// Capacitive PS/2 Trackpad
// github.com/adafruit/Adafruit-PS2-Trackpad

#include <Adafruit_PS2_Trackpad.h>
#include <SPI.h>

// PS2 uses two digital pins
#define PS2_DATA 5
#define PS2_CLK 6

// Digital Potentiometer
byte address = 0x11;
int CSx= 9;
int CSy= 10;

// correction parameter
// These depend on the characteristics of the trackpad
int CRx=70;
int CRy=90;
// Aspect Ratio
float ARx=3.8;
float ARy=2.7;

// Push Switch
int PSW1=3;
int PSW2=4;

// Adafruit_PS2_Trackpad 'absolute' tablet mode
Adafruit_PS2_Trackpad ps2(PS2_CLK, PS2_DATA);

void setup() {
  Serial.begin(19200);

  Serial.println("Track Paddle for Apple ][");
  if (ps2.begin()) 
    Serial.println("Successfully found PS2 mouse device");
  else
    Serial.println("Did not find PS2 mouse device");
  Serial.print("PS/2 Mouse with ID 0x");
  Serial.println(ps2.readID(), HEX);

// digital potentiometer  ---------------------
  pinMode (CSx, OUTPUT);
  pinMode (CSy, OUTPUT);
  SPI.begin();

// Push Switch ---------------------
  pinMode (PSW1, OUTPUT);
  pinMode (PSW2, OUTPUT);
}

void loop() {
  if (! ps2.readData()) return;

// Digital Potentiometer ---------------------
  int PX=255-(ps2.x-CRx)/ARx;
  int PY=255-(ps2.y-CRy)/ARy;

  if(PX>255){
    PX=255;
  } else if(PX<0) {
    PX=0;
  } else if(PY>255) {
    PY=255;
  } else if(PY<0) {
    PY=0;
  }

// X-axis ---------------------
  digitalPotWriteX(PX);
  delay(5);

// Y-axis ---------------------
  digitalPotWriteY(PY);
  delay(5);

// Push Switch Control ---------------------
  if (ps2.right)
  {
    Serial.print("\tRight");
    digitalWrite(PSW1, HIGH);
  }
  else
  {
    digitalWrite(PSW1, LOW);
  }

  if (ps2.left)
  {
    Serial.print("\tLeft");
    digitalWrite(PSW2, HIGH);
  }
  else
  {
    digitalWrite(PSW2, LOW);
  }
  Serial.println();
  delay(1);
}

// Digital Potntiometer Control Routine ---------------------
int digitalPotWriteX(int valueX)
{
  digitalWrite(CSx, LOW);
  SPI.transfer(address);
  SPI.transfer(valueX);
  digitalWrite(CSx, HIGH);
}

int digitalPotWriteY(int valueY)
{
  digitalWrite(CSy, LOW);
  SPI.transfer(address);
  SPI.transfer(valueY);
  digitalWrite(CSy, HIGH);
}

今回使用したAdafruit社のトラックパッドは,仕様として,

  1.  相対的な「マウスモード」で使うことができ,指の動きを変化量として取得できる.

  2. 「タブレットモード」にすると,タッチされたポイントの絶対xy座標量を取得できる.

  3.  ユーザーがどのくらい強く押しているかをz座標量として取得でき,同時に,指がパッドに触れているか,離されたかどうかのフラグを返す.

  4.  マルチタッチをサポートしていないが,タッチパッドエリアで「タップ」と「ダブルタップ」の基本的なジェスチャーをサポート.

があります.Apple II用のトラックパッドとしては2番目の機能を利用したのですが,3.~4.の機能についてはゲームI/Oから取り込めそうです.例えば3.についてはz座標量をデジタルポテンショメータを介してゲームコントローラ入力のGC3に,指の接触のフラグはプッシュボタン入力のPB2に入力することで利用できます.この工作はまだ未着手ですが,考え方自体を応用して入力情報制御を試みた工作例は後日紹介したいと思います.

ゲームI/Oを活用してシンプルなインタフェースを工作する可能性をジョイスティックとトラックパッドの工作で示せたと考えます.今回に続いてもう少しその可能性について記事にしていきます.

▷ エラーチェックについて
スケッチは自分のためにコメントや演算結果確認をするためのシリアルモニタ出力を多数記述しているのですが,ここに掲載するにあたり削除しています.注意はしているのですが,必要な部分まで削除しまうことがあります.掲載前に動作を確認をする必要があるのですが,工作自体を他の目的に転用していることもあり,再現性に課題があります.読めばわかるエラーは修正するようにし,動作確済みであることを後日クレジットするようにします.

この記事が気に入ったらサポートをしてみませんか?