atmega328をバッテリーで1年間動作させるにはどうすればよいですか?


51

シナリオ

私は寮の部屋に素敵な電子ドアロックを作成しました。現在は、ドアをロックする[un]サーボを備えたArduino Diecimilaです。3x4ボタンと5つのLED(2つのセリエペアと1つのLED)を備えた数字キーパッドがあります。現在、携帯電話の充電器でも動作します。

スタンドアローンのArduino(ATmega328)で動作するように再設計しましたが、単三電池または9V電池でも動作させたいと思っています。

ソフトウェアの部分についてはsleep、ATmegaの電力消費を可能な限り低く抑えるために、ループメソッド内で一定の時間呼び出しを行うことができると考えました。そして、可能な限り長い時間をオフにして、LEDを「点滅」させます。

質問1

ボードがスリープする数ミリ秒の間にボタンが押されると、スリープから抜け出すまで「記憶」/「保持」され、ボタンが押されるとピックアップされますか?

スリープ時にこのボタンを押すのに最適な方法は何ですか?ボタンのアクティビティで起動するようにコーディングできますか、それともたとえば10秒間スリープさせる必要があります。すべてのループで?

質問2

このデバイスを10か月間使用するために必要な単三電池の数を計算する数学にどのようにアプローチしますか?

また、1分あたりの平均電力使用量を測定する方法がわかりません。これは、交互にすばやく変化するためです。

デバイス

私のドアロック装置

回答:


35

Atmega328は6つの省電力モードを提供し、最小から優れた順に並べられています(このフォーラム投稿からの推定消費電流)。

  • SLEEP_MODE_IDLE:15 mA
  • SLEEP_MODE_ADC:6.5 mA
  • SLEEP_MODE_PWR_SAVE:1.62 mA
  • SLEEP_MODE_EXT_STANDBY:1.62 mA
  • SLEEP_MODE_STANDBY:0.84 mA
  • SLEEP_MODE_PWR_DOWN:0.36 mA

元の質問を引用する:

sleepループメソッド内で特定の時間呼び出しを行うことができると考えた

sleep_cpu()上記のリストから、必要なスリープモードを設定した後に使用する必要があります。Arduino Playgroundには、これに関する有用な投稿があります

アプリケーションは、割り込み駆動型で、上記のスリープモードを広範囲に使用し、ボタンプッシュ、タイマーオーバーフロー、ウォッチドッグタイマーイベントでプロセッサを起動して、タスクを実際に実行する必要があります。

次の手順を実行すると、さらに電力を節約できます。

  • マイクロコントローラの内部発振器と低クロックレート(16ではなく8MHz)を使用しますが、時間とタイミングに関連するコードが期待どおりに機能することを確認します。これには、異なるバージョンのブートローダーが必要になる場合があります。
  • アプリケーションでLEDを使用する場合は、LEDを長時間オンにしないでください。短い間隔(0.05秒オン、0.5秒オフ)の高速ダブルまたはトリプルフラッシュを使用し、その間に数秒のギャップを設けて、最小限の電力消費で顕著な表示を保証します。
  • レギュレータが必要な場合は、リニアレギュレータの代わりにスイッチングレギュレータを使用してください。
  • サポートされている場合は、3.0ボルト(例:CR2032リチウム電池、レギュレータは不要)または5ボルトではなく3.3ボルトで、マイクロコントローラーを低電圧で実行します。
  • 消費電力を最小限に抑えるために、未使用の入力および出力ピン設定については、データシートの推奨事項に従ってください。

これらの提案を組み込むことで、単一のCR2032コインセルで数週間または数か月、LR123タイプリチウムセルで何年もマイクロコントローラアプリケーションを実行できます。もちろん、走行距離は、アプリケーションに必要なセンサー、出力、および実際の処理によって異なります。

便利なリファレンス:


私の経験では、SLEEP_MODE_PWR_DOWNで、すべての小さなものをオフにすることに精通している場合(ブラウンアウト検出など)、0.1uAから6.0uAまで下げることができます。アルカリ単3電池で3〜5年持続する60uA未満のビルドを作成しました。
ティムエッケル

@TimEckel私はLEDでステータスを表示することに夢中です-それはスタイルが狂っているように電力予算を消費します。
アニンドゴーシュ

3
する必要はありません。高抵抗の高出力LEDを使用してください。20 mA以上の代わりに、ごく一部のmAを使用します。また、常時点灯するのではなく、数秒ごとに5〜15ミリ秒間、ステータスLEDを点滅させます。30 mAを使用する安価な調光ステータスLEDがありましたが、8秒ごとに15ミリ秒間点滅する3.3 kオームの抵抗を備えた高出力LEDに変更しました。30 mAから2.9 uAの平均電流、電力の1/1000になりました!
ティム・Eckel氏

4
@TimEckelまばたきライトに対する私の情熱の程度を明確に理解していません:-D強度を下げたいとは思わない、私はこれらのささいなものがHadesの炎のようにきらめくのが好きで、パワーバジェットはけっこうです!もっと深刻な注意:私はそれらの小さなトリックを知っています、そして実際、LEDを通して電力を減らしながら視覚的なアラームの影響を増加させる私自身のいくつかを作りました。その前のコメントは(部分的にのみ)冗談で、ここで私が答える多くの楽しいLEDの質問と一緒に行きます。
アニンドゴーシュ

3
私は、異なる電圧と周波数でATMega328Pの消費電力を測定し、このチャート作らdocs.google.com/spreadsheets/d/...
Cano64

19

現在、2本のAAバッテリーで動作しているArduino Pro Miniをデスクに置いており、必要に応じて1年以上使用できます。

これを達成した設計には3つの側面があります。

1.別のレギュレーター

LTC3525ブーストレギュレータを使用しています。非常に低い静止電流(7uA)と高効率(> 90%@ 0.2mA)を備えています。このsparkfunボードのようなものhttps://www.sparkfun.com/products/8999も同様の仕事をするはずです。Arduinoレギュレータが使用されないように、必ずVINではなくArduinoの5Vピンに接続してください。

2. Sleeeeeeep

デバイスがアクティブな時間の割合は小さくなります。残りの時間、デバイスはSLEEP_MODE_POWER_DOWNでスリープ状態になります。Rocketscreem Low Power Libraryから睡眠ルーチンを作成できます。そのリンクによると、ADC、BOD、およびWDTをオフにしてパワーダウンモードで1.7uAまで下げることができるはずです。

3.割り込み

スリープの残りの半分は、スリープを解除する割り込みです。パワーダウンスリープモードでは、INT1およびINT2のレベル割り込みのみがTWIに一致し、WDTがウェイクアップします。そのため、ボタンを押すと起動するように、ボタンをINT1またはINT2に接続する必要があります。

他のもの:

どうしても必要な場合を除き、すべてのLEDをオフにします。ロックが屋内にある場合、LEDは明るくする必要がなく、電力を節約できます。また、MCUに定期的に何らかのタスクを実行させる必要がある場合は、ウォッチドッグタイマーを使用して定期的に起動します。

編集:

動作する可能性のある1つの方法は、上記の低電力ライブラリを使用し、ウォッチドッグタイマーのおかげでループごとに約60msスリープすることです。起動時にボタンが押されているかどうかを確認します。呼び出す関数は

LowPower.powerDown(SLEEP_60MS, ADC_CONTROL_OFF, BOD_OFF);

14

これらのコメントはすべてスポットライトです。さらにいくつかの提案を追加したいと思います。

1)LEDには、高出力20 mA LEDを使用します。これがロジックです。8秒ごとに点滅する薄暗いステータスLEDが必要だとしましょう。明るくしたくないので、ランダムLEDを使用します。問題は、薄暗いLEDが20 mA(またはそれ以上)を使用して100 mcdしか出力しないことです。代わりに、定格20 mAであるが4000 mcdを出力できる高出力LEDを入手します(出力角度を確認し、おそらく30度以上にしたいでしょう)。この4000 mcd LEDを使用して、3.3 kオームの抵抗器のようなものと接続すると、約100 mcdの光出力が得られますが、使用する電流は1 mA未満です。したがって、ステータスLEDに20 mAを使用する代わりに、ごく一部のmAを使用しています。また、通常、ステータスLEDフラッシュのオン時間を5〜15ミリ秒のみに設定します。これにより、以前にフラッシュ時間を100ミリ秒にしていた場合、電力を大幅に節約できます。

2)私が選んだ電圧レギュレータはMicrochip MCP1700です。静止電流はわずか1.6 µAで、非常に安価です(少量で約0.30ドル)。唯一の制限は、最大入力電圧がわずか6ボルトであるため、9ボルトのバッテリーを使用できないことです。しかし、単三電池4個、LiPo単セル、またはコイン型リチウム電池2個には最適です。

3)4本の単三電池でATmega回路に電力を供給するために、私は通常、VCCの1N4001ダイオードを使用して、4個の電池の最大6ボルトを5.5ボルトに落とします。また、ダイオードは逆電圧からATmegaを保護するため、2つの有用な目的を果たします。これを行うと、常に電流を消費する電圧レギュレータがないため、スリープ中にわずか0.1 µAを使用できるバッテリ駆動回路を作成できます。


8

RocketScream LowPowerライブラリを使用して、ブレッドボード上の裸のatmega328P-PUでテストを行いました

このスケッチを使用しました:

#include "LowPower.h"

void setup(){}

void loop()
{
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);         
    delay(5000);
}

uCurrentゴールドときパワーダウンモードI測定7.25マイクロアンペア。


1
いいね!できるだけ早くこれを試してみます。これにより、CR2032バッテリーでatmega238を何年も使用できますか?
バスジ

6

ここには2つの質問がありますが、2番目の質問のみが実際に質問のタイトルの一部であるため、Arduinoプログラミングの質問に対して別の質問を開いた方がよいでしょう。ここで2番目の質問に答えます。

単一のトップエンドアルカリ1.5V単三電池の容量は約2600mAhです。リチウム電池に行く場合、運がよければ約3400mAhを得ることができます。絶対的なベストケースのベースラインとして、その数値を使用してみましょう。

負荷の理論上の最大実行時間を計算する方法は、単純に容量を負荷で割ったものです。負荷が1mAの場合、3400/1 = 3400時間= 141日= 5か月間実行できます。ただし、これは理論上の最大値にすぎません。その時間に約65%の電圧降下が発生し始めるためです。出力を調整している場合、バッテリー電圧が低いほど、調整電圧を維持するために必要な電流が大きくなり、バッテリーの消耗が早くなる暴走効果が得られます。デバイスを実行するのに十分な高電圧で、宣伝されている容量の80%を超える容量を引き出すことができれば、私は驚くでしょう。

したがって、電圧の低下とレギュレータの非効率性の後、その時間の80%を取得したとしましょう。直列に接続された3つのバッテリーから3.3Vで動作していると仮定します。これでも同じ容量が得られますが、レギュレーターには電圧で十分です。デバイスが15mAで動作する場合(かなり控えめな見積もりです)、数値は次のようになります。

  • 80%効率後の容量= 3400 * 0.8 = 2720mAh
  • 時間= 2720/15 = 181時間= 7.54日

そのため、1年間使用するには約144個のリチウム電池(3セット48セット)が必要です。あまりよくない!

代わりに、主電源からの安定化DC電源を使用することをお勧めします。バッテリーバックアップを含めることができます。これはSPDTリレーで簡単にセットアップできます。コイルを主DCに接続し、「オフ」接点をバッテリーに接続するだけです。DCに障害が発生すると、接点が落ち、代わりにバッテリーが使用されます。


私のコードレスの夢はつぶれます;)詳細な答えをありがとう。これも私にとって最良の選択肢のように思えました。
ルーホプリー

偶然にも、これは電子ドアロックを設計するときに私が提起したものと同じ質問でした。分厚い10,000mAhの充電式バッテリーでさえ、それは価値がありませんでした。250mA DCアダプターと古い携帯電話のバッテリーをバックアップとして使用するだけで終わりました。
多項式

4
15 mAの平均は私にとってあまり保守的ではありません!328は、スリープモードで1桁のマイクロアンペアで実行できます。そして、少なくともセミディープスリープで多くの時間を過ごすことができます。また、低周波数(0.5 MHzなど)では、アクティブモードで<1 mAで対応できます。もちろん、他のコンポーネント(電圧レギュレータなど)は、低電力の性質に合わせて選択する必要があります。
12

4
@Polynomial私は回路図を詳しく見ませんでしたが、確かにプロジェクトは「パワーLED」なしでビルドできました。それとも、それだけ言うために、(PWM経由で)半分の明るさで例えば上で25ミリ秒、2秒ごとに、だそうということ、それを点滅させることができ、現在の使用は〜0.09ミリアンペアの代わりに、15の平均に低下なるよう
exscape

1
Arduinoは電力に飢えています。独自のボードを構築すると、これを解決できます。Atmega328は、32kHのとき0.2 mA、省電力モードで0.75 uAを消費します。
ヴォラック

4

まだ誰も言及していないこと:使用していないときは、サーボに電力を供給する+ 5V電源をオフにする何らかの方法が必要です。動いていないときでも、サーボは電力を消費します。

ArduinoからのI / Oピンによって制御されるゲートを持つFETは、それを行う良い方法です。


私は通常、各センサーまたはそれをオン/オフにするものに2N3904を使用します。または、センサーの電力が低く、ATmegaを実行しているのと同じ電圧の場合、ピンを直接使用して電力状態を制御します。
ティム・Eckel氏

1
2n3904よりも大幅に少ない電力を使用するには2n7000を使用し、ベース抵抗は必要ありません。
ジョンミーチャム14

3

次の設計では、特に低電力消費向けに最適化されたマイクロコントローラーの使用を検討してください。低消費電力を実現するには、スリープ中に非常に低い電力を消費する必要があります。よく見落とされているのは、この睡眠からどれだけ早く目覚めることができるかも重要だということです。

カウントされるのは、最も深いスリープから可能な限り高速の割り込みを処理し(パワーバーストが非常に短くなるため)、再びスリープに戻るためにどれだけの電荷がかかるかです。

そのようなマイクロコントローラの一例は、テキサスインスツルメンツのMSP430です。彼らのウェブサイトには、エネルギーおよびエネルギーハーベスティングアプリケーションを節約する方法に関するアプリケーションノートがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.