メインコンテンツまでスキップ

MicroPython を搭載した Seeed Studio XIAO SAMD21

MicroPython の概要​

MicroPython は、一部にネイティブコードコンパイル機能を備えた Python インタプリタです。組み込みプロセッサや制約のあるシステム向けに実装された、Python 3.5 機能のサブセットを提供します。これは CPython とは異なり、その違いについてはこちらで詳しく読むことができます。

はじめに​

まず、Seeed Studio XIAO SAMD21 をコンピュータに接続し、MicroPython から簡単なコードを書き込んで、ボードが正常に動作しているか確認します。

ハードウェアの準備​

ファームウェアを書き込む​

XIAO SAMD21 の場合​

  • ステップ 1. Seeed Studio XIAO SAMD21 を Type‑C ケーブルでコンピュータに接続し、Reset ボタンを素早く 2 回押して BOOT モードに入ります。正常に動作していれば、PC 上に Arduino ディスクが表示されます。
  • ステップ 2. ファームウェアを書き込む

MicroPython の公式サイトにアクセスし、最新のファームウェアをダウンロードします。

セキュリティを確保し、最新機能をサポートするために独自のファームウェアをコンパイルすることも可能ですが、必須ではありません。


XIAO SAMD21 Plus の場合​

  • ステップ 1. XIAO SAMD21 Plus を Type‑C ケーブルで PC に接続し、Reset ボタンを続けて 2 回押します。すべてが正しく動作していれば、PC 上に Arduino ディスクが表示されます。
  • ステップ 2. 下記リンクをクリックしてファームウェアをダウンロードし、.uf2 ファイルを Arduino ディスクにドラッグ&ドロップしてファームウェアの書き込みを完了します。

ソフトウェアの準備​

  • ステップ 1. お使いの OS に応じて、最新版の Thonny editor をダウンロードしてインストールします。
  • ステップ 2. Thonny を起動します。

  • ステップ 3. Tools-->Options をクリックして設定画面を開きます。

  • ステップ 4. Interpreter タブを選択し、デバイスを MicroPython(generic)、ポートを Board CDC @ Port に設定します。

ソフトウェア開発​

SEEED XIAO SAMD21 シリーズのピン割り当て表​

MicroPython ピン名XIAO SAMD21 GPIO (ID)XIAO SAMD21 Plus GPIO (ID)IRQ SAMD21 / PlusADC機能
D0 / A0PA02 (2)PA02 (2)2 / 20GPIO, ADC, DAC
D1 / A1PA04 (4)PA04 (4)4 / 44GPIO, ADC
D2 / A2PA10 (10)PA10 (10)10 / 1018GPIO, ADC
D3 / A3PA11 (11)PA11 (11)11 / 1119GPIO, ADC
D4 / A4 / SDAPA08 (8)PA08 (8)NMI / NMI16GPIO, ADC, I2C SDA
D5 / A5 / SCLPA09 (9)PA09 (9)9 / 917GPIO, ADC, I2C SCL
D6 / A6 / TXPB08 (40)PB08 (40)8 / 82GPIO, ADC, UART TX
D7 / A7 / RXPB09 (41)PB09 (41)9 / 93GPIO, ADC, UART RX
D8 / A8 / SCKPA07 (7)PA07 (7)7 / 77GPIO, ADC, SPI SCK
D9 / A9 / MISOPA05 (5)PA05 (5)5 / 55GPIO, ADC, SPI MISO
D10 / A10 / MOSIPA06 (6)PA06 (6)6 / 66GPIO, ADC, SPI MOSI
USER_LED / D13 / SCL1PA17 (17)PA17 (17)1 / 1—元のユーザー LED、Plus では D13 & I2C1 SCL
RX_LED / D27PA18 (18)PA18 (18)2 / 2—元の RX LED、Plus では D27
TX_LED / D19 / I2S_SDPA19 (19)PA19 (19)3 / 3—元の TX LED、Plus では D19 & I2S データ
D12—PA28 (28)— / 8—Plus 拡張 GPIO
D14 / SDA1—PA16 (16)— / 0—Plus I2C1 SDA
D15—PA15 (15)— / 15—Plus 拡張 GPIO
D16—PA14 (14)— / 14—Plus 拡張 GPIO
D17—PA13 (13)— / 13—Plus 拡張 GPIO
D18—PA12 (12)— / 12—Plus 拡張 GPIO
D20 / I2S_SCK—PA20 (20)— / 4—Plus GPIO & I2S クロック
D21 / I2S_WS—PA21 (21)— / 5—Plus GPIO & I2S ワードセレクト
D22—PB10 (42)— / 10—Plus 拡張 GPIO
D23—PB11 (43)— / 11—Plus 拡張 GPIO
D24—PB23 (55)— / 7—Plus 拡張 GPIO
D25—PA23 (23)— / 7—Plus 拡張 GPIO
D26—PA22 (22)— / 6—Plus 拡張 GPIO
RGB_LED—PA27 (27)— / 15—Plus アドレス指定可能 RGB LED (WS2812)
BUTTON—PB22 (54)— / 6—Plus ユーザーボタン(アクティブ Low)
USB_DMPA24 (24)PA24 (24)12 / 12—USB D−(ネイティブ USB、GPIO ではない)
USB_DPPA25 (25)PA25 (25)13 / 13—USB D+(ネイティブ USB、GPIO ではない)
SWCLKPA30 (30)PA30 (30)10 / 10—SWD クロック
SWDIOPA31 (31)PA31 (31)11 / 11—SWD データ
注記

GPIO (ID) の括弧内の数字は、物理 MCU パッケージのピン番号ではなく、MicroPython SAMD のピン ID を示します。

コードを書き込む​

"Run current script" ボタンをクリックしてコードを書き込みます。初回は、Thonny からコードファイルの保存先を尋ねられます。This Computer と MicroPython device のどちらを選んでも構いません。

プログラムをオフラインで使用したい場合は、プログラムを XIAO SAMD21 に保存する必要があります。

Ctrl + Shift + S を同時に押し続け、MicroPython device に保存するオプションを選択します。

GPIO テスト(LED)​

準備するもの:

  1. XIAO SAMD21 の場合、RX_LED は PA18 です。

    青色の RX_LED が点灯し、1 秒ごとに点滅するのが確認できます。

from machine import Pin, Timer

led = Pin(18, Pin.OUT)
Counter = 0
Fun_Num = 0

def fun(tim):
global Counter
Counter = Counter + 1
print(Counter)
led.value(Counter%2)

tim = Timer(-1)
tim.init(period=500, mode=Timer.PERIODIC, callback=fun)
  1. XIAO SAMD21 Plus では RX_LED と TX_LED は取り外されており、その代わりに WS2812 LED が使用されています。そのデータピンは PA27 に割り当てられています。

from machine import Pin, Timer
import machine
import time

led = Pin(27, Pin.OUT)

Counter = 0


def ws2812_write(r, g, b):
data = bytearray([g, r, b])

machine.bitstream(
led,
0,
(400, 850, 800, 450),
data
)

time.sleep_us(80)


def fun(tim):
global Counter

Counter += 1
print(Counter)

if Counter % 2 == 1:
ws2812_write(0, 0, 255)
else:
ws2812_write(0, 0, 0)


# Initial state: OFF
ws2812_write(0, 0, 0)

# 500 ms periodic timer
tim = Timer(-1)
tim.init(
period=500,
mode=Timer.PERIODIC,
callback=fun
)

GPIO でリレーを制御する​

準備するもの:

from machine import Pin, Timer

output_4 = Pin(8, Pin.OUT)
detect_1 = Pin(4, Pin.IN, Pin.PULL_UP)
output_value = Pin(2, Pin.OUT)
Counter = 0

def fun(tim):
global Counter
Counter = Counter + 1
output_4.value(Counter%2)
print(Counter%2,detect_1.value())
if detect_1.value() :
output_value.value(1)
else:
output_value.value(0)

tim = Timer(-1)
tim.init(period=200, mode=Timer.PERIODIC, callback=fun)

人感検知による自動制御​

準備するもの:

from machine import Pin, Timer

led = Pin(8, Pin.OUT)

input_value_1 = Pin(4, Pin.IN, Pin.PULL_UP)
input_value_2 = Pin(10, Pin.IN, Pin.PULL_UP)
output_value = Pin(2, Pin.OUT)

Counter = 0
Fun_Num = 0

def fun(tim):
global Counter
Counter = Counter + 1
led.value(Counter%2)
print(input_value_1.value(),input_value_2.value())
if input_value_1.value() :
output_value.value(1)
else:
output_value.value(0)

tim = Timer(-1)
tim.init(period=50, mode=Timer.PERIODIC, callback=fun)

I2C サポート​

from machine import Pin, SoftI2C

i2c = SoftI2C(scl=Pin(9), sda=Pin(8), freq=100000)
devices = i2c.scan()
for device in devices:
print("Decimal address: ",device," | Hexa address: ",hex(device))

i2c.writeto(0x51, 'b')
print(i2c.readfrom(0x51, 4)) # read 4 bytes from device with address 0x51
i2c.writeto(0x51, 'a') # write 'a' to device with address 0x51
print(i2c.readfrom(0x51, 4)) # read 4 bytes from device with address 0x51
i2c.writeto(0x51, 'b')
print(i2c.readfrom(0x51, 4))

micropython に慣れてくると、さらに多くのことができるようになります。私たちは、皆さまのためにより多くの価値を生み出せることを楽しみにしています。ぜひ、あなたのプロジェクトも私たちと共有してください!

DAC サポート​

コードを提供してくださった Aleksei Tertychnyi 氏に感謝いたします。関連するすべての機能は彼によって開発・貢献されました。

from machine import Pin, Timer, DAC

led = Pin(18, Pin.OUT)
counter = 0

dac = DAC(0) #DAC on A0 output

def loop(tim):
global counter
led.value(counter%2)
print('DAC value: ', end =" ")
print(counter)
dac.write(counter%1024)
counter = counter + 1

tim = Timer(-1)
tim.init(period=1000, mode=Timer.PERIODIC, callback=loop)

ピン A0 上の電圧は徐々に上昇し、約 3.3V の最大値に達した後、0V まで下がり、このサイクルを繰り返します。

ADC サポート​

ADC の MicroPython コード例:

from machine import Pin, Timer, ADC
led = Pin(18, Pin.OUT) # digital output for blinking
counter = 0 # simple counter for LED toggle

ADC_CONVERT_V = 1.0 / 65535.0 # conversion factor: raw ADC (16-bit) → voltage (vref=1.0V)

adc = ADC(4, vref=0) # ADC reads on pin A4, using internal 1.0V reference
adcVoltage = 0.0 # variable to store measured voltage

def fun(tim):
global counter, adcVoltage # make sure we update the global variables
counter += 1 # increment counter
adcVoltage = adc.read_u16() * ADC_CONVERT_V # read ADC and convert to voltage
print(adcVoltage) # print voltage to REPL
led.value(counter % 2) # toggle LED every callback (blink)

tim = Timer(-1) # create a virtual timer
tim.init(period=1000, # callback period in milliseconds (1000 ms = 1 s)
mode=Timer.PERIODIC, # periodic callback
callback=fun) # function to call

MicroPython デバイスコンソール​

パートナーの Neil が、MicroPython を使用して XIAO 用のコマンドラインコンソールプログラムを作成してくれました。このプログラムを使うと、ファイルのアップロード、ダウンロード、削除を簡単に行うことができます。XIAO への彼の貢献に感謝いたします!

技術サポート & 製品ディスカッション​

弊社製品をお選びいただきありがとうございます。私たちは、製品をできるだけスムーズにご利用いただけるよう、さまざまなサポートを提供しています。お好みやニーズに合わせて選べる、複数のコミュニケーションチャネルをご用意しています。

Loading Comments...