ArduinoでLED割り込み点灯制御動作!ビジュアルプログラミング(mBlock)【Lesson18】
こんにちは、せでぃあ(@cediablog)です。
今回のArduinoプログラミングLESSON18では、「LEDランプとタクトスイッチ(押しボタン)を使った割り込み動作」を行います。
本記事は、プログラミング方法や電子パーツの役割など、ていねいな解説を心がけています。
プログラミング初心者にも、安心して読んでいただけると思います。
小学生、中学生も安心してプログラミングができるように、文字列を使わないブロックプログラミング(ビジュアルプログラミングとも言います)方法についても動画付きで紹介しています。
プログラミング初心者の方は、ブロックプログラミングから始めてみてください!
本記事では、スクラッチベースのビジュアルプログラミングツールmBlockとArduinoIDEプログラムどちらも紹介しています
無料のブロックプログラミングツールmBlockのインストール方法については、こちらの記事を参照してください。
- 温湿度センサDHT11を使った、LCDへの温湿度表示方法
- Arduino IDEでのプログラミング方法
- mBlockを使ったビジュアルプログラミング方法
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
割り込み制御について
今回紹介する「割り込み制御」について解説していきます。
Arduinoのプログラム演算順序について
割り込み制御の話をする前に、Arduinoのプログラム実行順序について説明します。
Arduinoのプログラム構造
- 宣言部分
- プログラム実行後1度だけ実行する回路
- 繰り返し実行する回路
宣言部分では、変数の定義(整数型など)やヘッダーファイルの読み出し宣言などを行います。
いわゆるプログラムを実行するための準備部分です。
プログラム実行部は、プログラム実行開始後に1度だけ実行する回路と繰り返し実行される回路があります。
プログラム実行開始後1度だけ実行する回路では、Arduinoの入出力ソケットを「入力」「出力」どちらで使うのか?など、繰り返し実行する必要のない演算内容を記述します。
そして、繰り返し実行する回路では変化する情報に対して演算させたいプログラムを記述します。
押しボタンによるランプ点灯動作など、条件に対する動作の連動は繰り返し実行する回路で作ります。
Arduinoのプログラムの概念になります。
プログラムは上から順番に処理される
プログラムは上から順番に処理されていきます。
上記はmBlockで作成した、Arduino本体の内蔵LED点灯プログラムです。
Arduinoは13番ピンと本体内蔵LEDが内部で接続されています。
このプログラムを例に、動作順序を説明していきます。
プログラムの演算順序
- 内蔵LEDを点灯させる。
- 1秒待つ。
- 内蔵LEDを消灯させる。
- 1秒待つ。
①⇒②⇒③⇒④⇒①⇒②⇒・・・と①から④まで順番に演算されて、それが繰り返し実行されます。
通常のプログラムではこの演算順は絶対であり、IF文などで実行条件を制限しない限りこの実行プログラム順序が変わることはありません。
繰り返し実行順を無視して割込みできる機能があります
ここまでArduinoのプログラム実行順に関するルールをご理解いただけたと思います。
そんな実行順序ルールを無視して、割り込み制御条件が成立したら、即決められた動作を実行させることが可能な機能があります。
それが割り込み制御機能です。
Arduino UNOの割込み対応ピンは2つ
割込み制御は、特定のピンの入力信号状態を使って行います。
Arduino UNOでは2番ピンまたは3番ピンが、割込み制御用の入力ソケットとして使用可能です。
Arduino IDEの場合
attachInterrupt(割込み番号、呼び出す関数、割込み条件)
Arduino IDEではattachInterrupt関数を使用することで、割込み制御が可能です。
割り込み番号はピン番号と異なる点に注意が必要です。
割込み番号
- 2番ソケットピン⇒0を指定
- 3番ソケットピン⇒1を指定
割り込み条件
- LOW:信号がLOWのとき
- CHANGE:信号状態が変化したとき
- RISING:信号がLOW⇒HIGHに変わったとき
- FALLING:信号がHIGH⇒LOWに変わったとき
Arduino IDEを用いた割込み制御プログラム例を後述しますので、参考にしてください。
ブロックプログラムmBlockの場合
スクラッチベースのビジュアルプログラミングツールである「mBlock」では、割り込み制御を実行するための専用ブロックが準備されています。
このブロックを使ってプログラムを作ることで、割り込みピンへの入力情報によって即時割り込み動作を実行させることが可能となります。
ブロックプログラムでの割り込み制御回路については、後ほど詳しく説明します。
割込み制御を使うときの注意事項
割込み制御では、割り込んで実行させる関数内にdelay関数は使用できません。
割込み制御動作プログラムを作る際には、この点に注意してください。
割込み制御プログラム動作の説明
今回紹介する「LEDランプとタクトスイッチ(押しボタン)を使った割り込み動作」について説明します。
- 割込み制御機能の解説
- 割込み制御プログラムを使った動作
- mBlockを使ったプログラミングの解説
割込み制御動作のポイント
- 赤色LEDは1秒間隔の点滅動作を行っている。
- タクトスイッチを押すと、黄色LEDが点灯する。
- 赤色LEDが消灯するタイミングで、黄色LEDも消灯する。
- 赤色LEDの点灯・消灯状態に関係なく、黄色LEDはいつでも点灯できる。
重要なポイントは、赤文字で記した内容です。
プログラム順序に関係なく、タクトスイッチが押されれば即座に黄色LED点灯回路が機能するということです。
この動作が割込み制御動作ということになります。
まずは動画を見て、今回のLESSONで実行させたい動作内容を確認してください。
また、mBlockを使ったブロックプログラミングや動作確認方法についても解説しています。
この動画を見れば、割込み制御の役割が理解できますよ!
割込み制御を使った押しボタンによるLED点灯回路の作り方
割込み制御機能を使った、タクトスイッチ(押しボタン)によるLED点灯回路を実行させるために必要な作業を解説します。
今回は文字列を使ったプログラム形式と、文字列を使わないブロックプログラミング形式について説明します。
あなたの作りたいプロブラム形式に対応した手順に応じて、対応してください。
プログラム形式に応じた開発環境
・文字列による命令語形式⇒ArduinoIDE
・スクラッチベースのビジュアル形式⇒mBlock
プログラミングするために、パソコンが必要です。
電子部品等の必要な機器については、このあと説明します。
パソコンに統合開発ソフトウェア「ArduinoIDE」のインストールを行います。
Arduinoのセットアップ方法については、以下の記事にて詳しく説明しています。
Arduino IDEでの言語プログラミングも勉強したい方は、プログラミングの流れを理解しておいてください。
以下の記事にて、プログラミングから動作確認までの流れを詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEのインストールは不要です。
パソコンにスクラッチベースのビジュアルプログラミングツール「mBlock」のインストールを行います。
以下の記事にて詳しく説明しています。
ArduinoIDEでプログラミングする場合は、mBlockのインストールは不要です。
電子部品とジャンパーワイヤの差し込みだけで配線が可能です。
専用開発ソフトウェア「Arduino IDE」を使います。
私が作成したプログラムをコピペして使ってください。
Arduino IDEプログラミングの基本操作については、こちらの記事にて詳しく説明しています。
mBlockでプログラミングする場合は、ArduinoIDEプログラミングは不要です。
スクラッチベースのビジュアルプログラミングツールmBlockを使ってプログラムを作成します
プログラム内容については、後述するプログラミング例を参考にしてください。
ArduinoIDEでプログラミングする場合は、mBlockプログラミングは不要です。
プログラムが完成したら動作確認を行います。
- 赤色LED点灯のときにタクトスイッチを押すと、黄色LEDが点灯するか?
- 赤色LED消灯のときにタクトスイッチを押すと、黄色LEDが点灯するか?
- 赤色LEDが消灯するタイミングで、黄色LEDも消灯するか?
割込み制御を使った押しボタンによるLED点灯回路で使うもの
- パソコン
- Arduino本体
- USBケーブル
- ブレッドボード
- LED(赤色・黄色)
- 220Ω抵抗器
- タクトスイッチ(押しボタンスイッチ)
- 1kΩ抵抗器
- ジャンパー線(オスーオス)
今回はELEGOO社のスーパースターターキットに含まれる部品で作ることができますが、Arduino裏面のショート対策としてクリアケースも併せて準備することをおすすめします。
【おすすめ】コスパ最強のArduinoキットの中間グレードです!
パソコン
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
Arduino本体【キット】
基本的なエディション「Arduino Uno」の互換機である、ELEGOO社のUNO R3を使用しています。
Arduino本体裏面のショート対策に、別売りのクリアケースの購入をおすすめしています。
各ソケットの役割など、Arduino本体の機能について以下の記事にて詳しく説明しています。
USBケーブル【キット】
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
ブレッドボード【キット】
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能は同じです。
ブレッドボードだけの購入も可能です。
LED(赤・黄)【キット】
赤色・黄色のLED(発行ダイオード)を1本ずつ使用します。
LED素子にはプラスマイナスの極性があるため配線時には注意が必要です。
極性を間違えて配線すると、LEDは点灯しません
LEDの点灯方法から学習したいかたは、こちらの記事がおすすめです!
抵抗(220Ω)【キット】
220Ωの抵抗を使用し、各LEDに1本ずつ接続します。
LEDは流せる電流値に制約があるため、抵抗を直列つなぎすることでLEDに流れる電流を調節します。
抵抗は極性がないので、配線時に方向を気にする必要はありません。
LEDを点灯させるために接続する抵抗の選び方、抵抗カラーコードの見分け方については、こちらの記事で詳しく説明しています。
タクトスイッチ【キット】
今回の回路では、タクトスイッチ(押しボタンスイッチ)を使用します。
押しボタンは押されている間のみ、上記写真での2点が内部でつながります。
このようなボタンをモーメンタリボタンといいます。
今回は扱いませんが、ボタンから手を離してもONしたままになるボタンをオルタネイトボタンといいます。
モーメンタリ・オルタネイトボタンについては以下記事にて詳しく説明しています。
抵抗(1kΩ)【キット】
1kΩの抵抗を1本使用し、押しボタンスイッチに接続します。
抵抗を接続するのは、押しボタンがOFFのときにArduino本体がノイズによる誤検出することを避けるためです。
この記事では詳しく説明しませんが、ボタンを押していないのに押されたと誤認識されることを避ける目的であるということだけ覚えておいてください。
ジャンパー線(オスーオス)【キット】
ジャンパー線を6本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
スターターキットに含まれる機器に関しては、以下の記事にて詳しく紹介しています。
配線のやり方
上図が配線説明図となりますので、これと同じ配線をすれば完成します。
機器が故障するおそれがあるので、接続するプラスマイナス極性には十分注意して配線してください。
抵抗は極性がないので、向きは気にしなくてもOKですよ!
機器故障させないためにも、USBケーブルを抜いた「通電OFF」状態にて配線を行ってください
プログラミングのやり方
本記事では、以下に示す「Arduino IDEプログラミング」と「mBlockプログラミング」の2通りのプログラミング方法について解説しています。
いずれか1つのプログラミング方法を用いることで、本LESSONの動作を行うことが可能です。
ArduinoIDE:文字列による命令語形式
mBlock:スクラッチベースのビジュアル形式
文字列を使わないmBlockの方が、直感的で分かりやすく小学生におすすめのプログラミング方法になります。
mBlockを使ってプログラミングをする方は、mBlockの説明まで読み飛ばしてください。
Arduino IDEプログラミング
Arduino IDEとは統合開発ソフトウェアで、C言語のような文字列を用いたプログラミング方法です。
プログラミングするにあたり、ある程度の命令語を知っておく必要があります。
Arduino IDEのインストール方法については、以下の記事で詳しく説明しています。
日本語版のArduino公式リファレンスが巻末にて記載されているので、関数を調べるときに重宝します!(私も所有しています)
プログラミング方法
Arduino IDEを使って、文字列プログラミングを行います。
Arduino IDEを使ったプログラミング~動作確認方法については、以下の記事で詳細説明しています。
Arduino IDEプログラム
/* 作品名:LESSON18 */
/* 作成者:せでぃあ https://cediablog.com */
/* 割込み制御 */
int BTN_SOCKET = 2; //押しボタン入力ソケット番号
int LED_Y_SOCKET = 8; //黄色LED点灯出力ソケット番号
int LED_R_SOCKET = 13; //赤色LED点灯出力ソケット番号
void setup() {
//プログラム起動時1回だけ処理される回路
//入出力の割り当て
pinMode(BTN_SOCKET, INPUT); //2番ピンは入力として使用
pinMode(LED_Y_SOCKET, OUTPUT); //8番ピンは出力として使用
pinMode(LED_R_SOCKET, OUTPUT); //13番ピンは出力として使用
//押しボタン入力がOFF⇒ONしたら割り込み実行
attachInterrupt(0,interrupt,RISING);
}
void interrupt(){
//割込み制御回路
digitalWrite(LED_Y_SOCKET, HIGH); //黄色LED点灯出力をON
}
void loop() {
//プログラム起動後ループ処理される回路
//赤色LEDを1秒点灯
digitalWrite(LED_R_SOCKET, HIGH); //赤色LED点灯出力をOFF
delay(1000); //1.0秒ディレイ
//赤色LEDを1秒消灯
digitalWrite(LED_R_SOCKET, LOW); //赤色LED点灯出力をOFF
digitalWrite(LED_Y_SOCKET, LOW); //黄色LED点灯出力をON
delay(1000); //1.0秒ディレイ
}
上記がタクトスイッチ(押しボタン)を使った黄色LED点灯割込み制御動作のプログラムになります。
Arduino IDEのプログラム画面にコピーアンドペーストすることで、動作確認まで進めることができます。
各プログラム列の右側にプログラム内容をコメント記入してありますので参考にしてください。
割込み制御動作部のプログラムについては、この後詳しく説明します。
命令語の解説
今回のプログラムで使用した命令文について、解説します。
変数のデータ型指定
変数のデータ型を指定するものです。
今回はピンソケット番号を代入するので整数を扱う「int型」を指定します。
またアナログ出力値は「0~255」の整数を扱いますので、同じく「int型」を指定します。
データ型 | 説明 | 扱える範囲 |
---|---|---|
int | 2バイトの整数を代入可能。 | -32768~32767 |
long | 4バイトの整数を代入可能 | -2,147,483,648~2,147,483,647 |
float | 4バイトの小数を代入可能。 | 3.4028235×1038~-3.4028235×1038 |
char | 1バイトの値を代入可能。文字列の代入に利用されます。 | -128~127 |
boolean | 0または1のみ代入可能。フラグのON-OFFなどに利用されます。 | 0,1 |
pinMode(入出力番号,INPUTまたはOUTPUT)
指定したデジタル入出力ソケット番号の機能を指示します。
入力として使用する場合は「INPUT」、出力の場合は「OUTPUT」を指定します。
digitalWrite(入出力ソケット番号,HIGHまたはLOW)
指定したデジタル入出力ソケット番号の電圧をON、またはOFFします。
ONさせたいときは「HIGH」、OFFさせたいときは「LOW」を指定します。
delay(時間)
()内で指定した時間(単位はmsec)だけ、プログラム実行を待たせます。
今回のプログラムではLEDが点灯した後、1000msec=1sec待ってから次のLED消灯命令を実行させています。
マイクロ秒単位で指定したい場合は、delayMcroseconds(時間)を使います。
割込み制御動作
割込み制御動作は大きく分けて2つのプログラムで構成されます。
割込みプログラムの構成は1つ!
- 割込み条件プログラム
- 割込み動作プログラム
1つずつ説明していきます。
割込み条件プログラム
attachInterrupt(割込み番号、呼び出す関数、割込み条件)
Arduino IDEではattachInterrupt関数を使用することで、割込み制御が可能です。
割り込み番号はピン番号と異なる点に注意が必要です。
割込み番号
- 2番ソケットピン⇒0を指定
- 3番ソケットピン⇒1を指定
割込みで呼び出す関数名は割込み動作関数で使用しますので、任意に決めてください。
割込み回路とわかる名前にしておくことをおすすめします。
私は割込み関数名を「interrupt」にしました。
割り込み条件
- LOW:信号がLOWのとき
- CHANGE:信号状態が変化したとき
- RISING:信号がLOW⇒HIGHに変わったとき
- FALLING:信号がHIGH⇒LOWに変わったとき
割込み動作プログラム
割込み条件が成立したときに、即座に実行されるプログラムになります。
void interrupt(){
//割込み制御回路
digitalWrite(LED_Y_SOCKET, HIGH); //黄色LED点灯出力をON
}
上記のように、void 関数名(){実行内容}という記載方法でプログラムを作ります。
割込み実行プログラム内でdelayは使用できません。
プログラミング初心者の方に、おすすめなArduinoの参考書を紹介しています!
mBlockプログラミング
ここからは、mBlockを使ったプログラムの作り方を解説します。
- デバイスにArduino Uno R3を追加する
- 接続モードを「アップロードモードON」にする
- mBlockプログラムを作成する
- プログラムをArduino本体に転送する
これらの基本操作方法については、こちらの記事を参照してください。
動画を参考にプログラミングしてみよう
割込み制御ブロックの説明
mBlockでは、割込み制御動作を行うための専用ブロックが存在します。
mBlockを使ったプログラム内容
今回は「アップロードモード オン」でのプログラム作成例を紹介しています。
プログラム開始条件が「Arduino Unoが起動したとき」になっている点に注意してください。
以下のプログラムが動作プログラムになります。
各ブロックの役割を記載しているので、参考にしてください。
mBlockのArduino専用ブロックについては、こちらの記事にて詳しく説明しています。
割込み制御プログラムがないとどうなるのか?
割込み制御プログラムを作らなかったら、どんな動作になるのか気になりますよね?
割込み制御できないということは、プログラムの実行順序の影響を受けるということです。
上記が、割込み制御を行わないで「タクトスイッチが押されたら黄色LEDを点灯させる」プログラムになります。
割込み制御プログラムを少しアレンジするだけで作れますので、ぜひ試してみてください。
割込み制御の意味がよく分かると思いますよ!
動作確認方法
- 赤色LED点灯のときにタクトスイッチを押すと、黄色LEDが点灯するか?
- 赤色LED消灯のときにタクトスイッチを押すと、黄色LEDが点灯するか?
- 赤色LEDが消灯するタイミングで、黄色LEDも消灯するか?
上記項目について確認していきましょう。
タクトスイッチを押したら黄色LEDが点灯するか?
赤色LEDが点灯していても、消灯していてもタクトスイッチを押したら黄色LEDが点灯するか確認してください。
赤色LEDの点灯プログラム演算が点灯・消灯どちらのプロセスであっても、割込み制御条件である「タクトスイッチがOFF⇒ONになった」が成立すれば、黄色LEDが点灯するはずです。
タクトスイッチを押すタイミング
①赤色LEDが点灯しているとき
②赤色LEDが消灯しているとき
①赤色LEDが点灯しているとき、で確認する際は赤色LEDが点灯した直後にタクトスイッチ(押しボタン)を押した方が動作を確認しやすいです。
もし表示内容が上記と異なっていた場合は、プログラム内での「上段」「下段」表示指示が間違っていないか?表示内容の指示が間違っていないか?確認してください。
赤色LEDが消灯するタイミングで黄色LEDも消灯するか?
赤色LEDが消灯するタイミングで黄色LEDが消灯することを確認してください。
もともと黄色LEDが消灯していた場合は、消灯状態が継続されます。
タクトスイッチがOFF⇒ONに変わった瞬間に割込み動作が開始します。
割込み動作があれば信号入力にタイムリーに対処できる
- プログラムは記述された順番に演算されていく
- 割り込み専用の関数やブロックを使うことで簡単に割込み制御ができる
- mBlockを使ったブロックプログラミングがシンプルでおすすめ
ディレイタイマーの待ち時間まで含めて順番に演算していくArduinoの世界において、割り込み制御の必要性について感じていただけましたでしょうか?
割り込み制御は、入力のタイミングを逃さず演算させたいときの必須制御となります。
演算順序に影響されたくない動作プログラムを作る場合は、ぜひ割り込み制御の活用をしてみてください。
また小学生のお子様には断然、ブロックプログラミングがおすすめです!
mBlockはブロックのドラッグアンドドロップでプログラミングできるため、初心者のかたにも安心して操作ができますよ。
ブロックプログラミングの練習におすすめな、プログラミングロボットです!
最後まで読んでいただき、ありがとうございました。
子供の成長を育む!小学生のお子様にぴったりなプログラミング教室が見つかるように厳選しました!
Arduinoスクラッチプログラミングのおすすめ参考書について詳しく説明しています。
Arduinoプログラミング(スクラッチも)を使った電子工作を紹介しています。
コメント
コメント一覧 (2件)
教えてください。
Arduino nano を接続し、mblockに接続もできましたが、プログラムの送信ができません。
『ファームウェアのアップデートをしてください』とエラーメッセージが出て、先に進めません。
ArduinoIDEでは、プログラム送信、動作確認はできています。対処方法を教えてください。
松原さん、コメントいただきありがとうございます。
『ファームウェアのアップデートをしてください』のメッセージが出るケースとしては、mblock画面左下のアップロードモード選択が「OFF」になっている場合が該当します。
アップロードモードOFFのときは、Arduinoにファームウェアを書き込んでPCからArduinoを制御する方式となります。
お手数ですが、アップロードモードがOFFになっていないかご確認いただけますと幸いです。
※アップロードモードについては、こちらの記事にて詳しく説明しています。
https://cediablog.com/mblockinfo/