LoginSignup
0
0

More than 3 years have passed since last update.

M5Stack BasicにEddystone Beaconを検出したときにMP3ファイルを再生させるまで

Last updated at Posted at 2021-03-24

用意した物

  1. microSDカード
  2. M5Stack Basicと付属のUSBケーブル
  3. Androidスマートフォン
  4. Arduino IDEをセットアップ済みのWindows10

MP3ファイルの用意

再生させたいMP3ファイルを用意します。

ここでは、Audionautixから、クリエイティブ・コモンズの音楽ファイルLimosine.mp3をダウンロードしてくることにします。

別のものを用意した場合には、以下のファイル名Limosine.mp3を、用意したMP3ファイルのファイル名に読み替えてください。

Creative Commons Music by Jason Shaw on Audionautix.com

microSDカードをWindows10の動いているPCのカードリーダ・ライタに挿入し、ルートディレクトリに、Limosine.mp3をコピーします。

コピーが終了したら、microSDカードをPCから取り外して、M5Stack Basicに挿入しておきます。

Eddystone Beaconの送信機の用意

M5Stack Basicに対してEddystone Beaconを送信する機器を用意します。

ここでは、Androidスマートフォン上で動作するアプリBeacon Simulatorを利用することにします。

Beacon Simulatorのインストール後、起動したら、メイン画面の右下の「+」をタップします。

01.png

画面下部にBeaconの種類の選択肢が表示されるので、"Eddystone UID"をタップします。

02.png

デフォルトでランダムなNamespace IDのEddystone Beaconの設定に、日付を含むラベル"EddystoneUID-YYYY-MM-DD"がつけられて、候補として表示されます。

変更があれば適切に変更した上で、画面右上の「✓」をタップします。

03.png

メイン画面に戻ると、設定したものが、登録されていることがわかりますが、この状態ではまだEddystone Beaconは送信されていません。

04.png

ここで、設定したEddystone Beaconの横にある灰色の長丸印をタップすると、オレンジ色となってEddystone Beaconの送信が始まります。

05.png

この時点では、送信できているかどうかは不明ですが、オレンジ色になっている長丸印をタップして灰色に変わることを確認し、Eddystone Beaconの送信を停止させておきます。

Arduino IDEでESP8266Audioをインクルード

Arduino IDEを起動して、メニューバーの「スケッチ」→「ライブラリをインクルード」→「ライブラリを管理」を選択します。

01.png

ライブラリマネージャのウィンドウが起動するので、検索窓に"ESP8266Audio"とキーボードで入力します。

しばらくすると、検索結果がウィンドウ内の下部に表示されるので、「インストール」ボタンをクリックしてインストールします。

02.png

インストールが終わったら、「閉じる」ボタンをクリックして、ライブラリマネージャを閉じます。

スケッチの作成

Windows10上でArduino IDEを起動し、スケッチを作成します。

#include <string>

#include <M5Stack.h>
#include <BLEDevice.h>

#include "AudioFileSourceSD.h"
#include "AudioFileSourceID3.h"
#include "AudioGeneratorMP3.h"
#include "AudioOutputI2S.h"

#define EDDYSTONE_BEACON BLEUUID((uint16_t)0xFEAA)
#define BEACON_NAMESPACE \
        {0x51, 0x17, 0xb8, 0x81, 0xc2, 0xc7, 0xd3, 0x0f, 0x47, 0x19}
#define MP3AUDIO_FILEPATH "/Limosine.mp3"
#define BLESCAN_DURATION 120

static uint8_t NS[] = BEACON_NAMESPACE; 
BLEScan* pBLEScan;
bool detected = false;

class playMP3 {
  private:
    AudioGeneratorMP3* _mp3;
    AudioFileSourceID3* _id3;
    AudioOutputI2S* _out;
  public:
    playMP3(char* path): 
      _mp3(new AudioGeneratorMP3()),
      _id3(new AudioFileSourceID3(new AudioFileSourceSD(path))),
      _out(new AudioOutputI2S(0, 1)) {}
    void setParameters(float gain=0.5) {
      _out->SetGain(gain);
      _out->SetOutputModeMono(true);
    }
    void play(void) {
      _mp3->begin(_id3, _out);
      while (_mp3->isRunning()) {
        if (!_mp3->loop()) {
          _mp3->stop();
        }
      } 
    }
};

class myBLEAdvertisedDeviceCB: public BLEAdvertisedDeviceCallbacks {
  private:
    uint8_t* _ns;
    uint8_t _size_ns;
  public:
    myBLEAdvertisedDeviceCB(uint8_t* ns, uint8_t size_ns=10):
      _ns(ns), _size_ns(size_ns) {}
    void onResult(BLEAdvertisedDevice advertisedDevice) {
      uint8_t cServiceData[100];
      std::string strServiceData = advertisedDevice.getServiceData();
      strServiceData.copy((char *)cServiceData, strServiceData.length(), 0);
      if (advertisedDevice.getServiceDataUUID().equals(EDDYSTONE_BEACON)) {
        if (memcmp(cServiceData+2, _ns, _size_ns) == 0) {
          advertisedDevice.getScan()->stop();
          detected = true;
          M5.Lcd.printf("NS:");
          if (_size_ns + 2 < strServiceData.length()){
            for (int i=0; i<_size_ns; i++) {
              M5.Lcd.printf("%02X",cServiceData[i+2]);
            }
          }
          M5.Lcd.printf(" Device:%s\n", advertisedDevice.toString().c_str());
        }
      }
    }
};

void setup()
{
  M5.begin();
  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan();
  pBLEScan->setAdvertisedDeviceCallbacks(new myBLEAdvertisedDeviceCB(NS));
  pBLEScan->setActiveScan(true);
}

void loop()
{
  playMP3 audio(MP3AUDIO_FILEPATH);
  audio.setParameters();
  detected = false;
  M5.Lcd.clear(BLACK);
  M5.Lcd.setCursor(0, 0);
  M5.Lcd.printf("Scanning Eddystone Beacon...\n");
  pBLEScan->start(BLESCAN_DURATION, false);
  if (detected) {
    audio.play();
  }
}

gitが使える環境であれば、適当なディレクトリで、git cloneすることで、上記スケッチの雛形をダウンロードできます。

git clone https://github.com/yohama/PlayMP3TriggeredByEddystone.git

ダウンロード後に、PlayMP3TriggeredByEddystone/PlayMP3TriggeredByEddystone.ino内のコードのうち、define文の記述を書き換えてください。

スケッチを作成し終えたら、メニューバーの「ファイル」→「名前を付けて保存」と選択して、適当な名前で保存します。

次に、M5Stack Basicを、USBケーブルで、Arduino IDEの動作しているPCに接続しておきます。

そして、「→」(マイコンボードに書き込む)ボタンをクリックします。

しばらくの間コンパイルが行われ、コンパイル終了後にM5Stack Basicに書き込まれます。

動作確認

M5Stack Basicの画面に"Scanning Eddystone Beacon..."と表示されたら、Eddystone Beaconの送信機から、スケッチ内のdefine文でBEACON_NAMESPACEで設定したビーコンを送信します。

M5Stack Basicのスピーカーから、MP3の音声ファイルが再生されたら成功です。

参考サイト

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0