はじめに
マイコン向けの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チカプログラム
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)
参考にさせてもらった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と無事つながり、「プロッター」も動作した。
プロッター表示させたコード
# 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で行うことに成功したのが次のコード
# -------------------------------------
# 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