割込み処理
回路図
pin2(割込み0)を使います。プルアップしておいてGNDに接続すると割込みになるように設定します。
配線
割込みのプログラムは単独でも有用ですが,次のテーマであるスリープを使うために必要なものです。
pin2を10KΩでプルアップしてスイッチでGNDに結線します。割込み0を作ります。写真のようにジャンパ線で配線するとすぐできます。スイッチは付けずにジャンパ線の接触で替えています。
10KΩの抵抗を付けたジャンパ線を作っておくと便利です。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void setup() {//初期設定
pinMode(LED_BUILTIN, OUTPUT);//内臓LED出力
Serial.begin(9600);
attachInterrupt(0,interrupt,RISING);//割込み設定
}
void loop() {//繰り返し
digitalWrite(LED_BUILTIN, HIGH);//内臓LED点灯
delay(1000);//1000ms待機
digitalWrite(LED_BUILTIN, LOW);//内臓LED消灯
delay(1000);//1000ms待機
Serial.println("normal");
}
//関数・補助
void interrupt(){
Serial.println("interrupt");
}
interrupt02
Lチカのプログラムに3,4行目と11行目そして14,15,16行目を付け足したものです。
3行目はシリアル通信を使って割込みを確かめるためのものです。Lチカをしていて通常であれば11行目で"normal"とパソコンに知らせます。割込みが発生すると15行目で"interrupt"と知らせます。
4行目が割込みを指示しています。
割込みのためにはattachInterrupt()の命令を使います。アタッチインタラプトと読みますが,attachはもともとフランス語なのでアタッシュケースと同じスペルです。そばに置くとか添えるという意味になります。直訳すると「割込みを添える」となります。( )内の引数(受け渡すもの)は(①,②,③,)です。
①割込みの種類0(pin2),1(pin3)で表現します。
②割込みで行う補助プログラム名です。予約語(命令や関数・定数等)以外であれば自由に命名できます。ループの下の「関数・補助」の部分にプログラムを書きます。14,15行目です。
③いつ割込むかを指定します。
LOW pinがLOWのとき
CHANGE pinの状態が変化したとき
RISING pinの状態がLOWからHIGH
FALLING pinの状態がHIGHからLOW
割込みのタイミング
補助
14,15,16行目は割込みが起きた時,実行するプログラムです。
14行目で名前を示しています。引数は無です。
15行目で割込みが起こったことをパソコンに知らせています。
16行目はプログラムの終了です。
INPUT_PULLUPの使い方
interrupt04
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void setup() {//初期設定
pinMode(LED_BUILTIN, OUTPUT);//内臓LED出力
pinMode(2,INPUT_PULLUP);//Interrupt0を入力としてpullup
Serial.begin(9600);
attachInterrupt(0,interrupt,RISING);//割込み設定
}
void loop() {//繰り返し
digitalWrite(LED_BUILTIN, HIGH);//内臓LED点灯
delay(1000);//1000ms待機
digitalWrite(LED_BUILTIN, LOW);//内臓LED消灯
delay(1000);//1000ms待機
Serial.println("normal");
}
//関数・補助
void interrupt(){
Serial.println("interrupt");
}
3行目にpinMode文を入れるとプルアップ抵抗を必要としなくなります。
スリープ
電池で動作させるときなど省電力にできると長く使うことができます。
例えば10分毎に温度を計測させるのに,ずっと動作させたままではもったいないと思います。
そこで,スリープ動作を使います。
スリープのモードは5種類あります。それぞれのモードにより状態や消費電力が違います。Arduinoは単体で48mAの消費電流です。気象観測装置としてLCD Keypad Shieldを付けて気圧と温湿度を測定させると133.5mA消費します。LEDを消灯(LCD Keypad Shieldの場合はD pin10をLOW)すると57.3mAになります。更にスリープモードにすると45.4mAとなります。
Arduinoを単体で動作
49.6mA
消費電流
// set_sleep_mode(SLEEP_MODE_PWR_DOWN);
// set_sleep_mode(SLEEP_MODE_PWR_SAVE);
// set_sleep_mode(SLEEP_MODE_ADC);
// set_sleep_mode(SLEEP_MODE_STANDBY);
// set_sleep_mode(SLEEP_MODE_IDLE);
31.9mA
33.1mA
39.9mA
32.3mA
32.3mA
スリープの実現はヘッダを使うと簡単にできます。
宣言部に#include <avr/sleep.h>のヘッダを付け加えます。
設定部でモードの設定を行います。
繰り返し部でスリープを実行します。
Serial.println("abc");で確認します。
Arduinoを単体で走らせると49.6mA消費します。それぞれのモードでsleepさせると上の表の消費電流になります。
//宣言部
#include <avr/sleep.h>//スリープを使う
void setup() {//初期設定部
Serial.begin(9600);
set_sleep_mode(SLEEP_MODE_IDLE);//モードの設定
Serial.println("Bigin");
}
void loop() {//繰り返し部
sleep_mode();//スリープ実行
Serial.println("abc");
}
//慣習・補助部
割込み命令
スリープに入っても抜け出さなければ仕事はできません。割込み命令で抜け出します。
attachInterrupt(0,wakeup,RISING);//許可
割込み許可(番号,割込み後の文,↑→↓)
detachInterrupt(0);//割込み禁止(番号)
attachは「付ける」のような意味です。
detachは「切り離す」のような意味です。
attachInterrupt(0,wakeup,RISING);//許可
「0番の割込みを許可して,割込み後はwakeupを実行する」という文です。
RISING は 入力信号の入った時です。
pin2を10KΩでプルアップしてGNDにスイッチでつなぎます。(interruptと同じ接続です。)
下はスリープに入った後,復帰させるために割込みを使います。とにかくスリープに入って割込みで抜け出すスケッチです。
//宣言部分
#include <avr/sleep.h>//スリープを使えるようにする
#include <avr/interrupt.h>//割込みが使えるようにする
int LED=13;//13pinをLEDと名付ける(スケッチ全体で使える)
int wakePin = 2;// pin2をwakePinと名付ける(全体で使える)
void setup()//初期設定部分
{
pinMode(wakePin,INPUT);//割込みpinを入力に設定
pinMode(LED,OUTPUT); // LEDpinを出力に設定
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
//スリープモード設定
}
void loop()//繰り返し部分
{
digitalWrite(LED,HIGH); // LED 点
delay(1000); //1秒待ち
digitalWrite(LED,LOW);//LED 滅
delay(1000); //1秒待ち
attachInterrupt(0,wakeup,RISING);//割込み設定
sleep_mode();//スリープ動作
}
//関数・補助部分
void wakeup() {//復帰
digitalWrite(LED,HIGH); // LED 点
delay(500); //0.5秒待ち
digitalWrite(LED,LOW);//LED 滅
delay(500); //0/5秒待ち
}
スリープと割込みを使えるようにして,1秒間隔でLEDを点滅したのちスリープに入ります。pin2をプルアップしておき,GNDに接触させると復帰します。
ArduinoではSLEEP_MODE_PWR_DOWNにしても半分弱くらいの消費電力だそうです。
リレー
リレーを使って電子機器をON,OFFさせることができます。
5Vの入力で動作するリレーです。