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

---
この記事は [リンク情報システム](https://www.lis.co.jp) の「[2020新春アドベントカレンダー TechConnect!](https://qiita.com/dgkz/items/5131349d56354b33ee97)」のリレー記事です。
TechConnect! は~~勝手に始める~~アドベントカレンダーとして、engineer.hanzomon という~~勝手に作った~~グループによってリレーされます。
（リンク情報システム：[Facebook](https://www.facebook.com/lis.co.jp/)）


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

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


## 2.用意／準備したもの
- Arduino UNO
- 青色LED
- 抵抗 200Ω(青色LEDに付属している抵抗を使用)
- 人感センサー(人体感知センサーモジュール:HC-SR501)
- ブレッドボード
- ジャンパワイヤ(オス～オス)(オス～メス)


## 3.LEDの点灯／点滅の方法
まずはArduinoと電子部品を図1のように接続します。
LEDは足の長いほうを200Ωの抵抗に繋ぎ、足の短いほうをArduinoのGNDに接続します。
<img width="396" alt="LED接続.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/f8fc47a8-dc12-1c24-1736-93fefec42735.png">
図1:LEDの点灯／点滅におけるArduinoと電子部品の接続

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

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

```cpp: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回だけ実行される関数**で、<font color="crimson">各ピンの入出力を設定する</font>などといった<font color="DarkCyan">Arduinoの設定</font>を記述していきます。
上記の「sketch_LightingLED.ino」では、**pinMode**関数の<font color="DeepPink">第1引数でピン番号の指定</font>を12番ピンに指定、<font color="Blue">第2引数で入力か出力かの指定</font>を出力に指定しています。こうすることで、**「12番ピンをGPIOの出力として使用する」**ようにしています。

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

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

```cpp: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.人感センサーを扱う方法
####人感センサーの仕組み
人感センサーは、赤外線を利用した電子部品であり、<font color="crimson">焦電型赤外線センサー</font>と呼ばれることもあります。周囲と温度差のある人やモノが動く際におこる赤外線の変化量を検出、信号ピン(OUT)の電圧を変化させ、この電圧の変化をArduinoが読み取ることで、LEDやモータなどの制御に利用することができます。

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


![IMG_0027.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/6c895ef9-7a9e-3732-fa5d-8d8b9d05caff.png)
図2:動作モード切替ジャンパ


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

![IMG_0023.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/9c70637e-c9f1-e563-2574-396e2f4880b5.png)
図3:Arduinoと人感センサーの接続および各部のはたらき


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

```cpp: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のピンの指定を定数で行っています。
このスケッチでは**シリアル通信**という機能を使用して、センサーの状態を**文字情報としてシリアルモニタに表示**させています。
シリアルモニタは、<font color="DarkCyan">Arduino IDEの画面右上の**虫眼鏡アイコンをクリックする**と表示されます。</font>
実際の表示は図4(1)(2)のようになります。

<img width="694" alt="serialMonitor_MotionHhigh.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/f447e690-b394-5078-f7d9-f49966f651d9.png">
図4(1):センサーが感知した場合のシリアルモニタの表示


<img width="695" alt="serialMonitor_MotionLow.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/d7283df3-8366-f68c-89c5-63ea44a3f8a5.png">
図4(2):センサーが感知していない場合のシリアルモニタの表示


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


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

####Arduino～電子部品の接続
Arduinoと電子部品を図5のように接続します。
<img width="430" alt="LED_人感センサ.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/cef458c5-f4f2-87e8-b385-afaf3ba02d68.png">
図5:人感センサを用いてLEDを制御する場合のArduinoと電子部品の接続

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

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

```cpp: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に転送したら、人感センサーの前で動いてみたり、人感センサーの前でじっとしていたり、人感センサーから離れたりしてみましょう。
<font color="OrangeRed">人の動きを検出した場合はLEDが点灯し</font>、<font color="Blue">センサーから人がいなくなったり、センサーの前でじっとしていると数秒後にLEDが点滅しはじめる</font>はずです。うまくいかない場合は、モジュールに取り付けてある「感知範囲調整ツマミ(図3)」で人感センサーの感度を調整してみましょう。また、モジュールに取り付けてある「HIGH信号出力時間調整ツマミ(図3)」で、センサーが最後の検知をしてからLEDが点滅しはじめるまでの時間を調整できます。
![IMG_0016.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/1e0d565e-5dbf-bcea-bf19-eda7ae6735fa.jpeg)
図6:実行例

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

**Arduino電子工作としての**今後の展望として、
・[PWM制御を用いた簡易扇風機](https://qiita.com/t_slash_k/items/ebf2bc1cb376d461c54a)をArduinoでも実装してみる
・人感センサーのみならず、様々なセンサーを使ってみる
・LEDのみならず、モーターやサーボモータなどの様々な部品を使ってみる

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

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

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

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