これは エムスリー Advent Calendar 2019 の13日目の記事です。
エムスリーエンジニアの岩本です。普段はアンケートを作るためのシステムを作っています。 今回は全く仕事とは関係のない話をしようと思います。私の趣味で作ったものの話です。
うちには4歳になる工作好きの娘がいます。いろいろ子供のため〜と思って作っていたら 私自身がDIYに興味を持つようになってきました。そして作成したのが30歳以上の人なら見覚えがあるであろうじゃんけんゲームです。
- コインを入れるとじゃんけんが開始
- ボタンを押してじゃんけんの勝敗を決める
- 勝ったらルーレットで出た数字の数だけコインが払い出される
という簡単なゲームです。特徴としては、中の仕組みが見えるように片側はアクリルで構成しています。STEM教育です。
全体のアーキテクチャ
全体のアーキテクチャは下記のような感じです。
使用した技術は下記のとおりです。
- 電子回路・Arduinoプログラミング
- WebアプリでBLE(Bluetooth Low Energy)
- 木工
- FlutterでBLE(Bluetooth Low Energy)
なお、私はWeb系のエンジニアなので上の殆どの分野は最近始めたばかりのど素人です。
物理構成
- コインの受付
- コインの払出
- 画面を表示
- 物理的なコントローラ
それぞれが下記のような配置になります。
コインの受付
コインの受付はコインアクセプタというモジュールで実現しています。コインアクセプタは正しいコインが投入されたときには、電子的な信号を出し、正しくないコインが投入場合には返却口に返してくれるというモジュールです。今回使用したものはAmazonで購入した安物のモジュールで、サンプルのコインを一枚図のようにセットしておくと、サイズの異なるコインをリジェクトしてくれるようになっています。
使用するコインはAmazonで購入したちゃんとしたメダル。
不正なコインをちゃんとリジェクトしてくれます。
コインが投入されたことを検知すると、コインアクセプタのCOUNTの配線がHIGHに変わります。これをesp32で検知します。
プログラム的には簡単でC言語で下記のようにピンの値を読めばよいだけです。
int value = digitalRead(COIN_ACCEPTOR_PIN); if (value == 1) { doSomething(); delay(100); }
コインの払出
コインの払出しにはコインホッパーというモジュールを利用します。ヤフオクで出品されていたものを購入したものを使っています。機構は単純で下記のようになってます。
実際に簡易回路を作って動作させてみたのが下記の動画です。
専用コントローラ
iPadの画面をタッチして遊ぶよりも、やっぱり実際のボタンを触って遊べたほうが楽しいだろうと考えて専用コントローラも用意しました。
こちらは単純なスイッチなので、回路は簡単です。ESP32につなぐだけの簡単な回路です。
iPadアプリ
JavaScriptは私の得意分野なのでWeb技術だけで完結したかったのですが、Web Bluetooth APIはiPadでは使えません。 そこで、Web Bluetooth APIが使えるブラウザのWebBLEというアプリがあったので、これを利用して実際に作ってみました。 ちなみに有料です。
しかし、Web Bluetooth APIを使うと、ペアリングする際にダイアログが必ず表示されます。 4歳児にはかなり難しいので、方針転換をしてFlutterで作りました。
うまく動いているように見えますが、、、
実際には不具合があります。しかも普段プログラミングしているときとは異なるソフト的な不具合ではなくハード的な不具合で、数週間格闘しましたが解決できていません。
- コインの払出しをするとたまにESP32が再起動する
- 別電源だと発生しないっぽい。
- 電流が足りない?ノイズ?
- コインを大量に投入するとESP32が再起動する
- 回路を完全に別にしても発生する。
- 電磁誘導?振動?
ハードウェアって本当に難しいですね。
[PR] We are hiring!
私は仕事以外で電子工作やDIYなどにハマっていますが、様々な趣味を持ったメンバーが活躍しています。たとえば、
- 後ろの席には3Dプリンタとラズパイで6足歩行するロボットを作った猛者
- 横の席にはRustを使ってOSを趣味で作っているハッカー
ということで、楽しく一緒に働く仲間を探してます!