はじめに
M5Stack版StackChan(スタックチャン)にSCD41搭載のCO2センサーを接続し、会話の中で部屋のCO2濃度・温度・湿度を確認できるようにしました。
「そろそろ換気した方がいい?」とStackChanに聞くと、組み込みMCPツールで取得したセンサー値をAIが参照し、換気の目安を答えてくれます。CO2濃度は換気状態を判断する指標のひとつで、一般的に室内環境では1000 ppm前後が換気の目安とされています。この記事ではStackChanがこの基準値を参照して換気タイミングを判断できるようにします。
この記事では、CO2L Unitの取り付けと配線、出荷時(純正)ファームウェアへのSCD41対応追加、実際の動作確認をやっていきます。
利用機材
| 機材 | 備考 | 販売URL |
|---|---|---|
| M5StackChan(M5Stack公式版 スタックチャン) | メインロボット本体 | スイッチサイエンス |
| M5Stack用 温湿度CO2センサ Unit CO2L(SCD41) | CO2・温度・湿度センサー | スイッチサイエンス |
| M5Stack用GROVE互換ケーブル 5 cm(10本セット) | Port.A接続用(任意) | スイッチサイエンス |
| LEGO テクニック 固定ペグ×2 | センサー固定用(任意) | 楽天市場(バラ売り) Amazon(10個セット) |
配線・取り付け
SCD41はSensirion製の光音響方式を採用したCO2センサーで、CO2濃度に加えて温度・湿度も取得できます。CO2L Unitはこのセンサーを搭載したM5Stack用のGroveユニットで、I2Cアドレスは0x62です。測定範囲はCO2が400〜5000ppm、温度が-10〜60℃、湿度が0〜95%RHです。
CO2センサーユニットをGroveケーブルでStackChanのPort.A(左側面の赤いコネクタ)に接続します。センサー付属のGroveケーブル(20 cm)でも問題ないのですが、利用機材に書いた5 cmのケーブルを使った方が余りが少なくてちょうど良いです。
Port.A(Grove)の各ピンの信号割り当ては以下のとおりです。
| Groveピン | 色 | 信号 | CoreS3 GPIO |
|---|---|---|---|
| 1 | 黄 | SCL | G1 |
| 2 | 白 | SDA | G2 |
| 3 | 赤 | 5 V | — |
| 4 | 黒 | GND | — |
StackChanとM5StackのユニットにはLEGOの穴が開いているため、固定用のペグを使うことで、きれいに取り付けできます。(私の場合は別のスタックチャンを自作する際に買ったM5Stackのサーボキットに付属していたものを流用)
カスタムファームウェア
カスタマイズの内容
M5StackChanの出荷時ファームウェアをベースにカスタマイズし、SCD41センサーへの対応を追加しました。カスタマイズについては、Codex・Claude Codeに公式資料を参考にしてもらいながら実装しました。
変更内容が多岐にわたるため、公式リポジトリをforkして変更を適用したソースコードをGitHubで公開しています。そのソースコードは pinelibg/StackChanのfeature/scd41-co2-unitブランチで確認できます。このブランチでの変更内容は次のとおりです。
- SCD41用のI2Cドライバー追加
- Port.Aを使ったI2Cの初期化関数追加
- センサーの初期化・バックグラウンドタスクでの定期センサー値取得
- CO2モニターアプリの追加
- 組み込みMCPへのCO2センサー取得ツール
get_co2_data追加 - ビルドコンフィグ(
CONFIG_HAL_SCD41_ENABLED)による、これらの追加項目の有効化・無効化(デフォルトで有効)
MCPツールのdescriptionにCO2濃度の目安(1000 ppm超で換気推奨)が記載されているため、AIがデータを解釈して自然な返答を生成します。なお、ディスプレイアプリは800/1200 ppmを境界としてメーターの色を変化させますが、MCPツールのdescriptionでは単純化のため1000 ppm超を換気推奨の目安としてAIに伝えています。
センサーが未接続の場合は{"error": "SCD41 not available"}を返すため、センサーが利用できない旨がAIから返答されます。
MCPツール追加部分:
ビルドと書き込み
ビルド環境のセットアップは前回の記事(🔧M5Stack版StackChanのファームウェアビルド環境構築)を参照してください。
フォークリポジトリのfeature/scd41-co2-unitブランチをcloneしてビルドします。
git clone https://github.com/pinelibg/StackChan.git
cd StackChan/firmware
git checkout feature/scd41-co2-unitその後は通常のビルド・フラッシュ手順と同じです。
動作確認
注意点として、バッテリー電源だけではセンサーが動作せず、USBケーブルを繋いで電源供給しないとセンサーが動作しません。バッテリーからの電源供給がGroveコネクタの方に行ってない可能性があって、ソフトウェアからCoreS3の電源制御ICを操作してGroveポートに供給することが可能だったはずですが詳細は未検証です。この動作確認ではUSBケーブルを接続した状態でテストしています。
CO2モニターアプリ
ファームウェアが書き込まれると、メニュー画面に「CO2」アプリが追加されます。
アプリを起動すると、リアルタイムのセンサー計測値が表示されます。(5秒ごとに更新)
CO2濃度はレベルに応じてメーターの色が変化します。
| 濃度 | 色 | 目安 |
|---|---|---|
| 800 ppm未満 | 緑 | 良好 |
| 800〜1200 ppm | 黄 | やや注意 |
| 1200 ppm以上 | 赤 | 換気推奨 |
AIとの会話
AIとの会話でself.robot.get_co2_dataツールが呼ばれ、センサーの現在値をもとに換気の判断とアドバイスが返ってきます。
なお、動作確認には前回の記事(🤖M5Stack版StackChanのAI.AGENTをローカルLLMで実行してみる)でセットアップしたローカルLLM(Gemma 4 E4Bモデル)を使用しています。
CO2濃度が基準値以下の場合:960 ppm
二酸化炭素濃度が960 ppmだよ、温度が摂氏26度~
過ごしやすい感じかな
CO2濃度が少し高めの場合:1023 ppm(基準値1000 ppm超)
少し高めだよ
換気するといいかもね
CO2濃度が高い場合:1446 ppm
これはかなり高いから
しっかり換気すると良いかもね
まとめ
SCD41 CO2センサーをStackChanに接続し、組み込みMCPツールget_co2_dataとして登録することで、AIが会話の中でリアルタイムのCO2データをもとに部屋の換気のタイミングを提案できるようになりました。
外部接続センサーをAIからツールとして扱えるようになるということで、同じパターンで他のセンサーの追加もできます。(気圧センサーも買ってあるのですがまだ繋いでない…)
現状ではStackChanが自発的に換気のタイミングで声をかけてくれるわけではなく、あくまでそれについて聞けば答えてくれるだけです。毎回の会話のコンテキストにセンサー値を付加するか、定期的にセンサー値をAIに渡して会話するか判断させるなどすれば、自発的に換気のタイミングを教えてもらえるようになって面白いかもと思いました。
過去記事
🤖クラファンで手に入れたStackChan(M5Stack版)をセットアップしてみた
🤖 M5Stack版StackChanのAI.AGENTをローカルLLMで実行してみる|Xiaozhi AI互換サーバーのセルフホスト
🤖 M5StackChanのAI.AGENTに任意のMCPツールを接続する