TAKOビーム送信🐙micro:bitでBLEアドバタイジング

# はじめに

本記事では、次の３つについて、紹介・解説します。

- OctoStudioの紹介（ビームブロック）
- TAKOチュートリアル（TAKO送信）
- ビームブロックの仕組み（BLEアドバタイジング）

# 【OctoStudioの紹介】ビームブロック

- **オクトーバー/October**
2023年10月24日に [OctoStudioがリリース](https://www.media.mit.edu/projects/octostudio/press-kit/) されました。
- **無料モバイルコーディングアプリ**
[Andorid/iPhone/iPadに対応](https://octostudio.org/ja/)しており、Scratchのスマホ版ともいえます。
- **ビーム(beam)**
OctoStudioには標準で、ビーム(beam)ブロックがあり、５種類の記号をスマホ間で送受信することができます。

## OctoStudio チュートリアル - ビーム(beam)

OctoStudioに関するチュートリアルが動画等でいくつか公開されていますが、その中に「複数のスマホを使ったゲームの作り方」というビームブロックを使ったチュートリアルがあります。

**複数のスマホを使ったゲームの作り方(英語)**

https://youtu.be/0hxPCkTIyqA?si=6CWh-DpkP_uEBFDg

## micro:bitからビーム送信

使用されている**ビームブロック**は、その通信を**BLEアドバタイジング**で実現していますので、BLE通信機能を備えたmicro:bitでも実現できます（**ただし、送信のみ**）。
チュートリアルに出てくる「発射ボタン(Launch)」をmicro:bitでコーディングしてみましょう。

# 【TAKOチュートリアル】TAKO送信でロケット発射

このTAKOチュートリアルでは、[「複数のスマホを使ったゲームの作り方」](https://youtu.be/0hxPCkTIyqA?si=6CWh-DpkP_uEBFDg)で紹介されている「発射ボタン(Launch)」をmicro:bitの **TAKO送信ブロック** を使ってコーディングし、OctoStudioの **ビームブロック** を使ってロケットが打ち上がるようにコーディングします。

## 用意するもの

1. micro:bit (1台)
1. OctoStudioをインストールしたスマホ (1台)

## MakeCode for micro:bitでのコーディング

micro:bitのAボタンで、"▲"記号を送信することによって、スマホ側のロケットが打ち上るようにします。

### MakeCodeの準備

**MakeCodeの新しいプロジェクト** で、**ユーザー定義の拡張機能** (`BLADV`)を追加し、 **TAKO送信ブロック** (`TAKO send`)が使えるようにします。

1. [**MakeCodeのページ**](https://makecode.microbit.org/)を開きます
https://makecode.microbit.org/
1. **「新しいプロジェクト」** を作成します
1. **プロジェクトの設定** （右上の歯車アイコン）で
**`No Pairing Required: Anyone can connect via Bluetooth`**
を **オン** にします
1. ブロックの **拡張機能** をクリックし、「拡張機能」画面を開きます
1. **検索欄** (`検索または、プロジェクトのURLを入力・・・`)に
**`https://github.com/jp-rad/pxt-ubit-bladv`**
と入力し、 **Enter** キーを押下します
1. **ubit-bladv** パネルが表示されますので、それを **クリック** して拡張機能をインポートします
1. **プロジェクトの設定** （右上の歯車アイコン）で、
`JustWorks pairing (default): Pairing is automatic once the pairing is initiated.`
と
`Passkey pairing: Pairing requires 6 digit key to pair.`
を **オフ** にし、**これら以外を** 全て **オン** にします

**設定例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/4285acb4-fdf8-9078-b03a-14f8893413ac.png)

### micro:bitのコーディングとプログラム転送

1. 「入力」の **`ボタン A が押されたとき` ブロック** を配置します
1. 「BLADV」の **`TAKO Send` ブロック** を配置します（`ボタン A が押されたとき` の中へ）
1. `TAKO Send` ブロックの記号を **"▲"に変更** します
1. **ダウンロード**し、micro:bitへ **プログラムを転送** します

**コーディング例**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/ef27687f-3a8a-aad3-dde4-0ea4942ced6c.png)

https://makecode.microbit.org/_FFCdvo28iaYu

## OctoStudioでのコーディング

スマホのOctoStudioで、"▲"記号の受信を待ち受け、ロケットが打ち上るようにコーディングします。
動画の60秒あたりから始まるチュートリアルを参考にしてください。

**ロケット打ち上げのコーディング(60秒から)**

https://youtu.be/0hxPCkTIyqA?si=g7-70bQvv5OX0XVm&t=55

1. **OctoStudio** を起動します
1. ホームで **新しいプロジェクトを作る** をタップします
1. **スプライトを追加** します
1. 「物と交通」にあるロケット等の **スプライト** を選択します
1. 好きな **背景の画像** を選択します
1. コーディング画面で追加した **スプライト** を選択し、**鉛筆マーク** で **編集モード** にします
1. **描画オブジェクト全体** を選び、上向きに **回転** させ、 **確定** します
1. コーディング画面で **スプライト** を選択し、「その他のブロック」の **`(ビーム)を待つ` ブロック** と「動き」の **`動く` ブロック** とを配置します
1. **`(ビーム)を待つ` ブロック** は、 **`(ビーム) ▲を受け取るまで待つ` ブロック** となり、 **"▲"記号** が指定されていることを確認します
1. **`動く` ブロック** は、**移動距離が150** 、 **移動方向が上向き** になるように変更します
（**`150 | 0 | 普通 動く` ブロック**）

## 動作確認

micro:bitとOctoStudioとでコーディングが完了しましたので、動作確認することができます。

1. **micro:bitの電源** を入れます
1. OctoStudioで、 **実行ボタン(再生マーク)** をタップします
1. **micro:bitのAボタン** を押します
1. **OctoStudioのスプライト** （ロケット）が、一度だけ **動き** 、停止ます。

# 【ビームブロックの仕組み】 BLEアドバタイジング

OctoStudioのビームブロックは、BLEのアドバタイジング機能を利用しており、ブロードキャスト方式で記号情報の送受信が行われています。

## ビームブロックの仕組み

**記号を送信する側** は、BLEアドバタイジングの内容(PAYLOAD)によって送信する記号をブロードキャストしています。
**記号を待ち受ける側** は、BLEアドバタイジングをスキャンし、その内容から記号の受信を判断しています。

|項目(PLAYLOAD)|内容|説明|
|----|----|----|
|[0x01] Flags|接続情報|接続不可|
|[0x07] Complete list (128bit)|識別子|{2540B6B0-0002-4538-BCD7-7ECFB51297C1}|
|[0x09] Complete Local Name|デバイス名|シリアルIDと記号情報(0～4)|

**Flags-接続情報**

LEにのみ対応しており、Bluetooth Classicには、対応していません。また、接続（コネクション）することはできません（接続不要の為）。

**Complete list - 識別子**

アドバタイジングされているBLEサービスの識別子は、独自の128bitUUIDです。

```text:UUID(value)
uuid: {2540B6B0-0002-4538-BCD7-7ECFB51297C1}
value: 0xC19712B5CF7ED7BC38450200B0B64025
```

**Complete Local Name - デバイス名**

一般的には、 **Complete Local Name** を使って、そのデバイス名をアドバタイジングしていますが、ビームブロックでは、これを使って、記号情報を通知（アドバタイジング）しています。

**Complete Local Name** の内容は、記号情報だけでなく、送信タイミングを区別できるように送信毎にユニークとなるシリアルIDが付与されています。

|項目|<---シリアルID(8文字)-->|<--記号情報(8文字)-->|
|----|-----|-----|
|内容|16進数の文字列|数字の文字列|
|▲|(0埋め以外のユニークな値)|"00000004"|
|●|(0埋め以外のユニークな値)|"00000000"|
|■|(0埋め以外のユニークな値)|"00000001"|
|♥|(0埋め以外のユニークな値)|"00000003"|
|★|(0埋め以外のユニークな値)|"00000002"|
|(なし)|"00000000"|"00000000"|

### 通信手順

ビームブロックでは、BLEのアドバタイジングを利用していますが、互いに接続の確立を行いません。アドバタイジング(送信側)とスキャン(待ち受け側)とで、次の通信手順で、記号の送受信を実現しています。

**送信側**

1. **新しいシリアルID** を生成します
1. **新しいシリアルID** と **記号情報** とをComplete Local Nameに指定して、 **アドバタイジング** を開始します
**→ 記号情報をアドバタイジングし続ける**
1. 一定期間待ち、アドバタイジングを終了します
1. **`(なし)` 情報** をComplete Local Nameに指定して、 **アドバタイジング** を開始します
**→ "0000000000000000"をアドバタイジングし続ける**
1. 一定期間待ち、アドバタイジングを終了します

**待ち受け側**

1. **スキャン** を開始し、Complete Local Nameの **シリアルIDが新しい値** になるのを待ちます
1. **シリアルIDが新しい値** になったら、その **記号情報を取得** します
1. **取得した記号情報** が、**待ち受けている記号情報**であれば、待ち受けを終了します

## micro:bitでの制限事項 - 送信のみの理由

MakeCode内部で、micro:bitランタイムやNordic nRF5 SDKといったライブラリを使用しており、micro:bitのバージョンによって、そのライブラリが異なります。

|micro:bit|ランタイム|nRF5|
|---------|---------|----|
|V1|dal|Soft Device 110|
|V2|codal|Soft Device 113|

この **nRF5** に示してある　`Soft Device 110` や `Soft Device 113` は、 **ペリフェラル(peripheral)** としてのみ機能し、 **セントラル(central)** として **機能しません。**
その為、 **アドバタイジング(advertising)** で送信できるものの、他のデバイスのアドバタイジングを **スキャン(scan)** することができず、 **待ち受けができない** のです。

|名称|役割|説明|
|----|----|----|
|ペリフェラル<br>(peripheral)|周辺機器|ボタンや加速度等のセンサーがあるデバイスから<br>BLEサービスを提供する。アドバタイジングで、<br>提供しているBLEサービスの情報を通知する。|
|セントラル<br>(central)|利用側|ペリフェラルのアドバタイジング情報をスキャンし、<br>BLEサービスを利用する。|

## 実装上のヒント - BLEアドバタイジング

BLEの仕様において、アドバタイジングの内容(PAYLOAD)の **長さ制限** は、 **31オクテット(バイト)** です。
`Complete list (128bit)`の値の長さが、 **16オクテット** で、`Complete Local Name`の値の長さも **16オクテット** であり、これらの**値だけでも32オクテット**になってしまいます。
31オクテットを超える内容をアドバタイジングするために、 **スキャンレスポンス(Scan Response)** という仕組みを使います。
次のように、 **通常のアドバタイジング情報** と **スキャンレスポンスによるアドバタイジング情報** とに分けて、全ての内容(PAYLOAD)をアドバタイジングすることができます。
※各項目の長さには、**TYPE識別子の1オクテット** を含みます。

**通常のアドバタイジング情報**

|項目(PLAYLOAD)|長さ|
|----|----:|
|[0x01] Flags|2|
|[0x09] Complete Local Name|17|
|[0x0A] Tx Power Level|2|
|[0x19] Appearance|3|
|**合計**|**24**|

**スキャンレスポンスによるアドバタイジング情報**

|項目(PLAYLOAD)|長さ|
|----|----:|
|[0x07] Complete list (128bit)|17|
|[0xFF] Manufacturer Specific Data|12|
|**合計**|**29**|

# おわりに

[ユーザー定義の拡張機能であるBLADV](https://github.com/jp-rad/pxt-ubit-bladv)の **TAKO送信ブロック** を使って、OctoStudioのビームブロックで記号の受信を待ち受けることができることを紹介しました。
また、ビームブロックの仕組みとともに、micro:bitでの制限事項や実装上のヒントについて解説しました。

[ユーザー定義の拡張機能であるBLADVのソースコード](https://github.com/jp-rad/pxt-ubit-bladv) は、GitHubリポジトリで公開されています。

https://github.com/jp-rad/pxt-ubit-bladv