Help us understand the problem. What is going on with this article?

【micro:bit 2019】micro:bit と #obniz で BLE + UART を試そうとした話と Mac用ツール(30記事目)

この記事は 12/31 に執筆して、後から 「micro:bit Advent Calendar 2019 - Qiita」の 13日目 へと登録した記事です。

今年のアドベントカレンダー用に書いた記事の 30記事目で、micro:bit Advent Calendar に登録した記事としては 11記事目になります。

はじめに

micro:bit と Androidアプリとの間で、BLE + UART での文字列の送受信を試した記事を書きました。

●【micro:bit 2019】micro:bit で BLE + UART による文字列の送受信(29記事目) - Qiita
 https://qiita.com/youtoy/items/46502b9bd17fad16d427

今回は Androidアプリとの間ではなく、obniz との間での通信を試してみようと思います。

onbiz でのデバイス検索を試す

まずは、公式ドキュメントを見つつ、デバイスのスキャンから試してみようと思います。

●BLE: セントラル-ペリフェラルを探す | obniz js SDK の基礎 | obniz
 https://obniz.io/ja/lessons/obnizjs/lessons_obnizjs_ble_central_search

以下の記載のとおり、条件付での検索もできるようですが、まずは条件なしでの検索を試してみます。

条件付き検索
すべての検索以外にも以下の指定が可能です。

 ・advertisementに含まれるUUIDを指定して検索
 ・名前(localName)を指定して検索
 ・タイムアウトを30秒から変更
 ・同一のデバイスでも新しいadvertisementを受け取ったら通知。

obniz のコンソールから、プログラムを書いていきます。
なお、「OBNIZ_ID_HERE」の部分にはご自身の obniz の ID を、「BBC micro:bit [?????]」の部分には、ご自身の micro:bit のローカルネームを設定してください。

<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://unpkg.com/obniz@3.1.0/obniz.js" crossorigin="anonymous"></script>
  </head>
  <body>
    <h3 class="text-center">BLE</h3>
    <script>
      var obniz = new Obniz("OBNIZ_ID_HERE");
      obniz.onconnect = async function () {
        await obniz.ble.initWait();

        var target = {
          localName: "BBC micro:bit [?????]"
        };

        obniz.ble.scan.onfind = function(peripheral){
          console.log(peripheral.localName)
          console.log(peripheral)
        };
        obniz.ble.scan.onfinish = function(peripheral){
          console.log("scan timeout!")
        };
        obniz.ble.scan.start(target);
      };
    </script>
  </body>
</html>

micro:bit のプログラムは、上でリンクを記載していた記事と同じものを用いました(ブロックのうち、半分くらいは不要なものですが・・・)。
Microsoft_MakeCode_for_micro_bit_BLE_UART_MC.jpg

そして、上記の obniz のプログラムを実行したところ、以下のとおりコンソールに micro:bit を検索した結果が表示されました。
obniz_-_developer_s_console.jpg
ちなみに、上記の obniz のプログラム中の「target」で localName をしなかった場合は、端末の周囲に複数の BLE で通信しているデバイスがある場合、それらが全て検出されることになります。
(とりあえずは target を指定しないで、周囲のデバイスの検索をしてみるのも良いかもしれません)

onbiz との間で BLE通信(ボタンサービスを試す)

UART でのデータ送受信を試す前に、ひとまず micro:bit との間のやりとりを何か試してみようと思いました(いきなり BLE + UART を試そうとして、うまくいかなかった流れがあり・・・)。
以下が分かりやすかったので、こちらの内容を進めました。

●【BLE初心者必見】obniz BLEでmicro:bitの加速度センサーとボタンの状態を取得する方法 - Qiita
 https://qiita.com/Google_Homer/items/7b8ad409d8575c5647d1

micro:bit側は、上記の記事の内容をベースにしたものを作りました(上記の記事のもの、そのままでも大丈夫です)。

また obniz側も変更を加えたものを用い、変更後のプログラムの全体は以下となりました。
なお、「OBNIZ_ID_HERE」の部分にはご自身の obniz の ID を、「BBC micro:bit [?????]」の部分には、ご自身の micro:bit のローカルネームを設定してください。

<html>
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://unpkg.com/obniz@3.1.0/obniz.js" crossorigin="anonymous"></script>
  </head>
  <body>
    <h3 class="text-center">BLE 2</h3>
    <script>
      var obniz = new Obniz("OBNIZ_ID_HERE");

      //ボタンサービス
      const UUID_BUTTON_SERVICE                    = "E95D9882251D470AA062FA1922DFA9A8";
      const UUID_BUTTON_A_SERVICE_CHARACTERISTICS  = "E95DDA90251D470AA062FA1922DFA9A8";

      var target = {
        localName: "BBC micro:bit [?????]"
      };

      obniz.onconnect = async function () {
        await obniz.ble.initWait();

        var peripheral = await obniz.ble.scan.startOneWait(target);
        if(peripheral){
          console.log("found");

          var connected = await peripheral.connectWait();
          if(connected){
            console.log("connected");

            obniz.repeat( async function(){
              //ボタン取得 0:OFF 1:単押し 2:長押し
              var A = await peripheral.getService(UUID_BUTTON_SERVICE).getCharacteristic(UUID_BUTTON_A_SERVICE_CHARACTERISTICS).readWait();

              //取得データ表示
              obniz.display.clear();      
              obniz.display.print("ボタン A:"+A);
              console.log("ボタン A:"+A);
            },500)

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

上記を動作させたところ、micro:bit のボタンの状態を、コンソール上や obniz のディスプレイ上に表示させることができました。

onbiz との間で BLE + UART

それでは、obniz と micro:bit との間で、BLE + UART の通信を試していきたいと思います。
上で試したボタンサービスに関する内容では、「getService と getCharacteristic」で指定していたものがボタンに関するものを使っているため、この部分は置きかえが必要です。

UART を使う場合の情報を探してみていて、以下のサイトがでてきました。

●Bluetooth Developer Studio - Profile Report
 https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html

ここから UART 関連の情報を抜粋してみます。

UART SERVICE
 UUID: 6E400001B5A3F393E0A9E50E24DCCA9E

UART SERVICE - CHARACTERISTICS
 ・TX Characteristic
  UUID: 6E400002B5A3F393E0A9E50E24DCCA9E
 ・RX Characteristic
  UUID: 6E400003B5A3F393E0A9E50E24DCCA9E

ひとまず、「TX と RX のうち RX のほう」をを試してみることにします。

micro:bit のプログラム

micro:bit 側のプログラムを、前に記事を書いたときのものから少し変えて、以下のようにしてみました。

Microsoft_MakeCode_for_micro_bit_001.jpg

意図通りの動作をしているか、Androidアプリでデータを受信して確認してみて、以下のとおり加速度のデータを取得できていました。

obniz のプログラム

上記のプログラムの

  //ボタンサービス
  const UUID_BUTTON_SERVICE                    = "E95D9882251D470AA062FA1922DFA9A8";
  const UUID_BUTTON_A_SERVICE_CHARACTERISTICS  = "E95DDA90251D470AA062FA1922DFA9A8";

 ↓

  // UARTサービス
  const UUID_UART_SERVICE                    = "6E400001B5A3F393E0A9E50E24DCCA9E";
  const UUID_UART_SERVICE_CHARACTERISTICS_R  = "6E400003B5A3F393E0A9E50E24DCCA9E";

とりあえず、これで動かしてみました。
そして、以下のエラーが・・・(やはり、どんな形でデータが来るのかや、どのようにデータを取得すれば良いのかを、きちんと見ないとダメでした・・・)。
obniz_-_developer_s_console001.jpg

情報を色々調べてみる

ここで、BLE 周りの情報をあらためて調べて見ました。
その中で「Mac上でデータを便利に見られたりしないかな」と思って調べた、解析に使えそうなツールを記載しておこうと思います。

Mac上で BLE の情報を解析

こちらは、Mac上 で BLE の情報を見るツールの話になります。
「Apple製のツール Bluetooth Explorer」が良い感じらしいです。以下の 2つの記事の情報をまとめると、2019/12/31時点でこのツールを導入するには、
 Xcode のメニューの「 [Xcode] > [Open Developer Tool] > [More Developer Tools...] 」を選択 ⇒ 起動したブラウザのページからログイン ⇒ Additional Tools for Xcode をダウンロード
という手順を踏めば良さそうでした。

●Apple製開発ツール「Bluetooth Explorer」でBLEデバイスのGATT仕様を確認する - Qiita
 https://qiita.com/shu223/items/46dabad41cf2eed67d13

●Xcode8以降でHardware IO Tools を使う方法は Additional Toolsをインストールすればいい - Qiita
 https://qiita.com/rd0501/items/f3e3094f79c2ace3b193

以下が、ダウンロードページのキャプチャ画像です。
More_Software_Downloads_-_Apple_Developer.jpg

そして、このツールをダウンロードして、実際に使ってみました。
使い方は上記のページに書かれたとおり、「Bluetooth Explorer のメニューの [Devices] > [Low Energy Devices] で起動」という流れで、以下のとおりデバイスのリスト等を閲覧することができました。

Low_Energy_Devices.jpg

良い感じに情報を閲覧できそうで、別途、いろいろ機能を試してみようと思います。

おわりに

micro:bit と obniz の間での、BLE + UART を使ったデータ送受信は途中までとなりましたが、その過程で BLE に関する色々な情報やツールの情報などが得られて良かったです。
引き続き、着実に BLE活用を進められればと思います。

追記

以下、今回の続きを進めるのに使いそうな情報。

あと、Python での利用とかも調べてみようかな。

あとは、micro:bit との連携のサンプルがけっこう見つかる気がする Web Bluetooth API とかも試してみるかな。

youtoy
業務の研究開発では「UI/UX、画像処理・映像伝送」といった分野のことをやってきました。 Qiitaの記事で書いていることは、主にプライベートでのコミュニティ活動で関わっている内容になります。
http://yo-to.hatenablog.com/
kddi
KDDIは、通信を中心に周辺ビジネスを拡大する「通信とライフデザインの融合」をより一層推進し、国内はもとよりグローバルにおいても、5G/IoT時代における新たな価値創造を実現し、お客さまの期待を超える新たな体験価値の提供を追求してまいります。
http://www.kddi.com
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした