Arduino割り込み
割り込み
これは、Arduinoコードの割り込みの実装に関するガイドです。 割り込みに関する多くの良い情報がそこにありますが、このガイドはごくわずかな電力消費でArduinoを実行することに関するシリーズの一部です。 そして私たちは小さなことを意味します。 私たちは、アプリケーションに応じて何年もの操作を話している…。 コイン型電池。 これは、将来の組み込みプロジェクトまたはモノのインターネットプロジェクトを作成するために知っておく必要があるものです。 率直に言って、Arduinoの株がどれだけの電力を無駄にしているのか、とんでもないことです。 このガイドシリーズのさまざまなトリックを使用すると、1000倍以上の消費電力を削減できます。 面白いですね? それからこれはあなたのためのガイドです! このガイドが気に入った場合、または独自のプロジェクトでどのように割り込みを実装したかをご覧になりたい場合は、次のWebサイトをご覧ください。
//doteverything.co/
割り込みが必要な理由
答えは本当に簡単です。 割り込みがなければ、Arduinoをスリープ状態にして再び起動することを期待できないため、割り込みが必要です(一般的に、限られた状況で割り込みなしでスリープから復帰する方法があります)。 眠れないと、夏の真ん中にあるデスバレーを駆け抜けるマラソン選手のように、息をのむような力になります。 スリープモードの消費電力は非常にわずかですが、設定には特別な努力が必要です。 最初に知っておくべきことは、割り込みを利用するためのコードの記述方法です。その後、より強力な手法を使用できます。
割り込みとは何ですか?
割り込みはいくつかのことです。 しかし、本質的には、特別なアクションが発生したときに呼び出されるコードの一部です。 どのような特別なアクションですか? 基本的に、特定のピンの電圧が変化したとき。 Duemilanove / UNOには、認定できるそのようなピンは2つしかありません。 しかし、ご覧のとおり、これは非常に広範な要件です。 これらのピンの電圧を変更するには、何でも使用できます。 ボタンを介したユーザー入力、センサーなどの周辺機器、別のマイクロチップ、内部タイマーなども可能です。 割り込みの使用を開始するために最初に行う必要があるのは、外部の電気的トリガーを持つようにアプリケーションを変換する方法を理解することです。 多くの場合、Arduinoに接続する他のデバイスは、割り込みを使用して注意を引きます。 以前の説明可能な「ArduinoプロジェクトにBluetoothを追加する方法」は、このような方法で外部デバイスとインターフェイスする完璧な例です。
このガイドでは、サンプル回路を配線して割り込みを発生させる方法を示します。 次に、サンプルコードを提供します。 それがどのように行われたかを見た後、あなたはあなたのプロジェクトに割り込みを適用する方法を理解するために正しい心のフレームに入ります。
私は電力消費を気にしないと言います。 まだ割り込みが必要ですか?
はい! プロセッサをスリープ状態にする予定がない場合でも、割り込みが必要になる場合があります。 タイミングに依存するアプリケーションがある場合、割り込みは不可欠です。 これは、xミリ秒ごとにアクションを実行する必要があること、または外部イベントが発生した直後にアクションを実行する必要があることを意味します。 Arduinoプログラミングの基本に精通している場合、なぜwhileループを使用してアクションを実行するタイミングをチェックできないのか疑問に思うかもしれません。 典型的な解決策は、Whileループにできるだけ早くピンの状態を「ポーリング」させることです。 この方法はよく機能しますが、信頼性が低くなります。 ボタンの押下をポーリングしているが、whileループが再びボタンの状態をチェックする前にボタンが押されて離された場合はどうなりますか? ボタンを押すのを見逃すでしょう。 センサーからの信号など、非常に迅速なイベントを探している場合はどうなりますか? かなり頻繁にポーリングする必要があり、プログラムは重大なイベントを見逃すことを恐れて他に何もできません。 ただし、割り込みを使用すると、イベントをキャッチすることが100%保証されます。 割り込みを使用すると、常に状態をチェックする必要がなくなり、計算能力が節約され、whileループが他のタスクにすばやく到達できるようになります。
ステップ1:回路の概要

最初の割り込みを作成するために構築する必要がある回路は次のとおりです。
...または、少なくとも、あなたが構築すべき回路です。 幸いなことに、ほとんどのArduinoボードには、まさにこの構成でLEDと抵抗が既に組み込まれています。 ソフトウェアで有効にすることができます。 残念ながら、組み込みの機能を使用するだけでは、進行中のすべてが表示されません! したがって、この回路図を研究し、それが何をしているのかを理解するのに時間をかける価値があります。 この正確な回路がArduinoに組み込まれているという事実は、それがどれほど重要であるかについての重要なヒントをすでに与えているはずです。
この回路の最も重要な部分は、+ 5Vに接続された20k抵抗です。 これはプルアップ抵抗と呼ばれます。 抵抗が+ 5VではなくGNDに接続されていた場合、プルダウン抵抗と呼ばれます(Arduinoにはプルダウン抵抗が組み込まれていないため、外部で追加する必要があります)。 プルアップ抵抗は、通常、+ 5Vで関連付けられているピンを保持します。 そのままにしておくと、ピンは常にHIGHになります。 ピンをGNDに直接接続すると(ボタンを閉じるなど)、ピンは0Vになり、LOWになります。 プルアップがなければ、ボタンを使って意味のあることをすることができませんでした。 pinMode(pin#、INPUT_PULLUP)を指定することにより、任意のArduinoピンを内部で+ 5Vに接続できます。 プルアップは、ピンが入力として設定されている場合にのみ意味があることに注意してください。 プルアップの詳細については、DigitalPinsページをご覧ください。
INTERRUPT_PINは、Arduino UNO(またはその他の328pベースのArduino)のピン2または3に行く必要があります。 他のArduinoについては、このページで割り込み可能なピンを確認してください。 コード例では、ピン2に配線します。ANY_PINに接続されたLEDは簡単な回路です。 Arduinoには既にピン13に接続されたLEDがありますので、それを使用しますが、別のピンの独自のLEDで回路を自由に変更してください。 Arduino LEDの横には「L」が付いています。
多くの場合、ボタンには4つのピンがあります。通常、2つのピンは、ボタンの同じ側にある他のピンに内部で接続されています。 ボタンを押しても何も起こらない場合は、常に接続されているピンではなく、ボタンが押されたときに接続するピンに実際に回路を配線したことを確認してください。
ステップ2:実際の配線

これらすべてを念頭に置いて、内部ArduinoプルアップとオンボードLEDを使用する場合、実際に配線する必要がある非常にシンプルな回路を次に示します。
ステップ3:コード

ここで指摘する価値のあることがいくつかあります。 最も興味深いのは、割り込みを構成する10行目です。 attachInterrupt()は3つの引数を取ります。 最初はピン番号ではなく、割り込み番号です。 これについて心配する必要はありません。必ず必ずdigitalPinToInterrupt(Pin#)を使用してください。そうすると、自動的に変換されます。 特定のピンのみを割り込みピンに変更できることを忘れないでください。 2番目の引数は、割り込みがトリガーされるたびにコードをジャンプさせる関数の名前です。 この関数が21行目にどのように定義されているかを確認できます。
attachInterrupt()の3番目の引数は、この場合、キーワードFALLINGです。 これは、ピン2の電圧がHIGHからLOWになると、割り込みがトリガーされることを意味します。 RISINGを指定することもできます。これは、電圧がLOWからHIGHになったときにトリガーされます。 または、CHANGEを使用することもできます。これは、電圧がいずれかの方向に変化するとトリガーされます。 私たちの回路では、ボタンを押すと電圧が高から低になり、ボタンを離すと高から低になります。 ボタンが切り替えられるたびにコードを2回トリガーしたくないので、RISINGまたはFALLINGを選択します。 アプリケーションは何か違うものを要求するかもしれません。
試してみる
コードをロードして、シリアルモニターを起動し、ボタンをクリックすると、LEDが意図したとおりに動作しないことがわかります。 ボタンを押すたびにLEDがオンとオフを繰り返すようにします。 ただし、ボタンを押すたびに数回点滅する可能性があります。 これは、ボタンが完璧ではないために発生します。 指がボタンを押している可能性がありますが、顕微鏡レベルで見ると、ボタンは実際には完全に閉じる前に複数回接点から跳ね返っています。 すべてのバウンスが割り込みをトリガーします。 私たちのシステムは非常に正確で敏感なので、実際に新しい問題を導入しました! これを修正するには、デバウンスとして知られるルーチンを使用して、割り込み検出の感度を下げます。
ステップ4:例

ここに私がホイップしたものがあります。 完璧ではありません。確かに優れた方法がありますが、ボタンの使用を開始するには十分なはずです。
基本的な考え方は、millis()関数を使用してボタンが最後に押された時間を記録することです。 (millis()関数は、スケッチの実行が開始されてから経過したミリ秒数を示します)。 前の割り込みトリガーが現在のトリガーの200ミリ秒未満前に発生した場合、ボタンがバウンスしている可能性が高いため、アクションは実行されません。 それ以外の場合、すべてが正常に行われます。 割り込み関数内で変更する変数は、割り込みとメインループで値が一致しないようにvolatileとして宣言する必要があります。
ステップ5:次は?
それでおしまい! ボタンをクリックするたびに、LEDの状態が変わります。 これで作業中の割り込みができました。 割り込みをプロジェクトに組み込む方法を想像するのはあなた次第です。 ご覧のとおり、タイミングと計算能力が重要な場合、割り込みは不可欠です。 次のガイドでは、ATMega328pを超低電力スリープモードにする方法について説明します。割り込みに頼って再び目を覚まします。 それまでは、Instructablesで購読し、www.doteverything.coの製品ページをご覧ください。 モノのインターネットデバイスであるDotを構築しています。これは、あなたがクールで便利なものになることを願っています。