PR

123d CircuitsとArduino実機で電子工作(4)

2017年2月9日(木)
青柳 良介

はじめに

今回は、「焦電センサ(人感センサ)」を使用した電子工作について解説します。

焦電センサは、人体から放出される赤外線(熱エネルギー)を検出して内部の圧電素子を変化させ、電圧のON/OFFをArduino側へ出力するセンサです。比較的に遠くまで離すことが可能で、今回使用する焦電センサ(SB612A)は8mほど離れていても検出が可能となっています(気候により距離は変動)。

焦電型赤外線センサーモジュール SB612A(秋月電子)

光が遮断されることで物体を検出する光電センサとは異なり、焦電センサは検出エリア内で物体(対象物)が停止していると検出しない特徴があります。そのため、人が検出エリアに入り込んだまま停止後、しばらくしてまた動き出すと2度目の検出をすることになります。

焦電センサの動作をシミュレーションしてみよう

それでは、さっそく焦電センサの動作を確認してみましょう。まず、123d Circuitsでシミュレーションしてみます。焦電センサが物体を検出したらLEDを点灯させるようにします。

まず、焦電センサのピンの配置を確認しておきましょう。現物を拡大すると表記があります。

今回使用する部品は、以下の5点です。抵抗は忘れずに数値(330Ω)を設定しておきましょう。

実体配線図は、以下のとおりです。

配線が終了したら、画面上部の「Code Editor」をクリックして、以下のスケッチを記述します。

int pinNum; //各ピン番号用の変数
int pirSensor = 2; //焦電センサを2番ピン
int pushSwitch = 3; //PUSHスイッチを3番ピン

void setup()
{
  //4番ピン~13番ピンをOUTPUTに設定
  for (pinNum = 4; pinNum < 14; pinNum++) {
    pinMode(pinNum, OUTPUT);
  }
  pinNum = 4;  //最初は4番ピンのLEDから点灯

  pinMode(pirSensor, INPUT);
  pinMode(pushSwitch, INPUT_PULLUP);  //内蔵のプルアップ抵抗を有効にしています。
  //焦電センサの出力をトリガーに割り込み信号出力
  attachInterrupt(digitalPinToInterrupt(pirSensor), ledControl, RISING);
}

void loop() {}

//---LEDの点灯---------------------------
void ledControl()
{
  int pirLevel;   //PUSHスイッチの値を格納する変数

  pirLevel = digitalRead(pirSensor);
  if (pirLevel == HIGH) {
    while (1) {
      for (pinNum = 4; pinNum < 13; pinNum++) {
        digitalWrite(pinNum, HIGH);
        delay(2000);
        digitalWrite(pinNum, LOW);
        delay(2000);
      }
      for (pinNum = 13 ; pinNum > 4; pinNum--) {
        digitalWrite(pinNum, HIGH);
        delay(2000);
        digitalWrite(pinNum, LOW);
        delay(2000);
      }

      int switchLevel;  //PUSHスイッチの値を格納する変数

      //スイッチが押されたらループを抜ける
      switchLevel = digitalRead(pushSwitch);
      if (switchLevel == LOW) {
        break;
      }
    }
  }
}

このスケッチで使用している関数について、簡単に説明します。

pinMode(pushSwitch, INPUT_PULLUP);
セットアップの段階でプルアップ抵抗を有効にしています。

プルアップ抵抗とは

マイコン(MCU)は、例えば電圧が3V以上なら5V(HIGH)と、1.5V以下なら0V(LOW)といったように電圧を判断しています。このような判断の境目を「しきい値(閾値)」といいます。Arduino UnoのAVRマイコン(ATmega328)では2.5V辺りが閾値になっています。そして、実は電気回路には常に(微妙な)電気(ノイズなど)が流れているため、誤作動が起きないように回路の電圧値を5V(HIGH)か0V(LOW)のどちらかに確実にしてあげる必要があります。

そのために必要なものとして「プルアップ(抵抗)」があります。下図のようにSW1(スイッチ)がOFFのとき、Arduino側は常に5V(HIGH)の状態です。

スイッチがOFFの場合

そしてSW1(スイッチ)がONになると電気はGND側へ流れて、Arduino側は0V(LOW)の状態になります。

スイッチをONにした場合

つまり、

①SW1がOFF(スイッチを押していないとき)、Arduino側は5V(HIGH)
②SW1がON(スイッチを押しているとき)、Arduino側が0V(LOW)
※①は後ほどのシミュレーション実行時にマルチメーターが5Vになることで確認できる

本来は上図のように電源側(Vcc)とArduinoのGPIO(ピン)の間に抵抗を挟みますが、Arduinoはマイコン内部にプルアップ抵抗が内蔵されています。Arduinoのスケッチのセットアップ時に「pinMode(pinNo,INPUT_PULLUP)」と設定することで内蔵されたプルアップ抵抗の機能を使うことができます。

焦電センサが対象物を検知したら、LEDを点灯させます。ここでは外部割り込み信号をタイミングとしています。

割り込みとは

「割り込み」とは、文字通り処理中のプログラムをいったん停止させて、別のプログラムを優先的に実行させるために割り込む処理のことです。プログラムの実行中に外部からの信号、例えば次のような動作を検知して、これらのタイミングで割り込みを発生させるなど、さまざまなものがあります。

  • スイッチが押された
  • センサがある値を検知した

シングルタスクのマイコンでは、この割り込み処理を駆使してさまざまなタスク処理を実行していくことになります。また、delay関数の遅延(待ち時間)が発生している際に割り込みが発生すると、delay処理よりも優先的に割り込み処理が実行されます。

この割り込み処理には 外部割り込み関数のattachInterrupt() を使用します。割り込みが発生したときに実行する処理(関数)を指定します(※注:Arduino Unoの場合、外部割り込みは2番ピンと3番ピンのみで使用可能)。

attachInterruptでは、以下のようなパラメータを指定します。

attachInterrupt( interrupt, function, mode)
①Interrupt:割込番号(通常は0または1をdigitalPinToInterrupt()のパラメーターに指定)
②function(ISR):割り込み発生時に呼び出す関数を指定
③mode:割り込みを発生させるトリガー(タイミング)
今回digitalPinToInterrupt()は焦電センサからの入力を割込に設定

③のmodeには以下のような指定が可能です。

LOW:ピンがLOWのときに割り込みを発生
CHANGE:値が変化するたびに割り込みを発生
RISING:ピンの状態がLOWからHIGHに変化するときに割り込みが発生
FALLING:ピンの状態がHIGHからLOWに変化するときに割り込みが発生

上記スケッチのattachInterrupt(digitalPinToInterrupt(pirSensor), ledControl, RISING)では、焦電センサ(pirSensor)が対象物を検知した際に(RISING)、割り込み信号でLEDの点灯(ledControl)を開始しています。

それでは、シミュレーションを開始してみましょう。開始してみるとわかりますが、プッシュスイッチ部分のテスタ(マルチメーター)の電圧は既にHIGHになっています。そのため、HIGHからLOWになった場合に出力信号をONにする必要があります。

実際に焦電センサが対象物を検出するとLEDが点灯します。

プッシュスイッチを押すとテスタの電圧が0Vになります。0VになったことをトリガーとしてLEDは消灯します。

Arduino Unoの実機で試してみよう

いかがですか。うまくシミュレーションできたでしょうか。それでは、今度はArduino Unoの実機で動作させてみましょう。焦電センサにはオスーメス型のジャンパワイヤ(片側がオス、もう片側がメス)を接続しています。

ブレッドボードへの配線はジャンパワイヤの種類がなく123d Circuitsでのシミュレーション時とは若干異なっていますが、以下のようになります(※注:330Ω以下の抵抗が不足していたため510Ωのものを使用しています)。

それでは動作させてみましょう。delay関数の値を変えることでLEDの点灯速度を調節できます。実際のLEDの点灯はシミュレーションよりもずっと速いかと思います(単にシミュレーション側の処理が遅いだけ)。また、実際の動作では焦電センサも反応がマチマチだったりすることもあります。

画像ではわかりにくいと思いますので、動画で示します。

おわりに

前回から2回にわたって、離れた位置の対象物を検出するセンサを紹介しました。照度センサや温度センサなどと組み合わせて使用することで、さまざまなものをトリガーにして動作させることができます。ぜひ、身の回りのもので色々と検出してみてください。

次回は、これまでに解説した内容を駆使して、誕生日等の記念日に使えるちょっと面白い仕掛けを紹介します。

Blooomin代表。半導体ベンチャーや米系通信機器メーカーを経て、組み込みシステムのコンサルディングからフィジカル・コンピューティングのコンテンツ開発などに従事。ハードやソフトにおける設計から保守までの勘所を横断的に網羅しております。
Blooomin:https://blooomin.com

連載記事一覧

Think IT会員サービスのご案内

Think ITでは、より付加価値の高いコンテンツを会員サービスとして提供しています。会員登録を済ませてThink ITのWebサイトにログインすることでさまざまな限定特典を入手できるようになります。

Think IT会員サービスのご案内

関連記事