AVRマイコンの電源スイッチとスリープモードと

このところ取り組んでいる電子工作には(取り敢えず)一つのゴールがありまして、それは、
  1. AVRマイコンを使って
  2. LEDを点灯させる
  3. 電子オルゴールを奏でる
  4. モーメンタリスイッチで電源ON/OFF(を含めた制御)
  5. 乾電池で駆動
といった5つの項目を同時に実現すること。

へんてこりんな回路図ですが、こんなイメージ。

回路図
あと、電源ラインとグラウンドとの間にバイパスコンデンサを入れた方がいいのかな?

個々の要素は出来上がったんだけど

(1)AVRマイコン(ATtiny85)で、(2)LEDの点灯までは、さすがの私でも難しくはなかった(ココから、ATtiny2313→ATtiny85にして、LEDを点滅から点灯へ変更)。

(3)電子オルゴールに関しては紆余曲折あったけど、申し分ないところまで辿り着けた。

(4)モーメンタリスイッチでの電源ON/OFFにもかなり苦労したけど、これもなんとかクリア。

(5)乾電池で駆動するのに関しては特に問題なし・・・と思っていたら、ここに大きな落とし穴があったんだけど、それに関しては後ほど。

さて、個々の課題はそれぞれ解決しましたが、これを一つに統合しようとしたとき、目の前に大きな壁が立ちはだかります。シンプルに言うと、 “私には” 統合できない。

LEDの点灯プログラムも、モーメンタリスイッチでの電源ON/OFFプログラムも自分で組むことが出来たんだけど、電子オルゴールに関しては、完全に「人の褌で相撲を取る」状態

なので、ATtiny85の中にある電子オルゴールのプログラムに、自分のLED点灯プログラムや電源ON/OFFプログラムを書き加えることが出来ない。

外から見えなくても電力は消費してるんだね

これはこれで頭を悩まさせてくれるのですが、加えてもう一つの問題が。先に触れた電池駆動に関して、「電池の持ち」が悪いってこと。

LEDとかオルゴールとかのアウトプットが無い時は、電力を消費していない(あるいは極端に少ない)と思っていたけど、そんなことはないんですね(当たり前か)。

100均の自転車用ライトとかでも、電源を切っている限り電池の消耗はほとんど感じられないので、そんなもんなんだろうと安易に考えていました。

オルタネイトスイッチで電源ラインを切断してON/OFFするのなら問題ないんだけど、今回はモーメンタリスイッチの入力を常に見張っていなければならないので、マイコンは働いているわけで。

これを解決するには、AVRマイコンのスリープモードを使うべし、と。ATtiny85には3つのスリープモードが用意されていて、その中のパワーダウンモードにすれば最少の電力消費で済むらしい。

ATtiny85のデータシートには、「消費電力」として以下のように記載されています。
  • 300μA (1MHz,1.8V,標準動作)
  • 0.1μA (1.8V,パワーダウン動作)
本当にザックリな言い方だけど、パワーダウンモードにしておけば1/3000の消費電力で済むってことかな? まあ、そこまで言わないにしてももの凄く抑えることが出来そうです。

眠る犬

ところが、このスリープモードを初心者の私にも理解できるように解説してくれるサイトが見つからない。「割り込みを使って復帰」とか、理解している人にとっては初歩の初歩なのでしょうが、私には何をどうしたらいいのか、サンプルプログラムを眺めていてもさっぱり分からない。

救世主現る

もう、色んなキーワードで検索していたら、ついに見つけました。救世主のごとき、まさに私が実現したいと思っていたことを目の前に提示してくれるサイトです。

ふえるとさんのHPで、「AVRで電源スイッチを省きたい」という記事です。

「電源スイッチをはぶく」とは、私の意図するところのモーメンタリスイッチでAVRをON/OFFするってのと同じこと。更に、このプログラムにはスリープモードを組み込んであるんです。

いや、もう、見つけたときは小躍りしましたね。

ふえるとさんが使っているのは、ATiny13Aという8pinのAVRマイコン。私の手元にあるのは同じく8pinAVRのATtiny85。

微妙に系列は違うようだけど、プログラムの中身を少しいじればATtiny85でも動くかも?って。

ピン配置はほぼ同じ(外部割込みに使う INT0 の位置が違うくらいかな)。

ふえるとさんのプログラムも2度の修正が加えられているので、完成形にあたる「その3」に少し手を加えて、ATtiny85に書き込んでみることにしました。

と言っても、大したことはしておらず(そもそも出来ないし)、ATtiny13AではPB2に割り振られている INT0 が、ATtiny85ではPB1にあるので、それぞれに接続されているSWとLEDを入れ替え、プログラム冒頭の define の中身も、それに合わせて変更。

#define DDRB_INIT 0b111101  →0b111011
#define PORTB_INIT 0b000010 →0b000100
#define LED_INIT 0b000100 →0b000010

プログラム中のSWの状態を読み込む部分も、PB1→PB2に変更。

これをAVR Studioに書き込み、Buildしてみると、こんなエラーが表示されました。

You're not using the correct register names for the T85. For example there is no TIMSK0, just TIMSK. 

どうやら、TIMSK(タイマー割り込み許可?)ってのが、ATtiny13AにはTIMSK0、TIMSK1と2つあるんだけど、ATtiny85にはTIMSKの一つしかないってことらしい。

ってことで、TIMSK0をTIMSKに変更して、再びBuild。今度はパスしました。が、・・・・・

続きは次回

関連記事
コメント:












管理者にだけ表示を許可する
トラックバック:
トラックバック URL:

http://55life555.blog.fc2.com/tb.php/1302-6030a197

<< topページへこのページの先頭へ >>