はじめに
M5CardputerおよびM5stack Cardputer ADVのキーボードマトリックスをスキャンして、キーの押下を検出するArduinoプロジェクトです。回路図などを見て理解してしまえばそれほど難しいハードウェア構成ではないのですが、ちょっとしたテストを兼ねて作ったので、その詳細とともに公開します。
概要
このM5Cardputerシリーズのキーボードの物理的な構造を理解し、キーマトリックスのスキャン方法を学習することを目的としています。従来モデル(V1.1)とM5stack Cardputer ADVの両方に対応しており、それぞれ異なるハードウェア構成に適したキーボード制御を実装しています。
対応ハードウェア
M5Cardputer(V1.1)
- 74HC138デコーダーを使用した8行×7列のキーマトリックス
- 直接GPIO接続による制御
M5stack Cardputer ADV ⭐ NEW
- TCA8418RTWRキーボードコントローラーを使用
- I2C通信による制御
- より安定したキーボード動作とFIFOバッファ機能
ハードウェア構成
従来モデル(V1.1)
-
行制御: 74HC138デコーダーによる8行の制御
- A0 (GPIO 8)
- A1 (GPIO 9)
- A2 (GPIO 11)
-
列検出: 7つの列の直接GPIO接続
- GPIO 3, 4, 5, 6, 7, 13, 15
ADVモデル
- キーボードコントローラー: TCA8418RTWR
-
通信方式: I2C
- SDA (GPIO 8)
- SCL (GPIO 9)
- INT (GPIO 11)
- I2Cアドレス: 0x34
- キーマトリックス: 8行×10列(最大80キー対応)
使用デバイス
- M5Stack CardPuter
機能
共通機能
- キー押下の検出とシリアル出力
- リアルタイムキー状態監視
- 自動デバイス検出
従来モデル(V1.1)固有
- 8×7キーマトリックスの全スキャン
- チャタリング防止機能
ADVモデル固有
- I2C通信によるキーボード制御
- FIFOバッファによる確実なキーイベント処理
- ハードウェアレベルでのデバウンス機能
技術的詳細
従来モデル(V1.1)のキーマトリックススキャン
- 74HC138デコーダーを使用して8行を順次選択
- 選択された行をLOWレベルにアクティブ化
- 7つの列をプルアップ抵抗でHIGHに保持
- キーが押されると、アクティブな行と列が接続されて列がLOWになる
- この変化を検出してキー押下を判定
74HC138には3ビットのGPIOが接続されています。これにより、8パターンの選択が可能です。0x00~0x07と考えるとよいでしょう。これが8行に相当します。
ADVモデルのTCA8418制御
- I2C通信でTCA8418RTWRを初期化
- キーパッドマトリックス用のGPIOピンを設定
- キーイベント割り込みを有効化
- FIFOバッファからキーイベントを読み取り
- キーIDと押下/リリース状態を解析
TCA8418RTWRは専用のキーボードコントローラーで、以下の利点があります:
- ハードウェアレベルでのデバウンス処理
- FIFOバッファによるキーイベントの確実な保存
- 最大80キーまでの対応
- 低消費電力設計
M5CardPuterの実際のキーマトリックス(従来モデル)
M5CardPuterは、14列4行のキーボードを持っています。これを、7列8行にマッピングしています。物理配置とGPIO接続上の配置が直感的ではないのですが、下の表のように接続されています。
行/列 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | R7C5 | R3C5 | R7C6 | R3C6 | R7C0 | R3C0 | R7C1 | R3C1 | R7C2 | R3C2 | R7C3 | R3C3 | R7C4 | R3C4 |
1 | R6C5 | R2C5 | R6C6 | R2C6 | R6C0 | R2C0 | R6C1 | R2C1 | R6C2 | R2C2 | R6C3 | R2C3 | R6C4 | R2C4 |
2 | R5C5 | R1C5 | R5C6 | R1C6 | R5C0 | R1C0 | R5C1 | R1C1 | R5C2 | R1C2 | R5C3 | R1C3 | R5C4 | R1C4 |
3 | R4C5 | R0C5 | R4C6 | R0C6 | R4C0 | R0C0 | R4C1 | R0C1 | R4C2 | R0C2 | R4C3 | R0C3 | R4C4 | R0C4 |
M5Cardputer ADVキーデータ
M5CardPuter ADVは、14列4行のキーボードを持っています。これを、7列8行にマッピングしています。REG_KEY_EVENT_Aから読み取った値は10進数で、一桁目がCOLで二桁めがROWとなります。15はR1C5となります。
ソースコード
参考資料
追記
このドキュメントは、初期調査とサンプルコードの生成をGemini2.5 Proで行い、コードの作成をClaude Sonnet 4に手伝ってもらいました。
連絡先など
間違い・改善提案などありましたら、プルリクエストをくださるかご連絡くださると嬉しいです。
- KIRIAKE Masanori seiken@rd01.net
- GitHub ji6czd
- Twitter ji6czd