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 用のCircuitPythonをダウンロードします。
https://circuitpython.org/board/seeeduino_xiao/

XIAOのRST端子を2度短絡すると橙色のLEDが点灯しArduinoドライブがPCの元に現れます。
Reset動画をSeeed HPから借りて貼りました

次にダウンロードしたファイルをこのドライブにドロップしてコピーを作成します。

コピーが終わるとドライブ名がCIRCUITPYに変わります。

MuエディタでPythonプログラムを書き、このドライブにmain.pyとして保存すると自動的にプログラムが実行されます。

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で埋め込んでみました

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

Mu について

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

「モード」アイコンを押して「Adafruit CircuitPython」モードに切り替える

MuにUSBを認識させる設定

「シリアル」アイコンを押すとエラーメッセージが出る

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に戻す。

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

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

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)

参考資料

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