DIY Arduino USBトラックパッド – 古いノートPCのタッチパッドを現代的なUSB入力デバイスに変換
部品と材料
- Arduino Micro (または Pro Micro / Leonardo) – 必須: ATmega32U4搭載機種 (HID機能のため)
- 廃棄ノートPCから取り外したトラックパッド (PS/2インターフェイス対応品)
- 配線用ワイヤー (細め推奨)
- ホットグルー (配線固定用)
アプリとオンラインサービス
- Arduino IDE
プロジェクト概要
Raspberry Piで自作ノートPCを作ろうとする際、スタンドアロンのUSBトラックパッドが市販されていないという課題があります。このプロジェクトでは、壊れたノートPCからトラックパッドを取り出し、Arduino Micro (Pro Micro/Leonardoも可) を介してUSBマウス(HID)として動作させます。
なぜこれが動くのか
多くの古いノートPCのトラックパッドは、PS/2インターフェイス (データ線・クロック線) でホストと通信しています。ArduinoでPS/2プロトコルを読み取り、USB HIDマウスレポートに変換して送信します。※新しい機種ではトラックパッド自体がUSB接続の場合があり、その場合はピンアサインを調べて直接USB接続可能です。
配線
トラックパッド基板上の半田パッド (通常 T10=Data, T11=Clock, T20=VCC, 大きな銅箔=GND) を特定し、以下のように接続:
| トラックパッド側 | Arduino Micro ピン |
|---|---|
| T10 (Data) | Pin 10 |
| T11 (Clock) | Pin 9 |
| T20 (VCC) | 5V |
| GND (銅箔) | GND |
重要: 半田付け後、パッドに一切力がかからないようホットグルーでしっかり固定してください。わずかな力でパッドが剥離し、トラックパッドが使えなくなります。
必要なライブラリ
- Mouse Library – Arduino標準搭載 (ATmega32U4ボード選択時)
- PS/2 Library – GitHub等から入手 し、Arduino IDEのライブラリフォルダに配置
スケッチ
ボードマネージャで「Arduino Micro」または「Arduino Leonardo」を選択して書き込んでください (Uno等ではHID動作しません)。
#include <Mouse.h>
#include <ps2.h>
#define PS2_DATA 10
#define PS2_CLK 9
byte mstat1, mstat2, mxy, mx, my, mz;
int msval[3];
int repeatCnt = 0;
PS2 moose(PS2_CLK, PS2_DATA);
void setup() {
Mouse.begin();
// PS/2マウス初期化シーケンス (リモートモード、分解能設定等)
moose.write(0xff); moose.read(); moose.read(); moose.read(); // リセット
moose.write(0xf0); moose.read(); delayMicroseconds(100); // リモートモード
moose.write(0xe8); moose.read(); moose.write(0x03); moose.read(); // 分解能設定
moose.write(0xe8); moose.read(); moose.write(0x00); moose.read();
moose.write(0xe8); moose.read(); moose.write(0x01); moose.read();
moose.write(0xe8); moose.read(); moose.write(0x00); moose.read();
moose.write(0xf3); moose.read(); moose.write(0x14); moose.read(); // サンプルレート設定
Serial.begin(9600);
}
void ms_read() {
moose.write(0xeb); // データ要求
moose.read(); // ACK
mstat1 = moose.read(); // ステータス1
mxy = moose.read(); // X/Yオーバーフロー等
mz = moose.read(); // Z (スクロール)
mstat2 = moose.read(); // ステータス2
mx = moose.read(); // X移動量
my = moose.read(); // Y移動量
// 符号付き12bit値に展開
msval[0] = (((mstat2 & 0x10) << 8) | ((mxy & 0x0F) << 8) | mx);
msval[1] = (((mstat2 & 0x20) << 7) | ((mxy & 0xF0) << 4) | my);
msval[2] = int(mz);
}
void loop() {
ms_read();
// 同じ方向の移動が3回継続したら移動実行 (ノイズ除去)
if (msval[0] > 0 && msval[2] > 10) {
repeatCnt++;
} else {
repeatCnt = 0;
}
if (repeatCnt > 2) {
// 生値をマウス移動量にマッピング (環境に合わせて調整必要)
msval[0] = map(msval[0], 580, 5164, -1023, 1023);
msval[1] = map(msval[1], 1120, 5967, 1023, -1023);
Mouse.move(msval[0] / 200, msval[1] / 200);
}
}
完成とトラブルシューティング
書き込み後、Arduinoが再起動してUSB HIDマウスとして認識されます。OS問わず即座に動作します。
よくある問題と対処
- 動かない: トラックパッド裏面の型番を検索し、「pinout」でピン配列を確認。T10/T11/T20の位置が異なる場合があります。
- 動作が不安定: 配線の接触不良、ホットグルー固定不足、電源電圧低下を疑ってください。
- 感度/方向がおかしい:
map()の範囲パラメータを実測値に合わせて調整してください。
カスタマイズの可能性
Arduinoを使う利点は、PS/2→USB変換アダプタでは不可能な以下のカスタマイズがコード修正だけで可能な点です:
- マウス感度・加速度曲線の調整
- タップ・ダブルタップ・スクロールジェスチャーの定義
- ボタン割り当ての変更
- 詳細: Arduino Mouse Reference
市販のPS/2→USB変換アダプタもありますが、データ変換が不適切で使い物にならないケースが多いとの報告があります。自作なら完全制御可能です。
製造プロセス
- Bluetooth 制御 Raspberry Pi ロボットに音声フィードバックを追加して構築
- ジェスチャー制御 RGB テーブルランプ – インタラクティブなハンズフリー照明
- Android加速度センサーで操作するラジコン車両:Raspberry Pi・Arduino・モーターシールド連携
- ラズベリーパイとNode-REDでAlexaからLEDを制御する - 簡単ステップバイステップガイド
- 古いラジコンカーをXboxコントローラーで操作可能に - ArduinoとUSBホストシールドで実現
- Arduinoベースのヌンチャク操作6自由度ロボットアームキット
- Arduino Nanoで音声制御ロボットを自作
- MobBob:Arduino製ロボットをAndroidスマホでシームレスに制御
- 音声で家電を操作:GoogleアシスタントとBluetoothでArduino家電制御
- PiBot:Arduino駆動の精密ピアノ演奏ロボット
- Wi-Servo:WebブラウザからWi-Fi経由でサーボモーターを制御