Trinket M0を制御したい！（タッチでLチカ、REPLからLチカ）

# 概要
Trinket M0は、Adafruit社の小型Arduino互換マイコンボードである。
PCに接続すると、入力デバイス(HID)として認識され、またTrinketの持つストレージはPC側の外付けドライブとして認識されます。

# 目標
- Trinket M0の開発環境を整える
- Trinket M0単品でＬチカを行う
- PCからの操作で、Trinket M0上のLEDをチカチカさせる

※Lチカとは、Ledランプを点灯・消灯させることです。

# 材料
- PC(Windows10をベースにします)
- Tinker M0 (約1,400円)  
- USBケーブル(A-MicroB) データ通信と電源供給ができるモノ

# 1.環境構築
## 1-1.PC上の準備
以下のソフトウェアをインストールします
- Mu Editor
https://codewith.mu/

```
メモ：
Mu Editorは、Pythonコードエディタとシリアル通信の機能を持ちます。
通常、テキストを編集しファイルへ書き出す際、書き込みバッファの影響により、ファイルの更新タイミングが変わる場合がありますが、
Mu Editorでのファイルの書き込みは、その時点で必ずファイルの出力が保証されるとのことです。
```

## 1-2.Tinket M0をPCと接続する
PCとTinket M0をUSBケーブルで接続します。
![TinketM0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97875/2d163e28-e65f-1b42-8712-62397582d01f.png)

環境構築は以上で完了です。

Trinket M0をPCに接続すると、PC上に以下のドライブが見えます。・・・①
![TrinketM0_CIRCUITPY_DRIVE.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97875/a1d21eea-abb5-c43f-ff74-a1b945cd9934.png)
※初期状態では、boot.pyは存在しません。

```
メモ：
Trinket M0の起動時は、以下の順番でコードが実行されます。
1. boot.py
2. code.py or main.py
コードは、code.pyに記述する方が良いようです。
```

# 2.Tinket M0のアップデート
購入時点では、Tinket M0に搭載されているCircuitPythonのバージョンが古いため、Updateを行います。

## 2-1.ファイルをダウンロード
以下から最新のCircuitPythonをダウンロードします。
https://circuitpython.org/board/trinket_m0/
adafruit-circuitpython-trinket_m0-ja-7.0.0.uf2　・・・②
（この時点では、CircuitPython 7.0.0でした(2021/10/14時点)）  

## 2-2.TRINKETBOOTフォルダを開く
PCにTinket M0が接続されている状態で、リセットボタンを二回押します。
押下後、PCから見えるフォルダは、以下の状態になります。・・・③
![TrinketM0_BOOTDRIVE.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97875/d475ad26-dbff-f05f-762a-0d4c98dcecd9.png)

## 2-3.CircuitPythonのアップデート
②のファイルを、③のTRINKETBOOTドライブにコピーします。
コピーが完了後、自動的に再起動され、①のウィンドウが表示されます。

## 2-4.libのアップデート
CircuitPython本体のlibフォルダ配下のライブラリバージョンが一致しない場合、
TrinketM0は、code.py実行時にバージョン差異エラーが発生します。

以下から対象のライブラリをダウンロードします。
https://circuitpython.org/libraries
今回は、「Bundle for Version 7.x」をダウンロードし、PC上で展開します。・・・④

必要となるファイル（更新するファイル）は以下となります。

```
CIRCUITPYドライブ
\lib
  \adafruit_hid
  \adafruit_dotstar.mpy
  \adafruit_pixelbuf.mpy
  \neopixel.mpy
  \adafruit_hid\__init__.mpy
  \adafruit_hid\keyboard.mpy
  \adafruit_hid\keyboard_layout_us.mpy
  \adafruit_hid\keycode.mpy
  \adafruit_hid\mouse.mpy
```
④で展開したファイル群から、上記と一致するファイルを探し、CIRCUITPYドライブのファイルにコピー・上書きします。

以上で、プログラムが実行できる状況になります。


```
メモ：
mpyとは、MicroPythonにてpyファイルをプリコンパイルした状態のファイルである。
mpyファイルは、コード上からimportすることが可能。
実行環境のバージョンと一致するものを利用する必要がある。
http://docs.micropython.org/en/v1.12/reference/mpyfiles.html
```

```
メモ：
Trinket M0の初期サンプルファイルは以下からダウンロードできます。
https://learn.adafruit.com/adafruit-trinket-m0-circuitpython-arduino/downloads
「Default CircuitPython files included v2」

libフォルダ配下のmpyバージョン差異に注意が必要。
```

# 3.Lチカ実験
## 3-1.「タッチでLチカ」
TrinketM0の3番ピンを触ると、赤色LEDが点灯するコードとなります。

```micropython:code.py
import board
from digitalio import DigitalInOut, Direction, Pull
from analogio import AnalogOut, AnalogIn
import touchio

# Built in red LED
led = DigitalInOut(board.D13)
led.direction = Direction.OUTPUT

# Capacitive touch on D3
touch = touchio.TouchIn(board.D3)

while True:
    # use D3 as capacitive touch to turn on internal LED
    if touch.value:
        print("D3 touched!")

    led.value = touch.value
```

3番ピンを触ると、左上の赤色LEDが点灯します。

![TrinketM0_TouchRedLed.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97875/8df9cde0-35b3-88dc-23a4-da35f1780c23.png)

また、Mu Editorのシリアルボタンを押下し、REPLの表示を見ると、D3 touched!が出力されている事が分かります。
![TrinketM0_TouchRedLed_MuEditor.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97875/d7b4f4a5-54ef-1399-7dc0-393983e85101.png)

## 3-2.「REPLからLチカ」
PC上のREPL上(コンソール)から文字を入力し、赤色LEDの制御を行います。
Trinket M0上、REPLからの入力は、supervisorを用いることでバイト取得が可能です。

```micropython:code.py
import board
from digitalio import DigitalInOut, Direction, Pull
import supervisor

# Built in red LED
led = DigitalInOut(board.D13)
led.direction = Direction.OUTPUT

red_led = False

while True:
    if supervisor.runtime.serial_bytes_available:
        value = input()
        if value == "on":
            red_led = True
        elif value == "off":
            red_led = False

    led.value = red_led
```

### 2-1.code.pyを実行中に、REPLから「on」と文字を入力しエンターを押下する。

![TrinketM0_TouchRedLed_MuEditor_ON.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97875/72db9687-fc7c-1ea2-5a7a-99d2dcf63dd8.png)

Trinket M0は以下の状態となる。
![TrinketM0_REPL_RedLed.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97875/c822f1b8-a56e-ca61-5878-7b4ff186cab6.png)

REPLから「off」と文字を入力しエンターを押下する。
![TrinketM0_TouchRedLed_MuEditor_OFF.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97875/2af58119-76e0-6a37-69d6-1514a15c5ede.png)

Trinket M0は以下の状態となる。
![TrinketM0_REPL_RedLed_OFF.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97875/30905cd9-d118-3cb3-be5b-5c53920e0732.png)

# まとめ
以上、Trinket M0上でのLチカと、PC上のコンソール(REPL)からのLチカを実施した。
実機を手に入れて、二日程度でここまで実施することが出来た。
このデバイスは小型かつ軽量であり、開発する上でのＰＣとの接続や動作確認の煩わしさが無く、開発環境も整っている。
全体的なバランスが良く、大変興味深い製品である。
次回は、Trinket M0を使って、もう少し複雑な事にチャレンジしてみたいと考える。

# 参考
- Tinket M0製品/チュートリアル (https://learn.adafruit.com/adafruit-trinket-m0-circuitpython-arduino)
- Mu Editor  (https://codewith.mu/)
- CircuitPython Trinket M0用(https://circuitpython.org/board/trinket_m0/)
- CircuitPython Libraries (https://circuitpython.org/libraries)