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


本記事はリンク情報システム勝手に始める2021新春アドベントカレンダー Tech Connect」のリレー記事です。
engineer.hanzomon のグループメンバによってリレーされています。
(リンク情報システム:Facebook
(リンク情報システム:Twitter

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

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

0.背景

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

1.仕様

Arduinoについて

前回の記事でも説明しましたが、もう一度雑に説明すると、ArduinoはAVRという種類のマイクロコンピュータが1つの基盤上に実装されたマイコンボードです。
今回も、一番メジャーなArduino UNOを使用しました。

今回作成したもの

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

2.用意/準備したもの

  • Arduino UNO
  • ウォーターポンプ(後述)
  • 抵抗
    • 5.1kΩ:×4
    • 220Ω:×1
  • フォトリフレクタ(反射センサー)
    • RPR-220
  • トランジスタ
    • 2SC2120
  • ダイオード
    • 1N4148
  • ブレッドボード
  • ジャンパワイヤ(オス~オス)(オス~メス)

ウォーターポンプについて

「ウォーターポンプ」と一口で記述されても、自動車や給湯器などに使われているものから、水槽や家庭園芸に使われている小型サイズのものまでピンキリあります。
今回は「手をかざすとセンサーが反応してアルコールが出てくる」という仕様を満たせばよいため、小型サイズのものを使用しました。
コチラになります
また、今回使用したウォーターポンプは2本線で、3V~5Vの電源を直接つなげば「ブィィィィィ……」と静かに音を立てて回りだすので、実質ただのDCモーターと考えて問題ないでしょう。

3.Arduinoと電子部品の配線

回路について

今回製作する自動手指消毒器の回路図を以下に示します。

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

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

トランジスタ(2SC2120)

トランジスタの役割は増幅とスイッチングで、ベースに微弱な電流を流すと、大電流を扱えるコレクタ~エミッタ間にも電流を流すことができます。
今回使用するトランジスタには端子が3本生えていますが、
平らな面を見た際、左からE(エミッタ)、C(コレクタ)、B(ベース)となります(下図。「いらすとや」様から元画像をお借りしました。)。

フォトリフレクタ(RPR-220)

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

ダイオード(1N4148)

ダイオードの向きとしては、黒または白い線が描かれている端子側がカソードとなります(下図)。

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

ウォーターポンプ

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

4.スケッチの準備

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

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])ウォーターポンプを作動させる

といったことを本来スケッチで実施したかったのですが、
今回使用したセンサーの誤反応が多かったため、「誤反応によるチャタリング、誤動作をなるべく減らそう」ということで、上記スケッチでは苦肉の策で、以下の処理を追加しました。

・センサ入力値測定~ウォーターポンプ動作後停止までの一連のフローを、センサ入力値測定5回分をfor文で処理の1周期とし、
あらかじめ定義した閾値(THRESHOLD)よりもフォトリフレクタからの距離(センサ入力値)が小さい場合、動作可能カウント(iCnt)をインクリメントし、
動作可能カウント(iCnt)の値が1以下の場合、一定時間(MOTOR1_ONTIME[msec])ウォーターポンプを作動させる

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

5.実際に動かす

回路を組み上げ、上記スケッチをArduinoに送信し、アルコール消毒液が入った容器にウォーターポンプを沈めたら、

電源となる電池ボックスに単3電池を3本入れ、センサー(フォトリフレクタ)に手をかざしてみましょう。
すると、ウォーターポンプをつないだ管から、アルコール消毒液が一定量出てきます。

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

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

6.終わりに

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

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

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

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

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