こちのものおき
こちのものおきは、こちがつくったものを置いておくところ。
こちはたまに、気まぐれでWebページやソフトウェアをつくることがあります。
つくったものを、ここに置いておきます。
seismo Pi
自宅に地震計を設置する
seismo Piは、加速度計とRaspberry Piを組み合わせた、簡易型の計測震度計です。100HzでX,Y,Z各軸の加速度を計測しつづけ、直近5秒間を対象区間とするリアルタイム震度を提示します。
seismo Piが観測しているリアルタイムの震度は、以下のURLから確認できます。「震度1」「5弱」などの震度階級を表す数字と、計測震度を表示しています。 設置場所や設置の方法は厳格ではありません。欠測、生活振動、移動やテストによる地震ではない異常値を示すことがあります。ご了承ください。
構成
seismo Piは、Wi-Fiでインターネットに接続したRaspberry Pi Zero 2とpythonプログラム、Analog Devices社製のMEMS加速度計センサーチップ「ADXL-355Z」で構成されています。
Raspberry Pi Zero 2
Raspberry PiのGPIOピンのうち、SPI通信用に割り当てられているピンを使用します。
開発時、運用時ともキーボードやマウス、ディスプレイは接続、使用しません。開発用の別PCからSSH接続しながらファイル操作などをすることで開発を進めました。
加速度センサー ADXL-355Z
ADXL-355ZはAnalog Devices社製のMEMS方式の加速度センサーです。 ADXL-355Zは観測したX,Y,Z軸方向の各加速度のアナログデータを内部でデジタル化し、SPI(またはI2C)通信によって外部から取得できるようになっています。
ソフトウェア(RaspberryPi上で動作)
seismo Piは、Pythonで作成されたスクリプトによって動作します。
毎秒100回、SPI通信によってADXL-355Zにアクセスし、X,Y,Zの各軸の加速度を取得します。
1秒経過するごとに、それまでに蓄積した直近5秒分(500サンプル)のデータを対象に、計測震度を求め、これをリアルタイム震度としています。
リアルタイム震度を求める前段階として、フィルタ処理を行います。
フィルタ処理については、[震度のリアルタイム演算に用いられる近似フィルタの改良]を参考にしました。
震度のリアルタイム演算に用いられる近似フィルタの改良
https://www.jstage.jst.go.jp/article/zisin/65/3/65_223/_article/-char/ja
その後、気象庁が定める[計測震度の算出方法]を適用して、計測震度を求めています。
計測震度の算出方法|気象庁
https://www.jma.go.jp/jma/kishou/know/jishin/kyoshin/kaisetsu/calc_sindo.html
*気象庁の方法では、計算の最後に「少数第3位を四捨五入し、少数第2位を切り捨てる」としていますが、現状のseismo Piでは少数第3位を切り捨てて表示しています。
求めた計測震度は、Raspberry Pi内のストレージにCSV型式で保存しつつ、httpのPOSTにより当Webサイトへ情報を送信しています。
ソフトウェア(Webサーバ上で動作)
WebサーバにはPOSTを受け取るだけのPHPがあります。受け取ったリアルタイム震度(計測震度)をJSONに保存し、表示ページのJava ScriptおよびCSSで、それを表示しています。
基礎技術
Python
RaspberryPiにはPython3をインストールしています。RaspberryPi上で動くプログラムはPythonで書いています。
SPI
Raspberry Piは、外部のモジュール等と簡単に情報をやり取りする方法としてSPI通信の機能を備えています。 MISO(Master In Slave Out)、MOSI(Master Out Slave In)、SCLK(クロック)、CS(Chip Select)という4つの役割をする4本の通信線をADXL-355Zに接続するだけです。 スクリプトから、ADXL-355Zのレジスタ、データを送ることで、センサの内部でデジタル化された加速度情報を読みだしたり、設定を与えることができます。
震度の求め方
兵庫県南部地震(阪神淡路大震災)があった1995年当時ごろまでは、地震の揺れの程度を示す「震度」は、人の体感により主観的に決められていました。 震度階級は「震度0」から「震度6」まで(0~6の7段階)を体感で測り、現地調査を経て「震度7」を発表していました。人による判断や報告の作業や手続きが介在するため、速報性、正確性にも欠ける方法でした。
気象庁は1996年に震度階級を「震度0」から「震度4」、「震度5弱」「震度5強」「震度6弱」「震度6強」「震度7」の10段階に改正し、計測震度計の導入によって速報が可能な体制に改善しました。 またその後から、被害状況把握と初動防災対応に活用する目的で全国の地方自治体が独自に震度計を設置するようになったほか、防災科学技術研究所による地震計の設置も進み、2023年では4300地点を超える震度計が設置されています。
「計測震度」は、地震による揺れを観測した加速度の時刻歴をもとに、定められた手続きによって計算し求められる、少数を含む値です。マイナスの値もとります。計測震度の値をもとに、震度階級が割り当てられています。
| 震度階級 | 震度0 | 震度1 | 震度2 | 震度3 | 震度4 |
|---|---|---|---|---|---|
| 計測震度 | 0.5未満 | 0.5以上 1.5未満 | 1.5以上 2.5未満 | 2.5以上 3.5未満 | 3.5以上 4.5未満 |
| 震度階級 | 震度5弱 | 震度5強 | 震度6弱 | 震度6強 | 震度7 |
| 計測震度 | 4.5以上 5.0未満 | 5.0以上 5.5未満 | 5.5以上 6.0未満 | 6.0以上 6.5未満 | 6.5以上 |
計測震度 I は、対象となる時間区間について、定められたフィルタ処理をしたのちに、X,Y,Z成分を合成した加速度の大きさの求め、 「これ以上の大きさの加速度を示した時間の合計が0.3秒」となるような加速度 a を求め、I = 2 log a + 0.94 の式によって求められます。
この説明は少々わかりにくいですが、1/100秒ごとに加速度を測って記録していることを前提に考えると、単純化できます。
加速度の記録の1件1件は0.01秒分の情報なので、対象とする時間区間の全記録を大きい順に並び替えれば、上から30番目(0.01秒 * 30位 = 0.3秒)となる加速度が、求めたい a であると考えることができます。
地震発生後に気象庁が発表する各地の震度は、揺れ始めから揺れ終わりまで、一般に60秒の区間について評価したものですが、Seismo Piにおいては、毎秒、直近の5秒間についてこれを行うことで、リアルタイムに計測震度を求めます。
また、本来の計測震度の計算におけるフィルター処理とは、震度計の特性を打ち消す目的で周波数領域について行われる、フーリエ変換と逆フーリエ変換で挟むような処理ですが、これを近似した時間領域についてのフィルタを採用しています。
考えたこと
ADXL-355Z
seismo Piでは、加速度センサーとしてAnalog Devices社の「ADXL-355Z」を使用しています。より正確には、同社より販売中の評価用基板を使用しています。
言うまでもなく、震度計を製作するにあたって加速度センサーの精度は重要です。とりわけS/N比については、震度0~1付近での正確な観測に重要だと考えられます。 seismo Piでは、家のまえの道路のわずかな凹凸を大型トラックなどが通過した際に生じる、部屋でじっとしているときに感じる程度のわずかな振動に対して震度1(よほどひどいと震度2)を示します。 一方、体感として何の揺れも感じないときは震度0、計測震度では-1.5~-1.00以下を、深夜帯では-2.00あたりを、比較的安定して示しています。
SPI通信
seismo Piとは別の工作において、Raspberry PiのSPI機能を使用せず、直接GPIOのHigh/Lowをスクリプトから自前でコントロールすることでSPI通信を行うことを試しました。 MISO、MOSI、SCLK、CSの4線を使用することに変わりはありませんが、クロック信号の立ち上げなどを含め、データの送信(このときは受信はありませんでした)についても自前で行ったため、 勉強にはなりましたが、不具合箇所の特定などに試行錯誤が必要でした。
Raspberry Piが標準で備えるSPI機能を有効化して使用することは、簡単で便利です。余計な問題の処理に煩わせることもなく、圧倒的にこちらに頼るべきだと感じました。
その他のスクリプト
同時に実行するスクリプトとして、時刻合わせスクリプト、Wi-Fi監視スクリプト、自動実行用スクリプトを作成しています。これらも、別の工作において作成したものを参考に、再作成しています。