年代物のタッチパネル(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 |
スケッチは次のようになっています。 タッチパネル部分は、ほぼ 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(); } }