• 投稿日
  • Maker Faire Tokyo 2019にて展示したデモの解説 -セキュリティーボタンIoT

    こんにちは

    インターン生のeriです。

    8月3日、4日 Maker Faire Tokyo 2019がビッグサイトにて開催されました。その際、SORACOMブースに沢山のデモが展示されていたのですが、今回のブログではその中の一つ、セキュリティーボタンについて書いていきます。個人的な思いつきから製作したデモなのですが、もし何かの参考になれば幸いです。


    Maker Faire Tokyoでは、このような盗難防止システムを作りました。

    f:id:torontoeri:20190816152340p:plain

    箱に仕組まれたボタンが上に置かれたモノの動き等を感知し、それを SORACOM Harvestで可視化、更にリアルタイムでそれをLINEを通してユーザーに通知。

    いたってシンプルな、セキュリティーボタンです。

    このソリューションは Grove IoT スターターキットを使って製作しました。使用したボタンセンサーからボード、SIMも全てスターターキットに含まれているので、このキットさえあれば誰でも簡単に作ることができます。

    soracom.jp

    是非「他人に盗まれたくない、でも隠しておくのは…」というモノがある方は自分だけの盗難防止システムを作ってみてください。


    製作にかかった期間はざっと3日。

    1日目

    • スターターキットに初めて触り、基礎的なことを学ぶ
    • デモのアイディアの検討

    2日目、3日目

    • ボタンのデータを SORACOM Harvest と連携
    • ボタンのデータを IFTTT と連携
    • 箱の調達&ボタンの設置

    まずはこのWioLTEの資料を参考にパソコンの環境構築とセットアップを行いました。1-1の「動作確認」でボードをライトアップできた瞬間からテンション上がりまくりです。

    そしてArduinoのメニューの「ファイル」>「スケッチ例」>「Wio LTE for Arduino」>「grove」>「grove-button」のコードを書き込みして、ボタンの仕組みを探りました。

    しばらくこのコードで遊んだ後、

    1-3: 温度計センサーのデータを SORACOM Harvest で可視化」で使用したコードとボタンのサンプルコードの使えそうなところを参考に、今回のこのセキュリティーボタンのコードを新たに作成しました。

    なんとかエラーを無くし、Harvestでちゃんとデータが送られているか確認した後、IFFT連携して完成したコードがこちら。

    #include <WioLTEforArduino.h>
    #include <stdio.h>
    
    #define WEBHOOK_EVENTNAME "security_button"
    #define WEBHOOK_KEY       "__SECRET_KEY__"
    #define WEBHOOK_URL       "https://maker.ifttt.com/trigger/"WEBHOOK_EVENTNAME"/with/key/"WEBHOOK_KEY
    
    #define BUTTON_PIN  (WIOLTE_D38)
    #define INTERVAL          (500)
    
     bool StateChanged = false;
     bool State = false;
    
    WioLTE Wio;
    
    void send_to_ifttt() {
    
      char strMessage[100] = "誰かが動かしたよん!!!";
      char data[100];
      sprintf(data, "{\"value1\":\"%s\"}", strMessage);
    
    
      int status;
      SerialUSB.println("### Post.");
    
      SerialUSB.print("Post:");
      SerialUSB.print(data);
      SerialUSB.println("");
      SerialUSB.println("### EXE #send?");
    
      if (!Wio.HttpPost(WEBHOOK_URL, data, &status)) {
        SerialUSB.println("### ERROR! ###");
        goto err;
      }
      SerialUSB.println("### EXE #sent");
      SerialUSB.print("Status:");
      SerialUSB.println(status);
    
    err:
      SerialUSB.println("### Wait.");
      delay(INTERVAL);
    }
    
    void setup() {
      delay(200);
    
      SerialUSB.println("");
      SerialUSB.println("--- START ---------------------------------------------------");
    
      SerialUSB.println("### I/O Initialize.");
      Wio.Init();
    
      SerialUSB.println("### Power supply ON.");
      Wio.PowerSupplyLTE(true);
      delay(500);
    
      SerialUSB.println("### Turn on or reset.");
      if (!Wio.TurnOnOrReset()) {
        SerialUSB.println("### ERROR! ###");
        return;
      }
    
      SerialUSB.println("### Connecting to \"soracom.io\".");
      if (!Wio.Activate("soracom.io", "sora", "sora")) {
        SerialUSB.println("### ERROR! ###");
        return;
      }
    
      pinMode(BUTTON_PIN, INPUT);
    
      SerialUSB.println("### Setup completed.");
    }
    
    void loop() {
    
      int buttonState = digitalRead(BUTTON_PIN);
      if (buttonState) {
        if (State) {
          SerialUSB.println("### pushed ###");
          sprintf(sData, "{\"alert\":%lu}", 0);
    
          State = !State;
        }
      }
      else {
        if (!State) {
          SerialUSB.println("### released ###");
    
    
          send_to_ifttt();
    
          char sData[1024];
          sprintf(sData, "{\"alert\":%lu}", 1);
    
          SerialUSB.println("### Open.");
          int connectId;
          connectId = Wio.SocketOpen("uni.soracom.io", 23080, WIOLTE_UDP);
          if (connectId < 0) {
            SerialUSB.println("### ERROR! ###");
            goto err;
          }
    
          SerialUSB.println("### Send.");
          SerialUSB.print("Send:");
          SerialUSB.print(sData);
          SerialUSB.println("");
          if (!Wio.SocketSend(connectId, sData)) {
            SerialUSB.println("### ERROR! ###");
            goto err_close;
          }
    
    err_close:
          SerialUSB.println("### Close.");
          if (!Wio.SocketClose(connectId)) {
            SerialUSB.println("### ERROR! ###");
            goto err;
    err:
            delay(INTERVAL);
          }
          StateChanged = false;
    
          
          State = !State;
        }
      }
    }

    完成した時、あまりの嬉しさにslackで歓喜のメッセージを流したのですが、反応してくださった皆様ありがとうございます。


    Maker Faire当日、沢山の方に自分のデモを試して頂くことができました。お客様から良い反応を頂けたり、小さい子たちがデモで楽しんでいる様子を見ると、達成感でいっぱいでした。

    展示中に頂いたご意見としては、

    • 光センサー、重さセンサーに変えてより正確な情報を。
    • 取られてからの通知では遅い。
    • 距離センサーを使用して、近づくだけで通知をくれた方が安心。

    開発中から想定していら取られてからでは遅いというご意見。確かに自分もそう思います。触ったらアラートが鳴って取りたくなくなる要素をつけたら良かったな、と今更ながら思います。


    最後に。

    初めてのデモ作り、とても楽しかったです。手探り状態の中、一つ一つの小さな目標ををクリアする充実感、そして自分の作品を褒めて頂ける達成感!Maker Faireが終わってしまった今は「なんで動かないのー」と悩まなくていいのがなんだか寂しく思えてしまいます。自分の作ったものが画面上を飛び出して、実際に動いた時の感動は忘れられないです。

    是非いつか今回ボツになってしまったアイディアたちを作りたいですし、皆様も是非自分の思うままに好きなものを作ってみてください!

    以上eriでした!