概要
UEQareer Advent Calendar 18日目の投稿です
いきなりですが、みなさんはハリーポッターは好きですか?
今回は、そのハリーポッターに出てくる「Alohomora」という鍵を開ける呪文を再現したお話をしたいと思います
目次
- Alohomoraって?
- 完成形
- 使用したもの
- システム構成
- 中身
Alohomoraって?
「Alohomora」とはハリーポッターに出てくる鍵を開ける呪文です
この動画をみてもらうとわかりやすいと思います
Alohomora(for advent calendar)https://t.co/M6aRbJliGs
— もーりー🌓 (@m___04v) 2018年12月14日
「Alohomora」と唱えながら鍵に向かって杖をかざすと、鍵が開きます
今回は「Alohomora」をRaspiとサーボモータを使って再現したいと思います
完成形
中身は興味ない!って人もいると思うので完成形はこちら!
杖を振り回すと鍵が開閉できるようになっています手作りAlohomora(for advent calendar) pic.twitter.com/6C1pKRvXFz
— もーりー🌓 (@m___04v) 2018年12月14日
使用したもの
- Raspberry Pi zero
- Raspberry Pi 3
- サーボモータ
- 6軸センサ
- タクトスイッチ
- 3Dプリンタ
↓完成した魔法の杖
システム構成
魔法の杖
もともとこのシステムを作成する前に、REDIMPULZさん主催のIoTハッカソンで魔法の杖というデバイスを作成しました
魔法の杖のシステム構成は以下のようになっています
- 杖につけた6軸センサから値を取得
- Jubatusで機械学習させ動作を推定
- APIで動作と紐づけたイベントを発火させる
- 対応したIFTTTのイベントを実行させる
このような流れで魔法の杖でテレビの電源制御やエアコンの電源制御を可能にしました
スマートロック
また、僕は趣味で研究室の鍵をICカードで開けれるように改造しました
スマートロックの状態をM5Stackで常時見れるようにしたよ
— もーりー🌓 (@m___04v) 2018年10月7日
mqtt使ってます🤔 pic.twitter.com/35txw8qAM9
裏側はこんな感じ
裏側のゴリ押し具合 pic.twitter.com/8gnCfgu8Vm
— もーりー🌓 (@m___04v) 2018年9月24日
1. NFCのカードリーダに登録済みのカードをかざす(OR アプリのボタンを押す)
2. Flaskで作成したAPIを叩く
3. GPIOでサーボモータを制御
4. 鍵の開閉に成功したらMQTTのpublish
5. M5StackがMQTTをsubscribeしてディスプレイの表示を変更
本題:Alohomora
今回は、以上の二つの作品を組み合わせて「Alohomora」を再現しました
本題のシステム構成はこちらです!
- 杖につけた6軸センサから値を取得
- Jubatusで機械学習させ動作を推定
- APIで動作と紐づけたイベントを発火
- (3で得られたイベントが鍵の開閉であれば)
- FlaskのAPIを叩く
- GPIOでサーボモータの制御
(MQTTの部分は省略しています)
中身
システムの少し詳しい中身を説明していきます
- 動作の認識
- 動作からイベントの取得
- サーボモータの制御
動作の認識
今回は、6軸センサ(9軸センサの地磁気センサの3軸を用いいていません)を用いて杖の動きを認識してイベントと紐づけます
動作の認識の流れは以下のようになっています
- ボタンを押しながら杖を振る
- 振り終わったらボタンを離す
- ボタンが押されている間のセンサの値から学習させたモデルを用いて動作を認識する
今回定義した動作は
- 上から下
- 下から上
- 左から右
- 右から左
- 時計回り
- 反時計回り
の6つです
動作からイベントの取得
上記の流れで動作が認識されれば、認識された動作をデータとしてAPIを叩きます
APIでは以下の処理を行います
- Jubatusで認識された動作(例:時計回り)がデータとして送られてくる
- DBから特定の動作と紐づけられたイベントを取得する(今回は鍵を開ける[閉める])
- イベントごとのアクションを実行する(今回はFlaskで立てたAPIを叩く)
サーボモータの制御
認識された動作から鍵を開ける[閉める]イベントが発火されたらFlaskのAPIが叩かれます
APIが叩かれればGPIOを使用してサーボモータを動かし、鍵の開閉を行います
例えば鍵を開けるAPIのコードは以下です
@app.route("/open")
def close():
GPIO.setmode(GPIO.BCM)
# GPIO4を制御パルスの出力に設定
gp_out = 4
GPIO.setup(gp_out, GPIO.OUT)
#「GPIO4出力」でPWMインスタンスを作成する。
#GPIO.PWM( [ピン番号] , [周波数Hz] )
#SG92RはPWMサイクル:20ms(=50Hz), 制御パルス:0.5ms〜2.4ms, (=2.5%〜12%)。
servo = GPIO.PWM(gp_out, 50)
servo.start(0)
#デューティサイクルの値を変更することでサーボが回って角度が変わる。
servo.ChangeDutyCycle(7.5)
time.sleep(0.5)
servo.stop()
GPIO.cleanup()
return "ok"
スマートロックの作成に関する内容は
に書いているのでそちらを参照してみてください
完成
こんな流れで作成していくと
「Alohomora」を再現できます手作りAlohomora(for advent calendar) pic.twitter.com/6C1pKRvXFz
— もーりー🌓 (@m___04v) 2018年12月14日
#おわり
最後まで読んでいただきありがとうございました
もっと詳しい中身について知りたいよ!って方がいらっしゃいましたら気軽にコメントしてください!