消費電力は、電源を切らずに長時間継続して動作するデバイスにとって重要な問題です。したがって、この問題を克服するために、ほとんどすべてのコントローラーにはスリープモードが付属しており、開発者は最適な電力消費のために電子ガジェットを設計するのに役立ちます。スリープモードでは、未使用のモジュールをオフにすることで、デバイスを省電力モードにします。
先ほど、省電力のためのESP8266のディープスリープモードについて説明しました。今日は、Arduinoのスリープモードについて学び、電流計を使用して消費電力を示します。Arduinoスリープモードは、Arduino省電力モードまたはArduinoスタンバイモードとも呼ばれます。
Arduinoスリープモード
スリープモードを使用すると、ユーザーはマイクロコントローラー内の未使用のモジュールを停止またはオフにすることができ、消費電力を大幅に削減できます。Arduino UNO、Arduino Nano、およびPro-miniにはATmega328Pが付属しており、スリープモード時の供給電圧を監視するブラウンアウト検出器(BOD)を備えています。
ATmega328Pには6つのスリープモードがあります。
スリープモードに入るには、スリープモード制御レジスタ(SMCR.SE)のスリープビットを有効にする必要があります。次に、スリープモード選択ビットは、アイドル、ADCノイズリダクション、パワーダウン、パワーセーブ、スタンバイ、および外部スタンバイからスリープモードを選択します。
内部または外部のArduino割り込みまたはリセットにより、Arduinoをスリープモードからウェイクアップできます。
起動維持モード
アイドルスリープモードに入るには、コントローラ「000」のSMビットを書き込みます。このモードはCPUを停止しますが、SPI、2線式シリアルインターフェース、USART、ウォッチドッグ、カウンター、アナログコンパレーターの動作を許可します。アイドルモードは、基本的にはCLKを停止し、CPUおよびCLK FLASHを。Arduinoは、外部または内部割り込みを使用していつでもウェイクアップできます。
アイドルスリープモードのArduinoコード:
LowPower.idle(SLEEP_8S、ADC_OFF、TIMER2_OFF、TIMER1_OFF、TIMER0_OFF、SPI_OFF、USART0_OFF、TWI_OFF);
arduinoにはさまざまな低電力モードを設定するためのライブラリがあります。したがって、最初に指定されたリンクからライブラリをダウンロードしてインストールし、上記のコードを使用してArduinoをアイドルスリープモードにします。上記のコードを使用すると、Arduinoは8秒間スリープ状態になり、自動的にウェイクアップします。コードでわかるように、アイドルモードでは、すべてのタイマー、SPI、USART、およびTWI(2線式インターフェイス)がオフになります。
ADCノイズリダクションモード
このスリープモードを使用するには、SMビットを「001」に書き込みます。このモードはCPUを停止しますが、ADC、外部割り込み、USART、2線式シリアルインターフェース、ウォッチドッグ、およびカウンターの動作を許可します。ADC雑音低減動作は、基本的には、CLK停止CPU、CLK I / OおよびCLK FLASHを。次の方法で、 ADCノイズリダクション モードからコントローラーをウェイクアップできます。
- 外部リセット
- ウォッチドッグシステムのリセット
- ウォッチドッグ割り込み
- ブラウンアウトリセット
- 2線式シリアルインターフェースアドレスの一致
- INTの外部レベル割り込み
- ピンチェンジ割り込み
- タイマー/カウンター割り込み
- SPM / EEPROMレディ割り込み
パワーダウンモード
パワーダウンモードは、生成されたすべてのクロックを停止し、非同期モジュールの操作のみを許可します。SMビットを「010」に書き込むことで有効にできます。このモードでは、外部発振器はオフになりますが、2線式シリアルインターフェース、ウォッチドッグ、および外部割り込みは引き続き動作します。以下のいずれかの方法で無効にできます。
- 外部リセット
- ウォッチドッグシステムのリセット
- ウォッチドッグ割り込み
- ブラウンアウトリセット
- 2線式シリアルインターフェースアドレスの一致
- INTの外部レベル割り込み
- ピンチェンジ割り込み
パワーダウン定期モードのArduinoコード:
LowPower.powerDown(SLEEP_8S、ADC_OFF、BOD_OFF);
このコードは、パワーダウンモードをオンにするために使用されます。上記のコードを使用すると、Arduinoは8秒間スリープ状態になり、自動的にウェイクアップします。
割り込み付きのパワーダウンモードを使用することもできます。このモードでは、Arduinoはスリープ状態になりますが、外部または内部割り込みが提供された場合にのみウェイクアップします。
パワーダウン割り込みモードのArduinoコード:
void loop() { //ウェイクアップピンがローで割り込みをトリガーできるようにします。 attachInterrupt(0、wakeUp、LOW); LowPower.powerDown(SLEEP_FOREVER、ADC_OFF、BOD_OFF); //ウェイクアップピンで外部ピン割り込みを無効にします。 detachInterrupt(0); //ここで何かをします }
省電力モード
省電力モードに入るには、SMピンを「011」に書き込む必要があります。このスリープモードはパワーダウンモードに似ていますが、1つの例外があります。つまり、タイマー/カウンターが有効になっている場合、スリープ時でも実行状態のままになります。タイマーオーバーフローを使用して、デバイスをウェイクアップできます。
タイム/カウンターを使用しない場合は、省電力モードではなく、パワーダウンモードを使用することをお勧めします。
スタンバイモード
スタンバイモードはパワーダウンモードと同じですが、両者の違いは外部発振器がこのモードで動作し続けることだけです。このモードを有効にするには、SMピンを「110」に書き込みます。
拡張スタンバイモード
このモードは、発振器が動作し続けることを除いて、省電力モードと似ています。SMピンを「111」に書き込むと、デバイスは拡張スタンバイモードになります。デバイスは、拡張スタンバイモードからウェイクアップするのに6クロックサイクルかかります。
以下は、回路図に従って回路を接続した後の、このプロジェクトの要件です。Arduino IDEを使用して、スリープモードコードをArduinoにアップロードします。Arduinoはアイドルスリープモードに入ります。次に、USB電流計への消費電流を確認します。それ以外の場合は、同じためにクランプメーターを使用することもできます。
必要なコンポーネント
- Arduino UNO
- DHT11温度および湿度センサー
- USB電流計
- ブレッドボード
- 接続線
ArduinoでDHT11を使用する方法の詳細については、リンクをたどってください。ここでは、USB電流計を使用して、スリープモードでArduinoが消費する電圧を測定しています。
USB電流計
USB電流計は、任意のUSBポートからの電圧と電流を測定するために使用されるプラグアンドプレイデバイスです。ドングルは、USB電源(コンピューターのUSBポート)とUSBデバイス(Arduino)の間に接続します。このデバイスには、消費電流の値を測定するための電源ピンとインラインの0.05オームの抵抗があります。このデバイスには、接続されたデバイスが消費する電流と電圧の値を即座に表示する4つの7セグメントディスプレイが付属しています。これらの値は、3秒ごとに反転します。
仕様:
- 動作電圧範囲:3.5V〜7V
- 最大定格電流:3A
- コンパクトサイズ、持ち運びに便利
- 外部供給は必要ありません
応用:
- USBデバイスのテスト
- 負荷レベルの確認
- バッテリー充電器のデバッグ
- 工場、電子製品および個人使用
回路図
Arduinoディープスリープモードを示す上記のセットアップでは、ArduinoはUSB電流計に接続されています。次に、USB電流計をラップトップのUSBポートに接続します。DHT11センサーのデータピンはArduinoのD2ピンに接続されています。
コードの説明
ビデオ付きのプロジェクトの完全なコードは最後にあります。
コードは、DHT11センサーのライブラリと LowPower ライブラリを 含めることから始まり ます。低電力ライブラリをダウンロードするには、リンクをたどってください。次に、DHT11のデータピンが接続されているArduinoピン番号を定義し、DHTオブジェクトを作成しました。
#include
では 、ボイドセットアップ 機能、我々が使用してシリアル通信を開始した serial.begin(9600)、 ここでは9600ボーレートです。スリープモードのインジケーターとしてArduinoの内蔵LEDを使用しています。そのため、ピンを出力として設定し、デジタル書き込みをローに設定しました。
void setup(){ Serial.begin(9600); pinMode(LED_BUILTIN、OUTPUT); digitalWrite(LED_BUILTIN、LOW); }
では 、ボイドループ 機能、我々はLED HIGHを内蔵し、センサーから温度と湿度のデータを読んで作っています。ここでは、 DHT.read11(); コマンドはセンサーからデータを読み取っています。データが計算されたら、それを任意の変数に保存して値を確認できます。ここでは、2つのfloat型変数 「t」 と 「h」を使用しました 。したがって、温度と湿度のデータはシリアルモニターにシリアルに印刷されます。
void loop(){ Serial.println( "Get Data From DHT11"); delay(1000); digitalWrite(LED_BUILTIN、HIGH); int readData = DHT.read11(dataPin); // DHT11 float t = DHT.temperature; float h = DHT.humidity; Serial.print( "Temperature ="); Serial.print(t); Serial.print( "C-"); Serial.print( "湿度="); Serial.print(h); Serial.println( "%"); delay(2000);
スリープモードを有効にする前に、 「Arduino:-私は昼寝をします」 と印刷し、内蔵LEDをLowにします。その後、コードで以下に説明するコマンドを使用して、Arduinoスリープモードを有効にします。
以下のコードは、Arduinoの アイドル定期スリープモード を有効にし、8秒のスリープを提供します。ADC、タイマー、SPI、USART、2線式インターフェースをオフ状態にします。
次に、8秒後に自動的にArduinoをスリープから復帰させ、 「Arduino:-Hey I justWakeup」と出力します。
Serial.println( "Arduino:-私は昼寝をします"); delay(1000); digitalWrite(LED_BUILTIN、LOW); LowPower.idle(SLEEP_8S、ADC_OFF、TIMER2_OFF、TIMER1_OFF、TIMER0_OFF、 SPI_OFF、USART0_OFF、TWI_OFF); Serial.println( "Arduino:-ちょっと目が覚めた"); Serial.println( ""); delay(2000); }
したがって、このコードを使用すると、Arduinoは1分間に24秒間だけウェイクアップし、残りの36秒間はスリープモードのままになります。これにより、Arduino気象台が消費する電力が大幅に削減されます。
したがって、スリープモードでArduinoを使用すると、デバイスのランタイムを約2倍にすることができます。