タッチパネルをマウスとして使う

年代物のタッチパネル(NEC PC-9873)があったのでArduino Leonardでマウスにしてみました。 PCのCRTにかぶせてつかうもので、写真のように透明度は今のものからすると低いです。 A4ぐらいのサイズがあります。 http://kousaku-kousaku.blogspot.jp/2008/08/arduino_24.htmlを参考にしています。

調べる

抵抗膜方式であっても4線式、5線式など少しずつ違いがあります。 PC-98x1用のインタフェースカードが付属していますが、古いものなのでいまのパソコンでは使えません。コネクタのところで配線をカットして被覆を剥くと網線+電線5本が出てきました。 テスターで調べたところ4線式で1本(オレンジ)は使われていませんでした。 調べた結果、次の表のようにつなぐことにしました。4つの信号すべて、10kΩの抵抗でプルダウンしておきます。プルダウンによって触っていないときの、Arduinoにつないだ端子(A0〜A3)の電圧が0Vになります。

電線の色信号Arduinoの端子
X-A0
X+A1
Y-A2
Y+A3
赤-白間の抵抗値は約500Ω、青-黒間の抵抗値は約200Ω

スケッチ

スケッチは次のようになっています。 タッチパネル部分は、ほぼ http://kousaku-kousaku.blogspot.jp/2008/08/arduino_24.htmlのままです。 X座標、Y座標を交互に読み(読まない側の端子から抵抗膜に電圧をかける)、 タッチされていたら、マウスカーソルをそこへ移動します。 タッチパネルの座標は絶対座標ですが、 マウスカーソルの移動は相対座標なので、リセット時の位置を(128, 128)として、 絶対座標→相対座標の変換をしています。別につないだマウスなどを操作すると座標がずれます。

直線に動かしても直線にならない、ドラッグしたらカーソルがとぶ(短時間タッチが外れる)といった問題などが残っています。それとマウスカーソルが動くだけで、範囲も狭くて、クリックができないというので、面白くないといわれてしまいました^^; 改良は時間ができたときにでも。

//http://kousaku-kousaku.blogspot.jp/2008/08/arduino_24.html
//デジタル出力用ピン番号の定義:the digital output pins
#define xLow  A0
#define xHigh A1
#define yLow  A2
#define yHigh A3

int mX = 128, mY = 128;

void setup(){
  //シリアル通信開始:start serial communication
  Serial.begin(9600);
  while (!Serial) {}
  
  Mouse.begin();
}

void loop(){
  //X座標用端子をデジタル出力に設定し、それぞれをLOWとHIGHで出力しておく
  //set the both x-coordinate pins as digital output:one is Low the other is HIGH  
  pinMode(xLow,OUTPUT);
  pinMode(xHigh,OUTPUT);
  digitalWrite(xLow,LOW);
  digitalWrite(xHigh,HIGH);

  //Y座標用端子をLOWにしておく:the both y-coordinate pins are set to be LOW
  digitalWrite(yLow,LOW);
  digitalWrite(yHigh,LOW);

  //Y座標用端子をデジタル入力に設定:change the y-coordinate pins as digital input
  pinMode(yLow,INPUT);
  pinMode(yHigh,INPUT);
  delay(10);

  //アナログ入力2番ピン(yLowピン)で読み込み
  //read analog pin2(yLow pin) to get an x-coordinate value
  int x=analogRead(A2);
  
  //Y座標用端子をデジタル出力に設定し、それぞれをLOWとHIGHで出力しておく
  //set the both y-coordinate pins as digital output:one is Low the other is HIGH 
  pinMode(yLow,OUTPUT);
  pinMode(yHigh,OUTPUT);
  digitalWrite(yLow,LOW);
  digitalWrite(yHigh,HIGH);

  //X座標用端子をLOWにしておく:the both x-coordinate pins are set to be LOW
  digitalWrite(xLow,LOW);
  digitalWrite(xHigh,LOW);

  //X座標用端子をデジタル入力に設定:change the x-coordinate pins as digital input
  pinMode(xLow,INPUT);
  pinMode(xHigh,INPUT);
  delay(10);

  //アナログ入力0番ピン(xLowピン)で読み込み
  //read analog pin0(xLow pin) to get an y-coordinate value
  int y=analogRead(A0);

  if (x>0 && y>0) {
   x >>= 2;
   y >>= 2;
    
    Mouse.move(x-mX, y-mY);
    mX = x;
    mY = y;
  }

//  if(Serial.available()>0)
  if (x>0 && y>0)
  {
    //文字列でシリアル通信:send the values as a DEC format with a delimiter
    Serial.print(x,DEC);   //X座標:x-coordinate
    Serial.print(",");     //デリミタ:delimiter
    Serial.println(y,DEC); //Y座標:y-coordinate

    //合図用信号読み込みでバッファを空にする
    //read a handshake signal from Processing and clear the buffer
 //   Serial.read();
  }
}

Arduinoのすすめ
Copyright (c) 2013, Noriaki Mitsunaga