【BLE初心者必見】obniz BLEでmicro:bitの加速度センサーとボタンの状態を取得する方法

#■簡単すぎるぞBLE
***BLEの事は全くわからないんだけど、obnizとmicro:bitでBLEしてみたい方に強くお勧めしたい内容です***。BLE、やってみたら実はLチカとさほどかわらないほど簡単だったので、これからBLEを始める方のハードルも下がればうれしいなと思い投稿しました。***micro:bitから情報を取得してobnizに表示するBLEサンプルプログラムの作成方法***を解説します。obnizとmicro:bitの基本操作については知っている事を前提で説明していきます。

#■紹介するプログラムの概要
***micro:bitの加速度センサーの値とボタンの状態をBLE通信を使って取得して、obnizに表示***するプログラムです。BLEは親子関係で通信するので、両方のプログラムをつくります。***micro:bit側は「ペリフェラル」と呼ばれる子供モード***で動作するようなので、***obniz側は「セントラル」と呼ばれる親のモード***でプログラムします。micro:bit側はBLEの知識はほとんど不要です。***obniz側のセントラルも予想に反してscan→connect→readWaitという3つの簡単な手順***を踏むだけです。***micro:bit側はブロック***で、***obniz側はHTML JavaScript***でそれぞれプログラミングします。

#■プログラム動作のデモ動画
まずは、デモ動画から。
micro:bitを左右(X)、前後(Y)、表裏(Z)に傾けたたり、左ボンタ(A)、右ボタン(B)を押したりしています。この各動作と、obnizのDisplayに表示された数値の対応を見て下さい。
https://youtu.be/bF-WuW8rL68

#■プログラム作成の大まかな手順
プログラム本体以外に、ほんの少し設定なんかも必要です。おおむね下記手順です。
***【micro:bit側】***
***　・拡張機能のbleutooth機能を有効にする***
***　・No pairingモードに変更する***
***　・micro:bit側のプログラムをつくる***
***　・micro:bitのBLEデバイス名を調べる***
***【obniz側】***
***　・obniz側のプログラムをつくる***
#■順詳細手順
#【micro:bit側】拡張機能のbluetooth機能を有効にする
下記手順で拡張機能のbletoothを有効にします。

(参考情報)
まぎらわしいのですが、micro:bitのBluetooth機能には「無線」と「bluetooth」の2つがあるようです。***「無線」はmicro:bit間でのみ通信***する機能、***「bluetooth」はobnizのような一般的な機器とBLE通信***する機能のようです。2つ同時には使えないので、ブロックメニュー自体を入れ替えて使う形になっているようです。
![microbit 設定1.png](https://qiita-image-store.s3.amazonaws.com/0/234533/95551613-b4a4-be59-499b-0c86955fdd96.png)

#【micro:bit側】No Pairingモードに変更する
これはよくわからないのですが、下記のように設定する必要があるようです。
設定歯車でプロジェクトの設定に入り、No pairingを設定して下さい。
![microbit BLE 設定 2.png](https://qiita-image-store.s3.amazonaws.com/0/234533/722f73c5-9dc7-ed99-f361-44af00c08578.png)

#【micro:bit側】micro:bit側のプログラムをつくる
しゃれにならないほど簡単です。bluetoothブロックの***「加速度計サービス」***と***「ボタンサービス」***を***起動する***ようにするだけです。動作確認しやすいように接続/切断でLED表示するようにもしましたが、何ならこの部分すら不要です。***obniz側では、この2つのサービスとやり取りをしてデータを取得***することになります。このサービスは相手が動いていないとエラーになるというものではなく、話しかけられたら答えるという仕組みのようで単独で動作します。
![microbit BLEサーピス.png](https://qiita-image-store.s3.amazonaws.com/0/234533/ab5c991e-b4d1-7d42-2c90-92fcd084f468.png)

#【micro:bit側】micro:bitのBLEデバイス名を調べる
つくった***micro:bit側のブロックプログラムを起動***して、***スマホのBluetooth設定画面なんかでスキャン***します。何となく***micro:bitという文字を含む機器***から当たりをつけてます。私のmicro:bitは"BBC micro:bit [pevov]"という名前でした。これを、次に説明するobniz側のプログラムに設定します。
![無題1.png](https://qiita-image-store.s3.amazonaws.com/0/234533/e9c3fe1a-d4f2-c899-25b6-922cd167c475.png)


#【obniz側】obniz側のプログラムをつくる
***micro:bitから加速度X/Y/Zの値と、ボタンA/Bの状態を取得して表示***します。BLEセントラルは、***scan→connect→readWaitという流れが基本***のようです。加速度はバイナリで返されるので普通の数値に変換しています。

***下記2箇所を自分用に設定すれば動くはずです。***
***　・const MICROBIT = { localName: "BBC micro:bit [pevov]" }***
***　・new Obniz("XXXX-XXXX")***

```html
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <script src="https://obniz.io/js/jquery-3.2.1.min.js"></script>
  <script src="https://unpkg.com/obniz@2.0.2/obniz.js" crossorigin="anonymous"></script>
</head>
<body>
obniz micro:bit_BLE_repeat_SAMPLE
<script>

//各サービスのUUIDは下記サイトで確認できる(全micro:bit共通)
//https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html
//加速度計サービス
const UUID_ACCELEROMETER_SERVICE                  = "E95D0753251D470AA062FA1922DFA9A8";
const UUID_ACCELEROMETER_SERVICE_CHARACTERISTICS  = "E95DCA4B251D470AA062FA1922DFA9A8";
//ボタンサービス
const UUID_Button_Service                         = "E95D9882251D470AA062FA1922DFA9A8";
const UUID_Button_A_Service_CHARACTERISTICS       = "E95DDA90251D470AA062FA1922DFA9A8";
const UUID_Button_B_Service_CHARACTERISTICS       = "E95DDA91251D470AA062FA1922DFA9A8";

//自分のmicro:bitのBLEの名前  
const MICROBIT = { localName: "BBC micro:bit [pevov]" };

var obniz = new Obniz("XXXX-XXXX");
obniz.onconnect = async function () {

   var peripheral = await obniz.ble.scan.startOneWait(MICROBIT);
   var connected = await peripheral.connectWait();
   if ( connected ){  
      obniz.repeat( async function(){

         //加速度取得 各-1000ぐらい～+1000ぐらいの範囲
         var data = await peripheral.getService(UUID_ACCELEROMETER_SERVICE).getCharacteristic(UUID_ACCELEROMETER_SERVICE_CHARACTERISTICS).readWait();   
         //バイナリの加速度を数値に変換(符号付き・2バイト・リトルエイディアン)
         var X = (data[1]*256)+data[0];if (X & 0x8000) X=-((X-1)^0xffff);
         var Y = (data[3]*256)+data[2];if (Y & 0x8000) Y=-((Y-1)^0xffff); 
         var Z = (data[5]*256)+data[4];if (Z & 0x8000) Z=-((Z-1)^0xffff); 

         //ボタン取得 0:OFF 1:単押し 2:長押し
         var A = await peripheral.getService(UUID_Button_Service).getCharacteristic(UUID_Button_A_Service_CHARACTERISTICS).readWait();
         var B = await peripheral.getService(UUID_Button_Service).getCharacteristic(UUID_Button_B_Service_CHARACTERISTICS).readWait();

         //取得データ表示
         obniz.display.clear();
         obniz.display.print("加速度 X:"+X);
         obniz.display.print("　　　 Y:"+Y);
         obniz.display.print("　　　 Z:"+Z);        
         obniz.display.print("ボタン A:"+A+" B:"+B);         
      },10)

   }else{
      obniz.display.clear();
      obniz.display.print("micro:bit Connect Error"); 
   }
}
</script>
</body>
</html>
```

#■まとめ
BLE、やってみたらとてもハードルが低かったです(奥は深いのかもしれないが)。これで、ボタン電池でも駆動できる無線接続の加速度センサーを、たったの2000円で手に入れたことになります。obnizとmicro:bitをBLEで連携させる事で、ますますobnizで面白いことができそうです。

#■Appendix
今回micro:bitから加速度とボタンのサービスを取得しましたが、その他にも地磁気センサーやLED表示状態なんかも取得できるようです。これらの情報にアクセスするにはUUIDと呼ばれる長い16進のような情報が必要です。[[こちら]](https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html)のサイトに情報が載っていますので参考にして下さい。