はじめに
前回の記事 でopencodeが使えるようになったので、趣味のM5Stck開発でも使ってみます。
流れ
-
仕様作成
最初に作りたいものをドキュメントに仕様として書き出します。最初からチャットで会話しながら作業を始める方法もありますが、最初に仕様を書きだしておくと自分の中でも整理できます。
サンプル仕様書は最後に記載します。
-
新しいプロジェクトの作成
PlatformIOで新しいプロジェクトを作成します。プロジェクトのフォルダーができます。
platformio.ini に想定のライブラリーなどを指定しておくと、PlatformIOがライブラリーを取り込みますが、この状態でopencodeを開始した方が効率的です。
サンプル
platformio.ini[env:m5stack-tab5-p4] platform = https://github.com/pioarduino/platform-espressif32/releases/download/55.03.39/platform-espressif32.zip board = m5stack-tab5-p4 framework = arduino upload_speed = 1500000 monitor_speed = 115200 lib_deps = m5stack/M5UnitUnified m5stack/M5Unit-KEYBOARD tobozo/LGFX_Fonts m5stack/M5Unified board_build.partitions = default_16MB.csv build_flags = -DCORE_DEBUG_LEVEL=3 -DSOC_USB_OTG_SUPPORTED=1 -DARDUINO_USB_CDC_ON_BOOT=1 -DARDUINO_USB_MODE=1 -
プロジェクトフォルダーに仕様書を配置
プロジェクトフォルダーに仕様書を配置します。例えば specification.md など、ツールによってデフォルトの名前が変わるみたいです。
src/
main.cpp
lib/
空
test/
空
platformio.ini
specification.md
やってみる
-
opencodeを起動する
コマンドプロンプトを開き、作成したプロジェクトのディレクトリーに移動します。
opencodeを開きます。opencode -
モデルを選択します
前回の記事のように使うモデルを選択します。
-
コード生成開始
コード生成を開始します。
仕様書のデフォルト名はツールによって変わるので、明示的に指定してます。
モデルによって、コード生成した後自動的にビルドして、ビルド完了までやってくれますが、指定しないと普通にpio runで実行されるので、penv環境での実行を指示します。今回はモデルの比較も兼ねてしたので事前に指定してないですが、このあたりは、plan や knowledge、あるいは specification で指定した方がいいかもしれません。
仕様書 specification.md からコードを生成して。 ビルドを行う際は、PlatformIOのpenv環境でビルド確認して(C:\Users\<ユーザー名>\.platformio\penv\Scripts\platformio.exe run)仕様書の内容によって追加の情報が必要であれば AI が質問してきますので、回答してください。Qwen3.6-35B-A38 モデルでは、main.cppにまとめるか、モジュール分割するか尋ねられました。
penv指定しないと、PlatformIOの共通領域に入っている package や platform がビルド毎に更新されて遅くなることがあります。platformのバージョン指定も同様です。
結果
サマリ
今回使用できる4つのモデルで結果を比較してみます。コード生成と、初回のビルド完了まで行いました。
ビルド完了までにかかるおおよその時間です
| No | モデル | 所要時間 | ステータス |
|---|---|---|---|
| 1 | Kimi-K2.7-Code | 約30分 | 完了 |
| 2 | Kimi-K2.6 | 約20分 | 完了 |
| 3 | Qwen3.6-35B-A38 | 数分 | 完了 |
| 4 | gemma-4-31B-it | 数分 | ビルド~修正の繰り返しになったので途中キャンセル |
Kimi-K2.7-Code
仕様書をしっかり理解して動作している反面、生成のレスポンスは遅い。
仕様書からキーボードを正しくQWERTYキーボードとして認識している。
指定にない配置も考慮されている。
BLE接続ができ、キーが送信される。
テーマ変更、タッチ音も組み込まれている。
montserratフォントは使ってくれたが、Font Awesomeは使ってくれなかった。
どれか1つモデルを選ぶとしたらまずこのモデル。
Kimi-K2.6
仕様書を理解して動作している反面、生成のレスポンスは遅い。
仕様書からキーボードを正しくQWERTYキーボードとして認識している。
横14列と指定した配置が考慮されていない。
BLE接続するとクラッシュする。キーを押すとタッチ音がでる。
テーマ変更は正しく動作しない。
montserratフォントは使ってくれなかった。
Qwen3.6-35B-A38
レスポンスがよく、軽快に使える。
最初のタスクの流れ、次に行うタスクの説明があまりない。
このモデルのみ、最初に、main.cpp 単独かモジュール分割するかの確認があった。
仕様書からキーボードをQWERTYキーボードとして認識していない。
配置が想定通りとなっていない。
gemma-4-31B-it
ビルド確認後に、無駄な空行の追加ループを何度か繰り返すようになったので、途中でキャンセルした。
レスポンスがよく、軽快に使える。
最初のタスクの流れ、次に行うタスクの説明を行ってくれる。
まとめ
モデルはそれぞれ個性が感じられて、どれか1つでなければならないという感じではなかった。
正確性を求めていて、のんびり待つことができる人は Kimi-K2.7-Code がよさそう。AIとチャットの会話を楽しんだり、人がAIに介入したい、あるいはせっかちでレスポンスが遅いのと耐えられない人は Qwen3.6-35B-A38 や gemma-4-31B-it を選ぶといいかもしれない。
また、初回のビルド完了までは Kimi-K2.7-Code で固めて、その後の調整は gemma-4-31B-it を使うという方法もよさそう。
人が作ると1日~数日かかる作業があっという間に出来上がるの素晴らしいです。余裕ができた時間は、新しいアイデアの実現、さらなる機能追加や、改良に充てることができるようになります。
くるま好きの人でもマニュアル車を好きな人がいるように、趣味の場合は、コードを書くこと自体が目的だったり、楽しみだったりする人もいるので使うか、使わないかは人それぞれだと思います。お好みに合わせて使ってみてください。
(参考)トークン数/リクエスト数
今回の試用でどれくらいトークン数/リクエスト数を使ったか、
トータル300ちょっとなので、MAX 3,000リクエストだとこれらが約10回試せる感じです。Kimi-K2.7-Codeの1つのモデルのみで、プログラムの規模次第ですが50~100回くらいの新規作成、修正を繰り返すことができるかもしれません。
(参考)仕様書
参考として今回試用した仕様書になります
# Tab5 Keyboard - 仕様書
*作成日: 2025-08-10*
*バージョン: 1.0*
## 1. 概要
M5Stack TAB5 を対象とした **タッチ操作対応 BLE キーボード** のファームウェアです。
TAB5 のタッチパネルをキーボードのキーパッドとして利用し、BLE (Bluetooth Low Energy) を経由してホスト端末に HID キーストロークを送信します。
TAB5 本体のタッチスクリーン上にキーボード UI を描画し、物理キーボード (M5Unit Tab5 Keyboard) との併用にも対応します。
---
## 2. ハードウェア環境
| 項目 | 仕様 |
|------|------|
| 開発ボード | M5Stack TAB5 (ESP32-P4 ベース) |
| ディスプレイ | タッチパネル付き LCD (M5GFX) |
| 拡張コネクタ | ExtPort1 (10-pin 内部コネクタ J9) |
| 物理キーボード | M5Unit Tab5 Keyboard (I2C 接続) |
| ボリュームスピーカ | 搭載 (ホバー音出力用) |
| WiFi | SDIO2 インタフェース (GPIO 8-12, 15) |
| フレームワーク | ESP32 Arduino (pioarduino) |
| ボードパーティション | default_16MB.csv (16MB フラッシュ) |
### 2.1 物理キーボード接続ピン
### Tab5 物理キーボード (UnitTab5Keyboard)
Tab5 の ExtPort1 (J9, 10ピン内部コネクタ) 経由で I²C 接続。
| 信号 | GPIO |
|------|------|
| SDA | GPIO0 |
| SCL | GPIO1 |
| INT | GPIO50 |
動作モード: **HID モード**
### SDIO WiFi
| 信号 | GPIO |
|------|------|
| CLK | GPIO12 |
| CMD | GPIO13 |
| D0 | GPIO11 |
| D1 | GPIO10 |
| D2 | GPIO9 |
| D3 | GPIO8 |
| RST | GPIO15 |
---
## 3. ソフトウェア構成
### 3.1 メインファイル構成
\```
src/
main.cpp メインエントリ (setup/loop)
lib/
必要なライブラリー
test/
\```
### 3.2 依存ライブラリ
| ライブラリ | 用途 |
|-----------|------|
| m5stack/M5Unit-KEYBOARD | Tab5 物理キーボードユニット制御 |
| tobozo/LGFX_Fonts | フォント (Montserrat 40pt) |
| M5Unified | M5Stack 統合 HAL |
| M5GFX | グラフィック描画 |
| T-vK/ESP32-BLE-Keyboard | Bluetooth HID キーボード送信 |
- ESP32-BLE-Keyboard は、デフォルトでは ESP32-P4 に対応していないため、ESP32-P4 に対応させる。
- ESP32-BLE-Keyboard は、デフォルトでは 101 キーボードのため、106 キーボードに対応させる。
---
## 4. コア機能
### 4.1 タッチキーボード入力処理
タッチパネル操作をキーボード入力に変換する。
#### 4.1.1 初期化
画面を 24列 x 6行で区切る
最上部は、ESC、INS、DEL、の他、いくつかのファンクションキーを配置する
タッチデバウンス処理を入れる
#### 4.1.2 キーレイアウト
3つのキャラセット (レイヤ) を持つ。
**Charset 0: 小文字 (Default)**
**Charset 1: 大文字**
- 小文字レイヤの英字が全て大文字に
- 記号類が対応する大文字/記号に切替
**Charset 2: 記号**
- Charset 0、Charset 1、でカバーしない記号・特殊文字のみのレイヤ
#### 4.1.3 特殊キー
画面でのタッチは小さく、入力しづらいこともあるため、Shift、Ctrl、Altキーは押すごとにロック/アンロックするタイプとする
#### 4.1.4 タッチイベント
タッチ時にキーをハイライト表示する
| メソッド | 説明 |
|----------|------|
| ProcessKeyTouch() | タッチ入力を処理してイベント配列を返す |
| GetKeyLabel() | 指定座標のキーラベルを取得 |
| HandleConfirmedKey() | 確定キーの内部状態を更新 |
| DrawKeyboard() | キーボード全体を描画 |
| DrawSingleKey() | 単一キーを描画 |
| SetKeyHighlight() | キーのハイライト表示 |
| ClearHighlight() | ハイライト解除 |
| SetTheme() | テーマ切替 |
| GetTheme() | 現在のテーマを取得 |
#### 4.1.5 テーマ
ファンクションキーの1つ、テーマボタンを押すと、カラーテーマが切り替わる
テーマ切替順序: Dark → Light → Blue → Green → Dark (サイクル)
---
### 4.2 BLE キーボード機能
#### 4.2.1 初期化
BLEデバイス名: `"Tab5 Keyboard"`
#### 4.2.2 HID 送信
キーラベルを BLE の HID コードに変換して送信するが、物理キーボードを接続した際の内部処理と共通化したい。
例えば、Enter キーを押した場合など、タッチキーボードと物理キーボードを押したた際の処理を合わせ、同じ意味のキーを押したら同じコードを送りたい。
タッチキーボードがタッチされたら、タッチキーボードのコードを送信、
物理キーボードが押されたら、物理キーボードのコードを送信する。
#### 4.2.3 その他
BLEの接続状態を監視し、接続中はアドバタイジングを停止し、接続が切れたらアドバタイジングの開始と再接続する。
---
### 4.3 M5Unit Tab5 Keyboard (物理キーボード)
#### 4.3.1 初期化
タッチキーボードに合わせて Character Mode で動作させることが望ましいか
接続は、内部のI2Cとぶつからないよう、TwoWire(2) / Wire2 を使用する。
LEDの輝度(Brightness)がまぶしいので、4 程度にする
---
### 4.4 M5Stack Tab5
#### 4.4.1 初期化
WiFi.setPins(...) // ESP32-C6 と接続する SDIO2 WiFi ピン設定
物理キーボードを接続した際にも同じ向きを設定する。Rotate(3)
---
## 5. プラットフォーム設定
### 5.1 platformio.ini
| 項目 | 値 |
|------|-----|
| platform | espressif32 @ 55.03.39 (pioarduino) |
| board | m5stack-tab5-p4 |
| framework | arduino |
| upload_speed | 1500000 |
| monitor_speed | 115200 |
| board_build.partitions | default_16MB.csv |
| CORE_DEBUG_LEVEL | 3 |
| SOC_USB_OTG_SUPPORTED | 1 |
| ARDUINO_USB_CDC_ON_BOOT | 1 |
| ARDUINO_USB_MODE | 1 |
---
## 6. 使用フォント
画面の解像度が高いため、大きめのフォントを選択する。
特殊キーのラベルに Font Awsome を使用するため、フォントは montserrat を使用する。
- タイトル: `lvglvFontMontserrat40`
---
## 7. キーのUnicodeシンボル一覧
| シンボル | Unicode | Font Awesome | 意味 |
|----------|---------|------|------|
| (U+F0C9) | U+F0C9 | fa-navicon | テーマ切替 |
| (U+F0F3) | U+F0F3 | fa-bell | タッチサウンドオン/オフ |
| (U+F077) | U+F077 | fa-chevron-up | 上向き矢印 |
| (U+F00D) | U+F00D | fa-close | - |
| (U+F00C) | U+F00C | fa-check | Enter |
| (U+F55A) | U+F55A | fa-delete-left(fa-backspace) | BackSpace |
| (U+F051) | U+F051 | fa-step-forward1 | Tab |
| (U+F11C) | U+F11C | fa-keyboard-o | 全/半キー切替 |
| (U+F053) | U+F053 | fa-chevron-left | 左向き矢印l |
| (U+F078) | U+F078 | fa-chevron-down | 下向き矢印 |
| (U+F054) | U+F054 | fa-chevron-right | 右向き矢印 |



