2012/02/17

続、FemtoCube電力管理 (SCP1000とプリスケーラ編)

お散歩デバッグ

引き続き、SCP1000の制御とATmega328p自体の電力を下げる方法を探る。SCP1000はArduinoIDEのSPIライブラリでサンプルスケッチとして載っているので、それを使った。 バグ情報などを参考にして、若干修正している。このソースではDREDYピンをタイミング監視用に使っているようだ。


SCP1000-D01の読み出し

SCP1000は通常でも25μAと省電力だが、垂れ流し状態の連続取得モードではなくトリガ読み出しを行う。使わないときは待機していてもらえると助かるので。
このモードを使うためには,
・オペレーションレジスタ(0x03)に0x0cを書き込む
              or
・TRIGピンにパルス入力を入れる
(from SCP1000データシート 2.2.2 Measurment mode selection)


という2通りがあるようなので、オペレーションレジスタの方を試した。オリジナルがすでにメインループの先頭で高速読み出しモードに設定しているので、設定値を0c に書き換える。あとは一連の処理を関数化しておいた。ちゃんと動いている様子。
他のセンサと読み出しタイミングを揃えなくて良ければ、TRIGピンは省略できそうだ。 (空きIOピンが1本増えた!) 

この状態で電池駆動し、動作テストを試みた。
電車に乗って移動していたときの気圧変化が以下となる。(5秒周期のパワーセーブ)

気圧が下がれば高度は上がる。1000秒あたりで列車が地下に潜って、地下鉄を乗り継いで都心に出たので、いい感じに大深度地下を経由してる気がするような・・・ 

標準大気で「hPa]から高度[m]を出し、出発地の高度補正をかけてみた。
路線は途中から高架を走り、新宿あたりで地下に入って、それからどんどん潜って最後に似たような高度の目的地に出てくる。という感じだろうか。
時刻管理と他のセンサによる地点を推定する情報と自分の活動を示す情報が欲しい。 (歩数計かな・・・)
もともとライフログ用途では作ってなかったから、これはまた別に検討したい。


プリスケーラ

消費電流削減のためにもともと8MHz駆動だが、さらにクロック分周比を変えてみる。ライブラリ化されたものを使ってみた。
クロックを落としている間は、その他ライブラリのタイミング設計が衝突するので、とりあえずセンサ読み込み、結果保存時に8MHzへ戻す。

待機状態 
8MHz 6mA
32分周 2mA

I/Oだけでなく内蔵機能にもアクセス!とりあえず動作してくれたみたい。

話がずれると自作PC(木製筐体)時代は定格派です。ケースのエアフロー性能にこだわってたので。

周辺機能の停止、スリープ

此処から先はCPUをスリープさせたり、内蔵機能を直接叩いて停止させたりすることになりる。こうなるといよいよセンサの使い方をモードごとに定義せねばなるまい・・・。
作り込むとだんだんとArduinoらしさは薄くなって、最終的にそこには一つのマイコン学習の世界があったのでした。 シンプルさと機能性の両立は色々と難しい。

はやく充放電回路完成させないとな・・・


参考

気圧センサー 秋月電子通商
http://akizukidenshi.com/catalog/g/gM-03468/

Using SPI to read a Barometric Pressure Sensor (Arduino.cc)

http://arduino.cc/en/Tutorial/BarometricPressureSensor

SCP1000 気圧センサーで気圧と温度を測定 (下手の横好きのスクラップブック!!)
http://blog.goo.ne.jp/mkidmtr70/e/bedb2067d520dbd9541f1b98cb716676

Arduinoで遊ぼう -動作クロックを切り替えて省電力制御 (なんでも作っちゃう、かも)