Seeeduino XIAOをArdupyで動かしてみた

この記事は[Seeed UG Advent Calendar 2020](https://qiita.com/advent-calendar/2020/seeed_ug)の25日目の記事です。


今年に入ってからSeeedから様々な新製品が登場しました。そのなかでWio TerminalとSeeeduino Xiaoという2つのマイコンボードがあります。
Wio Terminalは画面とボタンがついてるボードで某M○シリーズを彷彿とさせます。Seeeduino XIAOはコインサイズで小さくて可愛らしい見た目のボードです。
正反対に見えるこの2つには共通点があります。それは、「**Ardupyが使える**」ということです。ArdupyというのはSeeed Studioがリリースしたマイコンの開発環境です。ArduinoとMicroPythonを組み合わせており、MicroPythonでArduinoのAPIを叩くことができるそうです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/2b68377a-6cf7-f447-1320-9346f432fd26.png)

[Wiki](https://wiki.seeedstudio.com/ArduPy/)を見る限りWio Terminal向けに書いているような感じでSeeeduino XIAOが使えるのか疑問に思いました。というわけでせっかくMaker Fairでもらったので、今回はSeeeduino XIAOをこのArdupyで動かしていろいろ実験してみたいと思います。

# 用意するもの
- Seeeduino XIAO
- Seeeduino XIAO Expansion board(モジュールの実験用)

# Ardupyのインストール
まずはArdupyを動かすためにaipというCLIをインストールします。
Pythonの実行環境をセットアップしたら以下のpipコマンドでインストールします。

```
pip install ardupy-aip
```
終わったら以下のコマンドを実行し、エラーが出ずヘルプ画面が表示されたらインストール完了です

```
aip help
```

# ボードの初期化
まずはSeeduino XIAOをパソコンに接続します。ボードの初期化は以下のコマンドで行います。デフォルトではWio Terminal向けに初期化を実行しているっぽいので、オプションで`-b`をつけてSeeeduino XIAO向けの初期化を行っています。

```
aip flash -b xiao
```

実行して、エラーがなく書き込みが終わったら成功です。Windowsではあたらしくエクスプローラが立ち上がり、main.pyだけのフォルダが立ち上がると思います。

![flash](https://media.giphy.com/media/fbPPYIbctR5BZUXddK/giphy.gif)


# お約束のLチカ
まずはLチカをやってみます。
以下のコードを適当なディレクトリに保存します。

```python:blink.py

from machine import Pin, Map
import time

LED = Pin(Map.LED_BUILTIN, Pin.OUT)

while True:
    LED.on()
    time.sleep(1)
    LED.off()
    time.sleep(1)

```

保存したら以下のコマンドでxiaoに書き込みます。

```
aip shell -n -c "put work/dir/blink.py"
```

プログラムを書き込んだら以下のコマンドを実行します。

```
aip shell -n -c "execfile blink.py"
```

実行するとXIAOのUSB端子のそばにあるオレンジのLEDが点滅したら成功です。

![blink](https://media.giphy.com/media/FS9S13oeSqJhDfSzqk/giphy.gif)


# ボタンを操作する
続いてボタンを押してLEDをつけたり消したりします。

```python:buttonControl.py
from machine import Map, Pin
import time

buttonPin = 1
LED = Pin(Map.LED_BUILTIN, Pin.OUT)
BUTTON = Pin(buttonPin, Pin.IN, Pin.PULL_UP)

while True:
    if not BUTTON.value():
        LED.off()
    else:
        LED.on()
    time.sleep_ms(30)
```

コードを実行して、以下のようにボタン(D1)を押している間はLEDがついて、離して消えたら成功です。

![buttonControl](https://media.giphy.com/media/TDed0eA7ETAM0Plu8i/giphy.gif)

# ライブラリを使ってみる
今度はArdupyで使えるライブラリを使ってみたいと思います。
Ardupyと普通のMicroPythonとの大きな違いがここです。
ArduinoのライブラリをMicroPythonでも使えるようにパッケージ化されています。
対応ライブラリをコマンドラインでインストールできるので、その手順を紹介します。

## センサーの接続
今回は手元にあった[Temperature & Humidity Sensor (DHT11)](https://wiki.seeedstudio.com/Grove-TemperatureAndHumidity_Sensor)を使って実験をします。
センサーはExpansion boardのD0端子につないでおきます。
![IMG_20201222_031058.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/170520/e666e7be-5ad6-51b8-ce1a-29bac4c6c1ac.jpeg)


## ライブラリのインストール
DHTのライブラリは以下のレポジトリで公開されています。
[Seeed-Studio/seeed-ardupy-dht](https://github.com/Seeed-Studio/seeed-ardupy-dht)
以下のコマンドで上記のライブラリをインストール、ビルドします。

```
aip install Seeed-Studio/seeed-ardupy-dht/archive/main.zip
aip build
```
以下のコマンドで、ボードをフラッシュします。

```
aip flash -b xiao
```

## ライブラリが使えるか確認
ここでボード上でライブラリが使えるか確認してみます。
以下のコマンドを使ってArdupyのREPL環境(コマンドライン環境)を実行してみます。

```
aip shell -c "repl"
```
コマンドラインが立ち上がったら、以下の1行を実行してインポートしてみます。
エラーが出力されなかったらライブラリのインストールは完了しました。

```
from arduino import grove_dht
```

## サンプルコードを実行
ここまでできたらサンプルコードを動かしてみます。
ライブラリのレポジトリのREADMEにあるこちらのサンプルコードをSeeeduino XIAOに書き込みます。

```python:detectTempHumi.py
from arduino import grove_dht
import time

dht = grove_dht(0,11) # pin number, DHT type

while True:
    print ("Temperature: ", dht.temperature, "C")
    print ("Humidity: ", dht.humidity, "RH%")
    print ("30C to F", dht.ctof(30), "F")
    time.sleep(1)

```
コードを実行し、ターミナルに温度、湿度が流れてきたら成功です。
![image.png](https://media.giphy.com/media/afZSsGVivp7pIUWzb9/giphy.gif)

# プログラムを自動起動する
ここまでいくつかサンプルを紹介してきましたが、これらのプログラムは毎回`execfile`コマンドを実行しないと動きません。
では電源を入れるたびに自動起動するようにしたいときには、`boot.py`を用意するとそのプログラムは自動起動します。
Seeeduino XIAOのストレージで自動起動したいファイルのファイル名を変更してもいいですが、書き込むプログラムを自動起動させたいときには以下のコマンドのようにファイルパスを指定したときに半角スペースで`boot.py`を指定すればボードにはboot.pyとして書き込まれて自動起動するプログラムを設定できます。
以下は最初に紹介したLチカを自動起動させる例です。

```
aip shell -n -c "put work/dir/blink.py boot.py"
```

ボードを再起動するか、リセットボタンを押せばプログラムが自動で起動するようになります。


# まとめ
今回はArduipyを使ってSeeeduino XIAOを動かしてみました。
色々ソフトをインストールしなくてもPythonの実行環境があれば簡単に開発環境をインストールできるのはいいですね。
そして、GroveモジュールをArduinoのライブラリっぽくインストールさせることができるのは面白いです。
ただ、使えるモジュールの種類が豊富ではないので、今後に期待したいところです。