#こんにちは
東海大学で学生をやっているものです.
「研究室のみんなと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!をクリック.
2.BLE機能を追加
MIT App InventorでBLE機能を使うにはライブラリをいれる必要があります.
フォルダ内にある「edu.mit.appinventor.ble.aix」を下記の手順でいれてください.まず,「start new project」で新規プロジェクトを作成してください.
左にある「Extension」をクリックし先ほどのaixファイルをimportしてください.
これでBLE機能が使えるようになるはずです.
3.プログラムをimport
下記の画像のように,BLE_NefryBT.aiaをimportしてください.
このように出るはずです.
4.プログラムの動作確認
上部にあるconnectをクリックします.
次に「Al companion」をクリック.QRコードと文字列が出てきます.これをアプリ側でQRコードを読み込むか文字列を入力します.アプリについて下記に示します.
例えば,下記のような感じ
5.Androidのスマートフォンに「MIT AI2 Companion」というアプリを導入
ダウンロードし,起動したら4で現れたQRコードもしくはコードを入力したらアプリが起動します.(アプリをapk形式に出力し,直接,スマートフォンにインストールするという方法もあります.)
###アプリ側の使い方
1.スマートフォンのBluetooth設定をonにしてアプリ上で「scan」を押す
2.「Available Devices」を選択し,Nefry BT側で設定したデバイス名を選択する.これでペアリングが完了
3.「Control」を押すことで,Nefry BT上でLチカができます.(下のgif画像よりわかると思います.)
###Androidアプリの中身
MIT App Inventorを開き「Block」をクリックし,どういったプログラムになっているか見てみましょう.
では,まずNefry BTとスマートフォンをペアリングする必要があります.
以下の画像に示しているものががBLEもしくはBluetoothを使うために必要である基本的なプログラムです.これは,どんなプログラムでも使いまわせると思います.
次に,「Botton1」つまり「Control」というボタンが押された時のプログラムを記述します.それが下記の画像です.
ここで重要なのは,あらかじめNefry BTに書き込むプログラムで設定した「serviceUUID」と「characteristicUUID」を一致させることです.
今回は,「Control」というボタンが押されたら,「Hello」という文字列をNefry BT側に送っています.これで,Nefry BTでLチカすることができます.
#まとめ
BLEが使えるようになったときは,とても嬉しかったです.
まったくBLEの知識もAndroidアプリの知識もなかったのですが,なんとなくやってみたらなんとなく出来てしまいました.
なので,あんまり内容の正確さに自信がないのですが,少しでも参考になれば幸いです