Seeeduino XIAOでCircuitPythonを走らせる

#はじめに
マイコン向けのPython環境であるMicroPythonを基に、Adafruit社が開発したのがCircuitPythonです。ArduinoのC言語に比べて、少ない記述で高い機能を実現できて、コンパイルの必要もなく書き込みも簡単にできます。

CircuitPython対応マイコン
https://circuitpython.org/downloads

Adafruit社の自社マイコンの他にSeeeduino XIAOにも対応しています。

このマイコンの詳しい解説
https://qiita.com/nanase/items/0fed598975c49b1d707e

micro:bitもMicroPythonでプログラムできます
https://microbit.org/

Seeeduino XIAOの方がmicro:bitより安価でクロック周波数も高いです。

microbit(MCU：ARM Cortex M0 + 32bit 16 MHz(Nordic nRF51822 ))
https://www.switch-science.com/catalog/5263/

Seeduino XIAO(CPU：ARM Cortex-M0 + 32bit 48 MHz(SAMD21G18）)
https://www.switch-science.com/catalog/6335/
Amazonでは3個セットを販売してます
https://www.amazon.co.jp/dp/B086KXY929

# Seeeduino XIAOのセットアップ

SeeedのHPに、詳しくCircuitPythonのインストール方法が書かれてます。
https://wiki.seeedstudio.com/Seeeduino-XIAO/
https://wiki.seeedstudio.com/Seeeduino-XIAO-CircuitPython/

![seeeduino_xiao.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/7117fa09-d152-971f-65ec-d0aa83a6901a.jpeg)

Seeeduino XIAO 用のCircuitPythonをダウンロードします。
https://circuitpython.org/board/seeeduino_xiao/


XIAOのRST端子を2度短絡すると橙色のLEDが点灯しArduinoドライブがPCの元に現れます。
Reset動画をSeeed HPから借りて貼りました
![XIAO-reset.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/d3ed3afe-2d44-9781-a9c3-e0016e347c49.gif)

![Arduino_holder.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/f663b51a-3479-c52a-62a4-faf1d8fa0d7e.png)

![Arduino2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/679bcde4-25a0-1cf8-3b53-152310d46585.png)


次にダウンロードしたファイルをこのドライブにドロップしてコピーを作成します。
![Drop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/b227fd53-14f8-108a-0564-7580d07d68f5.png)

コピーが終わるとドライブ名がCIRCUITPYに変わります。
![CIRCUITPY2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/fc67984f-ca8a-4b43-8785-e3e3eadb2df0.png)

MuエディタでPythonプログラムを書き、このドライブにmain.pyとして保存すると自動的にプログラムが実行されます。
![Mu.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/5c7f3058-7ec2-7ff7-e073-8975ff528957.png)


Lチカプログラム

``` main.py

import time
import board
from digitalio import DigitalInOut, Direction

led = DigitalInOut(board.D13)
led.direction = Direction.OUTPUT

while True:
  led.value = True
  time.sleep(0.5)
  led.value = False
  time.sleep(0.5)

```

動画をgifで埋め込んでみました
![ezgif.com-crop.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/5de3a28c-8fe2-e0ee-8715-2749c7378a64.gif)

参考にさせてもらったQiita
https://qiita.com/bohebohechan/items/f8bf6d4bbe0f14497a7b

#Mu について
Muエディタについては、次に詳しく解説されてます。
https://qiita.com/inachi/items/8f61586cd2482987b8d0

「モード」アイコンを押して「Adafruit CircuitPython」モードに切り替える
![Mu4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/3a940b36-1fe5-f465-adbf-ec5f487b3327.png)

## MuにUSBを認識させる設定
「シリアル」アイコンを押すとエラーメッセージが出る
![Mu5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/58f2f6f8-e5d0-922f-9b19-23b0cb522aac.png)

Defaltでは、Adafruitのマイコンボードはシリアルアイコンを押すと接続するようだがSeeeduino XIAOは、シリアル接続できない！

接続するにはSeeeduino XIAOのUSB VID：0x2886とPID:0x002fを
C:/Users/%username%/AppData/Local/Mu/pkgs/mu/modes/adafruit.py
ファイルに登録しないといけない。
https://www.seeedstudio.com/blog/2020/03/30/update-for-seeeduino-xiao-from-the-community/

Windowsの場合、ファイルマネージャで隠しファイル表示にチェックを入れる、adafruit.pyをエディタで開こうとするとWindowsが固まるので、ファイルの拡張子をpyからtxtに変更し、エディタで開いて編集した後、拡張子をpyに戻す。

![Mu3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/c427b78b-f87b-783a-1fab-98d8b1294c6a.png)

67行目のように書き込むと、Muエディタの「シリアル」アイコンを押すとSeeeduino XIAOと無事つながり、「プロッター」も動作した。

![Mu2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/7149657f-b668-a0e9-d2da-3c23a4f4fca3.png)

プロッター表示させたコード

``` main.py
# CircuitPython AnalogIn Demo
import time
import board
from analogio import AnalogIn

analog_in = AnalogIn(board.A1)


def get_voltage(pin):
    return (pin.value * 3.3) / 65536


while True:
    print((get_voltage(analog_in),))
    time.sleep(0.1)
```
# MCP4922を使ってSPI通信で電圧出力を行う
Arduinoで行った記事がここのQiita
https://qiita.com/hiRina/items/b8756988210f7d2455e8

これをCiurcuitPythonで行うことに成功したのが次のコード

``` main.py
#-------------------------------------
# Import
#-------------------------------------
import board
import busio
import digitalio
from digitalio import DigitalInOut, Direction, Pull
import time

#-------------------------------------
# VAL
#-------------------------------------
t=0.01

#-------------------------------------
# PIN
#-------------------------------------
led = DigitalInOut(board.D13)
led.direction = Direction.OUTPUT
#-------------------------------------
ADC = DigitalInOut(board.D0)
ADC.direction = Direction.OUTPUT
#-------------------------------------
cs=digitalio.DigitalInOut(board.D7)
cs.direction=digitalio.Direction.OUTPUT
cs.value=True

#-------------------------------------
# SPI
#-------------------------------------
spi = busio.SPI(board.SCK, MOSI=board.MOSI)
while not spi.try_lock():
    pass
spi.configure(baudrate=10000000, phase=0, polarity=0)

#-------------------------------------
# loop
#-------------------------------------
while True:
    #--------------------------
    led.value = False
    ADC.value = True
    cs.value = False
    spi.write(bytes([0x3F,0xFF]))
    cs.value = True
    ADC.value = False
    time.sleep(t)
    #--------------------------
    ADC.value = True
    cs.value = False
    spi.write(bytes([0x30,0x00]))
    cs.value = True
    ADC.value = False
    time.sleep(t)
    #--------------------------
    led.value = True
    ADC.value = True
    cs.value = False
    spi.write(bytes([0xBF,0xFF]))
    cs.value = True
    ADC.value = False
    time.sleep(t)
    #--------------------------
    ADC.value = True
    cs.value = False
    spi.write(bytes([0xB0,0x00]))
    cs.value = True
    ADC.value = False
    time.sleep(t)

```
![IMGP4684.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492810/80a40075-44e7-e3ca-ac38-c86ac9153456.jpeg)


#参考資料
CircuitPythonについてadafruit社が記述してるHP
https://learn.adafruit.com/welcome-to-circuitpython

CircuitPythonの解説
https://learn.adafruit.com/circuitpython-essentials

CircuitPythonの例題
https://github.com/adafruit/Adafruit_Learning_System_Guides/tree/master/CircuitPython_Essentials