あなた:
最近古いノートPCのがいそうとか再利用しようと思ったとき、とりあえずarduinoでタッチパッドはI2Cとか何かしらのプロトコルで動くか、チップのデータシート調べて、色々コマンド投げてみるのもありかなって思いました。簡単にloop関数内でポーリングし続けて、クリックと座標がわかると大きいかも。
そのアプローチはとても良い方向性ですね!古いノートPCのタッチパッドを再利用する場合、以下のような手順や考慮点があります。ArduinoなどでI2CやPS/2などのプロトコルを使って直接制御できる可能性もあるので、試してみる価値は十分にあります。
タッチパッドのチップを調べる
ノートPCの分解後、タッチパッド部分にあるコントローラICの型番を確認します(例:Synaptics、Elantech、ALPSなど)。
データシートを検索
型番が分かれば、I2C、PS/2、SPIなど、どの通信方式に対応しているかを調査します。SynapticsなどはPS/2互換が多いですが、I2Cも増えています。
Arduinoでのプロトコル実装
通信プロトコルがわかれば、Arduinoでその通信を実装し、loop関数でポーリングする形でデータを読み取ります。
コマンド送信・レスポンス確認
タッチパッドは初期化コマンドやモード切り替えが必要な場合もあるので、レジスタの仕様がわかれば、正しいコマンドを送って確認します。
座標やクリックイベントの取得
座標系のデータやボタンクリック情報を取得できれば、応用範囲が一気に広がります(タッチスクリーンUIやゲーム入力等)。
cpp#include <Wire.h>
#define TOUCHPAD_ADDR 0x2A // 仮のI2Cアドレス、実機確認が必要
void setup() {
Serial.begin(9600);
Wire.begin();
}
void loop() {
Wire.beginTransmission(TOUCHPAD_ADDR);
Wire.write(0x00); // データ読み出し用レジスタ(仮)
Wire.endTransmission(false); // 再スタート
Wire.requestFrom(TOUCHPAD_ADDR, 5); // 座標 + ボタン状態など
if (Wire.available() >= 5) {
uint8_t button = Wire.read();
uint16_t x = Wire.read() << 8 | Wire.read();
uint16_t y = Wire.read() << 8 | Wire.read();
Serial.print("X: ");
Serial.print(x);
Serial.print(" Y: ");
Serial.print(y);
Serial.print(" Btn: ");
Serial.println(button);
}
delay(10); // 適度にポーリング
}
I2Cのスレーブアドレス確認:ロジアナやアドレススキャナで確認可能。
タッチパッドがACPI経由で動く場合:I2C単独での制御が難しいことも。
古いSynapticsはPS/2が主流:Arduinoと直接やり取りする場合はPS/2プロトコル実装も視野に。
USBタッチパッドの場合:USBホスト機能(例:Arduino USB Host Shield)が必要で、複雑度が上がる。
もし具体的なチップ型番がわかれば、もう少し掘り下げたサポートもできます!
また、実際にどのプロトコルが使われているかを調べる方法やロジアナを使った解析方法もお手伝いできますので、興味があればぜひ聞いてください。
**タッチパッドがACPI経由で動く場合**:I2C単独での制御が難しいことも。
もちろん、以下で「タッチパッドがACPI経由で動く場合、I2C単独での制御が難しい」という状況について、技術的背景と理由を詳しく説明します。
近年のノートPCでは、タッチパッドが I2C接続 されていることが増えています。ただし、この「I2Cタッチパッド」は 単なるI2Cセンサ ではなく、ACPI(Advanced Configuration and Power Interface)経由でOSとやり取りすることを前提 に設計されていることが多いのです。
このため、Arduinoなどから単純にI2Cでレジスタにアクセスしても動かない場合がよくあります。
ACPIは、OSがハードウェアの電源管理やデバイス構成を制御するための仕様です。
I2C接続されたタッチパッドなどの「スマートな」周辺機器は、ACPI経由でデバイスの存在や機能、制御方法がOSに通知されるようになっています。
多くのタッチパッドは「HID over I2C(I2C経由のHuman Interface Device)」という規格で動作しています。
OS(例:Windows)はACPIテーブル(DSDT)からI2Cアドレス、初期化手順、データ取得方法を読み取ってドライバ(HID-class driver)を動かします。
つまり、タッチパッドを使うには、OSのACPI制御とHIDプロトコルの理解が必要になります。
ArduinoにはACPIの概念もなく、I2C-HIDのプロトコルも標準では対応していません。
単純にWire.read()
で座標が取得できるようなレベルではなく、I2C上でHID形式のバイナリ通信(レポート)が行われているため、解析・実装が困難です。
ACPIによりデバイス情報とI2Cアドレス取得
例: _CID
が "PNP0C50"
ならHID over I2C対応。
初期化コマンド送信
デバイスごとに異なる。通常OSがACPI定義でやる。
中断(interrupt)経由でデータ取得
Arduinoでは割り込み対応が不十分なため難しい。
レポート(HID Report)形式でデータ取得
単純なX/Y値ではなく、HIDレポート構造に従う。
方法 | 難易度 | 備考 |
---|---|---|
① PS/2やUSB非HIDタッチパッドを使う | ★☆☆ | 古いものに多い。Arduinoで制御しやすい。 |
② I2C-HIDプロトコルを実装する | ★★★ | HID仕様書を読み、レポート解析が必要。マイコンによっては可能。 |
③ USB HIDタッチパッドを使い、USBホストで読む | ★★★ | USB Host Shield + HIDライブラリを使用。 |
④ ラズパイ等でACPI + Linuxドライバで制御 | ★★☆ | ドライバでI2C-HIDを認識させられる。 |
もし対象のタッチパッドの型番や写真がわかれば、I2C-HIDかどうか、また制御できる可能性があるかをさらに正確に調査できます。
必要なら、Linuxでi2cdetect
やdmesg
などでスキャンしたり、WindowsでデバイスマネージャやACPI dump
を使って調べる方法もあります。
ご希望あれば:
実際のHID over I2Cプロトコルの構造の解説
型番を調べて解析する具体的サポート
Arduinoでも可能性があるタッチパッド例の紹介
なども可能です。お気軽にどうぞ!
はい、まさにその通りです。
I2C-HIDデバイス(例えば最近のノートPCのタッチパッド)の制御情報は、基本的にBIOS/UEFIに埋め込まれている「ACPIテーブル」に記述されています。
I2C接続されたHIDデバイスの情報(I2Cアドレス、IRQ番号、初期化手順など)が書かれています。
これを使ってOS(Windows, Linuxなど)がドライバを通じてタッチパッドを正しく動作させます。
BIOS/UEFIは、これらのACPI情報をOS起動時に提供する役割を担っています。
aslDevice (TPAD) { Name (_HID, "PNP0C50") // HID over I2Cデバイス Name (_CID, "HID\VEN_SYN&DEV_1234") // Synaptics タッチパッド例 Name (_UID, 1) Name (_STA, 0x0F) Method (_CRS, 0, NotSerialized) { // リソース定義:I2Cアドレス、IRQ、GPIOなど Name (RBUF, ResourceTemplate () { I2CSerialBusV2 (0x2C, ...) // ← I2Cアドレス Interrupt (Level, ActiveLow, Shared, ...) { 0x00000015 } // ← 割り込み }) Return (RBUF) } }
このような構成がBIOS内のACPIテーブルに埋め込まれています。
[Windows Driver Kit (WDK)] または acpidump
などのツールを使ってBIOSからDSDTを抽出
.aml
を .dsl
に逆アセンブルして中身を見る(iasl
ツール)
PNP0C50
や I2CSerialBusV2
などをキーワードに検索
bashsudo cat /sys/firmware/acpi/tables/DSDT > dsdt.dat
iasl -d dsdt.dat # DSDTの逆アセンブル
または:
bashdmesg | grep -i i2c i2cdetect -l
タッチパッドのコントローラは、ACPI経由で初期化されることを前提に設計されているため、
ArduinoのようなOSなし・ACPIなしの環境では、
適切な初期化ができない
割り込み信号を正しく扱えない
HIDレポートのフォーマットが分からない
という壁にぶつかります。
I2C-HIDタッチパッドの通信仕様や初期化方法はBIOS内のACPIテーブル(主にDSDT)に書かれている
これはOSがデバイスを正しく制御するために使われるが、Arduinoのような単体マイコンでは参照できない
そのため、Arduinoで再利用するのは非常に難しく、I2C-HIDプロトコルを完全に理解して実装する必要がある
もし対象のノートPCやタッチパッドの型番がわかれば、ACPIに何が書かれているかの調査をお手伝いすることもできますよ!
気になる場合は、acpidump
などの結果を貼っていただいても構いません。
はい、あなたの見立ては鋭いです。その通り、
I2C-HIDの仕様さえ掴めれば、Arduinoなどでも実装は不可能ではありません。
I2Cレジスタアクセス+HIDレポート解析ができれば、ポーリングでもクリックや座標取得は可能です。
I2C-HIDデバイスが使うレジスタの読み書き
HIDレポートの構造(報告されるX/Y座標、クリック情報など)
初期化時に必要なシーケンス
Intelなどが関与した「HID over I2C Protocol Specification」という正式文書があります(Version 1.0.0など)
→ これが仕様の出発点になります。
I2CデバイスアドレスはACPIで定義されるが、実機から探せる場合も多い(例:0x2Cなど)
レジスタ(相対アドレス) | 内容 |
---|---|
0x00 - 0x01 | Input report size (16bit) |
0x02 - 0x... | Input report payload(バイナリ) |
HID descriptor
を読む
0x01
コマンドでレジスタから HID descriptor を取得(デバイスの機能が書いてある)
デバイスを初期化(RESET)
0x08
:Reset command
Inputレポートを読む
定期ポーリング or 割り込みで 0x00
からデータを読む
レポートIDが先頭(0x01
とか)に来る
このデータは、最初に0x01
のコマンドでI2Cデバイスから取得できます。中身は以下のような構造:
オフセット | フィールド | 意味 |
---|---|---|
0x00 | bLength | デスクリプタ長 |
0x02 | wReportDescLength | レポート記述子のサイズ |
0x04 | wReportDescRegister | レポート記述子が格納されているアドレス |
0x06 | input register | 入力レジスタのアドレス |
0x08 | max input size | 入力データの最大サイズ(バイト数) |
… | … | … |
→ これを読んで、どのアドレスから何バイト読めばいいか分かる。
ここが一番面倒ですが、たとえばこんな構造で送られてきます:
css[ ReportID ][ X_low ][ X_high ][ Y_low ][ Y_high ][ Button state ]
ReportID(1バイト)
X座標(16bit)
Y座標(16bit)
ボタン情報(ビット)
→ タッチイベントが1本指なら1レポート、2本指なら2レポート、みたいな構成。
この構造は HID Report Descriptor
に定義されているので、Linuxで /sys/.../report_descriptor
から読んだり、WindowsでUSBViewなどで調べられます。
デバイスのI2Cアドレスを判明させる
0x01
コマンドでデスクリプタを読む
デスクリプタから「input report のサイズ・アドレス」を取得
loop内でinput reportのアドレスからポーリング
バイナリをパース(レポートID、X/Y座標など)
Linux kernel source: drivers/hid/i2c-hid/
あたり
Windowsドライバにおける I2C HID についての WDK 文書
実機の report_descriptor
ダンプ(Linux: /sys/bus/i2c/devices/.../report_descriptor
)
項目 | 実現性 | 備考 |
---|---|---|
I2Cレジスタの直接読み書き | ◎ | Arduinoでも可能 |
HID descriptorの読み込み | ○ | レジスタ構造が分かればできる |
HIDレポートの解析 | △ | 難易度高いがパターン化すれば可能 |
初期化/Resetコマンド対応 | △ | デバイス依存のため要調査 |
もし「このタッチパッドを使ってみたい」と思っている実機があれば、
I2Cアドレスを調べる(i2cdetect
など)
LinuxやWindowsでHID descriptor
を取得して中身を見る
などから始めるのが現実的です。
デバイスの情報があれば、もっと具体的に調査サポートもできますよ。どうします?
とても良い視点です。
結論から言うと:
Haswell世代(第4世代Intel、2013年前後)では、I2C-HID対応は
**「あるにはあるが、まだ過渡期で限定的な採用に留まっていた」**というのが実情です。
I2C-HIDは、USB HIDに代わる省電力・小型モバイル向けの新方式として登場
仕様は2012年に初版公開(Intel/Windows共同)
Windows 8(2012年リリース)以降が正式サポート対象
Broadwell(第5世代, 2014年末〜)あたりから普及が加速
主流はまだPS/2またはSMBus的な独自I2C通信(ベンダー独自)
Synaptics、ELANなどは独自プロトコルのI2Cを使っていた
I2C-HID準拠でも、ACPIが未整備だったり、初期化失敗が多かった
Windows 8〜8.1はI2C-HIDに未対応だったモデルも多い
ドライバがうまく読み込めず、PS/2 fallbackされることもあった
逆にSurfaceやUltrabookなどでは一部対応が始まっていた
Haswell機でも、Linuxで以下が出ていればI2C-HIDの可能性あり:
bashdmesg | grep i2c-hid
または:
bashls /sys/bus/i2c/devices/
そこに i2c-ELAN0000
や i2c-SYNA2B00
みたいなデバイスが見えれば、それはI2C-HID対応デバイスである可能性が高いです。
項目 | Haswell世代の対応 |
---|---|
I2C-HID仕様の存在 | ある(2012年に策定) |
対応ハードウェア | 限定的(Ultrabookや一部のWindows 8対応モデル) |
実際の使用状況 | 多くはPS/2またはベンダー独自I2C |
Arduino等での活用 | I2C-HIDなら可、独自プロトコルだと難しい |
もし古いノートPC(Haswell世代)からタッチパッドを再利用したい場合:
Linuxで dmesg | grep -i i2c
や lsmod | grep i2c-hid
で確認
/sys/bus/i2c/devices/
にあるI2Cデバイスを辿って、modalias
や name
を調査
report_descriptor
などの中身を確認してHID準拠か調べる
→ ベンダー独自方式(Synapticsなど)の場合は、I2C-HIDではないため、ハードルが高くなります。
もし対象機種やタッチパッドのデバイス名がわかれば、それをもとにもう少し踏み込んだ調査ができますよ。必要あれば教えてください。
→ ベンダー独自方式(Synapticsなど)の場合は、I2C-HIDではないため、ハードルが高くなります。
了解しました。では「ベンダー独自方式のタッチパッド(Synapticsなど)のI2C通信はなぜハードルが高いのか?」を技術的に詳しく解説します。
Intel/Microsoftが定めた共通仕様
各OSやドライバが自動的に解釈・サポートできる
通信内容(レポートの読み方、初期化方法)が公開された文書に従って一貫している
Linuxの i2c-hid
ドライバや Windows のHIDクラスドライバで対応可能
HID準拠ではないI2C通信を使っている
データフォーマット、レジスタマップ、初期化シーケンスなどが非公開
通信内容やレポート形式がベンダーごとにバラバラ
対応ドライバもOSカーネルへの組み込みやベンダー提供のみ
たとえばSynapticsのI2Cパッドは、どのレジスタが何に対応してるのかが完全に不明
レポートが何バイトで、どのバイトがX座標なのかも自力で逆アセンブルするしかない
多くの独自方式では、動作前に「初期化コマンド列」が必要
例:「0xAB, 0x01 を書き込んでから 0xC4 を3回読め」みたいな独自シーケンス
このシーケンスが不明だと、デバイスが沈黙したまま
間違ったレジスタに書き込みを行うと、不安定になる、応答しなくなる、最悪フラッシュを破壊するリスクも
「実験的な逆コンパイル」でのI2C書き込みはかなり慎重を要します
SynapticsやELANは、Windows専用バイナリドライバで処理しているため、
Linuxでは完全対応していなかったり、
OSによって読み方が違ったりすることがある
実は SMBus over I2C という変則方式
I2Cアドレス 0x2c
などで動く
Windowsでは SynTP.sys
が制御(HIDじゃない)
Linuxでは psmouse
+ synaptics
モジュールで対応(I2CではなくPS/2に見せかけて制御)
一部モデルは i2c-ELAN0000
というI2C-HID互換モードを持つが、
古いモデルは完全な独自レジスタ構成で、ファームウェア更新で変化する場合もあり
項目 | I2C-HID準拠 | ベンダー独自 |
---|---|---|
初期化シーケンス | 公開仕様あり | 不明、解析困難 |
レポート構造 | ドキュメントあり | 自力解析が必要 |
Arduino再利用 | 比較的容易 | 非常に難しい(事実上不可能な例も) |
Linux上で挙動を観察(I2C snooping, dmesg)
Windowsでドライバを動かし、ロジックアナライザでI2C信号キャプチャ
通信ログから初期化コマンド列とレポート構造を逆解析
Arduino等で再現する
ただしこれには:
ロジックアナライザ(Saleae Logicなど)
ある程度のバイナリ逆解析の知識
単純なヒマと根気
が必要になります。
具体的なタッチパッドの型番やI2Cデバイス名
LinuxやWindows上での挙動ログ(dmesg
, lsmod
, デバイスIDなど)
をいただければ、ベンダー独自かどうかの判別や解析の可否を個別にサポートできます。
お気軽に教えてください。
はい、まさにその通りです。
ノートPCのタッチパッド(特に近年のもの)とタッチパネルは、原理的に非常に近く、多くが静電容量方式(capacitive sensing)を採用しています。
**2次元の電極グリッド(X-Y方向)**に対して
指が近づいた際の**静電容量変化(capacitance change)**を検出して
どの位置に指があるかを判定する仕組み
この構造は、スマホなどの静電式タッチパネル(タッチスクリーン)とほぼ同じです。
違いは主に用途とカバーガラスの有無、サイズ、マルチタッチのサポート数です。
基板上にグリッド状に配線された電極があれば、マイコン(例:ATmega、ESP32、RP2040など)で直接読み取ることも可能
Arduinoでは CapacitiveSensor
や TouchRead()
(ESP32)などのライブラリで対応可能
ただし、パッドの電極に直接アクセスできる場合に限る(多くは基板の裏面やチップ下に埋まっている)
Synaptics、ELAN、Goodix などの専用コントローラICが介在している場合、
自分で電極を読めない(=デジタル化済の座標出力しか得られない)
この場合はコントローラの仕様を逆解析するしかない
→ それならいっそ「コントローラなしで、自分で生基板を設計・実装する」という方向もあり。
例:MPR121(12ch 静電タッチ検出、I2C)
または:CAP1188(8ch)、AT42QT1070
DIYレベルでも十分に使え、タッチポイントを自由に配置可能
タッチポイントを複数組み合わせれば2軸近似パッドにも
ESP32はGPIOにタッチセンシング機能が内蔵
単純なタッチボタンやスライダーの他、
数本の電極を組み合わせて2Dの簡易タッチパッドも作れる
Arduino IDE + touchRead()
で試せる
透明アクリル板 + 裏面に導電パターンを配置
マイコンでタッチ検出し、処理する(タッチスクリーン風)
特徴 | タッチパッド | タッチパネル(スクリーン) |
---|---|---|
表面 | 非透明(プラスチック) | 透明(ガラス) |
役割 | ポインティングデバイス(マウス) | 直接入力装置 |
サイズ | 小型(5〜10cm程度) | 中〜大型(数インチ〜) |
規模 | 小型グリッド | 高密度グリッド |
出力 | 相対座標 or ジェスチャー | 絶対座標(画面) |
ノートPCのタッチパッドは、技術的にはタッチスクリーンに非常に近い存在です。
ただし、既存のノートPCの部品をそのまま再利用するには難易度が高い(チップや通信プロトコルの壁がある)
一方で、静電容量方式の原理に則って、Arduinoなどで自作パッドを作る道も十分現実的
もし「自作パッドを作ってみたい」「ノートPCからタッチパッドを取り外したが読み方が不明」など、より具体的なシナリオがあれば、それに沿って部品選定・回路例・サンプルコードなどご案内できますよ。
素晴らしいアプローチです。「自作の静電容量式タッチパッド(シングルタッチ対応)を KiCad + JLCPCB で設計・製造する」という前提で、実現可能性とトラブル時の自力回避を考慮した設計と実装のポイントを以下に体系的にまとめます。
ノートPCの純正タッチパッドを置き換える、またはそれに準ずる自由なデバイスを作る
最低限、1点の位置(x, y)を取得可能な静電容量式のタッチパッド
自分で回路・パターン・制御方式を管理できることが主眼(=再利用不能でも挫折しない)
電極グリッド方式(横電極×縦電極)
最小構成で 3x3〜5x5のグリッドを推奨(小さくても分解能は得られる)
X方向電極とY方向電極が交差する部分の静電容量変化を利用
MPR121などの静電容量ICを使用するなら、複数ポイントに対するセンシングが簡単
ESP32などタッチ対応MCUで電極を直接タッチ読み取りも可能(低コストでよく使われる)
X方向:水平電極(例:GNDプレーンに銅)
Y方向:垂直電極(絶縁レイヤを挟んで交差)
相互容量が変化する点を“タッチポイント”として扱う
電極パターンは外形層 + F.Cu/B.Cu でレイヤを分離
**シルクやソルダマスクを外す設定(exposed copper)**で静電センサとして感度アップ
外形の自由度を持たせるなら角丸・変形パッドも活用可能
X/Y方向の電極を複数GPIOに接続
タッチセンシングは touchRead()
で直接読み取り
電極間のクロストークや感度差を調整するため、0.1µF程度のグランドパッドを用意
I2CでArduinoやRP2040と通信
最大12ポイントを読み取り、タッチ座標を近似
初期化・しきい値調整はライブラリで可能
2層FR-4(1.6mm厚)で十分
銅厚1oz、ソルダマスクなし or クリア指定で感度確保
感度が足りなければ電極を広げ、裏側にGNDプレーンを置く
ケースに内蔵するなら、上から押さえつけられても壊れにくい構造
感度テスト用にジャンパパッドやトリマ抵抗エリアを用意すると後で助かる
ESP32:内蔵タッチピンで直接読み取り可能、シンプルなコードで実装できる
RP2040 + MPR121:性能高め、可搬性・拡張性も高い
ATmega328P(Arduino Uno):タッチIC必須、精度や速度にやや制限あり
一定間隔で各ピンのセンサ値をポーリング
基準値との差分で「接触してるかどうか」検出
複数電極の中で最大変化のポイントを座標にマッピング
方向性 | 内容 |
---|---|
多点タッチ対応 | 電極数増やす、マトリクス化して複数指対応 |
ジェスチャー検出 | スワイプ・スライド・円形パターンなど |
他センサ統合 | 照度、圧力センサ、IMUと統合し多モーダル化 |
カスタム入力デバイス | MIDI、ゲームパッド、オリジナルUIパッドなどに展開可能 |
チェック項目 | 内容 |
---|---|
電極構成 | X-Yマトリクス or 単電極分割? |
読み取り方式 | 自作RC読み取り or 外部IC使用? |
MCU | ESP32 / ATmega / RP2040 のいずれか? |
サイズと形状 | ケースと一致する寸法か?自由形状を許容するか? |
実装手順 | JLCPCBで問題なく製造できるか?感度や仕上がりは? |
デバッグ性 | 感度調整、ログ出力、シリアルモニタ可視化など |
KiCad用の簡易テンプレート
ESP32やMPR121用のArduinoサンプルコード
感度やしきい値の調整ノウハウ
JLCPCB発注時の注意点や設定例
なども具体的にサポートできます。興味がある方向にあわせて深掘りできますので、いつでもどうぞ。
静電容量式タッチパッドの仕組みを、具体的なGPIOの配線と動作の流れに基づいて説明します。ここでは自作する場合に比較的簡単な「静電容量変化を用いたマトリクス構成のタッチパッド」を前提にしています。
静電容量式は「指が近づくと電極の静電容量が増加する」という現象を利用。
人体は電気を通す導体であり、地面(GND)と見なされる。
指が導体パターンに近づくと、そのパターンの静電容量が変化する。
この変化量をマイコンなどで検出し、タッチされたかどうかを判断する。
要素 | 内容 |
---|---|
MCU | 例:ESP32、RP2040、ATmega328Pなど |
電極 | 5本の「Xライン」 + 5本の「Yライン」=25交差点 |
GPIO使用数 | 10本(X:出力, Y:入力) |
仕組み | XとYの交差点の「静電容量の変化」を検知する |
名称 | ピン番号 | 用途 |
---|---|---|
X0~X4 | GPIO 12~16 | 出力:順次HIGHにする(走査) |
Y0~Y4 | GPIO 17~21 | 入力:静電容量読み取り用 |
cppfor (int x = 0; x < 5; x++) {
digitalWrite(X[x], HIGH); // 一つのXラインだけON
cpp for (int y = 0; y < 5; y++) {
int value = touchRead(Y[y]); // ESP32の例(静電容量を読む)
if (value < threshold) {
// タッチされたと判定
Serial.printf("Touched at (%d, %d)\n", x, y);
}
}
cpp digitalWrite(X[x], LOW); // Xラインをリセット
}
MCU | 読み取り方法 | 備考 |
---|---|---|
ESP32 | touchRead(pin) | 超簡単、直接値が取れる(高精度) |
ATmega328P | RC充電時間を測る | 抵抗+電極に充電→時間計測で容量検出 |
RP2040 | PIO+アナログ的手法 | 高速処理で精度・柔軟性あり |
MPR121などIC | I2C通信でセンシング | 安定性と感度が高い |
scssX0 ──────────┬────────────┬─────────── │ │ ▼ ▼ Y0 (交差点) (交差点) ▼ ▼ Y1 (交差点) (交差点) ▼ ▼ ...
電極は 絶縁材を挟んだXラインとYラインの交差点で構成
指が近づくとそのポイントの静電容量が変化
Xラインを切り替えながらYラインの変化を読み取ることで**(x, y)座標を決定**
cppint X_pins[] = {12, 13, 14, 15, 16};
int Y_pins[] = {17, 18, 19, 21, 22};
void setup() {
Serial.begin(115200);
for (int i = 0; i < 5; i++) {
pinMode(X_pins[i], OUTPUT);
digitalWrite(X_pins[i], LOW);
}
}
void loop() {
for (int x = 0; x < 5; x++) {
digitalWrite(X_pins[x], HIGH);
delayMicroseconds(10); // 安定化待ち
for (int y = 0; y < 5; y++) {
int val = touchRead(Y_pins[y]);
if (val < 30) { // 閾値は調整
Serial.printf("Touched at (%d, %d): %d\n", x, y, val);
}
}
digitalWrite(X_pins[x], LOW);
}
delay(100);
}
交差面積が広いほど感度↑
銅箔の上にソルダマスクがあると感度↓(できれば exposed)
裏面にGNDプレーンを敷くと安定性↑(浮遊容量のブレ抑制)
要点 | 内容 |
---|---|
センサ構成 | X×Yマトリクスで電極を構成 |
GPIO役割 | X: 出力で選択、Y: 入力で容量変化を読み取る |
読み取り方式 | touchRead, RC方式, I2CセンサICなど選択肢あり |
パターン設計 | 交差面積と絶縁材、裏面GNDプレーンが重要 |
実装の自由度 | KiCadで自由形状・多様なレイアウト設計が可能 |
必要であれば:
KiCadのパターンテンプレート例
各方式ごとの回路図例
読み取り方式の比較表
実装時のトラブル対応方法
なども詳しく案内できます!どう進めたいか教えてください。
**電極グリッド方式(横電極×縦電極)** * 最小構成で **3x3〜5x5のグリッド**を推奨(小さくても分解能は得られる) * X方向電極とY方向電極が交差する部分の**静電容量変化**を利用
はい、あなたの理解は正しいです。
この方式(いわゆる交差型静電容量式タッチパッド、または相互容量方式)では、Xライン(横電極)とYライン(縦電極)は直接電気的に接続されず、物理的に絶縁された状態で交差しています。
上層:Y電極(受信) ───────────── 絶縁層(ポリイミドなど) ↑ 下層:X電極(送信) ─────────────
2層基板か、FPC(フレキシブル基板)+絶縁フィルム構成で作ることが多いです。
絶縁層の厚みが 静電容量の変化量に影響します。薄いと感度が上がるがノイズも増えます。
分解能は以下の 3つの要素で決まります:
例:5×5 → 25点、10×10 → 100点の交差ポイント
グリッドが細かいほど、タッチ検出の空間分解能が向上します
touchRead()
のようなAPIで取得する静電容量値はアナログ的(例:0~255などの範囲)
各交差点で 何段階の変化を識別できるかにより、座標のサブピクセル精度が得られます
例:
(X3, Y4) という交差点の「容量変化」が大きく、隣接点にも小さな変化 → 指は(3.4, 4.1)付近と推定できる
→ これを補間処理(センター・オブ・グラビティ等)で連続座標に変換可能
グリッドが荒くても、周囲の容量変化から重心補間を行えば高精度な連続座標が得られます
タッチパネル用IC(例:Cypress、Goodixなど)ではこの処理が内蔵されており、座標値(例:1024x768)として出力されます
項目 | 説明 |
---|---|
電極構造 | XとYは絶縁された交差構造。多くは2層基板や絶縁フィルムで構成 |
接続 | X(送信)とY(受信)は物理的に交差しているが電気的には絶縁 |
分解能の定義 | グリッド密度 + 静電容量変化の分解能 + ソフトウェア補間 |
高分解能を得る方法 | 電極を細かく設計するか、容量変化を複数点から収集し重心推定などを使う |
ご希望であれば:
KiCadでの交差レイアウトのサンプル
重心推定によるサブピクセル補間処理のコード例(Arduino/C)
タッチ座標→マウスエミュレーション(HID)への接続方法
なども提案可能です。どう展開したいか教えてください。