ホールセンサーの種類と使い方(割込み編)
どもです。
前回に引き続き、今回もホールセンサーについてです。
1.前回からの違い
前回のエントリでは、ホールセンサーの電圧値を「アナログ値」でとして読み込んでいました。
また、読込みは「loop()」関数の中で行っていました。
しかし、この方法では、処理内容によっては、磁石が近づいたことの検知を逃してしまう可能性があります。
そこで今回は、「ホールセンサーによる割込み」について書いていきます。
2.割込んでみた
早速ですが、コードです。
/**
* @file ホールセンサーのサンプルプログラム
* ホールセンサが近づいたコトを、割り込みで検出する。
*/
#include "Arduino.h"
int interruptCountPrev = 0;
int interruptCount = 0;
int interruptPin = 2;
/**
* @brief セットアップの実行
*/
void setup()
{
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), interruptHandler, FALLING);
interruptCount = 0;
Serial.begin(9600);
}
/**
* @brief メインループ
*/
void loop()
{
if (interruptCountPrev != interruptCount) {
Serial.print("interruptCount = ");
Serial.println(interruptCount);
interruptCountPrev = interruptCount;
}
delay(200);
}
/**
* @brief 割込みハンドラ
*/
void interruptHandler()
{
interruptCount++;
}
内容としては、コレまで書いてきたコードからほとんど変わりはありません。
違いとしては、setup()内の
attachInterrupt(digitalPinToInterrupt(interruptPin), interruptHandler, FALLING);
の部分です。
コレまでのコードでは、「attachInterrupt()」の第3引数は「RISING」でしたが、ココでは「FALLING」としています。
前回の投稿で載せたグラフから読み取れるように、ホールセンサでは磁石を近づけると出力(電位)が下がります。
そのため、この「電位が下がった」コトをトリガーに割り込みを発生させるために、設定を変更しています。
それ以外のコードは、大きく変化していません。
すなわち、「流用が可能!」というコトです!!
このコードを実機に書き込んで実行すると、通常は何も表示されません。
しかし磁石を近づけると、「interruptCount = xxx」という形式で、「割り込み」が発生した回数、前述のコードでは「interruptCount」の値、「interruptHandlerが実行された回数」が都度表示されます。
また、近づけた磁石をセンサーから「遠ざけた」際には、割り込みは発生しません。
すなわち、期待するタイミングでのみ、割り込みが発生していることが分かります。
3.まとめ
2回連続で、arduinoによるホールセンサーの電位の読み取りについて記載しました。
その中で、アナログ/デジタルの両方でセンサーの出力の読み取りについて書きました。
特にデジタルの読み取りについては、「割込み処理」が可能であること、およびそのコードについて書きました。
ここ数回のエントリの中で、ホールセンサについて書き、その使い方やできること、やり方が分かってきました。
使いこなす…ためには、もう少しH/Wの理解が必要です。
今後、それも含めて何かネタができれば、書いていきます。
ではっ!
ディスカッション
コメント一覧
まだ、コメントがありません