2010/12

ArduinoUnoでRealTimeClockをNTPと同期させる Step.3 Aruduino IDE Ver.0021用にライブラリを修正する

2010/12/03 Friday - 00:15:28 by chameleon

ArduinoUnoでRealTimeClockをNTPと同期させる Step.2 RTC8564用ライブラリの制作で、RealTimeClockを利用して、Aruduinoに計時させようと考えているわけですが、そもそも基準となる正確な時間をどのように与えるのかという問題があります。 やはり、NTPサーバーより時刻を得るのがいいのではないかと考えて、Aruduinoの開発環境用に作成されたライブラリ「Time Library」を利用してみることにします。 ダウンロードして得られた「Time.zip」を解凍すると「DS1307RTC」「Time」「TimAlarms」のフォルダができるので、librariesフォルダにコピーします。 そして、サンプルスケッチに「TimeNTP.pde」というNTPサーバーから時刻を得るスケッチがありましたので、Aruduino IDE Ver.0021環境からAruduino Unoに当該スケッチをアップロードしてみます。 TimeNTP.pdeをIDEで開いて確認すると、冒頭部分に #include <Time.h> #include <Ethernet.h> #include <UdpBytewise.h> // UDP library from: bjoern@cs.stanford.edu 12/30/2008 #if UDP_TX_PACKET_MAX_SIZE <64 || UDP_RX_PACKET_MAX_SIZE <64 #error : UDP packet size to small – modify UdpBytewise.h to set buffers to 64 bytes #endif と記述されていて、他にも「UdpBytewise.h」が必要なことがわかります。NTPサーバーはUDPを利用しますから、UDP関連のライブラリがいくつか必要なようです。このライブラリ一式はここからダウンロードできます。解凍したらできあがったファイルを「Ethernet Library」フォルダにコピーします。 ちなみに、UdpBytewise.hに記述されていてるUDP_TX_PACKET_MAX_SIZE とUDP_RX_PACKET_MAX_SIZE の値を64に変更しておけと書いてありますから、直しておきます。 では、コンパイルしてみます。はい・・・見事エラーの嵐ですね。 どうやらSPI.hをインクルードしろといっているようです。確かIDEがVer.0019になってからEthernet Liburaryを使うときにはインクルードが必要になりました。 TimeNTP.pdeに以下を書き加えます。 #include <SPI.h> [...]

ArduinoUnoでRealTimeClockをNTPと同期させる Step.2 RTC8564用ライブラリの制作

2010/12/02 Thursday - 12:30:17 by chameleon

ArduinoUnoでRealTimeClockをNTPと同期させる Step.1で制御系のだいたいの構想は立ちました。 なぜ、RealTimeClockが必要なのかは突っ込みどころ満載ですが、単に使ってみたかったからに他なりません。実際には、Timeライブラリを使えばArduinoの内部クロックで計時できます。 が、リアルタイムクロックのタイマー機能などを使えば、定期的に温度計測するタイミングなどを、単純なコードで記述できますし、arduinoのCPUの負荷も若干軽減できるはずです。 使ったリアルタイムクロックは秋月電子のものです。エプソントヨコムのRTC8564というチップをのせています。データシートも付属していましたが、エプソントヨコムのWEBサイトから詳細なマニュアルが入手できました。 このリアルタイムクロック用のライブラリを作成してみます。まあ、作らなくてもいいんですが・・・。一応、時計あわせやタイマー、アラームを設定できるようにしたりという機能を実装してみます。制作時間30分くらいなので、あまり突っ込んだ内容になっていないのは笑いですませます。 extern "C" { #include <stdlib.h> #include <string.h> #include <inttypes.h> } /************************************************/ /* Real Time Clock Module */ /* RTC-8564JE/NB */ /* */ /* 1pin CLKOE – open */ /* 2pin CLKOUT – Arduino D7 */ /* 3pin INT – open */ /* 4pin Vss – Arduino GND */ /* 5pin [...]

ArduinoUnoでRealTimeClockをNTPと同期させる Step.1 構想編

2010/12/02 Thursday - 10:18:40 by chameleon

ちょっとしたことは、ATmega168を搭載した小型マイコンボード「Arduino」で制御できてとても便利なツールになっています。 今回は、気象観測装置の雨量計の凍結防止用ヒーターを制御する機材のプロトタイプを作成することにします。雑用係ですから、微妙に業務とかぶらない仕事が回ってきます・・・。 さて、従来は「Arduino Duemilanove」というバージョンのハードウェアだったのですが、先日購入したものは「Aruduino Uno」となっていました。ハードウェア的な性能アップはないようですが、スケッチと呼ばれるプログラムのアップロードが高速化されているようです。 ただ、従来の開発環境である「Aruduino IDE」がVer.0021以降のものしか利用できません。 で・・・思わぬところで躓きました・・・。まあ、いつものことですけど。 一応、凍結防止用ヒーターの構成を考えます。 雪が降ると、雨量計の転倒マスへ雨を集約して送るバケットの受け皿に雪が融解せずに溜まり、正確な降水量が計測できなくなります。そうなったらあきらめて、雪が溶けるのを待てばいいのですが、そうなると、降雪がある間は全く雨量が計測されず、降雪が止んで、晴れてきてから雨量が計上されるというおかしなことになります。 こういったことを避けるために、ドップラー式の雨量計などがあるのですが、非常に高価です。したがって、転倒マス式の雨量計が普及しています。 さて、仮に何らかの方法で雪を溶かして水にしてしまえば、転倒マスに雨(水)として落ちて、正確な降水量が計測できるはずです。多くは、転倒マスのバケットの中に熱源を置くという解決方法がとられています。 私の施設ではDavis社のWeatherStationですので、純正のRainCollectorHeaterを装着しています。伝統的な手法としては、ヒーター線をバケット内に貼り付けて加熱したり、奇抜な方法はオートバイや車のスモールランプなどを12Vの電源で駆動するなどして熱源にする方法があります。ただ、ランプを使う場合は、もともとRainCollector内は水がかかりやすい環境なので、ランプや回路の防水が困難です。ランプを使う場合は発熱量が必要以上に大きくなりすぎないよう制御しないと、バケット内の機構がダメージを受けるほど高温になってしまう傾向があるので気をつけないといけません。 ただ、いずれにしても「凍結しそうなとき」や「大量の降雪がありそうなとき」には熱源の電源を入れなければなりません。いつも電源を入れておくという荒技もありますが、エコ指向な昨今、ある程度インテリジェンスに電源の制御をしておきたいところです。 構想としては、 温度計でRainCollector周辺と内部の温度を計測する。 外気あるいはRainCollector内の気温が0℃(仮に1℃くらいから運用してみる・・・)に達する前に、ヒーターを駆動する電源をONにする。 外気が十分に高くなったら電源をOFFにする。 RainCollector内部の温度が異常に高くなったら、電源をOFFにする。 Arduinoを格納するウォルボックス内の温度もついでに計測しておく。(夏場はかなり高温になると思われるので、各機器の動作範囲温度を超えてしまうおそれがあるのでそのモニター用・・・夏はヒーターコントロール回路はいらないし・・・) 制御がばたつかないように 適当なヒステリシスをとる。 あるいはいったん電源を入れたら数時間は通電したままにしておく。 といったところか。 細かな調整は、Arduinoならいつでも修正可能なので、後は運用して不都合があれば、その都度対応することにすればいいかな。 いつものように材料を調達します。 Arduino Uno シールド用基板(Arduinoのシールドを作る専用基盤です) デジタル温度計専用IC(今回はDS18B20というチップを使いました。) RealTimeClockモジュール 抵抗・コンデンサ 電気二重層コンデンサ コネクタ ツイストペアケーブル SSRリレー コンセントボックス一式 その他、こまごましたものは手持ちのものを利用 等々です。 特に温度計測用ICは温度校正がいらない、しかも測定誤差が±0.5℃以下という大変精度のよいものです。しかも複数のセンサーを一つのバスラインに並列に接続できるため、Arduinoのポートを節約できます。 今回は、このチップの正確な温度に基づいてWeatherStationの気温センサの校正にも利用することとします。