55
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Arduino電子工作~超簡単に人感センサーを扱う~

Last updated at Posted at 2020-01-27

この記事は リンク情報システム の「2020新春アドベントカレンダー TechConnect!」のリレー記事です。
TechConnect! は勝手に始めるアドベントカレンダーとして、engineer.hanzomon という勝手に作ったグループによってリレーされます。
(リンク情報システム:Facebook

1.仕様

そもそも「Arduino」とは

かなり雑に説明すると、ArduinoはAVRという種類のマイクロコンピュータが1つの基盤上に実装されたマイコンボードです。
Arduino言語と呼ばれる独自のプログラミング言語や、開発を行うソフトウェアであるArduino IDEも用意されており、価格も原則は安価であることも特徴です。
Arduinoの基盤には種類が様々ありますが、今回は一番メジャーなArduino UNOを使用しました。

今回作成したもの

実は筆者、Arduinoに触れるのは今回の記事が初めてで、前回の記事でラズパイ電子工作した際はいきなりモーターを動かしていたこともあり、今回の記事執筆にあたり、当初は**「まずは基礎となるLチカから始めよう!」**と考えてました。しかし、Lチカだけではつまらないと考え、センサーも使ってみたいとも考えていたので、人感センサーを用いてLEDの動作を制御するものを作ってみました。
製作物の大まかな仕様は以下の通りです。
・人感センサーが反応した(センサーが人や物体を検知した)場合
 →青色LEDが点灯
・人感センサーが反応していない場合
 →青色LEDが点滅

2.用意/準備したもの

  • Arduino UNO
  • 青色LED
  • 抵抗 200Ω(青色LEDに付属している抵抗を使用)
  • 人感センサー(人体感知センサーモジュール:HC-SR501)
  • ブレッドボード
  • ジャンパワイヤ(オス~オス)(オス~メス)

3.LEDの点灯/点滅の方法

まずはArduinoと電子部品を図1のように接続します。
LEDは足の長いほうを200Ωの抵抗に繋ぎ、足の短いほうをArduinoのGNDに接続します。
LED接続.PNG
図1:LEDの点灯/点滅におけるArduinoと電子部品の接続

Arduinoでは、電子部品の制御はスケッチと呼ばれるプログラムコードをメインとして行われるため、LEDの点灯/点滅の動作くらいなら専用の電子回路を組まなくても簡単にできます。

####LEDの点灯
動作としては、スケッチを実行するとLEDがずっと点灯します。
LEDを点灯させるだけならばArduinoを使わずとも電源とLEDと抵抗を直列接続すれば実現可能ですが、基礎を理解するためにここでは敢えて触れておきます。
まずは以下のスケッチを記述します。

sketch_LightingLED.ino
void setup() 
{
  // put your setup code here, to run once:
  // 12番ピンをGPIOの出力として使用する
  pinMode(12,OUTPUT);
}

void loop() 
{
  // put your main code here, to run repeatedly:
  // 12番ピンに電気を流す
  digitalWrite(12,HIGH);
}

Arduinoのスケッチは最初からsetup関数loop関数が用意されており、この2つの関数はArduinoのスケッチでは必ず使用します。
この2つの関数の役割を以下に記述します。
setup関数
setup関数は、Arduino起動時に1回だけ実行される関数で、各ピンの入出力を設定するなどといったArduinoの設定を記述していきます。
上記の「sketch_LightingLED.ino」では、pinMode関数の第1引数でピン番号の指定を12番ピンに指定、第2引数で入力か出力かの指定を出力に指定しています。こうすることで、**「12番ピンをGPIOの出力として使用する」**ようにしています。

loop関数
loop関数は、setup関数の実行終了時に繰り返し実行される関数で、電子部品の制御などといった実際の処理を記述していきます。
上記の「sketch_LightingLED.ino」では、digitalWrite関数の第1引数でピン番号の指定を12番ピンに指定、第2引数で電気信号の出力状態をHIGHに指定しています。

####LEDの点滅
動作としては、スケッチを実行するとLEDが点滅します。
実際に電子回路だけで組むよりも圧倒的に簡単に実現できます。
Arduinoと電子部品の接続は図1から変えずに、以下のスケッチを記述します。

sketch_FlashingLED.ino
void setup() 
{
  // put your setup code here, to run once:
  // 12番ピンをGPIOの出力として使用する
  pinMode(12,OUTPUT);
}

void loop() 
{
  // put your main code here, to run repeatedly:
  // 12番ピンの出力を”1”にする
  digitalWrite(12,HIGH);
  delay(500);
  // 12番ピンの出力を”0”にする
  digitalWrite(12,LOW);
  delay(500);
}

動作としては、
①LEDが接続されている12番ピンの出力を“HIGH”にしてLEDを点灯させる

②その状態で500ミリ秒待機

③LEDが接続されている12番ピンの出力を“LOW”にしてLEDを消灯させる

④その状態で500ミリ秒待機

の①~④を繰り返すことで、LEDを点滅させます。
②及び④の**「その状態で500ミリ秒待機」**という動作は、delay関数を用いて行います。この関数の引数の値(単位はミリ秒)を変化させることで、待機時間が変わり、このスケッチの場合はLEDの点滅周期を変化させることができます。

4.人感センサーを扱う方法

####人感センサーの仕組み
人感センサーは、赤外線を利用した電子部品であり、焦電型赤外線センサーと呼ばれることもあります。周囲と温度差のある人やモノが動く際におこる赤外線の変化量を検出、信号ピン(OUT)の電圧を変化させ、この電圧の変化をArduinoが読み取ることで、LEDやモータなどの制御に利用することができます。

####人感センサーの前準備
今回使用した人感センサーモジュール[HC-SR501]には、
・L:検知後、出力信号がHIGHになった後はLOWになるまで再検知しない
・H:検知後、出力信号がHIGHになった状態でも検知を続け、最後の検知から設定時間後にLOWになる
上記の2つの動作モードがあり、モジュール基板上のジャンパの差し込みで「L」「H」を切り替えます(図2)。今回は「H」に設定します。

IMG_0027.PNG
図2:動作モード切替ジャンパ

####人感センサーの動きを確認する
まずは図3の指定のようにArduinoと人感センサーを接続します。また、この際に「HIGH信号出力時間調整」ツマミを反時計回しいっぱい(最短)に設定します。

IMG_0023.PNG
図3:Arduinoと人感センサーの接続および各部のはたらき

また、以下のスケッチを記述します。

sketch_MotionSensor.ino
#define SENSOR 8

void setup() 
{
  // put your setup code here, to run once:
  // センサーをつないだピン(8番ピン)をGPIOの入力として使用する
  pinMode(SENSOR, INPUT);
  // シリアルモニタ表示用にシリアル通信を行う
  // パソコンとのシリアル通信を行うための通信速度を115200bpsに指定する
  Serial.begin(115200);
}

void loop() 
{
  // put your main code here, to run repeatedly:
  // センサーからの電圧を読み取り、その値から動作を分岐する
  // 読み取った値が”High”(センサーが感知した場合)
  if(digitalRead(SENSOR))
  {
    // シリアルモニタに”High"と文字列を送信
    Serial.println("High");
  }
  // 読み取った値が”Low”(センサーが感知していない場合)
  else
  {
    // シリアルモニタに”Low"と文字列を送信
    Serial.println("Low");
  }
}

このスケッチの一番上で**#define SENSOR 8と記述されていますが、Arduinoの#defineはC言語の#defineと同じ意味を持っております。このスケッチではArduinoのピンの指定を定数で行っています。
このスケッチでは
シリアル通信という機能を使用して、センサーの状態を文字情報としてシリアルモニタに表示させています。
シリアルモニタは、Arduino IDEの画面右上の
虫眼鏡アイコンをクリックする**と表示されます。
実際の表示は図4(1)(2)のようになります。

serialMonitor_MotionHhigh.PNG 図4(1):センサーが感知した場合のシリアルモニタの表示 serialMonitor_MotionLow.PNG 図4(2):センサーが感知していない場合のシリアルモニタの表示

スケッチをArduinoに転送したら、人感センサーの前で動いてみたり、人感センサーの前でじっとしていたり、人感センサーから離れたりしてみましょう。
人の動きがある場合は「High」センサーから人がいなくなったり、センサーの前でじっとしていると「Low」と表示されるはずです。うまくいかない場合は、モジュールに取り付けてある「感知範囲調整ツマミ(図3)」で人感センサーの感度を調整してみましょう。また、起動直後は人感センサーの挙動が安定しない場合があります。

5.人感センサーを用いてLEDを制御する

さて、ここまでArduinoにおけるLED及び人感センサーの基本的な使い方を一通り実践しました。これらを結合組み合わせて人感センサーからLEDを制御してみます。
仕様は前述のとおりですが、記事をかなり遡ることになりそうなので改めて以下に記述します。
・人感センサーが反応した(センサーが人や物体を検知した)場合
 →青色LEDが点灯
・人感センサーが反応していない場合
 →青色LEDが点滅

####Arduino~電子部品の接続
Arduinoと電子部品を図5のように接続します。
LED_人感センサ.PNG
図5:人感センサを用いてLEDを制御する場合のArduinoと電子部品の接続

実際に電子回路を組むよりも簡単に接続/実装ができてしまいます。
Arduino~電子部品の接続が完了したら、スケッチを記述します。

####スケッチの記述
以下のようなスケッチを記述します。

sketch_MotionLED_Flashing.ino
#define SENSOR 8
#define LED1 12

void setup() 
{
  // put your setup code here, to run once:
  // センサーをつないだピン(8番ピン)をGPIOの入力として使用する
  pinMode(SENSOR, INPUT);
  // LEDをつないだピン(12番ピン)をGPIOの出力として使用する
  pinMode(LED1,OUTPUT);
}

void loop() 
{
  // put your main code here, to run repeatedly:
  // センサーからの電圧を読み取り、その値から動作を分岐する
  // 読み取った値が”High”(センサーが感知した場合)
  if(digitalRead(SENSOR))
  {
    // LED1を点灯状態にする
    digitalWrite(LED1,HIGH);
  }
  // 読み取った値が”Low”(センサーが感知していない場合)
  else
  {
    // LED1を点滅状態にする
    digitalWrite(LED1,LOW);
    delay(900);
    digitalWrite(LED1,HIGH);
    delay(100);
  }
}

......スケッチもそこまで難しい記述はしていません。
スケッチをArduinoに転送したら、人感センサーの前で動いてみたり、人感センサーの前でじっとしていたり、人感センサーから離れたりしてみましょう。
人の動きを検出した場合はLEDが点灯しセンサーから人がいなくなったり、センサーの前でじっとしていると数秒後にLEDが点滅しはじめるはずです。うまくいかない場合は、モジュールに取り付けてある「感知範囲調整ツマミ(図3)」で人感センサーの感度を調整してみましょう。また、モジュールに取り付けてある「HIGH信号出力時間調整ツマミ(図3)」で、センサーが最後の検知をしてからLEDが点滅しはじめるまでの時間を調整できます。
IMG_0016.JPG
図6:実行例

##6.終わりに
今回も例に漏れず電子工作の記事を執筆したのですが、実はArduinoに触れたのは今回が初めてです。前回はRaspberry Piを用いた電子工作について触れましたが、今回の記事でRaspberry Piを用いた電子工作とArduinoを用いた電子工作を一通り実施しました。
この2つの電子工作を実施した個人的な感想として、
・Raspberry Piはコンピュータであり、主にソフトウェア系技術の勉強やソフトウェアがらみの複雑な処理を必要とするモノづくり向け
・Arduinoはマイコンボードであり、電子工作を行う上で「回路を基板上に組む」だけでは到底難しいことを簡単に実装するモノづくり向け
といった点を挙げたいと思います。あくまで個人の感想です。
今回の記事のような簡単な「実装」ならArduinoで十分かなぁと思います。とはいえ、筆者は「この実装をラズパイ(Raspberry Pi)でも実装してみたい」とも考えてます。

Arduino電子工作としての今後の展望として、
PWM制御を用いた簡易扇風機をArduinoでも実装してみる
・人感センサーのみならず、様々なセンサーを使ってみる
・LEDのみならず、モーターやサーボモータなどの様々な部品を使ってみる

………すごいざっくりしてますが、やってみたいことは多いです。
「Arduino初めての状態から短い開発期間で人感センサーを扱えたあたり、自分の中で結構自信が湧いてきた」というのが一番の理由です。
そして、今回Arduino電子工作を実践した際も、「電子工作の形態の多様化」「自分もしかしたらこんなものも作れるかもしれない」という自分への新たな可能性を改めて感じました。

さて、本アドベントカレンダーの前日の記事にも話題が挙がっておりますように、2020年度から小学校/中学校/高校で本格的にプログラミング教育が始まります。「どうせ出来ない」なんて言うのはやめて、**この機会にArduinoを用いた電子工作に触れてみるのはいかがでしょうか。**最初は苦手でも、触れていくうちに「(プログラミング含め)ものづくりってやっぱ楽しい!」と感じるでしょう。
あとがきがラズパイ電子工作の時と似たようなこと言ってる気がする...

(予告)
明日は@o-changさんが記事執筆を担当します。

(広告)
リンク情報システムでは一緒に働く仲間を随時募集しています。
また、お仕事のご依頼、ビジネスパートナー様も募集しております。
お気軽にご連絡ください。

55
55
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
55

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?