動きの速い車を考えてみましょう。突然反対方向に別の車がぶつかった場合、最初に発生するのは、車にある加速度センサーが突然の減速を感知し、にあるマイクロコントローラーへの外部割り込みをトリガーすることです。車。次に、その割り込みに基づいて、マイクロコントローラーはエアバッグをすぐに展開するための電気信号を生成します。車内にあるマイクロコントローラーは、車の速度の検知、他のセンサーのチェック、エアコンの温度の制御など、多くのことを同時に監視します。では、エアバッグが数秒で突然開く理由は何でしょうか。答えは、割り込み、割り込み信号はすべての最も高い優先度を有し、ここで使用されています。
割り込みのもう1つの簡単な例は、「タッチ」感覚に最も優先度の高いタッチスクリーン携帯電話です。ほとんどすべての電子機器には、通常のプロセスを「中断」し、特定のイベントに対してより優先度の高いことを行うために、何らかの種類の割り込みがあります。割り込みを処理した後、通常のプロセスが再開されます。
したがって、技術的には、割り込みは、I / Oまたは命令がプロセッサの通常の実行を一時停止し、優先度が高いようにそれ自体が処理されるメカニズムです。たとえば、通常の実行を実行しているプロセッサは、ISR(Interrupt Service Routine)に存在する特定のプロセスを実行するために、何らかのセンサーによって中断される可能性があります。ISRプロセッサを実行した後、通常の実行を再開できます。
割り込みの種類
割り込みには2つのタイプがあります。
ハードウェア割り込み:外部割り込みピンの状態がLOWからHIGHまたはHIGHからLOWに変化するなどの外部イベントが発生した場合に発生します。
ソフトウェア割り込み:ソフトウェアからの指示に従って発生します。たとえば、タイマー割り込みはソフトウェア割り込みです。
Arduinoでの割り込み
次に、Arduinoボードで割り込みを使用する方法を説明します。2種類の割り込みがあります。
- 外部割り込み
- ピン変更割り込み
外部割り込み:
これらの割り込みはハードウェアによって解釈され、非常に高速です。これらの割り込みは、RISING、FALLING、またはLOWレベルのイベントでトリガーするように設定できます。
Arduinoボード |
外部割り込みピン: |
UNO、NANO |
2,3 |
メガ |
2,3,18,19,20,21 |
ピン変更割り込み:
Arduinoは、ピン変更割り込みを使用することで、より多くの割り込みピンを有効にすることができます。ATmega168 / 328ベースのArduinoボードでは、任意のピンまたは20個の信号ピンすべてを割り込みピンとして使用できます。また、RISINGエッジまたはFALLINGエッジを使用してトリガーすることもできます。
Arduinoでの割り込みの使用
Arduinoで割り込みを使用するには、次の概念を理解する必要があります。
割り込みサービスルーチン(ISR)
割り込みサービスルーチンまたは割り込みハンドラは、命令の小さなセットが含まれているイベントです。外部割り込みが発生すると、プロセッサは最初にISRに存在するこれらのコードを実行し、通常の実行を終了した状態に戻ります。
ArduinoではISRの構文は次のとおりです。
attachInterrupt(digitalPinToInterrupt(pin)、ISR、mode);
digitalPinToInterrupt(pin): Arduino Uno、NANOでは、割り込みに使用されるピンは2,3で、メガ2,3,18,19,20,21です。ここで外部割り込みに使用する入力端子を指定してください。
ISR:外部割り込みが行われたときに呼び出される関数です。
モード:トリガーする遷移のタイプ(下降、上昇など)。
- RISING:ピンがLOWからHIGHに遷移するときに割り込みをトリガーします。
- FALLING:ピンがHIGHからLOWに遷移するときに割り込みをトリガーします。
- 変更:ピンがLOWからHIGHまたはHIGHからLOWに遷移するとき(つまり、ピンの状態が変化するとき)に割り込みをトリガーします。
割り込み使用中のいくつかの条件
- 割り込みサービスルーチン機能(ISR)はできるだけ短くする必要があります。
- Delay()関数はISR内では機能しないため、回避する必要があります。
このArduino割り込みチュートリアルでは、数値が0からインクリメントされ、2つのプッシュボタンを使用して割り込みがトリガーされます。それぞれがD2とD3に接続されています。LEDは割り込みを示すために使用されます。1つの押しボタンを押すとLEDがオンになり、ディスプレイに割り込み2が表示されてオフになり、別のプッシュボタンを押すとLEDがオフになり、ディスプレイに割り込み1が表示されてオフになります。
必要なコンポーネント
- Arduinoボード(このチュートリアルではArduino NANOが使用されます)
- 押しボタン-2
- LED-1
- 抵抗器(10K)-2
- LCD(16x2)-1
- ブレッドボード
- 接続線
回路図
ArduinoNanoと16x2LCDディスプレイ間の回路接続:
LCD |
Arduino Nano |
VSS |
GND |
VDD |
+ 5V |
V0 |
ポテンショメータセンターPINへ LCDのコントラストを制御するため |
RS |
D7 |
RW |
GND |
E |
D8 |
D4 |
D9 |
D5 |
D10 |
D6 |
D11 |
D7 |
D12 |
A |
+ 5V |
K |
GND |
2つの押しボタンがピンD2とD3でArduinoNanoに接続されています。これらは、LEDをオンにするためとLEDをオフにするための2つの外部割り込みを使用するために使用されます。各押しボタンには、グランドに接続された10kのプルダウン抵抗があります。したがって、プッシュボタンを押すとロジックHIGH(1)になり、押さない場合はロジックLOW(0)になります。プルダウン抵抗は必須です。そうでない場合、入力ピンD2とD3に浮動値があります。
A LEDは、割り込みがトリガされたか、ボタンが押されたことを示すために使用されます。
Arduino割り込みプログラミング
このチュートリアルでは、Arduino Nanoに接続された(16x2)LCDに連続して表示される0から数値が増加し、左プッシュボタン(割り込みピンD3)が押されると、LEDがオンになり、ディスプレイにInterrupt2が表示され、右プッシュボタンが表示されます。 (割り込みピンD2)を押すと、LEDが消灯し、ディスプレイに割り込み1が表示されます。
このチュートリアルの最後に、動作するビデオを含む完全なコードを示します。
1.最初に LCDディスプレイのヘッダーファイルがインクルードされ、次にArduinoNanoとの接続に使用されるLCDピンが定義されます。
#include
2. void setup()関数内で、最初にLCDディスプレイにいくつかの紹介メッセージを表示します。LCDとArduinoのインターフェースについて詳しくは、こちらをご覧ください。
lcd.begin(16,2); lcd.setCursor(0,0); lcd.print( "CIRCUIT DIGEST"); lcd.setCursor(0,1); lcd.print( "ArduinoInterrupt"); delay(3000); lcd.clear();
3.次に、同じvoid setup()関数で、入力ピンと出力ピンを指定する必要があります。ピンD13はLEDのアノードに接続されているため、このピンを出力として定義する必要があります。
pinMode(13、OUTPUT);
4.プログラミングの主な重要な部分は、attachInterrupt()関数です。これは、void setup()にも含まれています。
attachInterrupt(digitalPinToInterrupt(2)、buttonPressed1、RISING); attachInterrupt(digitalPinToInterrupt(3)、buttonPressed2、RISING);
ここでは、ピン2が外部割り込み用であると指定されており、D2ピンにRISING(LOWからHIGH)がある場合に buttonPressed1 関数が呼び出されます。また、ピン3は外部割り込み用であり、D3ピンにRISINGがあるとbuttonPressed2関数が呼び出されます。
5. void loop()内で、数値(i)がゼロからインクリメントされ、LCD(16x2)に出力されます。
lcd.clear(); lcd.print( "COUNTER:"); lcd.print(i); ++ i; delay(1000);
同じ voidloop ()で、 digitalWrite() はLEDのアノードが接続されているピンD13で使用されます。可変 出力 LEDの値に応じてオンまたはオフになります
digitalWrite(13、output);
6.最も重要な部分は、 attachInterrupt() 関数で使用される名前に従って割り込みハンドラー関数を作成することです。
2つの割り込みピンが2と3で使用されるため、2つのISRが必要です。このプログラミングでは、次のISRが使用されます
buttonPressed1():
void buttonPressed1() { 出力= LOW; lcd.setCursor(0,1); lcd.print( "割り込み1"); }
この機能は、ピンD2の押しボタンが押されたときに実行されます(RISINGEDGE)。この機能は、出力の状態をLOWに変更し、LEDをオフにして、LCDディスプレイに「interrupt1」を印刷します。
buttonPressed2():
void buttonPressed2(){出力= HIGH; lcd.setCursor(0,1); lcd.print( "Interrupt2"); }
この機能は、ピンD3の押しボタンが押されたときに実行されます。この機能は、出力の状態をHIGHに変更し、LEDをオンにして、LCDディスプレイに「interrupt2」を印刷します。
Arduino割り込みデモンストレーション
1.左側のプッシュボタンを押すと、LEDが点灯し、LCDにInterrupt2が表示されます。
2.右側のプッシュボタンを押すと、LEDが消灯し、LCDにInterrupt1が表示されます。
これは、通常の実行の間に重要なタスクをトリガーするために割り込みがどのように役立つかを示しています。