割り込みは、イベントを非同期に処理できるマイクロコントローラーの強力な機能です。イベントを継続的にチェックするポーリングとは異なり、ボタンプレスやタイマーオーバーフローなど、特定のイベントが発生するとすぐに割り込みが応答します。このチュートリアルでは、Arduinoで割り込みを理解し、使用することをガイドします。
あなたが必要とするもの
- Arduino uno(または互換性のあるボード)
- プッシュボタン
- 10K-OHM抵抗器(プルダウン構成用)
- LEDおよび220-OHM抵抗器(オプション)
- ブレッドボードとジャンパーワイヤ
- Arduino IDEがコンピューターにインストールされています
ステップ1:割り込みとは何ですか?
割り込みは、特定のイベントを処理するためにメインプログラムの実行を一時的に停止します。イベントが処理されると、プログラムは中断されたところから再開されます。割り込みは、呼ばれる特別な関数を使用して管理されます 割り込みサービスルーチン(ISR).
Arduinoの割り込みの種類
- 外部割り込み: 特定のピンのイベントによってトリガーされます(例:Arduino UNOのピン2または3)。
- ピン変更割り込み: デジタルピンの変更によってトリガーされます。
- タイマー割り込み: タイマーのオーバーフローによってトリガーされるか、一致を比較します。
ステップ2:外部割り込みの使用
Arduino UNOは、ピン2および3の外部割り込みをサポートしています。これらの割り込みを構成してトリガーします。
- 上昇: 信号は低から高になります。
- 落ちる: 信号は高から低くなります。
- 変化: 信号は状態を変えます(低から高または高から低い)。
- 低い: 信号は低いままです。
コードの例:ボタンを押すと押します
この例は、ピン2に接続されたボタンが押されたときにLEDを切り替えます。
#define buttonPin 2 // Interrupt pin
#define ledPin 13 // Built-in LED
volatile bool ledState = false; // Shared variable between ISR and main code
void handleInterrupt() {
ledState = !ledState; // Toggle LED state
digitalWrite(ledPin, ledState);
}
void setup() {
pinMode(buttonPin, INPUT_PULLUP); // Enable internal pull-up resistor
pinMode(ledPin, OUTPUT);
attachInterrupt(digitalPinToInterrupt(buttonPin), handleInterrupt, FALLING); // Trigger on button press
}
void loop() {
// Main loop does nothing; interrupt handles the LED
}
説明
-
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
:割り込みを構成します。-
pin
:割り込みピン(例:Arduino UNOのピン2または3)。 -
ISR
:実行する割り込みサービスルーチン。 -
mode
:トリガー条件(RISING
,FALLING
,CHANGE
、 またはLOW
).
-
-
digitalPinToInterrupt(pin)
:ピン番号を割り込み番号に変換します。
ステップ3:ピンの使用中割り込みを使用します
ピン変更割り込みにより、デジタルピンの変更を検出できます。これには、次のような追加のライブラリが必要です EnableInterrupt.
例コード:ピン変更割り込み
#include <EnableInterrupt.h>
#define pin 4 // Pin to monitor
void handlePinChange() {
Serial.println("Pin state changed!");
}
void setup() {
Serial.begin(9600);
enableInterrupt(pin, handlePinChange, CHANGE); // Trigger on any state change
}
void loop() {
// Main loop does nothing; interrupt handles the event
}
図書館のインストール
ピン変更割り込みを使用するには、インストールします EnableInterrupt Arduino Library Manager経由の図書館。
ステップ4:タイマー割り込み
タイマー割り込みは、正確な間隔でタスクをスケジュールするのに役立ちます。を参照してください Arduinoタイマーチュートリアル タイマー割り込みの構成の詳細については。
例:Timer1割り込みでLEDを点滅させます
#define ledPin 13
void setup() {
pinMode(ledPin, OUTPUT);
// Configure Timer1
noInterrupts(); // Disable interrupts during setup
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
OCR1A = 15624; // Compare match value for 1Hz (1-second interval)
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
TIMSK1 |= (1 << OCIE1A); // Enable Timer1 compare interrupt
interrupts(); // Enable interrupts
}
ISR(TIMER1_COMPA_vect) {
digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle LED
}
void loop() {
// Main loop does nothing; Timer1 handles the LED
}
ステップ5:割り込みを使用するためのベストプラクティス
- ISRを短くしてください: ISRの遅延や複雑な計算を避けて、迅速な対応を確保してください。
- ISRでのシリアル通信を避けてください: シリアル関数は、ISR内で確実に機能しない場合があります。
-
使用
volatile
共有変数の場合: ISRとメインプログラムの間で共有されるマーク変数volatile
コンパイラの最適化の問題を防ぐため。 - 入力の討論: ボタンプレスなどの騒々しい信号のソフトウェアまたはハードウェアのデバウンスロジックを処理します。
-
重要なセクションで割り込みを無効にします: 使用
noInterrupts()
そしてinterrupts()
重要なコードセクションを保護します。
割り込みのアプリケーション
- ハンドリングボタンは投票せずに押します
- ロータリーエンコーダーの読み取り
- タイミングクリティカルイベント(例:正確なモーター制御)
- 定期的なタスクのスケジューリング
- 外部信号に反応する(例:センサー、通信イベント)
トラブルシューティング
- トリガーしないことを中断します: 正しいピンとモードが構成されていることを確認します。
- 不安定な動作: ノイズの多いシグナルを捨てて、長いISRを避けます。
- ライブラリとの対立: 一部のライブラリは、内部的に割り込みを使用します(Servo、PWMなど)。コードとの矛盾がないことを確認してください。
結論
割り込みにより、Arduinoプロジェクトでのイベントの応答性と効率的な処理が可能になります。外部、ピンの変更、およびタイマー割り込みを使用することを学ぶことで、堅牢で正確なアプリケーションを作成できます。さまざまな種類の割り込みを試して、プロジェクトを強化し、パフォーマンスを最適化してください!