
私は毎日 Claude を使っていますが、最もよく口にする疑問はコードのことではありません。「今週はあとどれくらい残っているんだろう?」です。Claude Code の /usage 画面がその答えを出してくれますが、手を止めて入力したときだけです。私は時計が時刻を示すように、その答えを机の上に置きたかったのです。
M5Stack Basic はうってつけです。完成されたデバイスで、2 インチの 320×240 画面、3 つのボタン、バッテリー、そして ESP32 が 54 mm のケースに収まっています。ブレッドボードもはんだ付けも不要です。
この記事ではこのダッシュボードについて説明します。何を表示するのか、データがどうやって Claude から画面へ届くのか、デバイスが設定なしでどう接続するのか、そして自分で作るための手順です。UI はハードウェアに触れる前に Velxio 上の M5Stack Core で設計しました。作ってみたいなら、この方法をおすすめします。このファームウェアをブラウザで実行することもでき、デモデータで動くのでデバイスは不要です。
デバイス上のダッシュボードはこちらから。YouTube で見る。
コード、ファームウェア、PC ブリッジはすべて MIT ライセンスで GitHub に公開しています。velxio/m5claude。以下の「コードをパートごとに」のセクションで、各ファイルが何をするのかを順に説明します。
ハードウェア

ボードは M5Stack Basic Core IoT Development Kit v2.7 です。
- ESP32-D0WDQ6-V3、240 MHz のデュアルコア。
- 520 KB の SRAM で、PSRAM はありません。この制約がファームウェアの形を決めます。
- 16 MB のフラッシュ。
- ILI9342C コントローラを搭載した 2 インチ 320×240 IPS パネルで、v2.7 ではガラス張りです。
- GPIO 39、38、37 に 3 つのボタン(A、B、C)。
- CH9102 USB-シリアルチップ、Wi-Fi、Bluetooth LE。
- GPIO 25 に 1 W スピーカー。
- IP5306 電源チップと 110 mAh バッテリーで、I2C 経由で読み取れます。
他には何も必要ありません。ダッシュボードはケースに入っているものだけを使います。このボードには IMU、マイク、LED、リアルタイムクロックがないので、ダッシュボードはそれ以外のすべて、つまり画面とボタン、アラート用のスピーカー、バッテリー節約用のバックライト、充電量表示用の電源チップを使います。
画面に表示されるもの
このダッシュボードは 2 種類の Claude アカウントに対応しており、それぞれ複数のアカウントを扱えます。
- Pro と Max のサブスクリプション。 これらには使用上限があります。5 時間のセッション枠、週次上限、モデルごとの週次上限です。画面にはそれぞれをパーセンテージとリセット時刻で表示します。
- API 組織。 これらはトークンごとの課金なので、画面には代わりに利用額を表示します。今日と過去 7 日間の金額(ドル)です。
どちらの場合も、過去 1 週間の 1 日あたりのトークン数を、入力・出力・キャッシュ読み取り・キャッシュ書き込みに分けて、さらにモデル別にも表示します。
ビューは 4 つあります。B で次のビューに進み、A と C でアカウントを切り替え、B を長押しすると PC に最新データを要求し、C を長押しすると設定を開きます。以下がすべての画面で、各ビューが開くときに再生されるアニメーションも含まれています。

概要。 アカウントごとに 1 枚のカードを表示します。レイアウトはアカウント数に応じて変わります。1 アカウントなら画面全体を使い、2 アカウントなら今日の使用量の行を加えた背の高いカードになり、3 つ以上ならスクロールするリストになります。


上限。 週次上限をリングで表示し、その横にセッションとモデル別の上限を並べます。モデル名は Claude 自身から取得するので、行はプランにある上限にそのまま従います。色は 60%(アンバー)と 85%(赤)で変わります。

トークン。 今日、過去 7 日間、そしてドル換算額を表示し、その後に 1 日あたりのトークン数を平均値の破線付きで表示します。サブスクリプションの場合、ドル換算額は同じトークンを API の定価で使った場合の金額です。請求額ではありませんが、プランをどれだけ使っているかを知るのに便利な指標です。


内訳。 1 週間のトークンを種類別とモデル別に表示します。Claude Code では、通常キャッシュ読み取りが合計の大部分を占めます。


時計の横のドットは接続状態を示します。データが新しいときは緑、古いときはアンバー、PC が接続されていないときは赤です。写真は私自身のアカウントです。スクリーンショットはデモアカウントを使用しています。
バッテリー、サウンド、設定
時計の横にはバッテリーをスマートフォンと同じように描画します。残量と、充電中に満ちていく稲妻マークです。IP5306 電源チップは 4 段階(25、50、75、100%)しか報告しないため、数値は 25 刻みで動きます。

スピーカーはアラートに使います。セッションまたは週次上限が 90%(設定で 80% を選んだ場合は 80%)を超えると、デバイスは短い 2 回のチャイムを鳴らし、どのアカウントのどの上限かを表示します。上限がリセットされると、上昇するチャイムを鳴らします。新しいコンピューターからの承認リクエストも音を鳴らします。ボタンクリック音は任意です。
C を長押しすると設定が開きます。A と C で移動し、B で値を変更し、B を長押しすると画面を閉じます。設定はデバイスに保存されます。

- 言語。 英語またはスペイン語。画面上のすべての文字列は 1 つのテーブルにまとまっているので、言語の追加はエントリを 1 つ増やすだけです。
- 明るさ。 25、50、75、100%。
- サウンド。 オフ、アラートのみ、アラートとボタンクリック音。
- アラートしきい値。 80%、90%、オフ。
- バッテリー時の画面オフ。 なし、1 分後、5 分後。どのボタンでもスリープから復帰し、復帰させた押下はそれ以外の動作をしません。110 mAh のバッテリーでは、これが重要です。
- 夜間の減光。 PC の時計を使って 22:00 から 07:00 までバックライトを暗くします。
- ペアリング済みコンピューター。 承認済みの台数を表示し、B で確認後にすべて削除します。


110 mAh を長持ちさせる
最初のファームウェアは 1 時間ももたずにバッテリーを使い切りました。CPU は 240 MHz で動作し、画面は毎秒再描画され、無線は 15〜30 ms の接続間隔で最大出力で送信していました。1 分に 1 回変わる数値を表示するのに、そのどれも必要ありません。バッテリー動作時、ファームウェアは次のようにしています。
- CPU を 80 MHz に。Bluetooth がサポートする最低速度です。USB 給電時は 240 MHz に戻ります。
- バックライト。ボタンを押さずに 20 秒経つと暗くなり、設定で選んだ時間が経つとオフになります。
- スタンバイ。画面がオフになって 15 秒後、無線を停止し ESP32 はライトスリープに入ります。RAM は保持されるので、どのボタンでも最後のデータのまま画面がすぐに戻り、ブリッジは数秒で再接続します。10 分ごとにタイマーが最大 45 秒間、画面はオフのまま起動します。最新データを取得し、上限がアラートしきい値を超えていれば画面を点灯してアラートを鳴らします。
- 無線。+9 ではなく 0 dBm、アドバタイズは 0.5〜1 秒ごと、接続間隔はスレーブレイテンシ付きで 100〜200 ms。1 分に 600 バイトのスナップショットなら、これで十分です。
- 再描画は分が変わったときか新しいデータが届いたときだけ行い、バッテリー動作時はアイドルアニメーションもありません。
机を離れて一日中使うなら、Battery Module 13.2 を Basic の下に重ねれば 1500 mAh を追加できます。
仕組み
設計方針は デバイスは何も知らない ことです。Claude の認証情報も Wi-Fi 設定も持ちません。PC 上の小さなプログラムであるブリッジがすべてを収集し、デバイスには描画用のスナップショットを送ります。これにより、机の上に置かれたデバイスに秘密情報を残さずに済み、PC やネットワークを変えても再設定が不要になります。
データの取得元
ブリッジは約 1,100 行の Python で、依存関係は 2 つだけです(pyserial と bleak)。3 つのソースから読み取ります。
- プラン上限 — Claude Code のログイン情報から。 各 Claude Code の設定ディレクトリ(
~/.claude、~/.claude-workなど)には 1 アカウントのログイン情報が入っています。ブリッジはそれらをすべて見つけ、各トークンを使って Claude Code の/usage画面に表示されるのと同じ上限を読み取ります。トークンは読むだけで、リフレッシュはしません。リフレッシュするとトークンがローテーションされ、Claude Code がログアウトしてしまうからです。 - トークン数 — Claude Code のトランスクリプトから。 Claude Code が受け取るすべての応答は、トークン使用量とモデルとともに
projects/配下の JSONL ファイルに書き込まれます。ブリッジはこれを日ごとに集計し、重複を除去し(セッションを再開すると以前のメッセージが新しいファイルにコピーされます)、API の価格表で金額を計算します。 - API 組織の利用額 — Usage and Cost Admin API から。
usage_report/messagesは日ごと・モデルごとのトークン数を返します。cost_reportは実際の利用額を返します。どちらも Admin API キー(sk-ant-admin01-...)が必要です。
実際のアカウントで動かして分かった 2 つの教訓:
- 上限エンドポイントにはレート制限があります。 テスト中に、
Retry-Afterなしの HTTP 429 を返し始めました。そこでブリッジは上限を 1 分ごとではなく 5 分ごとに読み取るようにし、最後に成功した応答をディスクに保存して、一時的なエラーの間もそれを表示し続けるようにしました。トークン数はローカルファイルから取得するため、引き続き 1 分ごとに更新されます。 - トランスクリプトは大きくなります。 自分のものは 665 MB ありました。ブリッジは過去 8 日間に変更されたファイルだけを読み、サイズまたは更新時刻が変わったときだけファイルを再パースします。更新には約 1 秒かかります。
スナップショット
更新のたびに、約 600 バイトの JSON が 1 行生成されます。
{"v":1,"ts":1792770195,"tz":3600,"acc":[
{"n":"Personal","p":"Max 20x","k":"sub","ok":1,
"s":[42,1792778235],"w":[67,1793037195],"x":[["Opus",54,1793037195],["Sonnet",31,1793037195]],
"td":2840000,"tk":[2310000,1480000,15900000,1120000],"c":84.2,"ct":11.35,
"d":[1900000,3400000,2600000,4100000,3300000,2670000,2840000],"m":[["Opus",61],["Sonnet",34],["Haiku",5]]}]}
s、w、x はそれぞれセッション、週間、モデル別の上限を [パーセント, リセット時刻] で表します。d は 1 日あたりのトークン数です。ts と tz は PC の時計と UTC オフセットです。M5Stack Basic にはリアルタイムクロックもタイムゾーンデータベースもないため、デバイスはスナップショットから両方を受け取り、そこから秒を数えます。「あと 2 時間 14 分でリセット」や「火 04:00」を表示するにはこれで十分です。
設定なしで接続する
セットアップは一切不要にしたかったのです。ボタンが 3 つしかないデバイスに Wi-Fi パスワードを入力するのは不快です。PC の IP アドレスをデバイスに保存すると、PC を変えた途端に壊れます。そこでデバイスは 2 つの接続方式に対応し、どちらも設定を必要としません。
USB。 ケーブルを挿すだけです。ブリッジは USB チップが M5Stack のもの(CH9102 または CP2104)であるシリアルポートを探します。DTR と RTS をトグルせずにポートを開くので ESP32 はリセットされず、挨拶を待ちます。ファームウェアはデータが届くまで 2 秒ごとに {"hello":"m5claude",...} を送信します。数秒以内に挨拶が届かなければ、ブリッジはポートを解放し、しばらくそのままにします。これにより他の ESP32 ボードや書き込みツールに影響しません。
Bluetooth LE。 ファームウェアは 2 つのキャラクタリスティックを持つ GATT サービスをアドバタイズします。1 つは PC が行を書き込むもの、もう 1 つはデバイスが通知を送るものです。ブリッジはサービス UUID をスキャンして接続します。Windows のペアリングダイアログは出ず、リストから選ぶものもありません。
範囲内のどの PC からでもデバイスを見つけられるため、新しい PC はデバイス上で一度だけ承認します。

ブリッジは ~/.m5claude/pc_id にランダムな ID を保持します。デバイスは最大 4 台の承認済み PC の ID を NVS に保存します。既知の PC は即座に受け入れられ、電源投入時に A を押し続けるとすべて忘れます。すでに USB で接続されているデバイスは Bluetooth ではスキップされるため、同じ PC を 2 回承認するよう求められることはありません。
ブリッジが起動するまでの間、デバイスは何をすべきかを表示します。

ファームウェア
ファームウェアは arduino-esp32 2.0 コア上で arduino-cli を使ってビルドする Arduino スケッチです。3 つのライブラリを使用します。
- LovyanGFX — 画面の描画用。
- NimBLE-Arduino — Bluetooth 用。NimBLE はデフォルトの Bluedroid スタックの約半分の RAM で済みます。
- ArduinoJson 7 — スナップショットのパース用。
UI コードはハードウェアに依存しません。LovyanGFX のターゲットに描画し、3 つのボタンを読み取ります。ボード固有のもの(パネル、USB、BLE、NVS)はすべてスケッチ側にあります。
デモではなく製品のように見せるためのいくつかの工夫:
- アンチエイリアスされたテキスト。 フォントは Inter で、小さな Python スクリプトによって 6 つのサイズの LovyanGFX のスムーズな VLW 形式に変換されています。スクリプトは各サイズが使う文字だけを含めており、合計で約 77 KB です。
- アンチエイリアスされたゲージ。 リングはピクセル単位で描画されます。カバレッジはリングの端までの距離から計算され、端は丸められます。バーとカードは LovyanGFX のスムーズな角丸矩形を使用します。
- 短いアニメーション。 ビューが変わるたびに、バーと数値はイーズアウトカーブで 0.5 秒かけて値まで伸びます。
PSRAM なしで描画する、そして斜めの筋
16 ビットカラーの 320×240 のフルフレームは 150 KB です。Bluetooth が動作している状態での ESP32 の最大空きメモリブロックはそれより小さくなります。そこで UI はフレームごとに 320×60 のバンド(38 KB)へ 4 回に分けて描画されます。各パスはすべてをバンドのオフセット分だけ上にずらして描画し、バンドの外にはみ出した部分はクリップされます。
これをボードで初めて動かしたとき、画面には斜めの筋が現れ、承認プロンプトのボタンが上部と下部の 2 回表示されました。最初はパネル設定を疑いました。M5Stack のドキュメントを見ながら手書きで書き直しましたが、何も変わりませんでした。原因は別のところにありました。
LovyanGFX はスプライトを DMA でバックグラウンドでパネルに送信します。私のループは前のバンドがまだ送信されている間に、次のバンドを同じバッファに描画し始めていました。そのためパネルはあるバンドの半分と次のバンドの半分を受け取っていました。修正は 2 つのバッファを交互に使い、プッシュする前に前の転送を待つことです。
for (int y = 0, k = 0; y < 240; y += 60, k ^= 1) {
LGFX_Sprite& band = bands[k];
band.fillScreen(BG);
draw_ui(band, /*offset_y=*/y); // runs while the other buffer is still being sent
lcd.waitDMA(); // the other buffer's transfer has finished
band.pushSprite(&lcd, 0, y); // starts this buffer's transfer
}
lcd.waitDMA();
追加コストは 38 KB のバッファがもう 1 つだけで、空き RAM 約 275 KB のうちの一部です。
コードをパートごとに
コードは git clone https://github.com/velxio/m5claude.git でダウンロードするか、リポジトリの Code ボタンから ZIP で取得できます。プロトコル以外に共通点のない 2 つの半分で構成されています。bridge/ は PC 上で動作し、firmware/ と src/ は M5Stack 上で動作します。
M5Stack 側
firmware/m5claude/m5claude.ino: ボード固有のすべて。
- パネルの設定: VSPI 上の ILI9342C、そのピン、回転、色反転。
- USB リンク。シリアルポートを読み、応答を書き込みます。
- Bluetooth リンク。NimBLE の GATT サービスで、PC が書き込む characteristic と、デバイスが notify する characteristic を持ちます。NimBLE のコールバックで受信したバイトはストリームバッファに入り、
loop()で処理されるため、残りのコードが Bluetooth タスク上で実行されることはありません。 - 承認済み PC のリストと設定。
Preferencesを使って NVS に保存されます。 - バッテリー: 2 秒ごとに I2C 経由で IP5306 の残量、充電中、充電完了のビットを読み取ります。
- スピーカー: 小さなシーケンサが LEDC の矩形波を低デューティ比で使ってアラート、リセット、ペアリングの音を鳴らし、その後ピンをローに保つので、音と音の間でスピーカーがヒスノイズを出しません。
src/app/app.cpp: リンクに依存しないプロトコル。
- 各リンク (USB または Bluetooth) は独自の行バッファと状態を持ちます。改行ごとに行をパースし、データが届くまで 2 秒ごとにグリーティングを繰り返します。
- 信頼されていないリンクは承認を経ます。デバイスは UI に問い合わせ、回答を記憶し、
pair: okまたはdeniedを返します。 - B の長押しを
{"req":"refresh"}に変換します。 - 前回のスナップショットのコピーを保持するので、UI は上限がアラートしきい値を超えたか、リセットされたかを判断できます。
- 時計を保持します。最後のスナップショットの時刻に、それが届いてからの秒数を加えたものです。
src/model/: データ。
model.hはアカウントを記述します。プラン、パーセントとリセット時刻で表した上限、1 日あたりのトークン数、コスト、モデル。parse.cppは ArduinoJson でスナップショットからモデルを埋めます。別のコピーにパースし、行全体が有効な場合にのみ現在のデータを置き換えるので、壊れた行によって画面が中途半端に更新されることは決してありません。mock.cppにはこの記事のスクリーンショットで使われているデモアカウントがあり、設計中に便利です。
src/ui/: 画面。
ui.cppは 4 つのビュー、設定、承認プロンプトを描画します。ボタンを処理します。クリック、または 650 ms 後の長押しです。0.5 秒のアニメーションを実行し、バックライトのレベル (選択した明るさ、夜間の減光、バッテリー駆動時のアイドル中はオフ) を決定し、上限アラートを発生させ、2 つの DMA バッファを使ってバンド単位でレンダリングします。i18n.hは画面上のすべての文字列を英語とスペイン語で保持します。曜日名やブリッジのエラーメッセージも含みます。gfx.hは色と描画ヘルパーを保持します。角丸バー、アンチエイリアスされたリング、そして同じ描画コードで任意のバンドを埋められるようにするオフセットです。fonts_gen.hには Inter フォントが含まれます。tools/make_fonts.pyで生成されます。
PC 側
ブリッジは bridge/m5claude_bridge/ にあります。依存関係は pyserial と bleak だけです。HTTPS 呼び出しは標準ライブラリを使います。
__main__.py: コマンドラインとメインループ。
- コマンドは
run、snapshot、accounts、init、add-api、autostartです。 - 実行前にロック (localhost でリッスンするソケット) を取得するので、同時に実行されるブリッジは 1 つだけです。
runは 60 秒ごと、またはデバイスが要求したときに即座にスナップショットを収集し、ハブに渡します。
autostart.py はブリッジをウィンドウなしでログイン時に起動するよう登録します。Windows では pythonw を使った Run レジストリキー、macOS では LaunchAgent、Linux では systemd ユーザーユニットです。
config.py: アカウント。
- ログインのあるすべての Claude Code 設定ディレクトリを検出します。
- あるいは
~/.m5claude/config.jsonを読みます。ここでアカウントに名前を付けたり、API 組織を追加したりできます。
sources/: データソースごとに 1 ファイル。
subscription.pyはアカウントの Claude Code ログインとプラン上限を読みます。local_logs.pyは Claude Code のトランスクリプトを読みます。インクリメンタルにパースし、重複メッセージを除去し、1 日あたりおよびモデルごとのトークンを集計します。admin_api.pyは API 組織向けに Usage and Cost Admin API を読み、ページネーションをたどります。
pricing.py はモデルファミリーごとの API 定価を保持します。サブスクリプション利用の価値を推定します。
snapshot.py: スナップショットを構築。
- すべてのアカウントを並列に収集するので、1 つの遅いアカウントが他を遅らせることはありません。
- 上限ポリシーを適用します。5 分ごとで、最後の正常な応答はディスクにキャッシュされ、一時的なエラーの間も保持されます。
hub.py は最新のスナップショットを保持し、接続中のすべてのデバイスに渡します。遅いリンクには最新のものだけが渡され、たまることはありません。
transports/: リンクごとに 1 ファイル。
usb_serial.pyは M5Stack の USB チップを見つけ、ファームウェアがグリーティングを返した場合にのみポートを保持します。ble.pyはスキャンし、接続し、承認を待ち、ネゴシエートされた MTU に収まるチャンクで書き込みます。tcp.pyは開発用のローカルリンクです。
リポジトリの README には、同じ内容を表形式でまとめたツアーとトラブルシューティングがあります。
自分で作る
おすすめの順番は、Velxio で画面を設計し、次にボードへ書き込み、最後にブリッジを接続する、という流れです。
1. Velxio で M5Stack Core 上で動かして変更する
Velxio は M5Stack Core を 320×240 の画面、A・B・C ボタン、バッテリーチップとともにシミュレートします。2 インチの画面のレイアウトは細かい調整の連続です(ラベルが 2 ピクセル低すぎる、数値がカードに収まらない、など)。Velxio ならその 1 つ 1 つが書き込みサイクルではなくブラウザ上で数秒で済みます。
このダッシュボードは Velxio のサンプルギャラリーにあり、リポジトリと同じソースファイルを使っています。
- M5Stack Core: Claude usage dashboard (m5claude) を開いて再生ボタンをクリックします。サインアップは不要です。この記事で紹介しているデモアカウントで起動します。
- A と C でアカウントを選び、B でビューを切り替えます。シミュレーターはボードより遅くファームウェアを実行するので、設定を開くには C を数秒間押し続けてください。
- 自分の数値を見るには、PC で
m5claude-bridge snapshotを実行し、出力された行をシリアルモニターに貼り付けます。スケッチの先頭のコメントに、編集して使えるサンプル行があります。 ui.cppで画面を変更して再実行します。見た目が良くなったらボードへ書き込みます。
ボードとの違いは 2 点あります。Velxio には Bluetooth がないためその接続は省かれ、シリアルモニターが唯一の接続になります。またスピーカーのコードは新しい ESP32 Arduino コアの呼び出しを使っています。それぞれの変更はスケッチ内に印を付けてあります。
空の画面から自分のダッシュボードを作り始めるなら、M5Stack Core: Hello LCD + Buttons が最小のサンプルです。M5Stack の M5GFX を使っており、これは LovyanGFX を基にしていて描画 API を共有しているので、コードは両者の間で移行できます。
2. ファームウェアを書き込む
git clone https://github.com/velxio/m5claude.git && cd m5claude
arduino-cli core install esp32:esp32
arduino-cli lib install LovyanGFX NimBLE-Arduino ArduinoJson
./firmware/build.sh /dev/ttyUSB0 # Linux / macOS
.\firmware\build.ps1 -Upload # Windows, finds the COM port by itself
スクリプトは M5Stack Core 向けに、大きなアプリのための余裕を残すパーティション構成(PartitionScheme=no_ota)でビルドします。ファームウェアは約 820 KB です。私がつまずいた設定は 2 つあります。
- C++17。 arduino-esp32 2.0 コアはデフォルトで C++11 としてコンパイルしますが、コードは C++14 と C++17 の機能を使っています。
--build-property "compiler.cpp.extra_flags=-std=gnu++17"を追加してください。 - パネル。 LovyanGFX のボード自動検出を使わず、ILI9342C を明示的に設定しています(VSPI、MOSI 23、MISO 19、SCK 18、CS 14、DC 27、RST 33、バックライト 32、
offset_rotation = 3)。v2.7 の IPS パネルは色の反転が必要です。検出方法は M5Stack 純正ライブラリと同じで、リセットラインの読み戻し方で判定します。
3. ブリッジを実行する
pip install -e bridge # from the repository root; installs pyserial and bleak
m5claude-bridge accounts # which accounts it found
m5claude-bridge autostart on # start now, and at every login
autostart on はログイン時にウィンドウなしでブリッジが起動するよう登録します。Windows ではユーザーの Run レジストリキーに pythonw を起動する値を追加します。macOS では LaunchAgent を、Linux では systemd ユーザーサービスをインストールします。autostart status は実行中かどうかと、ログ(~/.m5claude/bridge.log)の最後の数行を表示します。同時に実行できるブリッジは 1 つだけです。2 つ目は USB ポートと Bluetooth 接続を取り合ってしまうため、メッセージを出して終了します。m5claude-bridge を単体で実行するとフォアグラウンドで動作し、ログはターミナルに表示されます。
Pro と Max アカウントは Claude Code の設定ディレクトリから検出されます。2 つ目のサブスクリプションを追加するには、専用のディレクトリでログインします。
$env:CLAUDE_CONFIG_DIR = "$HOME\.claude-work"; claude # then /login
API 組織には Admin API キーが必要です。Claude Console の Settings → Admin keys から取得します。
m5claude-bridge add-api "Acme API" --key-env ACME_ADMIN_KEY
4. 接続する
USB ケーブルを挿すか、デバイスを机に置いたまま Bluetooth で見つけさせます。Bluetooth で初めて接続するときは、デバイスの C を押して PC を承認します。数秒以内にデータが表示されます。
注意点
- プラン上限のエンドポイントは公開 API ではありません。 これは Claude Code の
/usage画面が使っているエンドポイントで、変更される可能性があります。ブリッジは古いフィールド名にフォールバックしますが、形式が変わった場合は更新が必要です。 - ログインは期限切れになります。 Claude Code は使うたびにトークンを更新します。数時間使っていないアカウントは、再び Claude Code で実行するまで「Login expired」と表示されます。
- サブスクリプションの金額は推定値です。 API の定価に基づく概算です。API 組織はコストレポートによる実際の利用額を表示します。
今後の予定
- PC 側のトレイアイコンで接続状態を表示。
- microSD カードへの履歴保存で、7 日より長い期間のグラフを表示。
- Grove ポートの RGB LED が 90% を超えると赤くなり、部屋の反対側からでも見えるように。
- オプションの Wi-Fi 接続。USB または Bluetooth 経由でブリッジから設定でき、デバイスを別の部屋に置けるように。
コードは github.com/velxio/m5claude にあります。Issue とプルリクエストを歓迎します。
すぐに使えるボードを提供してくれた M5Stack に、そして LovyanGFX、NimBLE-Arduino、ArduinoJson、bleak の作者の皆さんに感謝します。
このページの M5Stack ストアへのリンクはアフィリエイトリンクです。リンク経由で購入いただくと、追加費用なしで Velxio に少額の手数料が入り、シミュレーターを無料で提供し続ける助けになります。