ATtiny13Aの省電力化を試みる
前回の「ATtiny13Aをシステムクロック16kHzで利用する」でシステムクロックを落とすことで
省電力化を図りました。
更に省電力化する方法はないかと調べると次の対策があることが分かりました。
これにより消費電流が100μAほど抑えられるようです。
2)必要に応じてsleepさせる
停止させる。
set_sleep_mode(SLEEP_MODE_IDLE)
sleep_mode()
SLEEP_MODE_IDLEを指定したときはタイマーは可動しておりタイマー割り込みの
利用が可能です。このタイマー割り込みを使って定期的にCPUを起こして処理し
また寝るようにします。
実際に前回のソースを修正して試して見ました。
// アナログジョイスティック デジタル出力変換 for Lame Station // // ATMEL ATTINY13 / ARDUINO // // +-\/-+ // ADC0 (D 5) PB5 1| |8 Vcc // ADC3 (D 3) PB3 2| |7 PB2 (D 2) ADC1 // ADC2 (D 4) PB4 3| |6 PB1 (D 1) PWM1 // GND 4| |5 PB0 (D 0) PWM0 // +----+ #include <avr/sleep.h> // ピンの割り付け #define J_UP PB1 // UP 出力 #define J_DOWN PB0 // DOWN 出力 #define J_RIGHT PB5 // RIGHT 出力 #define J_LEFT PB2 // LEFT 出力 // アナログ入力ピンの割り付け(要ピン番号で指定) #define IN1 2 // ジョイスティック UP/DOWN #define IN2 3 // ジョイスティック LEFT/RIGHT void setup() { ACSR |= _BV(ACD); pinMode(J_UP,OUTPUT); pinMode(J_DOWN,OUTPUT); pinMode(J_RIGHT,OUTPUT); pinMode(J_LEFT,OUTPUT); set_sleep_mode(SLEEP_MODE_IDLE); // アイドルモードに設定 } void readjoystic() { int v1,v2; int s1 = analogRead(IN1); int s2 = analogRead(IN2); if (s1 < 50) { digitalWrite(J_DOWN, LOW); digitalWrite(J_UP, HIGH); } else if (s1 > 973) { digitalWrite(J_UP, LOW); digitalWrite(J_DOWN, HIGH); } else { digitalWrite(J_UP, LOW); digitalWrite(J_DOWN, LOW); } if (s2 < 50) { digitalWrite(J_RIGHT, LOW); digitalWrite(J_LEFT, HIGH); } else if (s2 > 973) { digitalWrite(J_LEFT, LOW); digitalWrite(J_RIGHT, HIGH); } else { digitalWrite(J_RIGHT, LOW); digitalWrite(J_LEFT, LOW); } } void loop() { readjoystic(); sleep_mode(); }
アナログコンパレータの利用停止はsetup()内のACSR |= _BV(ACD) で設定しています。
次にスリープですが、私が利用しているsmeezekittyさん公開の「Arduino core for Attiny13」
は内部的にdelay用にタイマー割り込みを使っており、256サイクルに1回割り込みが
発生するようになっています。
システムクロックが16kHzなので割り込みは62.5Hz(1秒にだいたい60回)です。
この間隔でのジョイスティックの読み込みでも実用的だと思い、ソースには単純に
setup()でset_sleep_mode(SLEEP_MODE_IDLE)、loop()でsleep_mode()を入れるだけ
としました。
(だだし、 readjoystic()の処理が1/62.5秒以上かかる場合は意味なしですが)
実際に動かして電流を測定してみると、前回の1.27mAから0.13mAほど減りました。
アナログジョイスティックが0.70mAほど流れるのでATtiny13A単体では0.44mAです。
ただし、スリープと稼働の繰り返しで電流変動が変動するため、私の安いテスター
では正確には測れていないと思います。
まあ、効果はあるようなのでこの修正でいってみます。
« Raspbian Jessie のGPIOまわりの利用権限 | トップページ | aitendo I2CマトリックスキットをArduino動かしてみました »
「ATtiny13A」カテゴリの記事
- ATtiny13AでI2C接続キャラクタLCDを利用する(4)(2018.04.16)
- ATtiny13Aで赤外線リモコン受信センサーを使う(2)(2018.04.15)
- ATtiny13AでHC-SR04を使った距離計測(2018.04.14)
- Arduino 1.8.5環境でATtiny13Aを利用する(2018.04.14)
- Arduino IDEを使ったATtiny13用スケッチの開発について(2016.08.30)
« Raspbian Jessie のGPIOまわりの利用権限 | トップページ | aitendo I2CマトリックスキットをArduino動かしてみました »

コメント