CCCMKホールディングス TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

ESPr Door SensorとRaspberry Piで誕生日にちょっとしたサプライズ演出!

こんにちは、技術開発ユニットの三浦です。先日娘が誕生日を迎えました。6歳にもなるとこだわりが出てくるというか、「誕生日にこんなことして欲しい!」とか色々出てくるようです。せっかくの誕生日なのでなるべく答えてあげたいと思いつつ、何か変化球という名のサプライズも用意したいな、なんて考えていました。今回はテクノロジーの力で誕生日にちょっとしたサプライズ演出をしたお話を紹介します。

サプライズをしたい!

・・・のですが、なかなかアイデアが出てきません。しかも最近色々バタバタしていることと、とあるゲームにハマっていたこともあり、いつの間にか明後日が娘の誕生日。しかももう夜の10時を過ぎていて明日の休日一日かけて準備するしか無い。なので最低でも今日中には何を用意するか考えないと・・・。うーんうーんと考えていたところ、やっとまとまったアイデアがこちらになります。

f:id:miu4930:20200804143148p:plain
考えたシナリオ

絵心が無いのであまり趣旨が伝わらないかもしれませんので以下文章で説明します。

  1. 娘が欲しがっているプレゼントとは明らかに違うとわかるプレゼント用の箱を娘に渡す
  2. 箱を開けると空っぽ。するとどこからかハッピーバースデーの曲が流れてくる
  3. 曲が鳴っている方に行ってもらう(「だばだば」は「すごいよ!!マサルさん」のことをふと思い出したので・・・)
  4. たどり着いた先に「おめでとう」と表示されたディスプレイと本当に欲しかったプレゼントが置いてある

といった流れになります。この、一旦「あれ?」と相手に思わせておいて「実は・・・」という流れはサプライズの定番手法というか特に誕生日によく見られる手法な気がします。

(誕生日の人)「今日なんの日か知ってる?」
(人)「え、知らないよ」
(誕生日の人)「誰も私の誕生日覚えてくれていないんだ・・・」ドアを開く
(みんな)「誕生日おめでとうー!」
(誕生日の人)「え、覚えていてくれたの?うれしい!」

様々な映像作品でこの流れを見た気がします。

つくるもの

さて、なんとか大筋が見えてきたのであとは具体的につくっていきます。まず今回のサプライズ演出のための仕組みの全体図は以下のようにしました。

f:id:miu4930:20200804144802p:plain
誕生日サプライズ演出システム

まずプレゼント用の箱が開いたことを検知し、処理を行う箇所は以前寝室のドアの開閉を検知してLINEに通知する際に活用したESPr Door Sensorを利用して実現します。最近この寝室のドアの開閉検知の記事をマイナビニュース様に寄稿させて頂きました!

CCCマーケティングテックブログ(1) ESPr Door SensorとIFTTTで寝室のドアの開閉をLINEに通知! | マイナビニュース

続いて音楽ファイルを再生する処理。こちらはRaspberry PiNode-REDというフローベースプログラミングツールを使って実装します。

Raspberry Piがサーバとして機能し、クライアントであるESPr Door Sensorが箱が開いたことをトリガーにサーバの特定のURLにリクエストを送信し、リクエストを受信するとサーバ自身のストレージにある音楽ファイルを再生し、HDMIで接続したディスプレイから音楽が流れる仕組みです。

音楽再生処理の実装

まずはRaspberry Pi上で音楽を再生する処理を実装します。

IPの固定化

今回のように外部からのリクエストが1度だけのような場合にはあまり必要ではないかもしれませんが、一応固定IPを割り振っておきます。Raspberry Piを再起動しても常に同じIPが割り振られるためクライアント側のプログラムのサーバへのリクエストの処理を書き換える必要がなくなります。Raspberry Piに固定IPを割り振る場合(ここではWiFiのIPを固定します)、手順は以下のようになります。

/etc/dhcpcd.confを編集する

dhcpcdの固定プロファイル/etc/dhcpcd.confに設定を書き込んでいきます。適当なテキストエディタで開きます。

$ sudo vi /etc/dhcpcd.conf

WiFiの場合、interface wlan0 以降に設定を書き込みます。我が家のLANの場合、以下のようにしました。

interface wlan0
static ip_address=192.168.11.21/24
static routers=192.168.11.1
static domain_name_servers=8.8.8.8

あとは再起動してifconfigコマンドなどで設定したIPアドレスが反映されていることを確認します。

Node-RED

Node-REDはフローベースプログラミングツールで、GUI上でノードをつなげていくことで、プログラムを使用しなくてもサーバの処理を実装することができます

Node-RED

細かいところはJavascriptを使ってプログラムを書く必要も出てきますが今回のような単純な処理で済む場合は本当にノンプログラミングで実装できてしまいます。Node-REDはRaspberry PiにOSを「with desktop and recommended software」のイメージでインストールしていればプリインストールされるようですが、それ以外でOSをインストールした場合には公式の手順に従ってNode-REDをインストールします。

インストール

公式のドキュメントに従い、以下のコマンドをターミナルで実行します。

bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)

起動

インストールが済んだら起動してみます。デスクトップの左上のアイコンをクリックし、[プログラミング]-[Node-RED]をクリックして起動することができます。

f:id:miu4930:20200804151527p:plain
起動するとターミナルが立ち上がります
起動したらターミナル上のメッセージに従い、ブラウザ上で「http://127.0.0.1:1880」と入力するとNode-REDのフロー編集画面を開くことができます。

フローをつくる

最終的には以下のようなフローをつくります。

f:id:miu4930:20200804152609p:plain
つくるフロー

一番左のHTTPリクエストを受け付けるHTTP inノードと一番右のレスポンスを返すHTTP responseノードは最初からNode-REDに組み込まれているのですぐに利用できますが、真ん中の音楽ファイルを再生するplay-audio-fileは別途追加する必要があります。

必要なノードの追加

ノードの追加は右上のアイコンをクリックして表示される[パレットの管理]から[ノードの追加]メニューを選ぶことで行います。ノード名で検索をし、該当のノードが見つかったら追加することですぐに利用可能です。play-audio-fileはプロパティで再生する音楽ファイルを指定することができます。

f:id:miu4930:20200804153725p:plain
play-audio-fileの編集

play-audio-fileでエラーが出た場合

play-audio-fileはmpg123等のコマンドラインで動く音楽再生アプリケーションを内部で使用するようです。それらのアプリケーションがいずれも入っていない場合、エラーが出るようですのでインストールをします。

sudo apt install mpg123

動作を試してみる

プレゼントの箱の準備に取り掛かる前に、一旦動作を試してみます。同じ無線LAN環境にあるスマートフォンなどのデバイスでブラウザを開き、「http://Raspberry PiのIP:1880/birth_day」にアクセスします。ここではNode-REDのHTTP inノードのURL設定を/birth_dayとしています。うまくいけばRaspberry Piにつないだスピーカーから音楽が聞こえてくると思います。

プレゼント用の箱をつくる

つぎはプレゼント用の箱をつくります。100円ショップでこのような箱を買いました。何か工作する際、100円ショップは駆け込み寺のような存在です。

f:id:miu4930:20200804155203p:plain
何か英語で色々書いてある

ESPr Door Sensor

ESPr Door Sensorに書き込むプログラムはほぼこちらで作ったものを利用します。こちらのプログラムのドアが閉まった時の処理は不要なので削除、接続先のホストをIFTTTのものからRaspberry PiのIPアドレスに変更します。

ちなみにESPr Door Sensorにプログラムを書き込むためにはUSB-シリアル変換アダプタが必要になります。スイッチサイエンスさんから購入できます。

FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き) - スイッチサイエンス

変換アダプタを以下のように接続して書き込みます。

f:id:miu4930:20200804155944p:plain
変換アダプタのUSBコネクタと書き込み用PCを接続

組み立てる

先程の箱に、次のようにESPr Door Sensor、リチウムイオン電池、磁石、そして上げ底用のラムネ菓子の箱をセットします。

f:id:miu4930:20200804160537p:plain
リチウムイオン電池は取り扱いに注意が必要です!

合わせて100円ショップで購入した飾りなども詰め込みます。

f:id:miu4930:20200804160730p:plain
ふさふさでセンサを隠すけど隠しすぎると反応しなくなる

Raspberry Piに表示するディスプレイも用意し、これで準備が整いました。

f:id:miu4930:20200804161024p:plain
表示コンテンツはGIFでつくりました

最後にリボンでプレゼント用の箱を閉じて完成です。

f:id:miu4930:20200804161203p:plain
リボンの結び方は「リボン ラッピング」で調べました

誕生日当日

そんなこんなでなんとかギリギリに出来上がった訳ですが、何度か箱をパカパカ開けていると上手くいかないことがありました。ESPr Door Sensorの微妙な位置の調整や動かないようにしっかり固定するなど行い、成功率大体80%くらいの状態で誕生日当日の朝を迎えました。(娘からの誕生日のリクエストの一つに朝イチでクラッカーを鳴らしておめでとうと言って欲しいというものがあったので、クラッカーを握りしめて寝落ちしていました。)

そしていよいよ緊張のプレゼントを渡す時間です。箱を渡した時、娘は「あれ、これ?」という期待通りのリアクション。その後ついに箱が開かれました・・・!

f:id:miu4930:20200804161649p:plain
ぱかっ

一呼吸後、ESPr Door SensorのLEDの点灯を確認、箱が開かれたことを検知し、Rapsberry Piにリクエストを送信するところまでは上手く行ったようです。そして・・・

f:id:miu4930:20200804162134p:plain
聞こえる・・・!

聞こえる!聞こえるぞ!ハッピーバースデーだ!娘よ、向こうの部屋だー!!

f:id:miu4930:20200804162501p:plain
だばだばだばだば

・・・こうして無事に本当のプレゼントを渡すことができました。 娘も割と楽しんでくれたようです。このサプライズ演出、シーンを変えればその他の記念日や何だったらプロポーズにも使えるかもしれません。よかったら是非使ってみてください!

それにしてもサーバを構築してプログラムを書いて・・・といったそこそこ面倒だと思われる作業もNode-REDを使うとあっという間に実現することができました。確かに本番運用となるともっと考えなければならないこともありますが、とりあえず動かしてみたいというケースでは積極的に活用していきたいと思います。