XIAO RP2040 x Expansion boardのMicroPythonサンプル

Seeed K.K.の中井です。

Seeed XIAO RP2040とSeeeduino XIAO Expansion boardを組み合わせてMicroPythonで動作確認をしてみたので、参考までにそれらのスクリプトを掲載したいと思います。

この記事で動作確認に使用したファームウェアは、 MicroPython v1.18 on 2022-01-17; Raspberry Pi Pico with RP2040 です。動作確認時の最新版です。

バージョンが違う場合には記載のコードから多少の変更が必要な場合がありますのでご注意ください。

https://micropython.org/download/rp2-pico/

サンプル集

Wikiの下の方からMicroPythonのサンプル集をダウンロードすることができます。参考までにコードを確認してみるのも良いかもしれません。

https://files.seeedstudio.com/wiki/XIAO-RP2040/img/micropython/XIAO-RP2040-MicroPython-Grove.zip

収録されているライブラリとそれに対応するGroveモジュールは下記です。

ライブラリ Groveモジュール
Acc_Adxl345.py Grove - ADXL345 - 3-Axis Digital Accelerometer(±16g)
buzzer.py Grove - Buzzer
dht11.py Grove - Temperature & Humidity Sensor (DHT11)
dht20.py Grove - Temperature & Humidity Sensor V2.0 (DHT20)
lcd1602.py Grove - 16x2 LCDなど
servo.py Grove - Servo
ssd1306.py Grove - OLED Display 0.96" (SSD1315) など
ws2812.py Grove - RGB LED (WS2813 Mini)など

例えばssd1306.pyなんかはExpansion boardを使用する場合にも利用することができます。また、ライブラリ以外にもexample/の下に実装例が収録されています。

XIAO RP2040

XIAO RP2040のRGB LED

Wikiにも動かし方が掲載されているので詳細は割愛しますが、ポイントとしてはws2812.pyをXIAO RP2040に転送しておく必要があります。ws2812.pyはWikiからダウンロードするか、上述したサンプル集のlibrary/ws2812.pyにも収録されています。

from ws2812 import WS2812
from machine import Pin
import time

switch = Pin(11, Pin.OUT, value=1)
led = WS2812(12, 1)

while True:
    colors = ((255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 255))
    for color in colors:
        led.pixels_set(0, color)
        led.pixels_show()
        time.sleep(1.0)

XIAO RP2040のUSER LED

USER LEDは3色のLEDにそれぞれ下記信号がつながっています。

LED COLOR Pin(n)
RED 17
GREEN 16
BLUE 25
from machine import Pin, PWM
import time

ledb = PWM(Pin(25))
ledb.freq(100)

while True:
    for i in list(range(0x100)) + list(range(0x100, 0, -1)):
        ledb.duty_u16(i * 0x100)
        time.sleep(0.005)

Expansion board

Seeeduino XIAO Expansion boardにXIAO RP2040を接続した時のピンマップです。MicroPythonで使用するピン番号(Px)を入れたので多少わかりやすくなったかなと思います。

Expansion boardのRTC

Expansion boardには、RTCとしてNXP PCF8563が採用されています。 PCF8563用のドライバpcf8563.pyは下記からダウンロードしてXIAO RP2040に保存しておく必要があります。

https://github.com/lewisxhe/PCF8563_PythonLibrary/blob/master/pcf8563.py

from pcf8563 import PCF8563
from machine import Pin, I2C
import time

i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=200000)
rtc = PCF8563(i2c)
rtc.set_datetime((22, 4, 1, 9, 30, 0, 6))

while True:
    print('{0:02d}/{1:02d}/{2:02d} {4:02d}:{5:02d}:{6:02d}'.format(*rtc.datetime()))
    time.sleep(1.0)

Expansion boardのボタン

ボタンに接続されている信号P27はハード的にプルアップされていないようなので、ソフトウェアで設定する必要があります。

from machine import Pin

def handler(p):
    status = 'Released' if p.value() == 1 else 'Pushed'
    print(status)

button = Pin(27, Pin.IN, Pin.PULL_UP)
button.irq(trigger=Pin.IRQ_RISING | Pin.IRQ_FALLING, handler=handler)

while True:
    pass

ボタンを押すとPushedと表示され、離すとReleasedと表示されます。

Expansion boardのブザー

下記のコードはビープ音を鳴らすものですが、サンプル集にはexample/music.pyに音階を鳴らす例もあります。

from machine import Pin, PWM
import time

buzzer = PWM(Pin(29, Pin.OUT))
buzzer.freq(440)
buzzer.duty_u16(32768)  # duty比を50%に設定
time.sleep(1.0)
buzzer.deinit()

Expansion boardのOLED

サンプル集に含まれるexample/oled.pylibrary/ssd1306.pyで動作するのですがHello World!が表示されるだけなので、 表示に多少の変化がつくようにRP2040内蔵RTCを使って時間を表示するコードにしてみました。 ssd1306.pyはXIAO RP2040に保存しておく必要があります。

from ssd1306 import SSD1306_I2C
from machine import Pin, I2C, RTC
import time
 
i2c = I2C(1, scl=Pin(7), sda=Pin(6), freq=200000)
oled = SSD1306_I2C(128, 64, i2c)
rtc = RTC()
rtc.datetime((2022, 4, 1, 6, 9, 30, 0, 0))

while True:  
    oled.fill(0)
    oled.text('{0:04d}/{1:02d}/{2:02d}'.format(*rtc.datetime()),0,0)
    oled.text('{4:02d}:{5:02d}:{6:02d}'.format(*rtc.datetime()),0,10)
    oled.show()
    time.sleep(0.1)

Expansion boardのマイクロSD

Expansion boardの回路図をみるとmicro SDスロットに接続されているCSピンはD2/P28でした。 SD Card over SPI用のドライバsdcard.pyを下記からダウンロードしてXIAO RP2040に保存しておく必要があります。

https://github.com/micropython/micropython/blob/v1.18/drivers/sdcard/sdcard.py

from machine import Pin, SPI
import os, sdcard

spi = SPI(0, sck=Pin(2), mosi=Pin(3), miso=Pin(4))
sd = sdcard.SDCard(spi, Pin(28))

os.mount(sd, '/sd')
os.chdir('sd')
print(os.listdir())
print()
print(open('README.txt').read())

PCなどでmicroSDをFAT32にフォーマットし、README.txtを保存したmicro SDカードを接続して実行するとその内容が表示されます。

変更履歴

日付 変更者 変更内容
2022/4/15 mnakai 作成
2023/2/17 mnakai sdcard.pyのリンクを変更