本家のScratch3.0でmicro:bitにつないだLEDを制御する - Scratch 3.0 micro:bit 拡張機能とArm Mbed オンライン IDEプログラミング

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">本家Scratch3.0で、ネコがベルに触れるとmicro:bitにつないだLEDが点灯します。本家なところが重要。<a href="https://t.co/hVPN38yaFu">https://t.co/hVPN38yaFu</a> <a href="https://t.co/6oO2WtdKEO">pic.twitter.com/6oO2WtdKEO</a></p>&mdash; くろやなぎ ひろあき (tw) (@kuroyanagi_css) <a href="https://twitter.com/kuroyanagi_css/status/1338140430945275904?ref_src=twsrc%5Etfw">December 13, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#micro:bitでLEDを制御する電子工作

micro:bitにつないだLEDをオン・オフさせるプログラミングは試したことがあるかと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/7dccbab0-2864-745d-d29c-b7d51f34e201.png)
引用：https://support.microbit.org/support/solutions/articles/19000101863-connecting-an-led-to-the-micro-bit

今回、100円ショップで購入した電池ボックス付きのLEDイルミネーションライトとオーディオ用イヤホン延長コードを使って、回路を組み立てました。micro:bitの出力端子では、10個のLEDを明るく光らせるほどの電力供給ができませんので、トランジスタを使用しました（出力端子に直接つないでも半分くらいの暗さで点灯します）。
トランジスタやカーボン抵抗は、電子パーツショップで購入できます。部品代の割に送料の方が高いのですが、通販でも購入できますよ。

![IMG_20201211_211129.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/9d6e816a-a3ab-5a4b-a5b1-dab3c2089c41.jpeg)


##必要なもの

- Scratch3.0動作環境(要Bluetooth)
- micro:bit本体（v1） - v2が欲しい・・・
- デコレーションライト（常時点灯） - ダイソー
- オーディオ用イヤホン延長コード（ステレオ） - ダイソー
- [トランジスタ 2SC1815 - RPEパーツ](http://rpe-parts.co.jp/shop/111_1286.html)
- [カーボン抵抗（炭素皮膜抵抗）1/4W 220オーム - 手元にあったもの](http://rpe-parts.co.jp/shop/rds25_025.html)
- 単三乾電池2本
- リード線
- 工具一式

##完成品

デコレーションライトの電源・スイッチの配線を加工し、イヤホン延長コードで、micro:bitと接続しています。
イヤホン延長コードのプラグを抜けば、デコレーションライトは、元のとおり、スイッチでオン・オフできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/1440cfd2-4036-d492-78b9-4d269b9feab1.png)

##回路図

デコレーションライトのスイッチへは、電池ボックスのプラス側が接続されていましたが、トランジスタのスイッチング作用を利用する為、マイナス側をスイッチの中央の端子に接続しています。
スイッチの切り替えにより、LEDのマイナス側、もしくは、micro:bitのマイナス側(GND)に接続されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/126a12dd-47ff-1520-c684-dbf6ab33480e.png)
※ あとで調べたら、ベースをプルダウンした方がより良いようです(ベースとGNDとを抵抗でつなぐ)。

##MakeCodeによるプログラミング

micro:bitの端子P2がトランジスタのベースに接続されていますので、端子P2をデジタル出力にして、そののHi-Lowを切り替えます。ボタンAを押すとHi(1)になり、ボタンBを押すとLow(0)になります。
ここまでは、トランジスタのスイッチ作用を利用して、LEDをオン・オフさせる一般的な電子工作です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/9751b14c-089a-fdee-4d4d-30cd6609b66d.png)

#本家Scratch3.0からmicro:bitの制御をする

ご存じの通り、Scratch3.0には、micro:bitと接続できる拡張機能があります。
→ [Scratch - micro:bit (https://scratch.mit.edu/microbit)](https://scratch.mit.edu/microbit)
ただし、この拡張機能（本家）には、端子P2をデジタル出力として利用するブロックが用意されていません。そのため、例えば、[Microbit More (Yengawa Lab)](https://lab.yengawa.com/project/scratch-microbit-more/)のようなサードパーティが開発した独自のScratch3.0動作環境が必要です。

今回は、Scratch3.0の拡張機能（本家）をそのままに、micro:bitのファームウェア側だけを独自にプログラミングして、端子P2を制御できるようにしました。

##Arm Mbed開発テンプレート - microbit-CodeMore-v1

MicroBit Moreのソースコードは[pxt-scratch-microbit-more](https://github.com/yokobond/pxt-scratch-microbit-more)としてGitHubで公開されていますが、これを流用して、Arm Mbed IDE オンラインで、簡単にプログラミングとコンパイルができるようにした [microbit-CodeMore-v1](https://github.com/jp-rad/microbit-CodeMore-v1)というテンプレートがGitHubで公開されています。
Arm Mbed オンライン IDE を開いて、プログラムをインポートすれば、すぐにプログラミングとコンパイルができます(HEX形式ファイルをダウンロードできる)。
https://ide.mbed.com/compiler/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/7a08b3de-f105-9962-d2eb-494f1f2ae669.png)

##端子P2をデジタル出力としてHi-Lowを切り替える

micro:bitの端子P2をデジタル出力として、Hi-Lowを切り替えるには、`main.cpp`を次のようにプログラミングします。これは、Scratch3.0の拡張機能のテキスト表示ブロック（「〇〇を表示する」）で送られてくるテキスト（ManagedString）の最初の文字が`"@"`の場合、micro:bit側での処理を横取りして(`onDisplayTextCommand`)、独自にプログラミングできます。このコードの場合、テキストが`"@on"`であれば、端子P2をHi(1)にし、`"@off"`であれば、端子P2をLow(0)にしています。
コンパイルに成功するとHEX形式ファイルをダウンロードできますので、名前を付けてダウンロードし、いつもの通り、HEX形式ファイルをmicro:bitのドライブにコピーします。
※ 初回起動時は、micro:bitのキャリブレーションが必要なため、micro:bitのLEDのドットが1周回るように、micro:bitをぐるりと回転させてください。

```main.cpp
#include "MicroBit.h"
#include "mbitcodemore/MbitMoreStartup.h"
#include "mbitcodemore/MbitCodeMore.h"

const ManagedString CMD_ON("@on");
const ManagedString CMD_OFF("@off");

MicroBitPin P2D(MICROBIT_ID_IO_P2, MICROBIT_PIN_P2, PIN_CAPABILITY_DIGITAL); 

// This handler, onDisplayTextCommmand is called, If the display text starts with '@'.
int onDisplayTextCommand(MicroBit &uBit, ManagedString &text)
{
    if (text==CMD_ON)
    {
        P2D.setDigitalValue(1); // P2 is now HI 
        // Handled, return zero.
        return 0;
    } else if (text==CMD_OFF)
    {
        P2D.setDigitalValue(0); // P2 is now LOW 
        // Handled, return zero.
        return 0;
    }   
    ManagedString err("Err:");
    text = err + text;
    // Unhandled, retrun not zero.
    return 1;
}

int main()
{
    MbitMore::startMbitMoreService(onDisplayTextCommand);
}
```

## Scratch3.0でのプログラミングと実行

Scratch3.0を開き、拡張機能からmicro:bitを選択し、micro:bitと接続します(Scratch Linkの起動を忘れずに！)。
図のように、`@on`や`@off`を表示するmicro:bit拡張機能のブロックを配置します。
※ 実際には、micro:bitに`@on`や`@off`というテキストがスクロール表示されませんが、Scratch3.0のブロック側は、スクロール表示が終了するであろう時間だけ待ちます（ブロックの処理がブロックされます）。

![bitmap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/84362f5a-f858-f925-bd15-2f4b9aa4fc1b.png)

例えば、次のようなプロジェクトを作成すると、ネコがベルに触れるたびに、LEDが光ります。
https://scratch.mit.edu/projects/462795757/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/04c0f693-172e-07c7-50d3-c66421cf3998.png)


#おわりに
micro:bit(v1)には、Nordic nRF51822というMCUが使われており、Arm Mbed 開発環境でのプログラミングが可能です。Arm Mbed 開発環境でゼロからプログラミングするには、ライブラリの準備などが煩雑ですが、今回紹介した[microbit-CodeMore-v1](https://github.com/jp-rad/microbit-CodeMore-v1)というテンプレートを使えば、比較的簡単にScratch3.0と連携させたプログラミングが可能です。

- 100円ショップで購入した材料とトランジスタを使って、micro:bitでLEDを明るく点灯させました。
- [microbit-CodeMore-v1](https://github.com/jp-rad/microbit-CodeMore-v1)というテンプレートでHEX形式ファイルを作成しました。
- 本家Scratch3.0の拡張機能micro:bitを使って、ネコがベルに触れるたびに、micro:bitに接続したLEDを点灯させました。