Arduino電子工作～センサーとウォーターポンプで自動手指消毒器を作る～


本記事は[リンク情報システム](https://www.lis.co.jp/)の~~勝手に始める~~「[2021新春アドベントカレンダー Tech Connect](https://qiita.com/dgkz/items/eabde6515457d8acec9b)」のリレー記事です。
engineer.hanzomon のグループメンバによってリレーされています。
（リンク情報システム：[Facebook](https://www.facebook.com/lis.co.jp/)）
（リンク情報システム：[Twitter](https://twitter.com/liscojp)）

......アドベントカレンダーも明日で最終日だというのに、
前例に漏れず電子工作系の記事しか書いていない執筆者はいったい誰でしょう。
そう、私です。

今回はこのご時世に便乗した記事をお届けします。
ちなみに今日から2月です。

##0．背景
このご時世から簡単に察しが付くと思いますが、
新型コロナウイルス感染拡大防止の観点から、最近ではスーパーや家電量販店、飲食店の入口にアルコール消毒液が置かれていることが多いです。中には、**手をかざすだけでアルコール消毒液が出てくるタイプ**のものもあります。
今回は、「**Arduino使えば簡単に「自動手指消毒器」作れるんじゃね？**」と筆者は考え、実際にそれっぽく作ってみました。

##1．仕様
####Arduinoについて
[前回の記事](https://qiita.com/t_slash_k/items/a0565deb5d0de53697b9)でも説明しましたが、もう一度雑に説明すると、ArduinoはAVRという種類のマイクロコンピュータが1つの基盤上に実装された**マイコンボード**です。
今回も、一番メジャーな**Arduino UNO**を使用しました。

####今回作成したもの
今回の記事では、パイプに括り付けたセンサーに手をかざすと、ウォーターポンプが作動してパイプから一定量のアルコール消毒液が噴射される**自動手指消毒器**をArduinoでの制御を用いて作成しました。

##2．用意／準備したもの
- Arduino UNO
- ウォーターポンプ(後述)
- 抵抗 
    - 5.1kΩ：×4
    - 220Ω：×1
- フォトリフレクタ(反射センサー)
    - RPR-220 
- トランジスタ
    - 2SC2120
- ダイオード
    - 1N4148 
- ブレッドボード
- ジャンパワイヤ(オス～オス)(オス～メス)


####ウォーターポンプについて
「ウォーターポンプ」と一口で記述されても、自動車や給湯器などに使われているものから、水槽や家庭園芸に使われている小型サイズのものまでピンキリあります。
今回は**「手をかざすとセンサーが反応してアルコールが出てくる」**という仕様を満たせばよいため、小型サイズのものを使用しました。
[コチラになります](https://www.amazon.co.jp/WayinTop-%E5%B0%8F%E5%9E%8B%E3%83%9D%E3%83%B3%E3%83%97-%E6%B0%B4%E4%B8%AD%E3%83%9D%E3%83%B3%E3%83%97-%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%BF%E3%83%BC-%E3%82%AC%E3%83%BC%E3%83%87%E3%83%8B%E3%83%B3%E3%82%B0/dp/B07VNDY385/ref=sr_1_23?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&dchild=1&keywords=%E5%B0%8F%E5%9E%8B%E3%83%9D%E3%83%B3%E3%83%97&qid=1611498484&sr=8-23)。
また、今回使用したウォーターポンプは2本線で、3V~5Vの電源を直接つなげば「ブィィィィィ……」と静かに音を立てて回りだすので、実質**ただのDCモーター**と考えて問題ないでしょう。

##3．Arduinoと電子部品の配線
####回路について
今回製作する自動手指消毒器の回路図を以下に示します。
![kairozu.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/59ae008f-510e-1402-20d1-97e80a2e0e65.png)

まずは前提として、**モーターの動作には<font color="Red">数百mA~数十Aの大電流を消費します。</font>**Arduinoのピンからでは電流が小さいため、Arduinoもラズパイの場合と同様に、**モーターを直接制御できません。**
そこで今回は**トランジスタ2SC2120を介して、Arduinoでのモーター制御を行う**ようにしました。
また、今回の記事ではウォーターポンプ(モーター)に流す電流は一方向のみであるため、モーターには逆起電力防止のダイオードを、トランジスタのB(ベース)端子にはArduinoから流れる電流を制限するための抵抗をつけておきます。

また、今回の回路で実装する部品の一部には**向きがあります。**
以下に紹介します。

####トランジスタ(2SC2120)
**トランジスタの役割は増幅とスイッチング**で、ベースに微弱な電流を流すと、大電流を扱えるコレクタ～エミッタ間にも電流を流すことができます。
今回使用するトランジスタには端子が3本生えていますが、
<font color="Blue">平らな面を見た際、左から**E(エミッタ)、C(コレクタ)、B(ベース)**</font>となります(下図。[「いらすとや」様から元画像をお借りしました。](https://www.irasutoya.com/2018/07/blog-post_38.html))。
![IMG_0060.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/62c19f06-9323-1173-8a12-9538fb9a6cf8.jpeg)

####フォトリフレクタ(RPR-220)
光源と受光部が1つの部品にまとまった反射センサーです。光源から発光された光を物体が反射して、反射した光を受光部のフォトトランジスタが受光する仕組みとなっています。また、受光部のフォトトランジスタは、受光した光量によって抵抗値が変わる仕組みのため、アナログピンでの入力となっています。
ピン配置としては、切り欠き部分ある(下図右上)方が受光部となっており、下図の左下から時計回りに①～④と端子を割り振ると①②が光源(赤外線LED)、③④が受光部(フォトトランジスタ)となります。足の短い②と③がGNDに接続するようにします。

![IMG_E0062.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/a41c9aaf-e990-3e43-18a6-fc4f162ddead.jpeg)


####ダイオード(1N4148)
ダイオードの向きとしては、黒または白い線が描かれている端子側がカソードとなります(下図)。
![IMG_E0061.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/6871187f-f8b9-5f8d-f3af-d433e83772c4.jpeg)

今回の回路におけるダイオードは、**モーターを止める際、モーターから発生する電気の逆流を防ぐために使用します。**そのため、<font color="Red">電源のプラス側にカソードを接続します。</font>
一般的には、アノードを＋側、カソードを－側に繋ぐことが多いです。

####ウォーターポンプ
今回使用したウォーターポンプは、普通のDCモーターと違い、逆方向には回せません。**赤い線を電源の+側、黒い線をトランジスタのコレクタ側に繋ぎます。**


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


```c:sketch_PhotoRefrector_Motor1.ino
#define ANALOG_0 0
#define MOTOR1 7
#define THRESHOLD 10
#define MOTOR1_ONTIME 500

void setup() {
  // put your setup code here, to run once:
  // シリアルモニタ表示用にシリアル通信を行う
  // パソコンとのシリアル通信を行うための通信速度を9600bpsに指定する
  Serial.begin(9600) ;
  pinMode(MOTOR1,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  int iCnt = 0; // 誤反応によるチャタリング防止策(カウント)

  // 誤反応によるチャタリング防止策(for文)
  for(int i=0; i<4; i++)
  {
    Serial.println(i) ; 
    Serial.println( iCnt ) ; 

    //　フォトリフレクタ(センサ)からの距離を測定
    int SensorValue = Sensor(); // センサ入力値

    // センサ入力値が閾値以下(センサーとの距離が)の場合カウントを1上げる
    if(SensorValue < THRESHOLD)
    {
      iCnt++;
    }

    // センサ入力値が閾値以下且つカウントが1以下ならウォーターポンプ(モータ)を1秒間作動 
    if(SensorValue < THRESHOLD && iCnt <= 1)
    {
      digitalWrite(MOTOR1,HIGH);
    }
    else
    {
      digitalWrite(MOTOR1,LOW);
    }
    // MOTOR1_ONTIMEで定義した値のミリ秒(ms)だけ動作させる
    delay(MOTOR1_ONTIME); 
  }

    // ウォーターポンプ(モータ)を停止
    digitalWrite(MOTOR1,LOW);
}

// フォトリフレクタからの距離(センサ入力値)を測定する関数
int Sensor() {
  int SensorDistance;
  SensorDistance = analogRead(ANALOG_0) ;   // アナログ入力A0ピンからセンサ入力値を読み込む
  Serial.println(SensorDistance) ;   // シリアルモニターへ表示
  return SensorDistance;     // センサ入力値を戻り値とする
}
```


>・フォトリフレクタからの距離(センサ入力値)をシリアルモニタで表示およびPCとシリアル通信を行い、
・あらかじめ定義した閾値(THRESHOLD)よりもフォトリフレクタからの距離(センサ入力値)が小さい場合、一定時間(MOTOR1_ONTIME[msec])ウォーターポンプを作動させる

といったことを本来スケッチで実施したかったのですが、
今回使用したセンサーの誤反応が多かったため、<font color="Blue">「誤反応によるチャタリング、誤動作をなるべく減らそう」</font>ということで、上記スケッチでは苦肉の策で、以下の処理を追加しました。
>・センサ入力値測定～ウォーターポンプ動作後停止までの一連のフローを、**センサ入力値測定5回分をfor文で処理の1周期**とし、
・<font color="FF1166">あらかじめ定義した閾値(THRESHOLD)よりもフォトリフレクタからの距離(センサ入力値)が小さい</font>場合、**動作可能カウント(iCnt)をインクリメント**し、
・<font color="FF6611">動作可能カウント(iCnt)の値が1以下</font>の場合、**一定時間(MOTOR1_ONTIME[msec])ウォーターポンプを作動させる**

上記のようにしたところ、ウォーターポンプの暴走は減りました。
フォトリフレクタ周りの回路にも原因はありそうですが、~~時間がなかったため~~今回は割愛します。**今後の課題です...読者の皆様からもご意見等御座いましたら是非...**~~(丸投げ)~~

##5．実際に動かす
回路を組み上げ、上記スケッチをArduinoに送信し、アルコール消毒液が入った容器にウォーターポンプを沈めたら、
![IMG_0054.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/c32fbd4e-1c6a-123d-8eb5-1a88216af440.jpeg)


電源となる電池ボックスに単3電池を3本入れ、センサー(フォトリフレクタ)に手をかざしてみましょう。
すると、**ウォーターポンプをつないだ管から、アルコール消毒液が一定量出てきます。**
![IMG_0056.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317905/7df2d7e5-7ba0-08be-c7ea-3bf9ebb8ccbd.jpeg)

これは実際に動かして分かったことなのですが、**ウォーターポンプの動作停止後もアルコール消毒液が出涸らしの如く管からちょろちょろ出てきていました。**

...ちなみに今回はあくまで動作確認ですので、牛乳パックを容器として使いました。

##6．終わりに
筆者は今回の記事で初めて「ウォーターポンプ」という部品に触れてみたのですが、<font color="1585FF">自分が思っていたよりも使いやすく、アイデア次第では様々な応用が利きそうだ</font>と感じました。
本記事で課題や改善点こそ残しましたが、**<font color="1515FF">「自動手指消毒器は自作できる」</font>**事が証明できたので~~結果オーライ~~**楽しかったです。**
~~まあ買った方が安上がりなのも事実っちゃ事実です。~~

寒い季節。ただでさえ体調崩しやすいのに、COVID-19の爆発的流行もあり、例年よりも体調管理が油断できません。
「帰宅時には必ずうがい・手洗いをする」「体を冷やさないようにする」など、体調管理には気を付けてこの難局を乗り越えていきましょう。

如何にもテンプレめいた~~二番煎じ言い換えのパロディみたいな~~文章で締めくくっちゃいましたが、筆者からは以上です。


**(予告)**
本アドベントカレンダーも**明日で最終日**です。
最終日は@following_ngさんが記事執筆を担当します。

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