こちらの記事について、内容・翻訳・視点・長さなど、皆様のご意見をお送りください。今後の記事製作の参考にしたいと思います。
Thank you! Your feedback has been received.
There was a problem submitting your feedback, please try again later.
こちらの記事の感想をお聞かせください。
ラズパイとThunder Clickモジュールを組み合わせた落雷検知器
マイクロエレクトロニカが「Thunder click」という落雷検出モジュールを発売しているので、それとRaspberry Piと組み合わせて落雷検出器を製作した。検知した雷の情報は標準的なMQTTプロトコルで配信するようにしてある。Home Assistantなどと連携すればログの記録やデータビジュアライズなどもできるはずだ。
この記事ではこれを作ったときの手順を見ていくことにする。
AS3935
今回使ったThunder clickモジュールはAustriaMicroSystems社のAS3935というICをベースにしている。これの仕組みとしては、雷が落ちるときには高周波の電磁波が放出されるので、それを受信して検出するという原理だ。このICはさらにいくつかの便利な機能を持っていて、受信した信号の中から人工の電波によるものを区別したり、実際に雷が落ちた際にその落雷のエネルギーや雷を引き起こしている前線までの距離を計算するアルゴリズムを備えている。
実は私がこのICを扱うのはこれが初めてではなく、もう9年近く前のことだが以前にもAS3935に関する記事を執筆した。あの時はAS3935のブレークアウトボードをプロトタイピングシールドを通じてArduinoに接続するやり方で試していたのだが、当時AS3935はかなり新しいデバイスで、知見が不足していたことに加え、動作テストを行うには激しい雷雨を待たなければならないという難題が立ちはだかっていた。
しかし、どうやら最近ではAS3935を使ったプロジェクトが結構いろいろ出てきているようである。しかもなんと割と安価な方法で「落雷エミュレータ」が作れることも分かったため、この面白げなセンサICを再び試してみたくなった次第だ。再挑戦するにあたり、今度はより実用的で、さらにテスト容易な設計のものを作ることに決めた。
ハードウェア
使用するハードウェアは次の通り。
- Raspberry Pi (3以降) 例: Pi 4 4GB (182-2096)
- MikroElektronika Pi 3 Click Shield (162-3385)
- Thunder Click (882-8966)
手元にあった旧モデルのRaspberry Pi 3 Model B+でも性能的には十分だったのでそれを使ったが、今新しく購入するなら明らかにPi 4を買った方が良いだろう。今後別のプロジェクトで再利用することを考えればPi 4の方がまず都合がいいだろうし、Pi 4ならば別のアプリケーションを同時に実行する性能的な余裕も大きい。
Thunder Clickを載せるのに使う「Click Shield」はPi 3向けの製品として販売されているが、Raspberry Pi 4でもピンには互換性があるので使用できる。わざわざ「Pi 3向け」と名乗っているのはおそらく、より短いGPIOヘッダを採用していたPi 2以前のバージョンと区別するためだろう。
Thunder clickモジュールはmikro BUSスロット#1に挿入することに注意。
Mosquittoのインストール
テスト用にMQTTブローカー(MQTTプロトコルを中央で仲介するサーバ)が必要だったので、以下のコマンドでRaspberry Pi上にMosquittoとそのクライアントをインストールした。
sudo apt install mosquitto mosquitto-clients
すでにネットワークで実行されているMQTTブローカーがあるなら普通にそれを使ってもいい。
より便利にしようと思えば、MosquittoをNodeRED、 InfluxDBおよびGrafanaと共に実行し、完全セルフホストでいわゆるデータプラットフォームを作ることも考えられる。こうすれば履歴データを管理したり、あるいは落雷情報を他の収集データとまとめてグラフにプロットするようなことも多分できる。こうした設定をする方法についてはRaspberry Pi 4で作る個人データセンター Part 3: セルフホスト式IoTデータプラットフォームを見て欲しい。
落雷検出器デーモン
AS3935用のライブラリやプロジェクトは探せばいろいろ出てくる。特に有名なプロジェクトはスティーブン・モラコ (IronSheep) 氏のlightning-detector-MQTT2HA-daemonだ。今回はこれを使わせてもらう。「MQTT2HA」という名前からわかるように、検知した落雷情報をMQTTで配信し、住居や建物のオートメーションで使われるHome Assistant (HA) ソフトウェアからその情報を利用できるようになっている。このプロジェクトの特長の1つは、MQTTの仕組みによってHA autodiscoveryに自身の存在を知らせる機能を実装しているところだ。
デフォルトの設定ではRaspberry Pi~AS3935間の通信にI2C接続を使うようになっているが、Thunder Clickモジュールが対応しているのはSPI接続なので、SPI接続用のドキュメントの指示に従った。
この後の手順については、ラズパイにRaspberry Pi OSをインストールしてまっさらな状態にしたところから書く。
Raspberry Pi OSにはいくつかのバージョンがあるが、この手の用途なら機能を絞ったLiteバージョンが最適だ。OSインストールと一緒にホスト名の設定やSSHサーバーの有効化などの基本設定も実行した。
はじめに、以下のコマンドでSPI通信を有効化する必要がある。
sudo raspi-config
続いていくつかの依存関係をインストール、MQTT2HAデーモンのGitHubリポジトリをクローンし、依存するPythonモジュールをインストールする。
sudo apt install git python3 python3-pip python3-pigpio pigpio
sudo git clone https://github.com/ironsheep/lightning-detector-MQTT2HA-Daemon /opt/ISP-lightning-mqtt-daemon
cd /opt/ISP-lightning-mqtt-daemon
sudo pip3 install -r requirements.txt
リポジトリのトップにデフォルトの設定ファイルが置いてあるので、設定ファイルを用意するにはこれをコピーして編集する。
sudo cp /opt/ISP-lightning-mqtt-daemon/config.{ini.dist,ini}
sudo nano /opt/ISP-lightning-mqtt-daemon/config.ini
MQTTブローカーとの接続に関する設定は[MQTT] セクションに書く。もし同じRaspberry PiでMosquittoを実行しているのであればほとんどデフォルト値のままで問題ないのだが、ここではそうではないのでコメント状態を外しておく。さもないとデーモンの起動に失敗する。
[Sensor]セクションには以下のパラメータを記述する。
- sensor_attached = SPI
- intr_pin = 6
ここの値を適切に指定すれば、Thunder Clickモジュールを2番目のスロットに付け替えることも可能なはずだ。(ただし私は実際に試していないので注意。)
変更を保存後、PiGPIOdを起動してやればいよいよ実行できる。
sudo systemctl start pigpiod.service
python3 /opt/ISP-lightning-mqtt-daemon/ISP-lightning-mqtt-daemon.py
上手くいけば上の画像と同じような出力が表示される。もしAS3935との通信に失敗してしまった場合は以下の点を確認すること。
- SPI通信が有効化されているかどうか
- Click Moduleがスロット1に取り付けられているか
- 設定パラメータがすべて正しいかどうか
詳細なパラメータ設定
あとでシステム起動時に自動で起動するようデーモンの設定を行うが、その前にまず一部の設定の調整を行う。
以下のコマンドを実行すると、
python3 /opt/ISP-lightning-mqtt-daemon/ISP-lightning-mqtt-daemon.py --calc_tuning_cap
アンテナの調整用コンデンサの最適な値が自動で算出される。これは完了するまでに数分ほど時間がかかる。
そして出てきたこの値を設定ファイルのtuning_capacitorパラメータに書き込んでやる。これによってアンテナの共振周波数を目的の値に近づけることができる。
[Sensor]セクションには他にもいくつか面白いパラメータがある。ひとつはdetector_afr_gain_indoorで、落雷検出器を屋外に設置した場合にはこれをFalseに設定する必要がある。屋外に設置した場合は落雷の信号の減衰が少なくなるので、このパラメータで適切にRFフロントエンドでの増幅ゲインを減らすわけだ。またノイズのしきい値を微調整できるdetector_noise_floorパラメータ、そして最後に重要なdetector_min_strikesがある。これはある回数連続して落雷を検知したときに初めて通知を起こすようにするためのパラメータだ。ここでは装置を起動したあと一番初めの落雷を記録できるように1に設定した。こうしたパラメータは恐らく運用とともに調整していくことになる。
テスト
落雷のエミュレーションができる便利なArduino用シールド がPlayingWithFusion社によって製造されている。これをArduinoに乗せて動作させれば、AS3935に本物の落雷情報として認識させられる信号を出せるということのようだ。ただし実際に使ってみると、このシールドはテストのために使うには厄介な要素があることが分かった。落雷エミュレータと落雷検出器のアンテナの距離次第では上手く動作しないことがあるのだ。この問題の原因は恐らくAS3935が人工の電磁波を区別する性能が高すぎるせいであり、当初諦めかけていた。しかし落雷エミュレータのソースコードを見たところ、単純にDACに入力する値を生成しているだけに見えたので、これはちょっとコードをいじれば改善できるかもしれないと考えた。
上にあるのは、落雷が正常に記録されたときのコンソール出力だ。
落雷情報を公開しているMQTTトピックをサブスクライブすることもできる。
mosquitto_sub -h <HOSTNAME> -t home/nodes/sensor/lightningdetector/detect
エミュレーションされた3回分の落雷のエネルギーおよび距離が計算されているのがわかる。
自動起動の設定
システムのスタート時に自動で起動するための設定を見ていこう。
サービスの実行ユーザーはSPIとGPIOにアクセスできる必要がある。自動起動の設定をした場合、そのサービスはdaemonユーザー権限で実行されるので、次のコマンドでdaemonユーザーを必要な各グループに追加しなければならない。
sudo usermod daemon -a -G spi,gpio
自動起動の設定をするには以下のコマンドを実行する。
sudo ln -s /opt/ISP-lightning-mqtt-daemon/isp-lightning.service /etc/systemd/system/isp-lightning.service
sudo systemctl daemon-reload
sudo systemctl enable pigpiod.service
sudo systemctl enable isp-lightning.service
sudo systemctl start pigpiod.service
sudo systemctl start isp-lightning.service
サービスの起動状態の確認、出力の確認はそれぞれ以下のコマンドでできる。
sudo systemctl status isp-lightning.service
sudo journalctl -f -u isp-lightning.service
2番目のコマンドは実行した後Ctrl-Cで停止する必要がある。
Home Assistant
ありがたいことに、Home AssistantのWebダッシュボード(Lovelace)に追加できる「落雷検出器カード」もスティーブン氏が開発してくれており、これを使えばわかりやすい形で落雷検出器のデータを表示することができる。これは手動でのインストールのほか、Home Assistantコミュニティーストア(HACS) でもインストールできる。もし自分のネットワーク上でHome Assistantが実行されていない場合はRaspberry Pi 4で作る個人データセンター Part 2: Home Assistant.を参照のこと。
注意点として、Ansibleプレイブックからの最後の2行については、enOceanワイヤレスレシーバをRaspberry PiのUSBポートに差し込んでいるのでなければ省略することができる。
まとめと覚書
このアプリケーションはRaspberry Pi上で Home Assistantと同時に実行できる。前述の投稿で詳しく解説した「セルフホストIoTデータプラットフォーム」も実行可能だ。
また注意として、複数のアプリケーションが同じポート番号を使おうとしてたりすることはないようにしなければならない。もしポート番号が衝突していれば、多くの場合アプリケーションの設定を修正したり、あるいはコンテナ内でアプリケーションを実行しているならポート番号のマッピングの設定を適宜変えることで容易に解決できる。
最後に、これらのプロジェクトをシェアしてくれたスティーブン・モラコ氏に謝意を表したいと思う。