雷センサーで雷を測定
オカッパリの釣り、カヤックでの釣りをしている中での心配事に、潮の流れ・風の向き・強さとかあります。さらにロッドを持っている以上、雷の心配も結構なウェイトを占めてもいます。
そこで以前から作ってみたかった、雷の距離測定機を作ってみることにしました。
準備
用意したもの
- 雷センサーモジュール(AS3935使用):秋月電子 1500円くらい
- Raspberry Pi W Zero
- その他:ブレッドボード、ケーブルなど
参考にしたサイト
ハンダ付け
ピンとモジュールが別々なのでハンダ付けが必要になります。
こんな感じになりますが、ハンダ付け側は恥ずかしくて見せられないレベルです。。。
丁寧な日本語の仕様書が付いてきます。ですが、私にはあまり理解が出来ないです。
雷センサーとラズパイとを接続
以前作っていたLチカの空きスペースを使ったため、ちょっとごちゃごちゃしていますが、
ブレッドボードを使って雷センサーとラズパイを接続しました。
Raspberry Pi Zero W I2C | 雷センサー |
I2C SDA (2) | SDA |
I2C SCL (3) | SCL |
GPIO 17 | IRQ |
GND | GND |
3.3V | VDD |
最初分からなかった所が、雷センサーのIRQをラズパイのどこへ繋げばよいかという事でした。
後で出てくるPythonスクリプト(demo.py)の指定番号と一致させればいいみたいですね。今の時点ではGPIO 17に繋げたということを覚えておけば良いと思います。
認識してるかのか?
センサーがラズパイに認識されているかどうかは、通常下記コマンドで確認するかと思うのですが、どうやら表示がされないようです。
$ i2cdetect -y 1
「# 秋月製の雷センサーはI2Cアドレスは0x00固定」という記述もどこかのWebサイトにあったので、アドレスの表示は気にしなくても良いのかもしれません。
Raspberry Pi
i2Cは既に有効にしてる状態です。
叩いたコマンドだけ載せてるので、詳しくはRaspberryPiによる雷センサーを参考におねがいします。
$ uname -a Linux raspberrypi 4.19.66+ #1253 Thu Aug 15 11:37:30 BST 2019 armv6l GNU/Linux $ python --version Python 2.7.18
後述しますが、訳あってPythonの2系を使いました。
設定変更
$ sudo vim /etc/modules i2c-bcm2708 i2c-dev
必要なものをインストール
$ sudo apt install python-smbus $ sudo apt install i2c-tools $ sudo apt install python-rpi.gpio
Pythonでプログラム
pcfens/RaspberryPi-AS3935よりgit cloneして、この中で作業しました。
$ git clone https://github.com/pcfens/RaspberryPi-AS3935.git
cdするとdemo.pyがあるので、こちらを実行していこうと思います。
サンプルがPython2系で書かれているようなので、私もPython2系を新しくインストールした方が楽だと思ったので、環境を合わせることにします。
asdfで2系の最新だった2.7.18をインストールしました。
demo.py
修正箇所です。
sensor = RPi_AS3935(address=0x00, bus=1) # bus=0を1へ変更、ラズパイのバージョンに依る
注意
下記箇所があると思うのですが、pin = 17がGPIO17に対応しています。もしGPIO4にIRQを繋げた場合はpin = 4と変更が必要になると思います。
pin = 17 GPIO.setup(pin, GPIO.IN) GPIO.add_event_detect(pin, GPIO.RISING, callback=handle_interrupt)
動かしてみる
$ python demo.py Waiting for lightning - or at least something that looks like it
Waiting for … が表示されれば雷の待ち状態になっていると思われます。
RPi_AS3935/RPi_AS3935.pyを修正
おそらく素のままだと「# 秋月製の雷センサー・・・」に関係してだと思うのですが、こんなエラーが出ます。
OSError: [Errno 121] Remote I/O error
RaspberryPiによる雷センサーのソースコードからRPi_AS3935/RPi_AS3935.pyを修正しました。
class RPi_AS3935: (省略) def set_indoors(self, indoors): self.read_data() if indoors: # write_value = (self.registers[0x00] & 0xC1) | 0x24 write_value = (self.registers[0x00] & 0xC1) | (0b10010 << 1) else: # write_value = (self.registers[0x00] & 0xC1) | 0x1C write_value = (self.registers[0x00] & 0xC1) | (0b01110 << 1) self.set_byte(0x00, write_value) (省略)
今後さらに
これで一応動いている所までは確認できましたが、これから検証していこうと思います。アンテナのキャリブレーションなども必要になってくるようです。
釣りに使いたい
釣り中に雷が近づいてきたら、iPhoneに通知したり出来たらなと思ってます。
さらにデータを保存できるようにしていけたらなと思っています。
以上になります