照度、温度、湿度、気圧、空気質――室内環境を複数のセンサーで計測したいとき、Wi-FiベースのIoTセンサーが一般的な選択肢だろう。しかしWi-Fiは電波環境に左右されやすく、ノードの増加に伴い通信の安定性が課題になることがある。
hackboxguy氏がGitHubで公開したプロジェクトは、車載通信規格のCAN(Controller Area Network)をセンサーネットワークの通信基盤に採用した。CANはノイズの多い環境や長距離配線に強く、複数デバイスが同一バスを共有するマルチドロップ接続に適している。
センサーノードの中核はESP32-C3 SuperMini(約2ドル)で、CANトランシーバーにSN65HVD230を採用した。3.3Vネイティブ動作のためレベルシフト回路が不要となる。センサーには照度用のVEML7700またはOPT3001と、温湿度や気圧、IAQ(室内空気質)を計測するBME680/BME688を搭載する。基板上のバックコンバーターが6~30V入力から5V/3.3Vを生成し、RJ-11コネクター経由でCANの信号線と電源を2対のケーブルで供給する。電話線用の安価なRJ-11ケーブルとジャンクションボードで配線でき、15mの距離で安定動作を確認している。
ファームウェアは起動時にI2Cバス上のセンサーを自動検出する設計で、VEML7700とOPT3001、BME680とBME688のどの組み合わせでも同一のファームウェアイメージで動作する。CAN通信は500kbpsで、各ノードに32個のメッセージIDを割り当て、最大16ノードを1本のバスに接続できる。
管理ツールのcan-sensor-toolはLinuxのSocketCAN経由で動作し、ノードの検出や監視、リブートに加え、CAN経由でのA/B OTAファームウェア更新にも対応する。OTAでは非アクティブ側のパーティションに書き込んだ後にリブートし、起動に失敗した場合は3回のリトライ後に自動でロールバックする仕組みとなっている。転送速度は約3.5KB/sで、335KBのファームウェアは約93秒で転送が完了する。複数ノードへの一括更新も可能で、3ノードの更新を5分以内に完了したという。
KiCadで設計したセンサーボードとモニターボードの基板データもGerberファイル付きで公開されている。モニターボードはSSD1306 OLEDディスプレイを搭載し、照度や温湿度、IAQの数値をリアルタイムに表示する。
想定用途としてhackboxguy氏は、家庭やラボでの複数室環境モニタリングのほか、車載プロトタイプでのキャビン内環境センシングを挙げている。車載ディスプレイのHDR10+ AdaptiveやDolby Visionでは、動的トーンマッピングに外光の照度データが必要となるため、CAN経由の照度センサーを活用できるとしている。
CAN Bus Multi-Sensor Node with ESP32 and KiCad PCB(Albert’s Blog) Esp32-CAN-ALS(GitHub)