micro:bit v2 用 MicroPython で新機能を試してみる

# はじめに

2020年11月25日に日本でも micro:bit V2 の販売が開始されましたので、さっそく入手して MicroPython の新機能を試してみたのでレポートします。

# micro:bit V2 用 MicroPython ファームウェア

micro:bit V2用の MicroPython は[micro:bit v2 用 MicroPython の GitHuB リポジトリ(一時的な置き場所)](https://github.com/microbit-foundation/micropython-microbit-v2)で開発中で、2020年12月6日現在 beta-2 の状況です。

micro:bit V2用MicroPythonファームウェアは[ここ](https://github.com/microbit-foundation/micropython-microbit-v2/releases)からダウンロード可能です。

# 開発環境

V2用ファームウェアは [Python Editor](https://python.microbit.org/v/2) に既に組み込まれています。Python Editor は [Universal Hex](https://tech.microbit.org/software/hex-format/#universal-hex-files) に対応していて、V1/V2 両方に対応した .bin を生成できます。

MicroPython 用のオフラインエディタといえば Mu がありますが、まだ V2 へのスクリプト転送に対応していません。[公式ガイド](https://tech.microbit.org/latest-revision/#python)によれば、当面は `MICROBIT` フォルダを使って直接 MicroPython ファームウェアをインストールし、スクリプトは Mu の「ファイル」機能を使って micro:bit 上のファイルシステムにコピーするようにとなっています。Mu の GitHub には既に V2 対応の issue が立っていて、バージョン 1.1 正式版にまでに対応予定となっています。

# V2用新機能

V2 の新機能に対応したAPIについては、まだ公式ドキュメントがない状況で、[ここ](https://tech.microbit.org/latest-revision/#python-apis)と[ソースファイル](https://github.com/microbit-foundation/micropython-microbit-v2)と[作成中のドキュメント](https://github.com/bbcmicrobit/micropython/tree/v2-docs/docs)ぐらいしか頼りになるものがありませんが、とりあえず最新ファームウェアを使って新機能を試してみました。

## タッチセンサー

`microbit` モジュールに新規にタッチセンサー端子 `pin_logo` が追加されています。このタッチセンサーは静電容量方式なので、従来の端子 0, 1, 2を使ったタッチセンスと違って GND に接触する必要がありません。

コード例を以下に示します。このスクリプトを動かして、micro:bit ロゴにタッチすると「悲しい」表示が「笑顔」になります。

```python
from microbit import *

while True:
    if pin_logo.is_touched():
        display.show(Image.HAPPY)
    else:
        display.show(Image.SAD)
```

![touch.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/ea864b36-524c-1d46-2a2e-a0d9f85e97e3.gif)


## マイク

`microbit` モジュールにマイクのオブジェクト `microphone` が追加になりました。今のところマイクというよりはサウンドセンサーという感じですが。このオブジェクトには以下のメソッドがあります。

`microbit.microphone.current_event()`

> 最近のサウンドイベントを返します。
> サウンドイベントとしては `SoundEvent.LOUD` (大きな音)と `SoundEvent.QUIET` (静かな音)がサポートされています。

`microbit.microphone.was_event(event)`

> 引数 event に指定したサウンドイベントが発生していたかをブール値で返します。

`microbit.microphone.is_event(event)`

> 引数 event に指定したサウンドイベントが発生しているかをブール値で返します。

`microbit.microphone.get_events()`

> サウンドイベントの履歴を古い順にタプルで返します。

`microbit.microphone.set_threshold(event, value)`

> 引数 event に指定したサウンドイベントを起こす閾値を引数 value (0-255)に設定します。

`microbit.microphone.sound_level()`

> 音のレベルを 0-255 の整数値で返します。

以下のサンプルスクリプトを動かすと、マイクアイコンが赤く点灯し、大きな音をたてると小さな四角表示は大きな四角表示になります。

```python
from microbit import *

while True:
    if microphone.current_event() == SoundEvent.LOUD:
        display.show(Image.SQUARE)
    elif microphone.current_event() == SoundEvent.QUIET:
        display.show(Image.SQUARE_SMALL)
```

![IMG_5472.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/106817/1781735b-3157-367b-7226-c6f63e355239.jpeg)


## スピーカー

micro:bit V2 ではスピーカが標準で内蔵になり、従来は端子 0 に出していた音や音楽が、内蔵スピーカに出すようになりました。デフォルトでは端子 0 と内蔵スピーカの両方に音を出しています。内蔵スピーカの端子は `microbit.pin_speaker` として提供されています。

従来どおり、端子 0 に繋げたスピーカだけから音を出すには `pin` 引数に端子 0 を明示するようにします。

```python
from microbit import *
import music

music.play(music.NYAN, pin=pin0)
```

デフォルトのように、内蔵と外付け両方から音を出すようにするには、`pin` パラメータにタプルで指定します。

```python
from microbit import *
import music

music.play(music.NYAN, pin=(pin_speaker, pin0))
```

タプルで指定できるからといって、たとえば `pin0` と `pin1` から音が出せるかといえば、そういうわけではなく、内蔵スピーカと外付け１つしか使えませんでした。この点はAPIとして分かりにくいという意見が出ていて、このまま正式なAPIとなるかは微妙なところです。

この pin 引数指定は `audio`, `music`, `speech` の音を鳴らすメソッドに指定できます。

また、microbit モジュールにはボリュームを設定する関数があります。ボリュームの値は　0-255 の範囲で設定します。

`microbit.set_volume(volume)`

## audio のための組込みサウンド

V1 用の MicroPython では `audio` (V2 では `microbit.audio` でも使えます)でサウンドを鳴らす場合、 `AudioFrame` を床って一から音源を作成する必要がありましたが、V2 用の MicroPython では組込みのサウンドが用意されました。

```python
microbit.Sound.GIGGLE
microbit.Sound.HAPPY
microbit.Sound.HELLO
microbit.Sound.MYSTERIOUS
microbit.Sound.SAD
microbit.Sound.SLIDE
microbit.Sound.SOARING
microbit.Sound.SPRING
microbit.Sound.TWINKLE
microbit.Sound.YAWN
```

使い方は簡単で、 `audio.play()` に従来は `AudioFrame` を使った音源を指定していたのを `Sound.*` にするだけです。

```python
from microbot import *

audio.play(Sound.HAPPY)
```

# おわりに

V2 用 MicroPython は [CODAL](https://lancaster-university.github.io/codal/) と本家 MicroPython の最新 1.13 をベースに実装し直されています。その割には従来との互換性を保ったままけっこうな出来に仕上がっているように見えます。V2 はメモリも増えたので、BLE の実装に期待しています。