Arduinoその他工作

Arduinoを制御デバイスにしてさまざまなモノを動かそう!

第2回:非接触型スイッチの制作と制御

Arduinoを使った簡単工作を通して、電子工作の原理や基本を学ぶこの企画。教えてくれるのは、メディアアートの分野で、また「ちょっと深い仕組み」を解説する書籍の世界で活躍している、伊藤尚未さんです。第2回は非接触スイッチをArduinoで作ってみたいと思います。

 

目次

  1. はじめに
  2. 非接触型スイッチの種類
  3. フォトリフレクタを使う
  4. ケースに入れる
  5. 非接触型スイッチの活用

 

1. はじめに

みなさん、こんにちは。伊藤尚未です。

世界的なウィルス感染が猛威を振るい、これだけ医療科学が発達していてもなかなか突破口が見いだせない状況に、人間がどんなに偉そうにしていても、地球上の一生物にすぎないという事実を改めて再認識しております。

多分、敵も人間ごときにやられるか!と頑張っているのかもしれませんが、そろそろ勘弁して欲しいですよね…。

さて、医療の発達していない時代であれば、「流行り病」という言葉で、加持祈祷に頼っていたのかもしれません。今ではウィルスの存在もわかり、感染経路も接触や飛沫ということがわかっていますし、手洗いやアルコール消毒なども、すっかり生活の中に浸透しているでしょう。特に他人と共用するドアノブやスイッチなどの接触点は消毒の対象に挙げられます。

もちろん以前よりトイレや水栓では当たり前のように手前に立ったり、手を差し出すだけで自動的に水が流れるものは公共の場では多く使われております。いわゆる非接触型スイッチですね。今回はこの非接触型スイッチの制作と制御についてご紹介していきたいと思います。

arduino-control-clipmotor-01_01

手を差し出すだけで自動的に水が出る水栓

 

2. 非接触型スイッチの種類

まずはどんな種類があるのか見ていきましょう。周囲をザっと見渡すと実にさまざまなものがありますね。それも用途、環境条件などにより使い分けられているようです。よく見られるものをいくつか挙げてみましょう。

焦電型

人感センサという言葉が使われる商品が多いのですが、人体から出る赤外線(熱、体温)により反応するもので、玄関先で防犯用の照明や、自動ドアのセンサなどに使われています。センサの手前に乳半の球形、または筒型のレンズがあるので、外観で見分けがつきます。

レンズによって感度方向のムラがあるようで、死角ができたり、また赤外線の変化を感知するので、ゆっくりとした動きは不得意のようです。

arduino-control-clipmotor-01_02

 

超音波測距型

超音波を発射し、物体に当たり反射して返ってくる超音波を感知してその距離を測ることができます。河川の水位を計る計測器などにも使われていますが、近年では教材やホビーとしてのロボット工作にもモジュールが広く出回っています。

arduino-control-clipmotor-01_03

 

赤外線測距型

赤外線を発し、物体から返ってくる反射光を測定して距離を求めます。受光部分で、返ってくる角度を三角測定法で算出し距離を割り出す方式もあり、精度は製品によるようです。

arduino-control-clipmotor-01_04

 

通過型

赤外線の発光、受光部分を分離し、その間に物体が通り、光を遮ることで感知します。かなり以前よりこの方式があり、ある意味安定している方式ですね。設置場所が固定されるので精度は高いので、自動エスカレータや駐車場の入出ゲート、改札ゲートなど生活圏内にも多く使われています。

小さなものではフォトインタラプタといい、スキマに何かの物体があるかないかを検知するときにも使われています。工場のラインやプリンタの紙位置の検知にも使われており、見えないところに設置されるのであまり気づきません。

arduino-control-clipmotor-01_05

 

反射型

トイレや水栓などによく使われている身近な方式です。赤外線の反射の有無によりスイッチを入れるもので、反応精度は高いです。ただし、使用環境に太陽光や白熱球照明など赤外線を発するものがあったり、特に水栓などではセンサ部分に汚れや水滴などが付着していると反応が弱くなります。手を差し出してもなかなか水が出ず、イライラした経験もあるのではないでしょうか?

arduino-control-clipmotor-01_06

 

展示系スイッチ

ところで、実は私の身近なところで展示施設系のものがあります。特に科学館などの動的展示物のスタートスイッチがあります。スイッチを押すと展示物が動き出したり、解説映像が流れだしたり、原理や仕組みをわかりやすく展示しています。

ところが、これがいわば感染症対策の消毒の対象にもなっているわけです。その展示に興味があろうとなかろうと、子供たちはまずスイッチがあると押します。特にこれまでの展示では物理的な接点を持つスイッチが多用されていますが、不特定多数の人間が1日に何人も何回も押すので、実は展示物の中でも一番壊れやすい部品なのです。特にスイッチのスキマにゴミがたまったりしていると、衛生的にもよくないわけです。

arduino-control-clipmotor-01_07

動的展示物イメージ

 

そこで、今回は非接触型のスイッチをArduinoで作ろうと考えつきました。

となると既述の方式からすると、物理的に穴を空けなければいけない超音波型は難しく、スイッチという小型、狭角ということからすると焦電型でもないだろうと。また、装置デザインを考えると通過型でもないだろう。

とすれば赤外線反射型になります。これであればアクリル板の下部にセンサを仕込むことができ、消毒する場合もアクリル表面でおこなえます。

 

3. フォトリフレクタを使う

赤外線測距センサでも良いのですが、シンプルな構成にしたかったのでフォトリフレクタを使うことを考えました。ここで使ったのはローム製の「RPR-220」というセンサです。

arduino-control-clipmotor-01_08

RPR-220

 

赤外線LEDとフォトトランジスタがひとつのパッケージに平行に収まっているもので、つまりはそれぞれ別々の部品を個々に動かしてセンシングするものです。いわばそれぞれの部品の使い方がわかっていれば、それぞれの回路を組むことで、センサとして都合の良いパッケージになっているということです。

データシートから赤外線LEDは1.34V50mAを基準に駆動しましょう。Arduinoからの電源供給で5V端子からとるなら73.2Ωの電流制限抵抗を直列にすればよいので、余裕をもって直近上位で75Ωとしましょう。

フォトトランジスタ部分はコレクタに抵抗を接続し、これをプラス側にすることで、抵抗とフォトトランジスタの間でArduinoにアナログ入力します。

まずは10kΩで試してみました。回路図はこのようになります。

arduino-control-clipmotor-01_09

 

ブレッドボードで組んでみますとこのような形です。

arduino-control-clipmotor-01_10

arduino-control-clipmotor-01_11

arduino-control-clipmotor-01_12

 

スケッチはサンプル(AnalogReadSerial)のものをそのまま流用し、シリアルモニタで見ますと、通常時は800~900ぐらいで変化します。

arduino-control-clipmotor-01_13

 

手でセンサ部分を覆ってみたりすると100前後まで数値が落ちます。

arduino-control-clipmotor-01_14

 

これらは室内、実験周囲の光環境にもよると思いますので、あまり参考にはならないかもしれませんが、とりあえず、こういった回路で手の有無を感知することができそうだということはわかると思います。ここまではほぼサンプル工作そのものですね。

 

では次に、これを応用してスイッチとして使えるように設えましょう。

手をかざすように設えたいので「ここに手をかざしてください」の意味を込め、手形のデザインとLEDの点滅で表現しました。そのため、回路は以下のようにしました。演出のためのLEDですから4個使い、トランジスタ「2SC1740S」でドライブします。

arduino-control-clipmotor-01_15

2SC1740S

 

周囲の光環境によるハード側の調整余地を作るためにフォトリフレクタのフォトトランジスタ側の抵抗器を半固定に変更しました。

arduino-control-clipmotor-01_16

 

LEDをボヤッと鼓動するように点滅させ、待機状態にしておきます。
手をかざしたときにLEDをピカッと3秒光らせることにし、これでスイッチONを表現します。実際にユニバーサル基板を組むとこのような形になります。

arduino-control-clipmotor-01_17

arduino-control-clipmotor-01_18

 

Adruinoスケッチはこのようになります。

int led = 9;
int brightness = 1;
int fadeAmount = 1;

void setup() {
  Serial.begin(9600);
  pinMode(9, OUTPUT);
}

void loop() {
  // read the input on analog pin 0:
  int sensorValue = analogRead(A0);
  int sabun1 = sensorValue ;
    delay(100);
  int sensorValue2 = analogRead(A0);
  int sabun2 = sensorValue2 ;
  // print out the value you read:
  int sabun3 = sabun1 - sabun2 ;
  Serial.println(abs(sabun3));
  delay(100);        // delay in between reads for stability

  analogWrite(led, brightness);
  brightness = brightness + fadeAmount;

  if (brightness <= 1 || brightness >= 50) {
    fadeAmount = -fadeAmount;
  }

  delay(50);

  if (abs(sabun3) > 20)
  {
   digitalWrite(LED_BUILTIN, HIGH);
    }
  else
  {
   digitalWrite(LED_BUILTIN, LOW);
    }

}

 

arduino-control-clipmotor-01_19

 

LEDをPWM点滅させるために9番ピンを使っています。使用環境によりますが、フォトトランジスタからの信号はある程度振れるので、絶対値で閾値を設定する方法もありますが、2回読み取ってその差を出し、ある大きさ(ここでは10に設定)以上で反応するようにしました。これは特に日光の入る展示空間のような1日の内で光環境が変化する場合に有効になるかと思います。スケッチ中央にコメントアウトしてある部分はシリアルモニタでその数値を確認するときに適宜使います。

 

4. ケースに入れる

手形デザインをスモークアクリルに施し、センサ部分はスモークの向こう側に見えるようにしています。ある程度の赤外線はスモークアクリルを通すようなのですっきりしたデザインになりました。

スモークアクリルの上からの反応は半固定抵抗器とシリアルモニタを見ながら閾値を調整すればよいでしょう。

arduino-control-clipmotor-01_20

arduino-control-clipmotor-01_21

 

5. 非接触型スイッチの活用

これで一応機能的には充足したことになります。あとは何のスイッチを入れるかによって、何のデバイスを使うかを考えればいいのです。

ここではLEDがピカッと光ることで、スイッチングONとしましたが、同じように何か弱電回路を動かすならトランジスタドライブでもいいでしょうし、電源電圧の異なるものであれば、フォトカプラやリレーで保護してもよいでしょう。家電程度を動かすならリレーやSSRをここに入れることで、稼働することができます。

このように必要な条件を加味して考えると、いろいろな応用することができます。ぜひみなさんも身近なものからアイデアを出して非接触型スイッチをArduinoで制御する面白さを味わって頂きたいと思います。

次回もArduinoを制御デバイスとして、いろいろなモノを動かしていく実験をご紹介していきたいと思います。お楽しみに!

自動水やりマシンを作ろう
伊藤 尚未

日本電子工作普及推進委員会代表、メディアアーティスト。サイエンスライター、動物園の飼育員のフリした電気工事士、理科実験教室講師、ワークショップ講師、教材開発など、幅広く活動中。 月刊「子供の科学(誠文堂新光社)」で電子工作の連載を続けて19年、代表的な書籍は「電子工作大図鑑」「電子工作パーフェクトガイド」があります。