OGIMOノート

6歳の娘と、4歳の息子(脳性麻痺)を持った父親エンジニアの備忘録。自作の電子工作おもちゃ/リハビリ器具の製作記録、勉強記録を残していきます

【簡単IoT】ESP8266(+Amazon echo)で寝室からの呼び出しボタンを作ってみた

はじめに

このGWに二段ベッドを導入してようやく娘が一人で寝れる環境を作ることができた。ただ、残念ながら、娘は毎晩12時頃に目が覚めてしまい、寂しくて泣いてしまうのである。今までなら無言でリビングに出てくるのだが、二段ベッドの上だと寝ぼけてベッドから落ちるのが怖いらしい。かといって、大声で「おとーさーん!」と叫ばれると、下で寝てる息子を起こしかねない。

そこで、今回は寝室からリビングへ呼び出し通知するデバイス(要はナースコール)みたいなのを簡単に作ってみたいと思う。

要件

・寝室ベッドの横に呼び出しボタンを設置。それを押すとリビングで通知音が鳴る事。(寝室では音が鳴らない)
・夜中でも押しやすい様な大きなボタン
・電源から遠いので、コードレス推奨。

amazon echoによる家電制御を導入してからようやく我が家で認められる様になったAlexa! ここらで更に活躍を広げるため、娘の呼び出し通知機能を追加していこうと思う。

ハードウェア

コードレス(無線伝送/電池駆動)かつ超シンプル制御という要件から考えて、今回はArduino対応無線モジュールesp8266を使ってみたいと思う。

【ESP8266

www.switch-science.com
動作確認をするならこれが一番簡単。USB電源供給だしPC書き込み可能だし、書き込みボタンをも搭載されてるし。ただ今回は電池駆動にするため、USBコネクタは冗長になりそうなので、下記のモジュールそのものを使う。
www.switch-science.com
ソフト書き込み時は、ブレッドボード経由でUSBシリアル変換モジュール経由でPCから書き込む。

【ボタン】
娘と近くのコーナリングに行って押しやすそうなボタンを選ぶ。LEDプッシュライト NIT-BP1D で400円くらい。
www.kohnan-eshop.com

【3.3V出力用レギュレータ】
購入したプッシュライトが単4電池×3本だったので、3.6~4.5V→3.3V(マイコン電源)に変換するDC/DCとして、LM3671搭載 3.3V出力DC-DCコンバータを使ってみた。
https://www.switch-science.com/catalog/2638/


接続はシンプルなので文章のみ。
LEDプッシュライトからは、電池電源(3.6~4.5V)とGNDの2本を引っ張り、3.3Vレギュレータで変換した後、ESP8266の電源として使用。
今回の使い方としては、特に他に端子仕様しないので、超シンプル。

完成イメージはこちら。



f:id:motokiinfinity8:20180506174213j:plain
f:id:motokiinfinity8:20180506174201j:plain
f:id:motokiinfinity8:20180506174321j:plain




ソフトウェア

ESP8266に実際に書き込んだソースコードは以下。要は、ボタン押し=マイコン起動したら、リビングにあるラズパイに対してHttpメソッドのGetを投げるだけ。うん、すごく簡単。サンプルコード程度。

#include <ESP8266WiFi.h>
const char* ssid     = ***************;
const char* password = **************;
const char* host = "192.168.0.**";    //リモコン制御用RaspberryのIPアドレス
const char* path = "/bedroom_call";

void setup() {
  Serial.begin(115200);
  delay(100);

  // We start by connecting to a WiFi network
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("connecting to ");
  Serial.println(host);
}
  
void loop() {
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 1880;  //Node-REDの使用ポート
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
   String body = "bedroom_call=1";
     
  // サーバにリクエストを送信(GET)
  client.print(String("GET ") + path +" HTTP/1.1\r\n" +
               "Host: " + host +":1880"+ "\r\n" + 
               "Connection: close\r\n\r\n");

  delay(1000); // Can be changed
  if (client.connected()) { 
    client.stop();  // DISCONNECT FROM THE SERVER
  }

  // 20秒待ち
  delay(20000); // Can be changed
}


本体ラズパイ側では、Node-REDを使用。寝室ボタンからのGETメソッドを受信したら、あらかじめ用意していたwavファイル(「~ちゃんが呼んでるでー!」)を再生するだけ。Google homeでは任意の音声を再生できるのだか、Amazon echoでは現時点でできなそう。text to speechはあるけど機械っぽい発音がいまいちなので。なので、echoをBluetoothスピーカーにしてラズパイから音声再生させる手段にしたいと思う。

なお、音声再生には node-red-contrib-spealkerpiを使用。

npm install node-red-contrib-speakerpi

でインストール可。


ほんま簡単。

ここでトラブル。Amazon echoから音声再生ができない!


Bluetooth経由でAmazon echo と接続。ごちゃごちゃやって、結果として paplay ではechoからの音声再生できたのですが、Node-REDからのSpeaker-Outノードで再生させようとすると、ラズパイ自身(HDMI or Audio Out)からの出力になってしまう。。。困った。

とりあえず、他にやりたい事もあったので、一旦はラズパイ自身に Audio DAC+スピーカを追加して、とりあえずロールアウト。
ちょっと悔しい。

この辺りの解決策、知っている人がいたら、是非とも教えて欲しいものだ。

作成結果

作成後の動画がこちら。

www.youtube.com

ピンポンパンポンの呼び出し音と、優しい関西弁での呼び掛け。text to speechでは出来ないコミカルな呼び出しボタンが出来ました。実際に、寝室の扉を閉めておけば、リビング音は聞こえないので、下の子を起こすこともない!

f:id:motokiinfinity8:20180506152005j:plain

運用を開始しましたが、娘は嬉しそうに使ってくれていて、早速活躍してます! 良かった♪ 「お父さん、こんなに早く出来たん!? すごい!」と尊敬と信頼も勝ち取りました(笑)

作成期間は約2晩(4時間×2日) ソフトは1h程度で、あとはハード構想&改造の時間。esp8266が思った以上に使えそうなのも収穫! これから使っていきます!