M5Stackと超音波距離センサーでAmazon Echoを起動させる

Twitterで見かけたM5Stackを速攻購入して色々試して遊んでみました。
ウチの会社ではAmazon Echoを使った受付システムを採用していますが、iPadを使った[I-FACE](https://www.system-i-enter.com/i-face/)との熾烈な受付システムバトルが展開されています。

そこで、人が受付システムに近づいたら「アレクサ、受付をひらいて」と言って強制的に音声受付システムを立ち上げる計画を企てました。

![uketuke.jpeg](https://qiita-image-store.s3.amazonaws.com/0/154355/20d240a5-ad91-5d3b-827c-bb6e44c6d10c.jpeg)

# はじめに
簡単にM5Stackの紹介。M5Stackは5cm四方に320x240カラーTFT、USB、Groveのコネクタ、スピーカー、ピンヘッダ、ピンソケット、wi-fi、Bluetooth搭載、microSDカードスロットと至れり尽くせりなモジュールです。
見た目の可愛さに惚れてすぐ購入してしまいました。

Groveコネクタがあるので、はんだ付けすることなく直ぐに超音波距離センサーを使うことができました。

![m5stack.jpeg](https://qiita-image-store.s3.amazonaws.com/0/154355/e5841974-5c1d-7e6c-11c4-66f7104af590.jpeg)


# 完成動画
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">受付システムをM5Stackと距離センサー使って自動応答させてみました<a href="https://twitter.com/hashtag/AmazonEcho?src=hash&amp;ref_src=twsrc%5Etfw">#AmazonEcho</a> <a href="https://twitter.com/hashtag/M5Stack?src=hash&amp;ref_src=twsrc%5Etfw">#M5Stack</a> <a href="https://t.co/735mgENWCV">pic.twitter.com/735mgENWCV</a></p>&mdash; がおまる@スマートスピーカー・HoloLens研究者 (@gaomar) <a href="https://twitter.com/gaomar/status/998482232091136002?ref_src=twsrc%5Etfw">2018年5月21日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

# 環境
- [M5Stack Gray（9軸IMU搭載）](http://ssci.to/3648)
- [GROVE - 超音波距離センサモジュール](http://ssci.to/1383)
- [Amazon Echo](https://amzn.to/2GFClyd)

# 1.超音波距離センサモジュールのライブラリを取得
超音波距離センサーモジュールのライブラリを下記からダウンロードしてきます。
ダウンロードしたものをArduinoのスケッチ-ライブラリをインクルード-.ZIP形式のライブラリをインストールを選択してインストールします。

https://github.com/Seeed-Studio/Grove_Ultrasonic_Ranger/archive/master.zip

![s100.png](https://qiita-image-store.s3.amazonaws.com/0/154355/79999697-ac83-52c6-6533-a6d086f995fe.png)

# 2.スケッチ例
来訪者が距離センサーの30cm以内に5秒間居た時にM5Stackに搭載されているスピーカーから「アレクサ、受付をひらいて」というSDカードに保存しているmp3ファイルを再生しています。
連続して動作するのを防ぐために、誰も居なくなって5秒経過したら検出モードを再開しています。

超音波距離センサーのGrove番号は22だったので、22を指定します。

```c++:sample.ino
#include "Ultrasonic.h"
#include <M5Stack.h>
#include "AudioFileSourceSD.h"
#include "AudioFileSourceID3.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"

#define DISTANCE 30

bool sayFlg = false;
int count = 1;

AudioGeneratorMP3 *mp3;
AudioFileSourceSD *file;
AudioOutputI2S *out;
AudioFileSourceID3 *id3;

long messageSentAt = 0;

// 距離センサー22番を指定
Ultrasonic ultrasonic(22);

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

  M5.begin();
  delay(500);

  // ボリューム調整
  M5.Speaker.setVolume(1);
  
  // mp3初期化
  file = new AudioFileSourceSD("/alexa_voice.mp3");
  id3 = new AudioFileSourceID3(file);
  out = new AudioOutputI2S(0, 1); // Output to builtInDAC
  out->SetOutputModeMono(true);
  mp3 = new AudioGeneratorMP3();

  M5.Lcd.setTextFont(4);
  M5.Lcd.setCursor(0, 0);

}

void loop()
{
  if (mp3->isRunning()) {
    if (!mp3->loop()) mp3->stop();
  } else {
    long RangeInCentimeters;

    // 距離センサーから取得
    RangeInCentimeters = ultrasonic.MeasureInCentimeters();

    // 画面クリア
    M5.Lcd.clear();
    M5.Lcd.setCursor(0, 0);

    // 画面に距離を表示
    M5.Lcd.printf("%d cm", RangeInCentimeters);
    
    delay(250);
  
    long now = millis();

    // 1秒ごとに距離をチェック
    if (now - messageSentAt > 1000) {
      messageSentAt = now;

      if (!sayFlg) {
        // 距離が30cm以下ならカウントアップする
        if (RangeInCentimeters < DISTANCE) {
          count++;

          // 5カウント(5秒)経過
          if (count > 5) {
            sayFlg = true;
            count = 1;
  
            // SDカードに保存している音声mp3データ再生
            file = new AudioFileSourceSD("/alexa_voice.mp3");
            id3 = new AudioFileSourceID3(file);
            out = new AudioOutputI2S(0, 1); // Output to builtInDAC
            out->SetOutputModeMono(true);
            mp3 = new AudioGeneratorMP3();
            mp3->begin(id3, out);
              
          }
        } else {
          count = 1;
        }
        
      } else {
        // 距離が30cm以上ならカウントアップする
        if (RangeInCentimeters > DISTANCE) {
          count++;

          // 5カウント(5秒)経過
          if (count > 5) {
            // 検出再開
            sayFlg = false;
            count = 1;                
          }
        } else {
          count = 1;
        }
        
      }
    }  

  }
  M5.update();
}

```

# 3.接続例
M5Stackとの接続例です。Groveシールドに差し込むだけで使えるので、とても便利に利用できます。
M5Stackには少しですが、バッテリーが搭載されているので、コードレスで稼働させることも可能です。

![m5stack-ultrasonic.jpeg](https://qiita-image-store.s3.amazonaws.com/0/154355/38a3c8bb-0a85-719a-99dc-45d5eaf5cf7f.jpeg)

# まとめ
M5Stackはその小さな筐体ながら様々なモジュールが導入されています。足りない機能は別売りのモジュールをStackすることでどんどんパワーアップしていきます。

今回は簡単な距離センサーを使った例でした。アイデア次第でもっと面白いことができると思います。
距離センサーは微妙に精度が悪いので、思った値が取得できなかったりするので実運用には厳しい印象でした。サクッと距離を測る分には申し分ないですけどね。

それでは素敵なM5Stackライフを！

システム化のご検討やご相談は弊社までお問い合わせください。
https://i-enter.co.jp/contact/