メイカーズ塾実習 データロガー作り(Arduinoで性能検証)

温度や降水量などの時間変化を記録する機器をロガーという。市販のものもたくさんある。

電力を測定しようとすると、1秒や1分単位の消費電力を測定して、ロギングして記録するロガー装置がある。

しかし、私は、電圧、電流の詳細な変化を記録したいと思っている。

一般に、コンセントの電力は、50Hz交流100Vである(西日本は60Hz)。50Hzとは、1秒間にプラスとマイナスがサイン波状に変化するということ。

つまりは、1秒/50回=20msで1周期となる。これを、詳細に観察しようとすると、1周期を100に分けて観察するには 100×50=5000回/秒も記録しなければならない。これは、200μs毎に記録すると言うこと。

ロガーで1msよりも高速に記録できる装置は、個人で購入するなんて、とても考えられないようなお値段がする。

そこで、自作が出来るか検討をすることに。自作と言うからには、部材代は1000円以下。けち~~~~! である。

果たして、実現出来るのか?

一から作り上げるのは、実は、結構ハードルが高い。そこで、メイカーズ塾で既に利用している部材を転用してどこまでできるか、検証を始めてみた。

手元には、ArduinoUnoとEthershieldがある。Arduinoは、ADコンバータからの10ビットでデータを取得することが出来る。Ethershieldは、マイクロSDカードスロットがあり、SDカードにデータを記録出来る。あわよくば、有線イーサネットでLAN経由でデータを送信することも出来るかも。

先ずは、素の状態のArduinoでどこまでできるか確認中。

Arduinoリファレンスは、Arduino使いにとって必須サイト。

Arduinoは、16MHzクロックで動作しており、ADコンバータにはそれを分周したクロックが供給されている。標準状態では、100μsで変換が終わると言うことで、毎秒1万回の測定が可能という。十分な性能だ。

しかし、それで、安心してはいけない。SDカードにデータを書き込む時間を侮ってはいけない。書込みにかかる時間は、メモリチップの性能に依存するため、Arduinoのクロックだけでは分からない。しかも、ファイルへの書込みと実際のメモリチップへの書込みは、ドライバに依存するため実測してみないとどれくらいの時間が必要か分からない。

先ずは、実験。

ArduinoでSDカードをアクセスするサンプルプログラムはこのサイトを参考にした。感謝!!

タイマー割込みで定期的に電流瞬時値をAD変換して取得した値をスルーでSDカードに書き出すプログラムを作ってみた。いちおう、要所要所でエラーがあったらコムポートにメッセージを吐き出すようにして、途中経過を観察できるようにしてある。

テスト中のプログラム

最初に定義してある「INTERVAL」でタイマ割込の間隔を設定している。そもそも、このサンプルでは、タイマ割込の間隔が最小で1msまでしか対応していないので、最高速でも1kHzまでだが、それに処理が間に合うのか。

INTERVALを100msから、実験開始。ログファイルを確認すると、きちんと記録されていることが分かる。ふむふむ。

INTERVALを10msにして実験。ログファイルを確認すると、きちんと記録されているようだ。よしよし。

思い切って、最小のINTERVALを1msではどうだ。ログファイルを確認すると・・・・!!!!

20140921ArduinoLogger01

1000個のデータを記録して終了するプログラムだが、ファイルには、768個のデータまでしか記録されていない。

明らかに処理が追いついていない証拠。さて、原因やいかに。

タイマー割込みサイクル毎にファイルに書込んでいることで、オーバーヘッドが大きいことが想定される。書込みを何回分かまとめて行えば、オーバーヘッドを削減することが出来るはずだ。ただ、SDカードドライバが、仮想的にファイル書込みを行い、ある程度まとまったところでSDカードにフラッシュしているのなら、それほどの負荷にはならないはずだ。何とも言えないところ。

また、AD変換している間の100μsは、ただ単に待っているだけでもったいない。AD変換をスタートしたあと、別の処理をしておき、変換が終了したら測定値の処理をすると、無駄を省くことも可能だ。しかし、Arduinoのライブラリを見る限り、これは難しそうだ。AD変換をローレベルで制御するようなプログラムを書かなければならず、ハードルは高い。

まだまだチューニングの方法はいくつかある。もう少し、頑張って、どこまで高速に測定できるか、トライしてみよう。

と言っておきながら、さっそくトライしてみて、あっけなく成功してしまった。少々気が抜けた感じだが、ひとまず1ms周期(1kHz)サンプリングロガーは出来た。

ネットを探していたら、Arduinoの制御系のクロックを変更するユーティリティツールというのが見つかった。これを組込んで、AD変換クロックを標準の125kHzから4倍の500kHz(精度を落とさずに高速化できる限界)まで上げてみたら、1msサンプリングでうまく記録することが出来た。AD変換にかかる100μsを25μsに短縮したことで、処理時間の余裕が増えたことによるものと理解できる。

調子に乗って、更にクロックを1MHzに上げて、AD変換にかかる時間を12.5μsにすると、動作はするものの、AD変換した値の精度が落ちることが確認されたので、ArduinoUnoでは、AD変換クロックは500kHzが限界と言うところのようだ。

なにはともあれ、作者さまに感謝!!

次回へ

(Visited 15,900 times, 4 visits today)
スポンサーリンク

シェアする

フォローする