今までの自宅IoTでは気温等のロガーを作って試していましたが、ここ最近では「自動水やり機」のように、条件に応じて動作するものを試しています。
別のブログにて紹介した「自動餌やり機」で「SG92R」のサーボモーターを使ってメダカの餌やりをしてみたのですが、こういったモーターを使って他に何か作れないかなあ・・・と適当にインターネットを検索していたところ、スプレーボトルのトリガーをサーボモーターで引っ張って自動的にスプレーを吹き付けるような情報がありました(どれかは忘れてしまったのですが)。
それを見たのと、たまたまダイソーへ行った時に目にした1,500円の「オートディスペンサー」を見て、「おお、これ作ってみたいなあ!」と思い、早速似たものを作ってみたいなあを考えました。
運良く、当時は仕事も1週間弱の夏季休暇をとっていたため、子供の夏休みの自由研究を手伝いつつ、自身も「夏休みの自由研究」ということで、このテーマでを作ってみることにしました。
まあ、ダイソーの場合は手をかざすとアルコール消毒液が自動で出てきますが、今回はスプレーボトルを使って自動で噴霧する「自動噴霧器」をESP8266を使って作ってみた内容となります。
自動噴霧器の仕組み
ざっくりこんな感じでやろうと思います。手を人体感知センサーに近づけたら、スプレーボトルのトリガーにワイヤーでつなげたサーボモーターの力を使用してワイヤーを引っ張り、その勢いでボトルからスプレーを噴霧します。
用意したもの
用意したものは次の通りです。「自動噴霧器」を作るにあたり、今まで持っていた「SG92R」だと、引っ張るトルクが弱いと思われるので、今回は少し強めの「SG5010」のデジタルサーボで試してみることにしました。
ESP8266の本体です。いろんなメーカーが作っていますが、今回は「HiLetgo」を使いました。
「SG92R」のトルクはデータシートから「2.5kg/cm(4.8V)」です。今回の「SG5010」のデジタルサーボのトルクは「5.5kgf/cm(4.8V)」、「6.5kgf/cm(6V)」となっています。
自動噴霧は人体感知センサーでやってみました。センサーの近くで手をかざすと、消毒液が自動噴霧します。
その他
- ジャンパーケーブル:配線で使用
- ユニバーサル基板:5cm×7cm:
- スプレーボトル:小型のものであればなんでもOK
- 木製インテリアトレイ:ダイソーで購入。土台として利用
- ボトル、モーター等の固定ネジ:サイズ的にはM3で統一、長さは素材に応じて揃える
- バスボンド:ボトルと土台をネジで固定するため、水漏れ防止剤として使用
- ワイヤー:ステンレスの針金(0.45mm)
- ゴムシート:木製トレイの端につける、いわゆる滑り止め
配置例
各パーツの配置例は次の通りです。今回はシンプルに以下のパーツのみを接続しました。
- デジタルサーボ(SG5010)
- VCC → 5V (赤)
- GND → GND (黒)
- SIG → D8 (黄)
- センサー(HC-SR501)
- VCC→ 3.3V (赤)
- GND → GND (黒)
- Output → D7 (緑)
- LED (センサー反応時に点灯)
- D6を使用 (灰)
スイッチはセンサーによる噴霧をオン/オフの切り替えのために設置しました。利用する上では必須ではないですが、センサー誤操作による誤噴射を防止するための措置です。
組み立て前の準備
今回の自動噴霧器を実装する上で、事前に行ったことを以下記載します。
センサーのつまみ調整
センサーに手を近づけることで作動させるため、センサーの感度を一番低く(つまり一番近い距離)、かつセンサー感知後に短時間で解放させるため、両方のつまみ(VR)を反時計回り一杯まで調整。これにより、ON時間調整VR(左側)は5秒、感度調整VR(右側)は3mで動作するようになります。
なお、ジャンパーについては出荷時の状態(L:再検知なし)のままにしています。
トリガーへのワイヤー設置
やり方はいくらでもあると思いますが、ワイヤーでトリガーを引っ張った際に外れないように、トリガーに小さな通し穴を設けて、そこにワイヤーを通すようにしました。
ESP8266 ISR Servo ライブラリのインストール
ESP8266でサーボモーターを動かすためには「ESP8266 ISR Servo」ライブラリのインストールが必要になります。Arduino IDEのツール>ライブラリを管理より、次の「ESP8266_ISR_Servo」(検索窓からESP8266 ISR Servoで検索)をインストールします。(インストール時のバージョンは1.3.0でした)
インストール後、コード内にて「include」文を入れることで利用できます。
#include <ESP8266_ISR_Servo.h>
サンプルコード
サンプルコードは次の通りです。
#include <ESP8266_ISR_Servo.h>
// for LED
#define LED_PIN D6
// for HC-SR501
#define SR501_PIN D7
// for SG5010
#define TIMER_INTERRUPT_DEBUG 1
#define ISR_SERVO_DEBUG 1
#define SERVO_PIN D8
#define MIN_MICROS 544 // 544 or 800
#define MAX_MICROS 2450
int servoIndex = -1;
void setup() {
// Initialization
Serial.begin(9600);
delay(100);
Serial.println(F("Start"));
// Setup of LED
pinMode(LED_PIN, OUTPUT);
// Setup of HC-SR501
pinMode(SR501_PIN, INPUT_PULLUP);
// Setup of SG5010
servoIndex = ISR_Servo.setupServo(SERVO_PIN, MIN_MICROS, MAX_MICROS);
if (servoIndex != -1) {
Serial.println(F("Setup SG5010 Servo OK"));
} else {
Serial.println(F("Setup SG5010 Servo failed"));
disconnect();
exit(0);
}
}
void loop() {
if(digitalRead(SR501_PIN) == HIGH) {
Serial.println(F("Sensor detected a human..."));
digitalWrite(LED_PIN, HIGH);
if (servoIndex != -1) {
delay(500);
ISR_Servo.setPosition(servoIndex, 180);
delay(500);
ISR_Servo.setPosition(servoIndex, 0);
delay(500);
}
digitalWrite(LED_PIN, LOW);
} else {
Serial.println(F("Not detected..."));
digitalWrite(LED_PIN, LOW);
}
delay(1000);
}
実際の組み立て
実際の自動噴霧器はこんな感じで作りました。
モーターのワイヤーを引っ張る力によってボトルが倒れないように、裏返しにした木製トレイの土台にボトルをネジで固定+バスボンドで防水するようにしました。トレイの端にはゴムシートを貼り付けて土台自体が滑らないようにしています。
センサーはノズルに手を差し出した時を考えて、ノズルの下の土台にセンサーを固定しておきました。
実際の動き
作成後の動作確認の動画です。仕組み上の確認のため、ボトルには消毒液を入れていませんが、手がセンサーに反応したのをきっかけに、サーボが180度回転することで、ノズルに繋いだワイヤーが引っ張られることで、自動的に噴霧します。
ちなみに、センサーが反応(HIGH)した時にLEDも点灯するようにしています。
デジタルサーボがトリガーを引っ張る力が強く感じられます。問題なさそうです。
こちらが、実際に消毒液を入れた後の動画です。手がセンサーに反応して消毒液が自動で噴霧していることが確認できます。なお、噴霧によってセンサー等の機器に水がかかる可能性があるため、とりあえずラップで覆いました。
ボトルがワイヤーに強く引っ張られる感じなので、土台から外れないかなあと少し心配していますが、一応、使い物にはなりそうです。
振り返り
今回手をセンサーにかざすと自動でアルコール消毒液が出る自動噴霧器を作ってみました。機器の防水加工ができれば、家族が自宅に帰ってきた時にアルコール消毒ができる運用ができるかな・・・といったところですね。
一点残念なのが、水の出る向きがやや下になっているトリガー付きのノズルがあるとよかったのですが、ほとんどが水平方向か少し上目方向のノズルか、または手頃な値段のものがなかったことですね。実際は手をノズルの下側に差し出すと思うので、下手したら噴霧が直接体にかかってしまう懸念があります。
まあ、ノズルとボトルを繋ぐジョイントはペットボトルの穴の大きさと同じようですので、また良いノズルが見つかったら取り替えはききそうです。
とりあえず、機器の防水加工だけはやっておかないといけないですね。