2011年3月21日月曜日

Arduinoとリアルタイムクロック -2: 定周期タイマー割り込み & スリープ



前回の続きでRTC8564と定周期割り込みライブラリの詳細。

< 資料 >
Sketch: Rtc8564AttachInterruptSleep ▼
Library Code:
    Rtc8564AttachInterrupt.h ▼
    Rtc8564AttachInterrupt.cpp ▼
Download: Rtc8564AttachInterrupt.zip


< Arduino と RTC8564 >

1. スレーブアドレスの指定

ArduinoでRTC8564モジュールを使用するには WireライブラリでI2C通信を行う必要がある。
RTC8564のスレーブアドレスは『0xA2』固定だが、Wireライブラリでは7ビットでデバイス特定をするため、
右に1ビットシフトさせて指定している。

Rtc8564AttachInterrupt.cpp line10

    0xA2 >> 1

2. 回路接続

ArduinoとRTC8564回路図
Arduinoではアナログ4ピン(SDA:データライン)、アナログ5ピン(SCL:クロックライン)を使う。
前回のHoneypotシールドではタイムスタンプ保存のための外部EEPROMにI2C通信を用いていたが、
その回路をRTC用に入れ替えればよい。

RTCからの外部定周期割り込み信号を受信するためには、Arduinoの割り込みピンであるデジタル2ピンをプルアップで接続する。
タイマーを設定されたRTCは、カウントダウンが終了するごとにRTC3ピンからArduino2ピンにLOWレベル(0V)の信号を発信する。
その0V信号を受信するために、スケッチでは以下の部分で設定をしている。



  // 割り込み設定
  pinMode(RTC_INTERRUPT_PIN, INPUT);
  digitalWrite(RTC_INTERRUPT_PIN, HIGH);


3. スリープ


SleepClass::powerDownAndWakeupExternalEvent()メソッド内で attachInterrupt()関数を使用してArduinoの割り込みピンを指定している。
なんでも作っちゃう、かも。さんのブログによると、このメソッドは「パワーダウン+外部割り込みによる復帰モード」であり、
スリープした後に指定したピンにLOWレベルの割り込み信号があった場合にスリープから復帰する、とある。



  // スリープ開始
  SleepClass::powerDownAndWakeupExternalEvent(0);


つまり、

スリープ
RTCからの定周期割り込み信号によってスリープから復帰
なんらかの処理をさせる
スリープ
...

というサイクルが可能になる。




< RTC8564 各種設定レジスタへの設定方法 >

1. レジスタ一覧

RTC8564は様々な機能を設定するためのレジスタを持っている。
詳細は、『RTC-8564NB アプリケーションマニュアル』を参照。

PAGE11より

2. Wireライブラリによるレジスタの設定方法

一覧の上から順に機能を挙げると
レジスタのAddress 機能
 00 (0x00)  時計、カレンダーを始めとした機能の停止/動作を制御
 01 (0x01)  各種割り込みイベント動作設定や各種割り込みイベント発生状況の把握
 02 (0x02)  時計カウンタ(秒)設定
 03 (0x03)  時計カウンタ(分)設定
 04 (0x04)  時計カウンタ(時)設定
 05 (0x05)  時計カウンタ(日)設定
 06 (0x06)  曜日カウンタ(曜日)
 07 (0x07)  時計カウンタ(月)設定
 08 (0x08)  時計カウンタ(年)設定
 09 (0x09)  アラーム割り込み(分)設定
 0A (0x0A)  アラーム割り込み(時)設定
 0B (0x0B)  アラーム割り込み(日)設定
 0C (0x0C)  アラーム割り込み(曜日)設定
 0D (0x0D)  出力端子のクロック出力設定
 0E (0x0E)  定周期割り込み機能を制御
 0F (0x0F)  定周期割り込み機能を使用する際のカウントダウン初期値を設定

となる。
レジスタごとに、0〜7のbitへ 1 か 0 を指定することにより、RTC8564モジュールを制御する。
Wireライブラリを使用した指定の仕方は以下のようになる。



  // Control2レジスタ(定周期タイマの繰り返し・割り込み時の信号発信設定)
  Wire.beginTransmission(RTC8564_SLAVE_ADRS);
  Wire.send(0x01);  // Control2 address
  Wire.send(0x11);  // TI/TP:1(繰り返し割り込みモード),TIE:1(定周期割り込み時、Lレベルの割り込み信号を発生させる)
  Wire.endTransmission();


上記は、割り込み動作設定レジスタの『0x01』(Control2) に16進数でいう『0x11』(2進数では "10001")をセットしている。
※ "RTC8564_SLAVE_ADRS" は、定数としてデバイスのスレーブアドレスを指定している。

レジスタへの設定値
2進数、8進数、10進数、16進数相互変換

次回は、Rtc8564AttachInterruptライブラリの詳細を書いてみる。




2011年3月20日日曜日

Arduinoとリアルタイムクロック -1: 定周期タイマー割り込み & スリープ



秋月電子のRTC8564モジュール


< Arduino と RTC8564 >

畑にセットしていた定点観測データロガーHoneypot
一週間後にSDカード内のデータをチェックしてみると、タイムスタンプ情報が大幅に狂っていた。
チェックしてみた時刻と14時間近くのずれがある。
どうも気温によってArduinoのクロック振動数がかなり変動してしまうらしい。
1日1分程度のずれが生じるらしく、定期的に正確な時刻カウントを継続させるという用途には向いていない。
正確な計測時刻を継続させるにはハードウェア的に無理がある。

RTC(リアルタイムクロック)は、そのような問題を解決してくれる。
Arduinoとは別系統の正確なクロックモジュールを使用するので、時間系の処理はすべて一任できる。
今回調べてみるまでRTCのバックアップ回路の存在を知らなかったので、観測用シールドに組み込むべくいろいろと調査してみた。
以下の回路では、電源をOFFにしても5.5V 1Fの電気二重層コンデンサに溜められた電力によってRTCはカウントを持続できる。
外部EEPROMにタイムスタンプを記録して無理矢理時刻情報を繋げたり、SDカードと電池交換時のタイムラグが発生したりする問題がすべて解決する。


ArduinoとRTC8564回路図
Sketch: Rtc8564AttachInterruptSleep ▼

スケッチ実行には、以下の二つのライブラリが必要となる。



< Arduino RTC8564用定周期タイマー割り込みライブラリ >

なんでも作っちゃう、かも。さんのRTC8564のライブラリを使わせて頂きました。
ありがとうございます。

RTC8564用ライブラリには定周期タイマー割り込みのメソッドが含まれていなかったので、改造してみた。
以下は RTC8564ライブラリをもとに僕が追記したRTC8564定周期割り込みタイマーライブラリである。

■ Rtc8564AttachInterruptライブラリ

Download: Rtc8564AttachInterrupt.zip
Library Code:
    Rtc8564AttachInterrupt.h ▼
    Rtc8564AttachInterrupt.cpp ▼

Rtc8564AttachInterrupt.zip をダウンロード & 解凍し、Arduino/libraries/Rtc8564AttachInterrupt として保存する。
追加したメソッドは以下。

メソッド名 処理内容
 beginWithoutIsValid (void)  RTC日付時刻継続確認なしに日付時刻を初期化する。
 initDatetime (uint8_t date_time[])  日付時刻のプロパティをセットする。
 isInitDatetime (void)  日付時刻プロパティがセットされているか確認する。
 syncInterrupt (unsigned int mode, unsigned long term)  定周期割り込みタイマの設定を初期化する。
 isInterrupt (void)  定周期割り込みタイマがセットされているかの確認をする。

次回は、RTC8564についてもうちょっと詳しく書いてみる。



マザー・テレサの言葉






                   思考に気をつけなさい、それはいつか言葉になるから。

                   言葉に気をつけなさい、それはいつか行動になるから。

                   行動に気をつけなさい、それはいつか習慣になるから。

                   習慣に気をつけなさい、それはいつか性格になるから。

                   性格に気をつけなさい、それはいつか運命になるから。


                                                                                〜 マザー・テレサ 〜





読んでいた記事のなかで唐突に出会った言葉。
思わずドキッとしてしまった。

ベンチャービジネス千里眼より。



2011年3月19日土曜日

ちょっと気になる震災復興支援関連プロジェクト




ものづくり系Makerの人達が関われそうなプロジェクトが Make:Japan に掲載されている。
二つのサイトの連携による震災復興支援プロジェクト。

被災地で役立つ情報を日本語化するFab For LifeプロジェクトとOLIVE

OLIVE : 震災被災地での生活を助けるデザインやアイデアを集めるデータベースwiki。
Instructables : DIYものづくりノウハウ共有サイト(英語)。

(1) Instructablesに掲載されている有益なアイディアの翻訳
(2) 世界のFabLabとの連携による新規アイディアの投稿
(3) OLIVEのテキスト情報のビジュアル化




このサイトを通じて募金すると、自分のTwitterアイコンを表示できる。
募金した金額によってアイコンの大きさが異なる。
ユーザーインセンティブと震災復興支援活動をシンプルに結びつけた発想力。

募金にはPaypalアカウントが必要。




物理データ共有サイト Pachube によるガイガーカウンター情報の共有プロジェクト。
Pachube開発チームがセキュアな共有鍵や制限なしのAPIリクエストなどの提供を用意してくれたみたい。
復興支援ではないけれど、気になったのでチェック。
Arduino × Ethernet Shield × ガイガーカウンターで作れそうだけど、分解していじれそうな手頃なガイガーカウンターが見つからない。
ストロベリー・リナックスのUSBガイガーカウンターはまめにチェックしているけど、納品は1ヶ月後とのこと。
APIリクエストを受け付けているということは、アカウント登録すれば自分のサイトにも共有データを表示できるのかも。

XML: http://api.pachube.com/v2/feeds.xml?tag=sensor:type=radiation&lat=35&lon=139&distance=2000
JSON: http://api.pachube.com/v2/feeds.json?tag=sensor:type=radiation&lat=35&lon=139&distance=2000
CSV: http://api.pachube.com/v2/feeds.csv?tag=sensor:type=radiation&lat=35&lon=139&distance=2000

放射能についての最低限の知識


放射線についてあまりに知らなさすぎたので少し調べてみる。

全国の放射能濃度一覧
放射線監視モニタ
武田邦彦 「原発、緊急情報」
Gigazine 「ミリシーベルト」「マイクロシーベルト」とはどんな単位なのか、どのくらいから危険なのか?放射線量計測単位のまとめ
サイエンス・メディア・センター Q&A
風向き情報 気象庁アメダス:東北地方(南部)

日常生活では、1年間にだいたい平均して 2.4mSvの放射線を浴びるそうだ。
これは、1時間に換算するとだいたい 0.27μSv。
1日だと 6.57μSv。
注意しなければならないのは、メディアで耳にする400mSvだとかの数値が
どんな時間の幅のなかで計測されたものなのかということだ。
それは瞬間的なものなのか、1時間のものなのか。
それとも1ヶ月、もしかしたら1年間のものか。
またはレントゲンの放射線量に対しての比較値なのか。
例えばある空間の放射線量が 10μSv/h(1時間に10μSv)であるならば、その場所に1日留まると240μSv 被曝する。
それが1年間では 87.6mSvと、基準を上回まわる。
メディア媒体で放射線量の数値を目にしたときは、その数値がどのような計測をされた値なのか、
少なくとも一度は考えてみなければならない。



政府への静かな批判


Twitterを始めとして様々なメディアで政府の対応と東京電力の危機管理のなさが非難されている。
Ustreamでは実況に対しての非難がリアルタイムで流れている。
彼らは非難されて当然だと思うし、こういう状況では張りつめた鬱憤を彼らに吐き出したくなる。
放射能濃度が危険だからという理由で物資が被災地に届いていないことや、
政府が正確な情報を出さない事に対して無力感を感じている。

しかしいま情報発信をしている人達の多くは、僕を含めて、現時点では、とりあえず直接的な被害を被っている地域に居るわけではないと思う。
被災者の方々よりも体力と気力がある分、冷静な対応をするべきだと思う。

記者は政府と東京電力に対して、どういう質問をしたら最も効率的に具体的な情報を引き出せるのか考え抜いて質問をしなくてはならない。
とりあえずの「安全圏」に居る僕達は、自分のできる範囲で被災地への支援(募金や物資を送る)をして
使わない家電製品のケーブルを抜き、なるべく余計な情報を発信せずに日常生活を遅ればいいと思う。

ある程度のプレッシャーは政府と東京電力に与え続けるべきだけど、
それがただの罵りに終始するのではエネルギーの無駄だ。
それどころか、政府に対する無駄なプレッシャーは被災地や原発への対応を鈍らせてしまうかもしれない。
自分の命の危機を感じるなかで原発の冷却作業にあたっている作業員の心の中に余計なノイズを届けてしまうかもしれない。
バカだの死ねだの言われ続けながら、それでも死ぬ気で頑張れるほど人は強くないと思う。
国の為に動く立場にいる人達が、本当に大事な局面で保身や利益云々を超えて正確な一歩を踏み出すために必要なのは、
心ない非難を受けることではなく、プロとしてのプライドを取り戻せるような周囲の冷静な批判力だ。
余計な情報が、実際に原発の対応にあたっている東京電力や自衛隊の方々の耳に入らない事を祈る。



心に残ったメッセージ。

心に残るつぶやき
村上龍のニューヨーク・タイムズへの寄稿文 「危機的状況の中の希望」




2011年3月12日土曜日

東北地方太平洋沖地震災募金


地震発生時、会社の同僚とともに近くの公園に避難した。
鉄筋コンクリート製であるはずの会社の建物の壁とガラス窓が水面のようにうねっているのを見た時に、
初めて恐怖を感じた。

ある程度揺れがおさまり、会社に戻ってネットで情報を集めてみる。
仙台出身の同僚が家族に電話・Twitter等で連絡を試みていたが、通じる気配がないようだった。
その時はまだあの火の海になった気仙沼や濁流に飲み込まれる若林区の映像は流れていなかった。
そのせいか、まだ彼の顔には若干余裕が感じられた。
会社からは帰宅の許可が出たので約3時間ほどかけて自宅まで帰った。
その頃にはもう次々とアップされていく被災地の映像が流れていた。

僕の会社には非常用ヘルメットは用意されていない。
避難した公園には大勢の人達がいたが、その中でヘルメットをしている人は1割にも満たなかった。
地域の災害訓練にも参加したことがない。
もし震源地が東京だったら自分は生きていられるだろうかと思わずにはいられない。


災害募金先情報が以下のサイトに載っている。
微力ではあるけれど、僕も寄付をした。
災害時には募金詐欺が多発するらしいので、なるべく政府の窓口を利用するのが確実である。

民主党 東北地方太平洋沖地震災害募金の受付を開始

※5/14 政府の犯罪的無策ぶりに頭に来たので、取り消しをする。

他にも以下に災害募金先情報が載っている。

募金情報まとめ
東北地方太平洋沖地震の義援金、募金先の情報まとめ



亡くなられた方々のご冥福をお祈りします。
そして、少しでも多くの被災者の方々が救われますように。