micro:bitをBLE(Bluetooth Low Energy)を使ってブラウザーから操作するという、とても大事な技術の研究。

技術の社会的意義

micro:bitをあきらめた。アメリカの友人が「今はESP32がホットだし安いぜ。」なんだそうな。
日本はやはり後追いだ。

なぜならばみなさんはIoTと騒いでいるけど、もう少し詳細を考えたことはあるだろうか?

IoTデバイスがセンサーをもっているとする。
それをどうやってインターネットにつなぐと思いますか。

ほとんどの人がWi-Fiとか、小型の携帯電話モジュールとかを考えると思います。
おそらく技術を知らないマッキンゼーとかBCGとかの間抜けなコンサルタントもそう考えるんじゃないかな。アクセンチュアみたいに自分でシステム構築していないどころか、売り物のプログラム一本書いたことない「戦略コンサル」がIT技術を語るのは本当に嫌いだ。(と毒を吐く)

でもね、それは今の技術じゃ不可能なんです。

Wi-Fiも携帯電話モジュールも場合によっては3.3V2アンペア近い電力が必要です。電池ではたちまち消耗します。
この単純な事実が知られていない。

考えてもみてください。スマホってリチウムイオン電池という今の最新の技術を使っていても、ほぼ毎日充電しますよね。

ばらまいたIoTデバイスを充電したり電池交換して歩いたりできると思いますか?

それを解決する技術は現在ただひとつBluetooth Low Energy(BLE)しかないんです。

BLEは従来のBluetoothとは互換性のない技術です。

IoTを使おうとするならばBLEで、あなたのもっているスマホにデータを渡し、そこからインターネットに飛ばすしか現状ではちょっと考えにくい。
(もちろん自動販売機や自動車みたいに大きな電源もってて、そこから給電すればいいというのは別ですよ。私の想定は広い工場敷地内とか、通りです。)

よってBLEとアプリケーションを配布しないでいい、ブラウザーの進化から目を離せないのです。
とくにGoogle Chromeはこの分野の最先端を走っています。

2018年6月現在、一部の専門家しか気づいてないと思います。

以下、技術研究。

Javascript

Promise

Promiseとは、ちょっと前にリリースされたJavascript界の大事件である。

私は知らなかった。

もともとJavascriptはシングルスレッドであった。
このあたりから書き起こされたGoogleドキュメントがこれ

なにかのイベントにaddEventListenerでイベントハンドラーをつけたとしても、それは非同期では動かない。イベントを受け取ったら所定のコールバック関数を呼ぶ。

そこでイベント1ができたら、イベント2をやって、とプログラムを書くとどんどんネストが深まった関数ができてしまう、と。

それを解決するのがPromiseです。(個人的には非同期処理の順序を約束するからPromiseなのかなぁ、と)

これ実行すると、Hello World, Task A, Task Bと出力されます。

これ以上の議論はこのブックレットを読むべし。
忙しい時はこちらでも。なお、ほとんどの解説がよくわからず書かれている模様。

さらにアロー関数が頻繁に出てくるのでアロー関数の勉強

アロー関数

アロー関数は無名関数を簡単に書こうというもの。(thisの扱いが変わるが、今回は割愛)

もともとこう書いて関数を変数にいれちまう。

これを

return を省略できる。

これだけだとつまんないけど、

引数がいっぱいある時は

引数が1つしかない時は()が省略できて

(これを知らず、えらい苦労した)

引数がない時は省略できない。

 

これをふまえて、ブラウザーからのBLEのハンドリングを書くことになります。(Googleさんが、そうしているから)

micro:bit

スケッチ

参照:https://lancaster-university.github.io/microbit-docs/ble/profile/

micro:bitのプロジェクトにBLuetoothのパッケージを追加する。
以下のようなエラーが出るけど無視して置き換える。

すると、「プロジェクトの設定」でBLuetoothのセキュリティレベルを下げられる。

プログラムのセットアップ部分で、Bluetoothの使用可能としておく。

最低限、Bluetoothが繋がった、切れた、イベントを

ここでプログラムをボードへダウンロード

Google Chrome

ブラウザー側にmicro:bitのUUIDを知らせなきゃいけないそうです。

こちらから

BLEの接続シーケンスについてはこちらのサンプルで学ぶ

  1. デバイスの検索
  2. GATTサーバーに接続(device.gatt.connect)
  3. プライマリーサービスの取得(server.getPrimaryService)
  4. キャラクタリスティックの取得(service.getCharacteristic)
  5. キャラクタリスティックにvalueを書き込む(characteristic.writeValue)

UUIDは使うサービスとキャラクタリスティクスを得なくてはいけません。

ボタンサービス
UUID: E95D9882251D470AA062FA1922DFA9A8

ボタンサービス-キャラクタリスティクス
UUID: E95DDA90251D470AA062FA1922DFA9A8

ブラウザーのJavascript

https://qiita.com/yokmama/items/5522fabfb5b9623278e2

デバイスの検索

GATTへ接続

プライマリーサービスの取得

getPrimaryService()で使いたいサービスを指定しますが、Promise.all([])内で使いたいSERVICEのUUIDを指定します。

Characteristicsの取得

Characteristicsの値を保持、保管

全部のHTML(すいません。オリジナルはきっちりとHTML,CSS,JSをわけていますが勉強用に一緒くたにしてしまいました。)

 

注意事項

サーバーに乗っけたらhttpsであること。