雷センサ(AS3935)と接続して見ます

〔PICの動かせ方入門に戻る〕


秋月電子のこちらで手に入れた雷センサモジュール(AS3935:AMS社)ですがぁ、
カミナリが発生すると、雷雲までの距離(1-40Km)と雷の強さ(21ビット:相対値)を推測してくれる
雷検知器です。
このセンサは、稲妻から放出される電磁波を検出する事により、雷の発生を知る事が出来る様です。

畑で農作業しているとぉ、ゴロゴロ、ピカッと来る時が有ります、そんな時に、止めようか如何しようか
考えたりしますがぁ、
今まではピカッの後のゴロゴロの間隔が短いとカミナリさまが近いぞぉなんて経験値(勘)から
言っていました、(光ってから音までの時間を測れば大体の距離は解ると思いますが)
こぉんなセンサが有れば適格な判断が出来るかもって購入して見ました。

このセンサは、雷が発生すると、割り込み(IRQピン)が出力されるので後はレジスタ値を読み出すだけ
の至って簡単な使い方なのですがぁ.....雷が発生しないとぉデバッグ実験出来ません。 (>_<)

実はだいぶん前に実験機とプログラムは作っていました、
最近になりカミナリさまが鳴る鳴る、雨も降る降る、余震も揺れる揺れる、こんな状況で実験再開です。
実験はまだ、暫くは継続しますので、
ここの記事やプログラムは内容が変わる可能性が有ります。m(_ _)m

又、このAS3935のデータシートは英語なのですがぁ、"O-Family"さんのこちらのサイトで
使用方法の概略を日本語にしてオリジナルに書き起こしておられますので解りやすいと思います、
参照して下さい。

このAS3935のデバイス自体はSPIとI2Cの何方かで接続可能なのですが、このモジュールはI2Cのみ
接続となっています。
又、I2Cアドレスも0x00/0x01/0x02/0x03から選択出来るのですが、このモジュールは0x00のみ
なっています。
本来はI2Cアドレス0x00は一斉同報通知用アドレスなのであんまり好ましくはないですね、
それとI2Cバス仕様ではアドレス0x03以下は予約されたアドレスなのでこれも好ましくないのですがぁ。

《配線図》

PICピン構成図 左図はPIC16F1827のピン構成図です。
センサ電源は、2.4-5.5Vなので回路は
3.3Vに統一しました。

PICのMSSP1(SCL1/SDA1)をI2Cで使い、
"I2C接続小型LCDモジュール"と
"雷センサ"に接続しています。
I2C用プルアップ抵抗は"雷センサ"が
内蔵しているのでそれを利用しています。

外部割込み(下図橙色線)をRB3に入力し スイッチ入力はRA1で、LEDはRA2に接続しています。
尚、IRQ出力(橙色線)はアンテナ較正用共振周波数の出力も行います。

配線図
取りあえず、この回路で雷の発生を待つ事にします。
(ノイズを拾いやすいのでセンサの配置は注意が必要かもね)

《ダウンロードプログラムについて》

↓ここからサンプルプログラムソースファイルをダウンロードして下さい。
skAS3935.lzh

プログラムソースをダウンロードしたら、MPLAB Xにてプロジェクトを作成します。
以下のファイルをプロジェクトディレクトリにコピーしてプロジェクトに取込んで下さい。
次にコンパイルPIC書き込みを実行して下さい。
MPLAB(R) XC8 C Compiler Version 1.32コンパイラを使用しています。

ダウンロードファイルを解凍すると下記の様なファイル構成です。
 ANTcarib.c・・・・・・・・・ 本体のプログラムソースファイル(アンテナ調整用サンプルテスト)
 Lightning.c・・・・・・・・・ 本体のプログラムソースファイル(メインのサンプルテスト)
 skAS3935.c・・・・・・・・ 雷センサAS3935用関数ソースファイル
 skAS3935.h・・・・・・・・ 雷センサAS3935用ヘッダファイル
 skI2CLCDlib.c・・・・・・ I2C接続LCDライブラリ関数ソースファイル
 skI2CLCDlib.h・・・・・・ I2C接続LCDライブラリ用ヘッダファイル
 skI2Clib.c・・・・・・・・・・ I2C通信を行う関数ソースファイル
 skI2Clib.h・・・・・・・・・・ I2C通信を行う関数のヘッダファイル

 尚、CPUのクロックは16MHzを想定しています。
 なので通信速度等(I2C)はシステムクロック16MHzで計算されています。

ANTcarib.c

AS3935は、アンテナの共振周波数を調整(キャリブレーション)しないとダメです。

0x08番地レジスタの7Bit(DISP_LCO)をONすると、IRQピンから共振周波数を出力します。
0x08番地レジスタの3-0Bit(TUN_CAP)に0〜15を設定する事により調整します。

共振周波数は500KHzですので一番近い値に調整しますが、IRQから出力される周波数は
500KHz/LCO_FDIVとなり、"LCO_FDIV"は分周比(16/32/64/128)で0x03番地レジスタの7-6Bitにて
指定します、デフォルトは"16"です。
ですので500KHz/16 = 31.25KHzに近い値で調整します。

@ IRQピンをテスター等で繋ぎ、"ANTcarib.c"を起動させます。
  LCDに[ANTcarib]が表示されます。

A AS3935が十分に立ち上がるのを待つ為に5秒間待ちます。

B 5秒後にAS3935を初期化します。
  [Init ERR]が表示されれば初期化失敗です、配線等を確認しましょう。

C 後は10秒毎に0〜15の調整値をセットして行きますのでテスター値をメモリましょう
  (31.25KHzに近い値の調整値を探します)
  [ans=?  ]  ? = "LightningANTC( )"関数から返される成功(0)/失敗(1)の値
  [xx     ]  xx = セットした調整値の表示

IRQ出力値をPICの"キャプチャ"機能で読んでみたのですがぁ、”31.xxKHz”のxx部分の精度が
出せなくてあきらめました、近い値を出せば良いので自動調整を行っても良さげですがぁ、
ここは確実な方法を取りました。

Lightning.c

雷が発生した時に距離とエネルギーを表示させるサンプルプログラムです。

現状このプログラムは雷の発生イベントをただひたすら待ちます。
o(T^T)o うぉ〜 なんとぉ、けなげな \(^^;ナンデヤネン

発生(ノイズ発生も含む)すればLCDの表示とLED点灯を行います
雷発生時
[??Km  ]  ?? = 雷雲の先頭までの距離(1〜40Km)を表示
[xxxxx  ]  xx = 雷のエネルギー量を表示
それ以外の割り込み発生時
[xxxxxxxx]  "INT_CLS":内部メモリーの統計データが消去されました。
         "INT_NH" :ノイズレベルが高すぎます。
         "INT_D"  :ノイズを検出しました。
         "ReadFail" :レジスタの読出し失敗。

スイッチを押せば、LCD表示の消去とLEDの消灯を行います。

"INT_D"は良く発生するので現状は表示しない様にコメントになっています、
0x03レジスタの"MASK_DIST"を"1"にすると"INT_D"は発生しない様に制限できます。
"INT_NH"が発生する場合は、近くにノイズ源(パソコン等)が有るので離しましょう。
"INT_CLS"が偶に発生したのが気にかかる、データの消去はしていないはずなのになぁ。
なので、"INT_CLS"も表示しない様にコメント等にした方がよさげぇ。

このプログラムは実験が進めば変更すると思います。
発生時の距離を記録すれば良いのですがぁ、これは先の話ですね。
雷が発生しそうなら、電源を入れて屋内で実験します。それから、おへそは隠しますよ、念の為。

skAS3935.h

雷センサAS3935用関数ライブラリのヘッダファイルです。
"skAS3935.c"を利用する場合に
#include "skAS3935.h" をプログラムの先頭で記述して下さい。

下記の様に調整値(キャリブレーション)を定義していますので、調整値を自分用に書き換えましょう。
(上の、"ANTcarib.c"でメモった値ですよ)
#define AS_TUN_CAP       0x05           // アンテナ較正用コンデンサー値のデータ

skAS3935.cpp

このライブラリはAS3935から雷のデータをI2C接続で読み出す関数集です。
ですので、この関数集にはskI2Clib.c/skI2Clib.hのファイルが必要です。

この関数集を利用する場合は、"skI2Clib.c"の"InitI2C_Master( )"関数を呼び出した後使います、
使い方の例は、"Lightning.c"を参照下さい。

雷センサAS3935用関数の使い方を説明します。

ans = LightningInit(address,intpin)
 雷センサの初期化を行う処理です。
 デフォルト値で初期化します、変更する場合はヘッダファイル(skAS3935.h)を書換えて下さい。
 (設定値の詳しい内容はデータシートを参照して下さい)

  address :雷センサ(スレーブ)のI2Cアドレスを指定します(0x00)
  intpin    :割り込みを行うピンを指定します(1[RB0]-8[RB7])
  ans       :戻り値   0=正常終了、それ以外はI2C通信エラーです
              1=異常(相手からACKが返ってこない)
 例)
  #define AS3935_ADRS  0x00       // センサのスレーブアドレス
  #define INT_PIN      4          // 割り込みピンはRB3

  int ans ;

  ans = LightningInit(AS3935_ADRS,INT_PIN) ;
  if (ans != 0) {
       printf("初期化失敗") ;
       while(1) ;
   }
ans = LightningCLSTAT( )
 雷センサ内部統計データの全消去を行う処理です。
 この関数を実行させたがぁ、"INT_CLS"が発生しない、
 なのでぇ、データの全消去が実行されているのかが解らない。やり方がダメなのかぁ〜。

  ans   :戻り値   0=正常終了、  1=異常(相手からACKが返ってこない)

ans = LightningPWD(sw)
 雷センサのパワーダウンの設定を行う処理です。

  sw    :0=パワーダウン無効 1=パワーダウン有効
  ans   :戻り値   0=正常終了、  1=異常(相手からACKが返ってこない)

ans = LightningAFE(gb,lev)
 雷センサのAFE(アナログ・フロントエンド)の設定を行う処理です。

  gb    : AFEの利得を設定します(0-31)(デフォルト=屋内:18)
  lev   :ノイズ下限の閾値を指定します(0-7)(デフォルト=屋内:2)
  ans   :戻り値   0=正常終了、  1=異常(相手からACKが返ってこない)
 例)
  int ans ;

    ans = LightningAFE(AS_AFE_GB_INDOOR,AS_NF_LEV_DEF) ; // デフォルト値での設定
ans = LightningINTread( )
 雷センサの割り込み情報を読み出す処理です。
 IRQ割り込みが発生した時に本関数で読み出します、同時に割り込みも解除されます。
 但し、IRQピンのHIGH後、2ms過ぎて本関数を読み出して下さい。
  ans   :戻り値 -1 = 読出し失敗
             0 = 内部メモリーの統計データが全消去されました(AS_INT_CLS)
             1 = ノイズレベルが高すぎます(AS_INT_NH)
             4 = ノイズを検出しました(AS_INT_D)
             8 = 雷が発生しました(AS_INT_L)

ans = LightningEnergyRead( )
 雷のエネルギー計算値を取り出す処理です。
 雷の強さは21ビット値です、相対的な値で物理的な意味は無いらしい。

  ans   :戻り値 -1 = 読出し失敗、それ以外はエネルギー計算値を返す

 ※ 表示させた結果で、"今の雷は強かったぞぉ"って数値を見たら前のより低い値だったりのでぇ
   あんまり当てにならないかもね。

ans = LightningDistanceRead( )
 雷雲までの距離データを取り出す処理です。

  ans   :戻り値 -1 = 読出し失敗、それ以外は距離データを返す(1-40Kmまで)
 例)
  int ans ;

  ans = LightningINTread() ;
  if (ans == AS_INT_L) {
       printf("%d",LightningEnergyRead()) ;
       printf("%dKm",LightningDistanceRead()) ;
   }

 ※ 距離が"1Km"は頭上です、
   前回の距離と今回の距離が同じ場合は、割込みが発生しない様な気がしますがぁ...

ans = LightningANTC(cap,fdiv)
 雷センサのアンテナ較正値の設定処理です。
 IRQピンにアンテナの共振周波数が出力されます。

  cap   :較正値を指定します(0-15)(0=初期値)
  fdiv   :共振周波数の分周比を指定します(0=1/16 1=1/32 2=1/64 3=1/128)(0=初期値)
  ans   :戻り値   0=正常終了、  1=異常(相手からACKが返ってこない)

LightningINT( )
 雷センサの割り込み処理を行う処理です。
 この関数はメインプログラムの割込み関数で呼びます。
 例)
  void interrupt InterFunction( void )
    {
         // 雷センサの割り込み
         LightningINT() ;
         if (InterFlg == 1) IOCIF = 0 ;
    }
 ※ 他のピンを使い、他の場所で割込み処理を行うかもなのでIOCIFフラグは"LightningINT"関数内
   ではリセットしていませんので必ず外部でリセットして下さい。
 ※ 割り込みが発生すると"InterFlg"変数が"1"になります、これを参照して割り込みを判断したら
   必ず"0"にセットして下さい。("Lightning.c"を参照下さい)


skI2CLCDlib.c
skI2CLCDlib.h
skI2Clib.c
skI2Clib.h

この内容は”秋月電子I2C接続小型LCDモジュールに表示を行う”を参照下さい。

尚、システムクロックを変えた人は"skI2Clib.c"ファイル内の"InitI2C_Master( )"関数と、
"skI2CLCD.h"のファイルを変更する必要が有ります。
また、AS3935はI2C通信速度が最大400KHz対応です、ここでは400KHzで行っています。

《その他》

ストライクアラート」こんなのも販売されています、これも電磁波を測定(落雷検知のみ)するらしい、
でもぉ、お値段がぁ....

この際なのでぇ、”雷の知識(落雷対策)”を読んでおきましょう。
これを見るとぉ、”止めようか如何しようか?”等と悠長な事考えている場合でなく、
”ゴロゴロ”聞こえたら逃げろって事ですね。
ついでに、避雷針の保護範囲の技術資料サイトも載せて置こう。

Arduino版は実験が終了したら移植を行いますがぁ、だいぶん先かもね。




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.