こんにちは。ECF Tech ブログ 担当 Michiです。

前回に続いて、今回もAndroidでマイクロビットと接続するまでのプログラムのご紹介をしたいと思います。

前回はマイクロビットとの接続要求をし、接続完了時に呼ばれる下のコールバックメソッドの説明までをさせていただきました。

というわけで、その続きから進めたいとおもいます。接続が正しく完了すると、引数 newStateに定数STATE_CONNECTEDが渡されてコールされますので、その値を判断し接続時の処理を行なっています。接続が完了すると、サービスを探す段階に移行します。この処理はdiscoverServices()によって行われます。

サービスが見つかった場合は、下記のコールバックメソッドがコールされます。

ここからは、マイクロビット固有の処理が入っています。分割してみていきます。

gerServicesメソッドでサービスの一覧を取得します。

取得したサービスの一覧をひとつずつ見て、利用したいサービスを探します。今回は、加速度サービスを探すものとします。

GATTでは、サービスをUUIDと呼ばれる識別IDを用いて識別します。どんなサービスにどのUUIDが割り当てられているかはこちらのマイクロビットの仕様から確認することができます。加速度サービスにあたるUUIDは定数を用いてあらかじめ定義しています。

なので、下のようなif文を用いて該当サービスを探します。

サービスが取得出来たら、その中に含まれるchractersitics(キャラクタリスティクス)を使ってマイクロビットとのデータ送受信を始めます。characteristicsはサービスが持つ属性値といったところです。マイクロビットの加速度サービスでは、次の2つのデータを操作することができます。

  • Accelerometer Data(加速度値):加速度X、Y、Zの各値
  • Accelerometer Period(加速度通知間隔):マイクロビットが加速度値を何msごとに通知するか

詳しくは、マイクロビット仕様より確認することができます。

では、これらの値の操作に入っていきます。まずは、加速度の通知間隔を160msに設定しています。characteristicsも個々にUUIDを持っているので、その値を使って該当するインスタンスを探します。インスタンスの持つsetValueメソッドで通知間隔を設定しています。setValueの引数は順に、書き込むint値、データフォーマット、書き込み位置です。データフォーマットは仕様に記載があります。UINT16は符号なし2バイト整数です。書き込み位置は0バイト目からとなります。

次に加速度値を取得するための準備です。加速度値を取得できるcharacteristicsは、通知モードのON/OFFができるようになっています。デフォルトはOFFですのでONに設定します。

ONにするには、setCharacteristicsNotificationをtrueにし、さらにDescriptorという設定データを通知モードに変更します。手順としては次のように行います。

通知設定が完了すると、マイクロビットから加速度値の通知が来るようになります。通知が来るたびに下のコールバックメソッドが呼ばれることになります。

上記コメントのとおりですが、加速度値はX、Y、Zがそれぞれまとめて6バイトのデータとして提供されます。データの取得はgetIntValueで行います。getIntValueメソッドの引数は順に、データフォーマット、データ開始位置です。加速度値のデータはSINT16(符号つき2バイトint)で0バイト目からX値、2バイト目からY値、4バイト目からZ値がセットされているので、第2引数は0、2、4となっています。上のプログラム例では、もらった値を随時TextViewに反映させています。

以上で、説明は終わりです。最後までありがとうございました。全体のソースコードはこちらで提供しておりますので、参考にしてみてください。

マイクロビットではほかにも様々な値の取得、設定ができるので、ぜひ仕様を参考に色々試してみてください。アプリと連携した新しい楽しみ方ができるかもしれません。


合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報は、下記よりご確認ください。

ECFエデュケーション