ホールセンサーの種類と使い方(割込み編)

2021年2月9日

どもです。
前回に引き続き、今回もホールセンサーについてです。

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の理解が必要です。
今後、それも含めて何かネタができれば、書いていきます。

ではっ!