手をかざすと消毒液をシュッてするやつをM5 Atom+UIFlowでつくる—なつやすみの工作(未完成)—

そろそろ夏が終わってしまうので、やりかけのままだった夏休みの工作を供養しておこうと思います。

タイトルの通り、👇こんな感じの、消毒用アルコールをシュッてするやつを手作りしようとした話です。

はじめに

さっそくですが、シュッてする仕組みを作るのに必要な要素はこの4つ。

  • コントローラー
  • 近接センサー
  • 電動ポンプ
  • バッテリー

全部手作りするのも面白そうですが、今回は電子工作系プロトタイピングに絶大なパワーを発揮するマイコン、「M5 Stack」シリーズを使おうと思います。

コントローラーはM5 Atom Liteに決めた!

M5 Stackシリーズは、いまのところサイズ展開が4種類あって、5cm×5cmのCore、細身のStick、小粒のAtom、それとつい最近発売されたシリーズ最小モデルのStampがあります

www.switch-science.com

今回は小さくまとめたいので、シリーズで2番目に小さいモデルのAtom Liteを使ってみます。(記事を書いてる途中でStampが発表されたので...😭)

www.switch-science.com

近接センサーはToFセンサーに決めた!

次に選ぶのは、装置に手をかざしたことを認識するための近接センサーです。

一般的に近接センサーは、赤外線や超音波を放って、物に当たって帰ってくる時間や強さから距離を測ります。

色々な種類があって、精度や価格も様々ですが、今回はM5シリーズのToFセンサーユニットを使ってみます。

www.switch-science.com

ToFとはTime of Flightの略で、赤外線レーザーが物に反射して返ってくるまでの時間を測るタイプのセンサーです。

www.hokuyo-aut.co.jp

一般的なシュッてやるやつは、赤外線LEDとフォトトランジスタの組み合わせで、反射の強さをセンシングしているものが多く、コスト的にはその方が安く上がりますが、誤作動を防ぐためにはソフト側をがんばらないといけません。

ToFセンサーなら、mm単位での距離が高い精度で測れるので、あんまり難しいこと考えずに使えそうです。

ポンプはAmazonで買った安いの

次はポンプですが、前に自動水やり機を作ろうとして買ったものがあったのでコレを使います。

アルコールへの耐久性は不明ですが、1個200円くらいなので、壊れてもダメージは小さいです。

小さいDCモーターが入っていて、3〜5Vを繋ぐだけで動きます。

パワーは、ミストを出すにはちょっと非力かも...?

電源はモバイルバッテリー?→ 要検討

ここがちょっと曲者なんですが、電源は5Vくらいでコンパクトなのが欲しいです。

パッと思いつくアイディアは3つ

  1. USBモバイルバッテリーを使う
  2. 単3×3本=4.5V(電池が減るとポンプが弱くなる)
  3. 単3×4本=6V & 5Vレギュレーター

できれば充電できる1が良いんですが、これがなかなかの曲者で、詳しくは後述します。

回路構成

センサーは付属のGroveケーブルで繋ぐだけで使えます(簡単!ステキ!)

モータードライバーを使うほどではないので、1815トランジスタで動かすことにします。

f:id:at_you_key:20210905121608j:plain ちょっと汚すぎなのでそのうち清書します...

抵抗はとりあえず動きそうな値を選びました、ちゃんとやりたい人はちゃんと計算したほうが良いとは思います。

あと、モーターが止まるときの逆起電力で回路がやられないよう、保護回路としてダイオードを付けています。1N4001とかで良いと思います。

プログラム(UIFlow)

M5 Atomで公式に提供されている(?)プログラム環境は、Arduino(C言語)とUIFlow(Micro Python & Blockly)です。

今回は夏休みの工作らしく、見た目的に気楽な感じで使えるUIFlowを使います。

m5stack.github.io

気軽といっても、Blocklyの皮をを被ったMicro Pythonなので、見た目のわりに結構パワフルです。大抵のプロトタイピング、なんなら本番実装もUIFlowでじゅうぶんいけると思います。

そしてさっそく、作ったプログラムがこちらです。

f:id:at_you_key:20210905122256j:plain

まず、ここで手が近くに来たことを判定します、if文ですね。とりあえず60mmにしてみました。

f:id:at_you_key:20210905122534j:plain

21ピンにモーターを繋いであるので、0.3秒ONにします。この時間はチューブとかノズルとの兼ね合いになるので、後で実物を動かしながら調節しましょう。

f:id:at_you_key:20210905122549j:plain

そして、連続で反応してしまわないように、手が離れるまでは空のループに入るようにします。while文です。

f:id:at_you_key:20210905122556j:plain

試運転

とりあえずポンプの動作確認までですが、うまく動きました!

モバイルバッテリーが曲者

電源には充電式かつ安全性の高そうなUSBモバイルバッテリーを使いたかったので、エレコムの18650電池1本入りのスティックタイプのものを買ってみました。

しかし、一般的なモバイルバッテリー(もちろんこのエレコムも)には安全装置として自動オフ機能がついていて、これが少し厄介です。

これは、ある程度の電流が流れていないと、使っていないと判断して自動でオフになる機能なんですが、スマホなどの充電電流が数百〜数千mAなのに対して、マイコンの消費電流は数十mA程度なので、閾値に届かず30秒くらいで勝手に給電が止まってしまいます。

ダミー負荷で安全装置を騙そう

どう対策するかっていうと、ダミーの負荷を追加して閾値以上の電流を流してあげれば良いわけですが、ずっと流し続けてしまうとすごい無駄です。

そこで、オフになる直前くらいのタイミングで短時間だけ電流を流して、叩き起こし続けてあげればいいわけです。

タイミングは無負荷でオンにしてから自動オフになる時間を計って、それより少し短めにすれば良いです。今回のバッテリーの場合は30秒でした。

次に必要な負荷を計算します、閾値が不明なので、まずは100mAでやってみましょう。

必要な抵抗値は

5V÷0.1A=50Ω

そのときの電力は

5V×0.1A=0.5W

です

手元に100Ω 1/4Wのカーボン抵抗が沢山あったので、これを2個並列に繋げば、抵抗値は半分、耐電力は2倍になるので50Ω 1/2Wとして使えます、回路はこんな感じ。

f:id:at_you_key:20210905123714j:plain

耐電力に余裕がありませんが、パルス動作なのでまあ耐えてくれるでしょう。

プログラムはLチカするのとおんなじです。25秒おきに0.3秒オンにするようにしてみました。

f:id:at_you_key:20210905122806j:plain

実験の結果は△

結果は、狙い通りの効果を発揮してくれて、30秒を超えても給電を続けてくれるようになりました。

f:id:at_you_key:20210905125337j:plain

と喜んだのもつかの間、こんどは数分経つと給電が止まるようになりました、どうやら別の保護機能が働いているようです。うーん曲者...。(正しい使い方をする分には、むしろ安心なんですけね)

そうこうしているうちに夏休みが終わってしまったので、続きはまたいつか。