Bluetoothトラックパッド・基板名刺を作ろう
名刺が欲しくなったので,基板名刺(プリント基板製の名刺)を作ることにしました.
ネタを色々考えた結果,メイン部分が配線パターンだけでよいため薄く,シンプルにできる上,キーボードなどと比べてあまり作例がないということでBluetoothトラックパッドを作ることにしました.
GitHub: https://github.com/object1037/card
ハードウェア
構成

ハードウェア構成は上のようにします. トラックパッドでは電極間の相互容量をセンシングして指を検知する方法が一般的(マルチタッチ時にゴーストが出ないため)で,そのための電極パターンをPCB上に用意します.
静電容量センシングにはタッチコントローラMTCH6102を使います. シングルタッチのみ対応ですが,十分かと思います.
BLEモジュールは小ささ,薄さ重視でISP1907-LLを選びました. アンテナや水晶発振子など含めて8mm角のパッケージに収まっており,技適もついています. 載っているマイコンはNordicのnRF52811で,最低限のメモリしか載っていない分安いです.
また,電源はCR2032一つにしました. MTCH6102とISP1907はどちらも3Vで動作するので,そのまま使うことができます. 消費電力については,MTCH6102が1mAほど,ISP1907はBLEで通信していないときはuAオーダーですが,通信時には最大5mA以上消費するようです. CR2032の標準放電電流は大幅に上回っているものの,この程度なら動くはずなので,見た目・単純さ重視で選んでいます.
基板設計

設計した基板を上に示します. 右上にISP1907が,その下にコイン電池,その左下辺りにMTCH6102があります.
電極パターンが裏面になっているのは指が電極に近づきすぎないようにするためです. 指が電極に近づくと,指を通じてGNDへの容量結合が増える分,電極間の相互容量が減ります. しかし,電極に近づきすぎると今度は相互容量が増加してしまいます. タッチコントローラは容量が減る領域で動作するようになっているので,正常に動作させるためには指と電極の間に隙間が必要です.
通常のトラックパッドでは,ガラスやプラスチックのオーバーレイを基板の上につけるのですが,今回は薄く,シンプルな見た目にしたかったので裏面の電極を表から触る構造にしました.当然GNDでシールドした場合と比べて外界のノイズに弱くなってしまうのですが,ここでもシンプルな見た目を重視しました.
ファームウェア
nRF52系のファームウェア開発にはnRF Connect SDKを使うことが推奨されているようです. VSCodeの拡張機能などもあります.
ファームウェアがやるべきことは大きく分けて3つあります. まず,電源投入後,Bluetoothのプロトコルにしたがってパソコン等と接続・ペアリングします.
次に,タッチコントローラからデータを読む必要があります.
MTCH6102は新しいデータが利用可能になると割り込みで教えてくれるので,割り込みが来たらI2Cでデータを読みに行きます.(Task1
)
最後に,読み取ったデータを基にカーソルの変位やクリック状態などを計算して,HIDレポートとしてBluetooth経由で送信します.(Task2
)
割り込み時の処理は以下のようになります.
最初はアイドル状態ですが,GPIO割り込みが発生するとISRに実行が移ります.
ISRはTask1
をキューに追加して終了します.
すると,スケジューラは次にキューからTask1
を取り出して実行します.
Task1
では,I2Cで読み取ったデータをメッセージキューに追加し,Task2
を実行キューに追加します.
Task2
ではメッセージキューからデータを取り出して使います.

デバッグ・書き込み
デバッグやファームウェア書き込みにはSWD(Serial Wire Debug)を使います. パソコンと基板をデバッグプローブを介して繋ぎ,probe-rsなどで書き込みます.
nRF52811は十分なメモリがないため,デバッグ出力などの機能をオフにしないとそもそも書き込みができませんでした.

最終的にはフラッシュメモリのうち83%, RAMはほぼ100%使っています(スタックサイズなどを調整して収めた).
完成

完成〜
普通にカーソルを動かすことができ,クリック・ダブルクリックなども可能なBluetoothトラックパッド・基板名刺ができました.
皆さんも作ってみてはいかがでしょうか.それではさようなら.