BluetoothLE
nefry
NefryBT
NefryDay 17

Nefry BTとMIT App InventorをつかったandroidアプリとのBLE通信をやってみた話

こんにちは

東海大学で学生をやっているものです.
「研究室のみんなとNefry BTを使ってはじめIotデバイスをつくってみた」の続きです.
さて,タイトルにもあるようにNefry BTを使ってAndroidアプリでBLE(Bluetooth Low Energy)による通信を行ってみました,という内容で書いてみます.
なので,いろいろ参考にしながらやってみました.
初心者なので,あまり詳しいことやよくわかっていないことが多いです.
それでも,ちょっとでも参考になれば幸いです.

実際につくってみたものはGithub上にあげています.
https://github.com/minwinmin/NefryBT_BLE_AndroidApp

概要

・AndroidアプリからNefry BTをLチカさせる
・Nefry BTのversionは1.0.5を使用
 (Nefry BTの最新版だと何故かうまくいきませんでした…)

マイコン側のプログラム

まず,Nefry BTに入っているサンプルプログラム(BLE_notify)を参考にして改良していきました.
では,説明していきます.
github上にあげたBLE_LED2_success.inoというプログラムを見ながらだとわかりやすいかと思います.

UUIDの設定

まず,UUIDのSeviceとCharacteristicを設定しましょう.
これは,調べれば自動で生成してくれるサービスがあるので任意で設定してください.

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

実現したい機能

Androidアプリのボタンが押されたら,Nefry BT上のLEDがランダムに光が変化するプログラム.
そこで,このプログラムでは下記のように,何か「文字列」がアプリから送られてきたらLEDの発光がランダムに変化するというようになっています.

class MyCallbacks: public BLECharacteristicCallbacks {
    void onWrite(BLECharacteristic *pCharacteristic2) {
      std::string j = pCharacteristic2->getValue();

         randomSeed(analogRead(A0));

         if (j.length() > 0) {
         red=random(255);          //random関数は0-255の数値をランダムに返します。
         green=random(255);
         blue=random(255);
         Nefry.setLed(red,green,blue);
         delay(1000);
         Nefry.println("On");   
         }else{
         Nefry.println("Off");
         }
    }
};
MyCallbacks myCallbacks;//名前を端的にわかりやすくした

BLEの初期設定

// Create the BLE Device
  BLEDevice::init("MyESP32");

  /////////////////////////////////////////////////////////////////////
  //BLEServer *pServer = BLEDevice::createServer();
  BLEServer *pServer = new BLEServer();
  ///上の2行は同じ意味のようだが,Nefry BTのバージョンによってエラーが出るので,その都度,どちらかを置き換えて使うこと.
  ///最新のバージョンだと上の一行が正しい
  //////////////////////////////////////////////////////////////////////
   // Create the BLE Service
  BLEService *pService2 = pServer->createService(SERVICE_UUID2);
   //serviceのどういうことをやるかをcharacteristic(特性)を指定する,READ,WRITEなど 
  BLECharacteristic *pCharacteristic2 = pService2->createCharacteristic(
                                         CHARACTERISTIC_UUID2,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );
  pCharacteristic2->setCallbacks(&myCallbacks);//特性を指定したclassにもどす.機能の追加には&をつける.classはpythonみたいな感じ.読み込んだ値なども格納されている.
  pCharacteristic2->setValue("Hello");
 pService2->start();
pServer->getAdvertising()->start();

こんな感じで一通りvoid setup()の中にプログラムを書きます.

Androidアプリ

「Androidアプリをつくってみた」といっても,Android studioを使いこなせるだけの技術力があるわけではないので,お手軽にアプリをつくれる(はず)のMIT App Inventorというものを使ってみました.まずは上記のサイトにアクセスしましょう.
そして,まず,Github上にあげたプログラムを動かしてみましょう.
https://github.com/minwinmin/NefryBT_BLE_AndroidApp/tree/master/Androidapp_BLE

MIT app inventorの導入とBLE機能の追加

1.MIT app inventorにアクセス
上記のアドレスにアクセスして,Creat apps!をクリック.
1.jpg

2.BLE機能を追加
MIT App InventorでBLE機能を使うにはライブラリをいれる必要があります.
フォルダ内にある「edu.mit.appinventor.ble.aix」を下記の手順でいれてください.まず,「start new project」で新規プロジェクトを作成してください.
2.jpg
左にある「Extension」をクリックし先ほどのaixファイルをimportしてください.
3.jpg
これでBLE機能が使えるようになるはずです.

3.プログラムをimport
下記の画像のように,BLE_NefryBT.aiaをimportしてください.
4.jpg
このように出るはずです.
図6.png

4.プログラムの動作確認
上部にあるconnectをクリックします.
次に「Al companion」をクリック.QRコードと文字列が出てきます.これをアプリ側でQRコードを読み込むか文字列を入力します.アプリについて下記に示します.
図7.png
例えば,下記のような感じ
図8.png

5.Androidのスマートフォンに「MIT AI2 Companion」というアプリを導入
ダウンロードし,起動したら4で現れたQRコードもしくはコードを入力したらアプリが起動します.(アプリをapk形式に出力し,直接,スマートフォンにインストールするという方法もあります.)
6.jpg

アプリ側の使い方

図9.png
1.スマートフォンのBluetooth設定をonにしてアプリ上で「scan」を押す
2.「Available Devices」を選択し,Nefry BT側で設定したデバイス名を選択する.これでペアリングが完了
3.「Control」を押すことで,Nefry BT上でLチカができます.(下のgif画像よりわかると思います.)
LチカBLE.gif

Androidアプリの中身

MIT App Inventorを開き「Block」をクリックし,どういったプログラムになっているか見てみましょう.
では,まずNefry BTとスマートフォンをペアリングする必要があります.
以下の画像に示しているものががBLEもしくはBluetoothを使うために必要である基本的なプログラムです.これは,どんなプログラムでも使いまわせると思います.
BLE_App.png
:grin:
次に,「Botton1」つまり「Control」というボタンが押された時のプログラムを記述します.それが下記の画像です.
ここで重要なのは,あらかじめNefry BTに書き込むプログラムで設定した「serviceUUID」と「characteristicUUID」を一致させることです.
今回は,「Control」というボタンが押されたら,「Hello」という文字列をNefry BT側に送っています.これで,Nefry BTでLチカすることができます.
Controlボタン.png

まとめ

BLEが使えるようになったときは,とても嬉しかったです.
まったくBLEの知識もAndroidアプリの知識もなかったのですが,なんとなくやってみたらなんとなく出来てしまいました.
なので,あんまり内容の正確さに自信がないのですが,少しでも参考になれば幸いです:grin: