ESP32を作っているEspressif社が、Matterデバイス開発するWebアプリ、ESP ZeroCodeを公開しました。これを使ってESP32で簡単なMatterデバイス(照度のみ制御できるLED照明)を作ってみます。
ESP ZeroCode
ESP ZeroCodeのサイトはこちらです。一言で説明すると、「数回クリックするだけで、要件に応じてMatter認定ファームウェアを開発できるWebアプリケーション」です。
これを使用すると、Matter対応の
- スマートプラグ
- 照明
- スイッチ
- ローラブラインド
- 壁スイッチ
を、ESP32で作成できます。
ユーザー登録する
ZeroCodeを利用するためには、メールアドレスとパスワードの登録が必要です。登録したメールアドレスにパスコードが送られてくるので、それを使ってユーザー登録を終えます。macOSの「メールを非公開」機能で作る仮のメールアドレスでも大丈夫です。
サインインすると、3種類のメニュー、
- 今まで作成したデバイスの一覧
- 新しいデバイスを作る
- デバイスを製品化する
が現れます。製品化メニューを選ぶと、Matter認証を申請して、チップを発注するページが現れます。このように、ZeroCodeは、デバイスメーカーが試作をして、動作確認し、ESP32チップを発注するためのサイトです。でもここでは未承認のMatterデバイスをDIYして楽しみたいと思います。
デバイス種類を選ぶ
中央のCreate a new productを選択すると、Matterデバイスに名前をつけるダイアログが現れます。今回は、簡単なスマート電球を作ることにしました。SimpleLightと名付けます。
次に、デバイスの種類を選択します。電球の場合、照度のみ調整する電球、色温度も調整できる電球、RGB色も調整できる電球の3種類から選びます。例えば下の例では、照度、色温度、色を変更できる電球と、照度のみを変更する電球の選択肢を示してます。
照度・色温度・色調整のデバイスは、BP1658CJというLEDドライバーチップを使用することになってます。LEDドライバーチップは、コマンドをI2Cで受信して、LEDを点灯させる機能があるようです。一方で、単純な照度のみの場合は、ESP32のPWM (パルス幅変調)を使います。簡単なので、PWMを使う電球を選びました。
CPUを選ぶ
次にコントロールチップを選びます。
- ESP32-C3,
- ESP32-H,
- ESP32無印
から、それぞれの開発キットと、単体のチップを選択できます。ESP32-Hを選べば、Matter over Threadのデバイスも開発できるようです。AliExpressではESP32-Hの開発ボードも売られていたので、そのうち試してみたいです。
今回は、手持ちに在庫がたくさんあるESP32のDevkitを選択しました。ESP32無印ならば、技適マークも付いていて価格が安い(送料込み600円程度)です。
回路を設計する
次のページでは、ESP32周辺の回路を設計します。とはいえ、今回はPWMでLEDを点灯させるだけなので、LEDを何番ピンに割り当てるかの指定をするだけです。
デフォルトではGPIO4になってます。ブレッドボードの配線の関係で、GPIO13に変更しました。
プログラムをダウンロードする
この結果、サーバー側で必要なプログラムを生成してくれます。次に、これをESP Launch PadというWebアプリで、ESP32にダウンロードする手順にすすみます。ただし、このアプリは、Google Chromeでしか動作しないということで、ブラウザを切り替えます。
また、後で説明する理由で、この先の操作をWindowsで行いました。WindowsのGoogle Chromeで先を続けると、ESP32を接続したシリアルポートを聞かれます。COM4に接続されているようなのでそれを選択します。
ESP32に接続できると、Device logsというウィンドウが現れます。この中に、
Wrting at 0x0x00... (1%)
のような表示が現れて、これが100%まで進捗すれば、ダウンロード成功です。
すると以下のように、ESP32へのダウンロードが終了して、Matterデバイスとして使用可能になったとの表示が現れます。ただ、USB接続に失敗して、ダウンロードができなくても、このように表示されてしまいます。Writingの表示が現れて100%まで進捗したことを確認する必要があります。
スクロールすると、下の方にMatterペアリングのためのQRコードも表示されます。
この段階では、Matterとしては認証されていませんし、暗号化やIDの設定は仮のものです。製品化を目指すならば、ZeroCodeのページのPlace Orderボタンを押して、手続きを進めて、コードが着込まれたESP32を発注することになります。
ただ、このままでもこのESP32は、Matterデバイスとして動作し、HomeKitなどから使用可能です。Matterデバイスを趣味でDIYする場合には、これで十分です。
回路を作成する
ESP32 Devkitの周辺回路を、以下のように作成しました。ENピンに接続した0.1μFコンデンサに関しては、後で説明します。ZeroCodeで指定したようにGPIO13にLEDを接続しました。念のために330Ωの電流制限抵抗を入れてあります。
ブレッドボードの配置は、以下のように考えました。
実際の配線の写真です。
ペアリングモードにする
プログラムをダウンロードした直後、ESP32はMatterのペアリングモードになっています。ペアリングモードでは、LEDが2秒周期で点灯・消灯を繰り返します。このことを、以下の動画のようにLEDの点滅を確認できれば、プログラムは完成していて、ダウンロードに成功しています。
HomeKitに追加するなどして、通常の稼働状態になった場合は、よくあるスマート電球のように、電源投入を繰り返すことでペアリングモードに復帰させることができます。ZeroCodeのプログラムでは、ESP32をOnにした状態から、Off/On/Off/On/Off/Onと2秒間隔で3回繰り返すと、ペアリングモードに復帰します。
HomeKitにペアリングする
次にESP32をMatterデバイスとしてHomeKitに追加します。iPhoneのホームから、「アクセサリを追加する」メニューを選びます。
そして、ESP ZeroCodeの画面に表示されたQRコードを読み込ませます。ペアリングプロセスが開始すると、LEDの点灯パターンが速くなり、1秒周期の点灯・消灯になります。ペアリングが終了すると、この点滅は止まります。
Matter認証されていないデバイスなので、その警告が出ます。これは無視して、「このまま追加」を選びます。
この後、設置する部屋の指定、名前の変更などの画面を経て、照明として追加されました。
HomeKitから操作する
これでiPhoneやMacのホームに、照明として表示されます。アイコン部分をタップすると、ESP32に取り付けたLEDがOn/Offします。
余白部分をタップすると、明るさを調整するスライダーが表示されます。
詳細を見ると、製造元、モデル名などが仮の名前になっていました。
これで、製品として売られているようなスマート電球の動作をする試作品が完成しました。特に、照明のOn/Off時には、ゆっくりと照度を変化させながらOn/Offします。前回紹介したMatter電球では、瞬時にOn/Offしましたが、徐々に点灯、消灯すると高級感があります。
下の動画は、HomeKitで操作している時のLEDの様子です。On/Off操作でも、明るさがゆっくり変化している様子がわかります。
苦労したこと
ここまで、順調に試作ができた様子を紹介しましたが、実際には多少の苦労をしました。
ESP32の書込み自動切替
ArduinoやESP32 Devkitのような組み込みボードには、
- 通常のプログラム実行モード
- 新しいプログラムを書き込むモード
が用意されています。例えば、Arduino IDEでプログラムを作成した後、USBシリアル経由でダウンロードするときには、プログラム書き込みモードに自動的に切り替わるよう工夫されてます。
ESP32では、リセットパルスの立ち上がり(ESP32のENピンへのパルス立ち上がり)の時に、GPIOの0番ピンがLowならばプログラム書き込みモードになります。これをUSBシリアル通信の信号タイミングで実現してます。そのために、ENピンのパルス立ち上がりを遅延させる回路が、抵抗とコンデンサーで構成されて、Devkitに搭載されてます。下のサイトで詳しく説明されています。
格安で出回っている非純正品のESP32 Devkitの一部には、この仕組みが正しく動作しなくて、書き込みモードに切り替わらない問題点があります。パルスの遅延時間が不十分なためのようです。手元にある格安ESP32 Devkitも、半分くらいは自動切り替えに問題があります。ただ、ESP32 DevkitのBootボタンをタイミングよく押せば、書き込みモードになるので、あまり不便ではありませんでした。
ZeroCodeの自動切替失敗
一方、ZeroCodeがコードをダウンロードする際のモード切替えは、Arduino IDEよりタイミングが難しいようです。Bootボタンを手動で押しても、書き込めません。手持ちのほとんどのESP32 Devkitでモード切り替えに失敗します。書き込みに成功するESP32でも、失敗することもあります。
書き込みに失敗しても、EPS ZeroCode画面に、ダウンロード成功メッセージと、QRコードが表示されてしまうので、原因不明でした。このことを、X (Twitter)に呟いたところ、なんとThe ESP Journalに記事を書いてらっしゃるKedar Sovaniさんからリプライが来て、ダウンロードに失敗していることを教えてくださいました。日本語のつぶやきだったのに気づいていただいてありがとうございます。
Pairing with HomeKit requires an Apple Hub (HomePod) in your setup, is this already present? If yes, can you DM me the device logs.
— Kedar Sovani (@kedarsovani) August 26, 2023
それで、プログラム書き込みモードの自動切り替えが確実に実行されるように、改良することにしました。
コンデンサーで対策
プログラム書き込みモードの自動切り替えを確実に動作させるために、コンデンサを追加して遅延時間を長くする方法が知られてます。上記のサイトによると、通常のDevkitには0.1μFのコンデンサが搭載されていて、これで1msの遅延を作り出しているそうです。さらに0.1μFのコンデンサを追加すると、遅延を2msに伸ばすことができて、確実にモード切り替えできるそうです。
それで、今回の回路では、ENピントGNDに0.1μFのセラミックコンデンサを取り付けました。これにより、ESP ZeroCodeのダウンロードが、ほぼ問題なく成功するようになりました。
Windowsが必要
これでWindowsのGoogle Chromeからダウンロードできるようになりました。しかし、macOSのGoogle Chromeからダウンロードしようとすると、やはり失敗します。コンデンサを増やすなどして試したのですが、書き込みモードに切り替わらないようです。タイミングがさらにシビアなのかもしれません。ということで、ESP ZeroCodeはWindowsから使用することにしました。
PWM対応ピンに注意
このほか苦労した点は、うっかりPWMに非対応のGPIOを使用しようとして、しばらく悩んでいたことです。GPIO34から39のピンはPWMに非対応ですが、これを使おうとしてました。間違えた原因は、適当に検索したサイトに、これらがPWM対応と書かれていたからです。またESP ZeroCodeでもPWMピンとして指定可能でしたので、間違いに気づきませんでした。ちゃんと確認すべきでした。
まとめ
EspressifのWebアプリ、ESP ZeroCodeを使って、ESP32によるMatter対応電球(のようなもの)を作りました。作りたいMatterデバイス種類、ESP32種類、GPIOピンを選ぶだけで、コードを書くことなく完成しました。HomeKitにMatter照明として接続できて、On/Offと照度変更が可能です。
他にも色々なデバイスが作成可能ですし、Matter over ThreadのDIYも試したいと思います。ESP ZeroCodeでは、完成度の高いデバイスを簡単に作成できるので、DIYの可能性が広がります。いろいろ試したいと思います。その一方でコードを書けないので、標準的な動作をするデバイス以外は作れないという欠点はあります。標準的なデバイスを商品化したい企業向けのシステムなので、仕方ないところです。
ESP32のプログラミングをして、Matterデバイスを作る方法はいくつかあります。その中でも簡単な方法は、Arduino IDEのesp32-arduino-matterライブラリを使用する方法です。
Arduino IDEを使って比較的簡単にプログラミングできるので、多彩な要望に応えられます。ただし今のところ、照明とプラグだけしか作れません。
コメント
TasmotaもMatterサポートしているようです。
またLD2410も使えるようなので激安でmatter対応ミリ波センサーが作れるのではないでしょうか?
https://tasmota.github.io/docs/Matter/
https://github.com/arendst/Tasmota/discussions/17555
arduino core for ESP32 v3.00でesp-idf5.1に対応するようですし、Matterデバイス自作のハードルが下がってきて良いですね!
情報ありがとうございます。Tasmotaも使ってみたいです。
LD2410は、調整・設定機能を除けば、1ビットで人が居る・居ないを出力するだけなので、取り込むのは難しくなさそうです。でもZeroCodeには、センサーのメニューが無いですね。
感谢博主的分享,我也正在学习用esp32开发matter over thread,很感谢你的分享。目前同样的感受,zerocode虽然很简单,但缺少定制化能力,我也正在找更好的方案。