phpのfftライブラリのテスト

phpで計測震度を計算するのにfftライブラリが必要になったのでテスト。試しにFast Fourier Transform 0.1を使ってみる。

平成12年(2000年)鳥取県西部地震の米子市のデータを気象庁が公開しているので同じデータをサンプルデータとして使う。ファイル名はAA06EA01.csv。

結果

AA06EA01

完全に一致。

ただしちょっと重い。Corei5 2.3GHzのpcでテストしたが1秒に3回計算するのがやっと。RaspberryPiでは厳しいかも?5秒に1回くらいでも実用かも?元々c++だしc++で書く方が楽かも?

ソース

ffteqtest.php

(2016/04/21 気象庁のurlを修正)

RaspberryPiで地震計を作りたい

raspberry-1328616821

RaspberryPiで地震計を作りたい。

想像図

加速度センサ→ADコンバータ→PIC→USB→RaspberryPi→phpで計測震度計算→WiringPi→GPIO→7セグで震度表示

手元のRaspberryPiのOSはRaspbianが入っていて、PICをUSB接続するだけでOS側から認識できた。

$ dmesg | grep tty

[  122.1046771] cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device

$ ls /dev/ttyACM0

/dev/ttyACM0

標準入出力を使えば読み書きが出来る。

$ echo  hoge > /dev/ttyACM0

$ cat /dev/ttyACM0

計測震度の計算はphpで行う。fftのライブラリを使えばできると思う。

GPIOを制御するライブラリ WiringPi-PHPを入れる。

7セグはRaspberryPiの筐体に合う大きめの物を使いたい。GPIOの電流は16mAまで設定できるらしいので直接点灯できそう。数値は高々1桁なのでダイナミックにする必要はないだろう。

「強弱」の表示は作る必要がありそう。

 

UV測定器

感光基板で使ったUVランプの強度とフィルムの透過率を測定するためにUV測定器を作った。

作ったUV測定器
作ったUV測定器
回路図
回路図

UVセンサは秋月で売ってる半導体UVセンサG5842。ADコンバータは地震計3を流用してMCP3551を使った。pc用ソフトも作った。

UVランプはサンハヤト ちびライトDX BOX-S1100。電源はAC100V/50Hz。

結果

UVランプは起動後にUV強度が安定するまで30秒くらい掛かるようだ。縦線間が約5秒。

起動後の経時変化
起動後の経時変化

位置によっても大きく違う。縦線間が約5cm。

左右の位置によるUV強度変化
左右の位置によるUV強度変化
前後の位置によるUV強度変化
前後の位置によるUV強度変化

また、UVランプの筐体を指で触ると測定値が20~30%変動した。UV強度が変化するのか、センサの感度が変動するのかは不明。ネジ部分を接地すると安定した。

ネジ部分を接地
ネジ部分を接地

感光基板に使用する材料の透過率を測定した。

材料 測定値
μW/cm2
透過率
blank 6300 1
ガラス(露光クランプ) 5300 0.84
OHPシート 4800 0.76
トレッシングペーパー 3600 0.57
コピー用紙 850 0.13

pic18f14k50ソース
main.c
HardwareProfile.h

pcソース
Form1.h

 

アナログ加速度センサーを比較する

秋葉原で手に入るアナログ加速度センサーを同じADコンバーター(地震計11を流用)で測定しノイズを比較した。
DSC03269

結果

メーカー メーカー品番 ノイズ
μg/√Hz
g範囲 出力
インピー
ダンス
実測
標準偏差
gal
STMicroelectronics LIS344ALH 50 ±2g 110 0.160
Kionix Inc KXR94-2050 45 ±2g 32 0.182
Analog Devices Inc ADXL335 XY:150 Z:300 ±3.6g 32 0.519
Freescale Semiconductor MMA7361LC 350 ±1.5g 32 1.238

LIS344ALHの波形
LIS344ALH

KXR94-2050の波形
kxr94_2050

ADXL335の波形
adxl335

MMA7361の波形
mma7361

LIS344ALHモジュールはマルツや千石で売っているAM-3AXIS-PV03。これだけ出力インピーダンスが110kΩなのでローパスフィルタのコンデンサは0.33μFを使用している(他は1μF)。

KXR94-2050は秋月で売っている。高性能の割に安い。

ADXL335はマルツで売っている。ノイズが多く、地震計には使用できないと思う。

MMA7361は秋月や千石で売っている。ノイズが多く、地震計には使用できないと思う。

地震計11 — ADS1115

DSC03250

16bitADコンバータADS1115を使って作った地震計。

スイッチサイエンスの16BitADCも同じものと思う。

回路図

ads1115

ソースはC18でコンパイル。

main_ads1115.c

レジスタが16bitなのが少し曲者と思う。あと変換中にチャンネルを変えるとどのチャンネルの変換値か分からなくなるので工夫が必要。

他の部品は、

PIC18F14K50使用USB対応超小型マイコンボード

I2Cバス用双方向電圧レベル変換モジュール(PCA9306)

リニアレギュレーターADP150

3軸加速度センサモジュール KXR94-2050

 

地震計10 — ADS1247

SONY DSC

前回とほぼ同じ部品で小さくまとめる為に作った地震計。

PIC側のソフトはMCHPFSUSBを加工したもの。C18でコンパイル。

main.c

HardwareProfile.h

usb_config.h

回路図

eq10

PC側のソフトはVisual Studio 2008(C++/CLI)でコンパイル。

新規作成→プロジェクト→Windowsフォームアプリケーション→プロジェクト名「vc232」→ok

でひな形を作り、ソースを入れ替え。

プロジェクト→プロパティ→構成プロパティ→全般→共通言語ランタイムサポート→/clr:pure

だと通らないので/clrにする。

Form1.h

fft.h

地震計8 — PIC18F2553とオペアンプ

SONY DSC

スペックを下げればもっと手軽な部品で何とかなるんじゃないか?と考えた地震計。

感覚的に震度4くらいまでは日常的に起こるので、震度4に相当する25~80galを計測できれば実用になるだろう。

2回路入り入出力フルスイングオペアンプNJM2732D

3軸加速度センサモジュール KXR94-2050

12bitADコンバーターを備えたPIC18F2553モジュール

リニアレギュレーターADP150

で構成。

KXR94は±80galで±53mVの感度があるので差動増幅すれば、PIC18F2553の有効ADC分解能10bitでも0.1galまで測定できる……筈。

が結果上手く行かない。ローパスフィルタを入れれば瞬時の測定値は安定するのだけど、2~5秒の間にゆっくり測定値が変動する。

高精度アンプを使えば良いと思うが。

地震計7 — KX023-1025

SONY DSC

より良いデジタル加速度センサーを求めて作った地震計。

加速度センサーはKX023-1025の評価基板EVAL-KX023-1025。16bitでサンプリングできる。

他、PIC18F14K50モジュール

I2Cバス用双方向電圧レベル変換モジュール(PCA9306)

リニアレギュレーターADP150

KX023-1025はローパスフィルターを内蔵してるが、求めているものではなかった。

 

鳥と地震と地震計