1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

前回の記事 でopencodeが使えるようになったので、趣味のM5Stck開発でも使ってみます。

流れ

  1. 仕様作成

    最初に作りたいものをドキュメントに仕様として書き出します。最初からチャットで会話しながら作業を始める方法もありますが、最初に仕様を書きだしておくと自分の中でも整理できます。

    サンプル仕様書は最後に記載します。

  2. 新しいプロジェクトの作成

    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
    
  3. プロジェクトフォルダーに仕様書を配置

    プロジェクトフォルダーに仕様書を配置します。例えば specification.md など、ツールによってデフォルトの名前が変わるみたいです。

ファイル配置
src/
  main.cpp
lib/
  空
test/
  空
platformio.ini
specification.md

やってみる

  1. opencodeを起動する

    コマンドプロンプトを開き、作成したプロジェクトのディレクトリーに移動します。
    opencodeを開きます。

    opencode
    
  2. モデルを選択します

    前回の記事のように使うモデルを選択します。

  3. コード生成開始

    コード生成を開始します。
    仕様書のデフォルト名はツールによって変わるので、明示的に指定してます。
    モデルによって、コード生成した後自動的にビルドして、ビルド完了までやってくれますが、指定しないと普通に 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は使ってくれなかった。

corrected_IMG_0281.png

どれか1つモデルを選ぶとしたらまずこのモデル。

Kimi-K2.6

仕様書を理解して動作している反面、生成のレスポンスは遅い。
仕様書からキーボードを正しくQWERTYキーボードとして認識している。
横14列と指定した配置が考慮されていない。
BLE接続するとクラッシュする。キーを押すとタッチ音がでる。
テーマ変更は正しく動作しない。
montserratフォントは使ってくれなかった。

corrected_IMG_0280.png

Qwen3.6-35B-A38

レスポンスがよく、軽快に使える。
最初のタスクの流れ、次に行うタスクの説明があまりない。
このモデルのみ、最初に、main.cpp 単独かモジュール分割するかの確認があった。
仕様書からキーボードをQWERTYキーボードとして認識していない。
配置が想定通りとなっていない。

corrected_IMG_0279.png

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日~数日かかる作業があっという間に出来上がるの素晴らしいです。余裕ができた時間は、新しいアイデアの実現、さらなる機能追加や、改良に充てることができるようになります。

くるま好きの人でもマニュアル車を好きな人がいるように、趣味の場合は、コードを書くこと自体が目的だったり、楽しみだったりする人もいるので使うか、使わないかは人それぞれだと思います。お好みに合わせて使ってみてください。

(参考)トークン数/リクエスト数

今回の試用でどれくらいトークン数/リクエスト数を使ったか、

image.png

トータル300ちょっとなので、MAX 3,000リクエストだとこれらが約10回試せる感じです。Kimi-K2.7-Codeの1つのモデルのみで、プログラムの規模次第ですが50~100回くらいの新規作成、修正を繰り返すことができるかもしれません。

(参考)仕様書

参考として今回試用した仕様書になります

specification.md
# 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 | 右向き矢印 |
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?