2010年11月23日火曜日

定点観測データロガー -1 : Watchdogタイマーとスリープからの自動復帰


アウトドアに設置され、静かにデータを計測し続ける定点観測ロガー。
なぜか「定点観測」という言葉の響きからとてもロマンチックなイメージをしてしまう。
まるで毎晩天体望遠鏡で夜空の星を眺め続ける少年のような(それは天体観測)。
大自然の中に存在する、小さいけれどメカニカルな存在感を美しいと感じているんだと思う。
Arduinoを使い、一ヶ月くらい放置してもきちんと環境データを記録し続けてくれる定点観測ロガーを作成する。

八月から始めた畑は家から結構離れた郊外にある。
往復2時間かかるので、仕事帰りにちょっと野菜達の様子を観るということは無理である。
育成の観察や害虫駆除など本当は毎日でもしたいようなことができない分、農業はまだ身近に感じる事ができない。
だからというわけでもないけど、定点観測ロガーを設置する予定のフィールドは僕の畑である。

畑の面積は約16平方メートルで、これは六畳一間をひとまわり大きくしただけの広さだ。
堆肥の山の発酵熱は成分調整をうまくやれば季節を問わず摂氏80℃にも達する事があり、
また真冬の霜の降りた畝の表土は0℃を下回る。
それにキーホールガーデンや畝、池など、狭い空間なりにできるだけ多様な小環境を造成したので、
ベランダのプランターガーデンよりは複雑な微気象の変化を作り出せるのではないかと思う。
土の水分計測も考えたが、必要ないので止めた。
共同農園には水道の蛇口が一つしかないしから自動水分補給器のようなものをしかけることはできないし、
プランター栽培とは異なり、種まき後の発芽までの期間以外は自然の雨だけで水分補給は事足りてしまうからである。
計測対象となるのは気温と湿度、それに堆肥の山の発酵熱、土の表面温度、池の水温、照度とする。
温度センサと湿度センサ、フォトダイオードをしかける。
ちょっとした環境データを利用して、種まきの時期の把握とか、自分の畑に適する野菜の選別作業の足しになれば?幸いである。


< 定点観測器の仕様 >
  1. 計測内容は、計測時刻・気温・湿度・温度・照度とする。
  2. Arduino Pro 328 3.3V 8MHz をスタンドアロンで動作させる。
  3. 単三乾電池4個を電源とし、最低一週間は稼働する省電力設計とする。
  4. 設定した間隔で持続的にデータを記録できるものとする。
  5. 定期的に記録データ媒体と乾電池を交換できる設計とする。
  6. 計測データの保存はSDカードを使用する。

まずは電源である。
これはなんとかなりそう。
超最先端ハイテク技術でもない限りこういうことは既に先人達の解決方法があって、そのヒントはMake:Japanの記事の中に眠っていた。

スリープして電池寿命を延ばすArduino小鳥さえずり機

Watchdog Timerによる自動復帰スリープ機能を使って、電池寿命をなんと4日間から3年間に引き延ばしている。
この記事を読んで初めて、Arduinoでも外部からの割り込みなしにスリープからの自動復帰ができるということを知った。
スリープ状態の時には電力消費を限りなく低く抑え、設定したスリープ間隔に達したら自動復帰させて目的の処理を実行させ、
再び設定した間隔でスリープさせる。
畑には毎週、最低でも隔週間隔で通うので、電池4個を使って2週間持てばいい。


< Arduino スケッチ >

以下はテストスケッチである。
ArduinoのWatchdogとSleepのライブラリはなんでも作っちゃう、かも。から賜りました。ありがとうございます。

Watchdogライブラリ
リンク先からファイルをコピペし、Watchdog というディレクトリを作成してその中に保存。

Sleepライブラリ
リンク先から Sleep003.zip をダウンロード&解凍ファイルする。Sleep というディレクトリができる。

それぞれ、Arduino/libraries/ 以下に保存する。

参考サイトのスケッチをちょっといじった。
デジタル13ピンのLEDを3秒間点灯させた後、スリープさせて1秒後にスリープ復帰...を繰り返す。
Arduino Pro をUSBケーブルで接続して、スケッチをアップロード。



/*
 * sketch name   : watchdog_sleep_led
 * summary       : LEDを点灯させた後に指定の間隔スリープ、自動復帰させる
 */

#include <Watchdog.h>
#include <Sleep.h>

// オブジェクト作成
WatchdogClass WD = WatchdogClass();

void setup() {
  pinMode(13,OUTPUT);                   // 13ピンを出力に設定
  WD.systemResetEnable(false);          // スリープ復帰時にスケッチをリセットしない(setup関数を実行しない)ように設定
  WD.enable(WatchdogClass::TimeOut1s);  // スリープ間隔を1秒に設定
}

void loop() {
  digitalWrite(13,HIGH);        // LED点灯開始
  delay(3000);                  // 3秒間
  digitalWrite(13,LOW);         // LED点灯停止

  WatchdogClass::timerReset();  // Watchdogタイマーリセット
  SleepClass::powerDown();      // パワーダウン
}


Arduino Pro 328 3.3V 8MHzにスケッチをアップロードするには3.3V動作Arduino製品向け小型USB-シリアルアダプタ
USBケーブル(Aオス-miniBタイプ)が必要である。
スケッチの実行は、Arduino Pro 328 3.3V 8MHzとPCをただ繋ぐだけである。

データロギングは、

  digitalWrite(13,HIGH);
  delay(3000);
  digitalWrite(13,LOW);
の箇所で実行すればいい。
次回は、もう一つの問題点である、持続した時刻情報の保存を試してみる。


< 参考リンク >


0 コメント:

コメントを投稿