どうも、なかしーです。
僕は自動車のマイコンにプログラミングをする組み込みエンジニアとして働きつつ、YouTubeでArduinoの使い方を解説しています。
ボタンを押した瞬間にArduinoが反応するようにはどうすればいいの?
という悩みにお答えします。
ボタンを押すことでLEDの点灯と消灯が切り替わるプログラムにdelay関数を入れた場合、delay中にボタンを押してもすぐにLEDの点灯状態は変化しません。
例えば、こんなプログラムです。
unsigned char led = 0;
int i = 0;
void setup() {
pinMode(3,INPUT);
pinMode(7,OUTPUT);
}
void loop() {
if(digitalRead(3) == 1) {
led ^= 1;
digitalWrite(7, led);
}
for(i = 0; i < 5; i++){
delay(1000); //無駄に5秒待たせる
}
}
LEDの場合は問題ないかもしれませんが、ボタンを押したときにArduinoがすぐに反応して欲しいという場面もあるかと思います。
そういう時に役立つのが「割り込み」です。
割り込みを使うことで、ボタンを押したらすぐにArduinoが決まった処理を実行するようにできます。
この記事では「Arduinoの割り込み機能と使い方」について紹介します。
動画でも解説しています!
Arduinoの割り込み機能とは
スケッチで書いたプログラムをArduinoは上から順に実行していくようになっています。
例えるなら、処理が長い列をつくって並んでいるようなイメージです。
Arduinoで作りたい物に応じて、優先度の高い処理と低い処理に分けることが出来ると思います。
冒頭のボタンでLEDの点灯状態を変えるプログラムの場合は
- LEDの状態をDelayの時間だけ保つ・・・優先度は低い
- スイッチの入力・・・優先度は高い
優先度が高い処理も低い処理も同じ列で自分の順番を待っているので、優先的に実行したい処理まで時間が掛かります。
そこで「割り込み機能」を使います。
テーマパークでよくある「ファストパス」みたいな感じです。
割り込みにはいくつか種類があり、条件が成立したときに効果を発動します。
- タイマ割り込み・・・一定時間ごと
- 外部割り込み・・・外部からの立下りもしくは立上り信号
- シリアル通信の受信割り込み・・・シリアル通信でデータが送られてきた時
やりたいことはスイッチを押した時にLEDの点灯状態を変えたいので、今回の場合は「外部割り込み」を使います。
Arduinoへスイッチをつなぐ方法
外部割り込みを使う時は所定のピンにスイッチなどをつなぐ必要があります。
僕が使っているArduino UNOの場合はデジタルピンの2PINと3PINが該当します。
今回はスイッチを押した時に5Vが入力されるようにArduinoに繋ぎました。
スイッチの使い方がよく分からない方は「Arduinoでタクトスイッチの状態を読み込む方法【エンジニアが解説】」を読んでください。
Arduinoで外部割り込みを使ったプログラム
Arduinoで外部割り込みを使うには、割り込みの条件が成立したときに実行させる関数と外部割り込みの初期設定が必要です。
まずは割り込みが発生したときにLEDの状態が反転する関数を作ります。
void sw_led(void);
void sw_led(void) {
led ^= 1;
digitalWrite(7, led);
}
関数の入力が終わったら、外部割り込みの初期設定を行います。
使う関数はattachInterrupt(割り込み番号, 呼び出す関数, トリガ)です。
unsigned char led = 0;
int i = 0;
void sw_led(void);
void setup() {
pinMode(3,INPUT);
pinMode(7,OUTPUT);
attachInterrupt(1,sw_led, RISING);
}
void loop() {
for(i = 0; i < 5; i++){
delay(1000); //無駄に5秒待たせる
}
}
void sw_led(void) {
led ^= 1;
digitalWrite(7, led);
}
割り込み番号は
- デジタルピン2→割り込み番号は0
- デジタルピン3→割り込み番号は1
となっています。
呼び出す関数は先ほど作った関数です。
トリガは条件のことで4パターンあります。
- LOW・・・電圧が0Vのとき
- CHANGE・・・ピンの状態が変わったとき
- RISING・・・ピンの状態がLOWからHIGHに変わったとき
- FALLING・・・ピンの状態がHIGHからLOWに変わったとき
スイッチを押すと電圧が0V→5Vになるので、LOWからHIGHのRISINGを選びます。
スイッチから指を話した時であれば、FALLINGを選ぶといいでしょう。
このプログラムを実行するとloop関数内で5秒間のdelay処理が走っていてもLEDの点灯が変わることが分かると思います。
Arduinoの割り込み機能と使い方|まとめ
この記事では「Arduinoの割り込み機能と使い方」について解説しました。
割り込みを使うことで、特定の条件が成立したときに優先度の高い処理を順番関係なく実行することが可能です。
Arduinoには一定時間ごとに実行するタイマ割り込みやシリアル通信でデータを受信したときに実行するシリアル通信受信割り込みなどがあります。
割り込みは他のマイコンでも使うので、覚えておくと電子工作で役立つはずですよ!
Arduino関連の人気記事
>>【Arduino入門キット】電子工作の勉強におすすめ【こんなに安くていいの?】
>>Arduinoをゼロから勉強する方法を紹介【参考書は不要】
>>Arduinoのプログラムの書き方【基本的なルールは4つある】
当ブログで人気のArduino入門キット