【micro:bit編】Scratch LinkでIoT - Scratch 3.0のクラウド変数を使ってmicro:bitのサーボ・モーターを動かしてみた


https://qiita.com/advent-calendar/2022/scratch

# Scratch 3.0 クラウド変数とScratch Link for micro:bit

Scratch 3.0の**クラウド変数**と**Scratch Link for micro:bit**を使って、インターネット経由で、micro:bitに接続したサーボ・モーターを動かしてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/e11ca4a0-1402-0e5d-8bd7-62f5bd992698.png)


## 変数のスコープ

Scratch 3.0で、変数を作成する際に、「新しい変数」が表示され、変数名とスコープとを指定することができます。

| # | スコープ | 補足 |
|---|----------|------|
| 1 | すべてのスプライト用 | |
| 2 | このスプライトのみ | |
| 3 | クラウド変数 | "Scratcher"としてサインインすること |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/320eafbc-78db-b364-fc4f-ef6344eeaccd.png)

**FAQ: クラウド変数**

https://scratch.mit.edu/faq#clouddata

## micro:bit拡張機能

Scratch 3.0では、標準で「micro:bit拡張機能」を追加可能で、Scratch 3.0からScratch Link を経由して、micro:bitデバイスの利用が可能です。
ただし、標準（公式）の「Scratch micro:bit HEXファイル」では、サーボ・モーターを動かす機能は備わっていません。

**Scratch Link for micro:bit**

https://scratch.mit.edu/microbit


## 独自のScratch micro:bit HEXファイル

Scratch 3.0とmicro:bitとは、Scratch Link を介して、Bluetooth(R) LEで通信していますので、この通信仕様に則ってmicro:bit側で独自のコーディングを行えば、サーボ・モーターを動かすことも可能です。
[Microsoft MakeCode for micro:bit](https://makecode.microbit.org/)で、そのコーディングを容易にするため、ユーザー定義の拡張機能である[**S3Link-UDK**](https://github.com/jp-rad/pxt-s3link-udk)と[**BLADV**](https://github.com/jp-rad/pxt-ubit-bladv)を使用します。。

* **S3Link-UDK**

https://github.com/jp-rad/pxt-s3link-udk

* **BLADV**

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


# 仕組みとコーディング

サーボ・モーターを動かすために、Scratch 3.0からmicro:bitへコマンドを送ります。

## 仕組み

Scrach 3.0から見て、micro:bitへの送信機能には、**「画面に文字列を表示する」** 機能があります。この**文字列**を**コマンド**と見立てて、micro:bitでサーボ・モーターを動かします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/3c8a941c-b6cb-35e5-b6cb-b5f1f0e25328.png)


今回、次の２つのコマンドを定義しました。

| 文字列 | 説明 | 備考 |
|--------|------|------|
| **on** | サーボ・モーターの位置を0度にします。 | LEDは変化しません。 |
| **off** | サーボ・モーターの位置を180度にします。| LEDは変化しません。 |
| (その他) | 文字列をLEDにスクロール表示します。 | |

## micro:bit側のコーディング(MakeCode)

[MakeCode](https://makecode.microbit.org/)で、micro:bit側のコーディングを行い、ダウンロードしてmicro:bitへ書き込みます。

「最初だけ」で、`UDK start service`と`BLADV Complete list of 16-bit Service ID:`とを実行し、Scratch Linkの通信を有効化します。10進数の`61445`という値は、16進数で表すと`0xF005`であり、Scratch 3.0（Scratck Link）でデバイスを探索する際に確認されます。

今回の主役は、`UDK on display text received`ブロックです。「画面に文字列を表示する」機能で、Scratch 3.0から送信された文字列(text)の値が、"on"か"off"かを判断し、サーボ・モーターの角度を指定しています。

**コーディング例:** [共有プロジェクト- https://makecode.microbit.org/_CrFJzxRhHW3m](https://makecode.microbit.org/_CrFJzxRhHW3m)


<details><summary>JavaScriptのソースコート</summary>

```rb
s3linkudk.onDisplayTextReceived(function (text) {
    if ("on" == text) {
        pins.servoWritePin(AnalogPin.P1, 0)
    } else if ("off" == text) {
        pins.servoWritePin(AnalogPin.P1, 180)
    } else {
        basic.showString(text)
    }
})
s3linkudk.onDisconnected(function () {
    control.reset()
})
s3linkudk.startService()
bladv.accumulateCompleteList16BitServiceID(61445)
pins.servoWritePin(AnalogPin.P1, 180)
basic.showIcon(IconNames.Heart)

```
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/4d5cfbd6-356a-e083-4fd5-c371148b21c4.png)

## Scratch側のコーディング(Scratch 3.0)

[Scratch 3.0]()では、クラウド変数の値を判断して、「画面に文字列を表示する」機能で、文字列の"on"か"off"を送信します。クラウド変数の場合は、数値しか扱えませんので、1-"on"、0-"off"に対応させています。

スプライトの"onスイッチ"、"offスイッチ"をクリックすることで、クラウド変数の値を、1-"on"、0-"off"にそれぞれ設定しています。
スプライトの"スイッチ状態"では、クラウド変数の値を判断して、文字列の"on"か"off"を送信しています。

コーディング例: https://scratch.mit.edu/projects/769484632


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/9a0a6ad6-cc01-289c-4642-b66b07e6c5f2.png)

# 使い方

**micro:bit**
1. micro:bitにダウンロードしたHEXファイルを書き込みます。
→ [共有プロジェクト- https://makecode.microbit.org/_CrFJzxRhHW3m](https://makecode.microbit.org/_CrFJzxRhHW3m)
1. micro:bitにサーボ・モーターを接続し、起動します。

**パソコン**

1. パソコンでScratch Linkを起動します。
1. Scratch 3.0にサインインし、プロジェクトを開きます。
→ コーディング例: https://scratch.mit.edu/projects/769484632
1. パソコンのScratch 3.0からmicro:bitへ接続します。
1. パソコンのScratch 3.0のプロジェクトを実行します。

**スマホ**

1. スマホでScratch 3.0にサインインし、プロジェクトを開きます。
→ コーディング例: https://scratch.mit.edu/projects/769484632
1. スマホで、Scratch 3.0のプロジェクトを実行します。


**動作確認**

1. スマホの画面で、"オン(on)"や"オフ(off)"をタップして、サーボ・モーターが連動することを確認します。


# おわりに

**【micro:bit編】Scratch LinkでIoT**を確認するために、Scratch 3.0のクラウド変数を使って、micro:bitに接続したサーボ・モーターを動かすことができました。

* Scratch 3.0のクラウド変数
* micro:bit拡張機能とScratch Link
* ユーザー定義の拡張機能である[**S3Link-UDK**](https://github.com/jp-rad/pxt-s3link-udk)と[**BLADV**](https://github.com/jp-rad/pxt-ubit-bladv)

## おまけ

独自のScratch micro:bit HEXファイルを開発するにあたり、次の記事を投稿していますので、参考にしていただければ幸いです。

https://qiita.com/jp-96/items/73e6fc42e6592b78c43e

https://qiita.com/jp-96/items/da4413c03670a5e0b195

https://qiita.com/jp-96/items/db0c49ac545507bdff6d