google-site-verification: google3bd66dd162ef54c7.html

Arduinoでdelay関数を実行時の消費電流を減らす

 とりあえずやりたいことが無くなってしまったので、手なぐさみにArduinoで遊んでいます。今回のテーマはArduinoでdelay関数を実行する時の消費電流を減らす方法です。

 ArduinoをUNOの状態で動かす場合、USBからの電力を使うので消費電流はあまり気にならないです。しかし、CPUチップを外して、CPUの単独動作を行う場合は出来るだけ消費電流を減らしたいところです。

 消費電流を減らすにはクロックと電圧を下げるのが王道です。でもプログラムのタイミングなどの問題が出てくるし、そもそもArduino UNOでそういう状態は簡単には作れないのでデバッグが厄介になります。

 ということでプログラムで簡単に出来る対策として、delayを実行する時にCPUをスリープ状態に入れることで消費電流を減らしてみました。

▼CPUの消費電流測定用ゲタを使う
Arduino CPU電源電流測定ゲタ  以前作った物ですが、これを使ってCPUの電源電流を測定します。

 delaySleep()という関数を作ってdelayのルーチンの中でCPUをスリープさせてしまうことにします。 プログラムは以下の通りです。

 おなじみのLチカのdelay関数を、自作したdelaySleep関数に変更して実行しています。(UNOなのでLEDはオペアンプでドライブされており、CPUの消費電流への影響は(ほとんど)ありません。)

 この、プログラムのアイディアは、Arduino forumの Delay with IDLE sleep mode, please checkから頂きました。関数名もこの記事のままです。実はdelaySleepという関数名は先に決めていて、検索していたらこの記事を発見しました。

/*
DelaySleep関数のテスト
 2014/07/06 ラジオペンチ
 http://radiopench.blog96.fc2.com/
 */

#include <avr/sleep.h>

int led = 13;                          // LEDピン
boolean flag = false;                  // LED on/off フラグ

void setup() {                
  pinMode(led, OUTPUT);     
}

void loop() {
  digitalWrite(led, flag);              // flagで LEDを点滅
  delaySleep(500);                      // delaySleep関数呼び出し
  flag = ! flag;                        // flagを反転
}

void delaySleep(unsigned long t) {
  //
  // 注意:millis関数を使っているので50日以上の連続動作は出来ない。
  //
  unsigned long t0;
  if( t <= 16 ) {                       // 16ms以下なら普通のdelayで処理
    delay(t);
  }
  else{                                 // 17ms以上ならスリープ入れたdelayで実行
    t0 = millis();                      // 開始時のmillisの値を記録しておき
    set_sleep_mode (SLEEP_MODE_IDLE);   // アイドルのモード指定
    while( millis() - t0 < t ) {        // 設定値になるまでループ
      sleep_mode();                     // スリープに入れる(自動復帰するので何度も指定)
    }
  }
}
 上のスケッチのダウンロードはこちら

 delay関数を普通に使った場合の消費電流は16mA、上のdelaySleep関数を使った場合の消費電流は9mA。つまり43%の消費電流低減効果ということになりました。
 もっと減っても良さそうなもんですが、SLEEP_MODE_IDLEに入れても、すぐにタイマー割り込みがかかってスリープが解除されてしまうので、消費電流が大幅に減るというわけにはいかないようです。

 でも電池駆動の回路なら43%の電流低減は嬉しいと思います。

 それで、この話には続きがあります。もっと強力なスリープモードに入れれば消費電流を大幅に減らすことが出来ます。実は、100円ショップの時計で作るアナログ気圧計の時に使ったテクニックなのですが、その部分を使い易い関数の形にまとめて、次回の記事で紹介したいと思います。

 記事にできるようなプログラムをうまく書けるかが問題ですが、お楽しみに。

【追記】
 できました。消費電流が激減! delayWDT関数を作ってみた。
関連記事

コメントの投稿

管理者にだけ表示を許可する

カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード