ラズパイPICOに使用されているコントローラー「RP2040」を搭載した、Seeed社製の「seeed Studio XIAO RP2040」の使い方を詳しく紹介します。
「XIAO RP2040」を動作させるためには、専用のファームウェアもありますが「Raspberry Pi Pico」のファームウェアでも同じように動作するので、これを使った方法を「MicroPython(初心者向け)」と「Circuit Python」で紹介します。
「XIAO RP2040」専用に最適化されたファームウェアは以下のサイトから入手できます。
1.XIAO PR2040とは(開発環境の準備)
2.外観
3.基本仕様
4.端子配列、機能、各機能の注意点
・端子配列(Raspberry Pi Picoとの比較)
・端子機能一覧表(Raspberry Pi Picoとの比較)
・ファームウェアごとの端子名指定方法の違い
・本体LED、NeoPixel使用時の注意点
・D3(A3[GP29])端子使用時の注意点
5.サンプルプログラム①〜⑦の動作紹介
・①Lチカ
・②本体フルカラーLEDの動作確認
・③本体NeoPixelの動作確認
・④アナログ入力(ADC)
・⑤OLED SSD1306で画面表示
・⑥シリアル通信(UART)テスト
・⑦PWM制御
6.MicroPythonのサンプルプログラム①〜⑦(コピペ)
7.CircuitPythonのサンプルプログラム①〜⑦(コピペ)
8.本体の初期化方法
9.まとめ
1.XIAO PR2040とは(開発環境の準備)
「XIAO RP2040」とは「Seeed社」製の小型の開発ボード「Seeed Studio XIAO」シリーズの1つで「Raspberry Pi Pico」に搭載されているコントローラ「RP2040」が搭載されています。
「Raspberry Pi Pico」と互換性があり、プログラムには「C言語」「MicroPython」「Circuit Python」が使用できます。
下画像のように「Pico」の半分以下の寸法で端子数は少ないながら「Pico」で使用できる機能のほとんどを使用することができます。
「Pico」と同様に基板上にはブートボタン(XIAO:B/Pico:BOOTSEL)があり、開発環境の準備も「Pico」と同じファームウェアを使うことで同じように準備することができます。
開発環境の準備は以下のリンクで詳しく紹介しています。
2.外観
外観は下写真のようになります。
「ラズパイPico」のUSBは「micro-B」ですが「XIAO」には「Type-C」が搭載されています。
その他にも「Pico」には無い「電源LED赤」や「フルカラーLED(赤緑青)」「NeoPixel」「リセットボタン:R」が実装されています。
「ブートボタン:B」は「Pico」と同様にファームウェアの書き込み時に使用します。
半田付けは下画像のように、ブレッドボードにピンヘッダーを差し込んでから行うと簡単に半田付けすることができます。
3.基本仕様
「XIAO RP2040」の基本仕様は以下表のようになります。
Item | Value |
---|---|
コントローラ CPU | RP2040 Dual-core ARM Cortex M0+ processor up to 133MHz |
Flash Memory | 2MB |
SRAM | 264KB |
入出力(I/O) | 11点(D0〜D10) |
アナログ入力(ADC) | 4点(A0〜A3) |
PWM出力 | 11点(D0〜D10) |
I2C通信 | 1(SDA/SCL) |
SPI通信 | 1(MOSI/MISO/SCK/CSn) |
UART通信 | 1(RX/TX) |
USB | Type-C |
電源電圧 | 3.3V/5V DC |
外形寸法 | 20×17.5×3.5mm |
4.端子配列、機能、各機能の注意点
「XIAO RP2040」の端子配列について「ラズパイPico」との比較や、各機能を使う上での注意点について詳しく紹介します。
・端子配列(Raspberry Pi Picoとの比較)
「XIAO RP2040」の端子は「ラズパイPico」に使用されているコントローラ「RP2040」の端子と直接接続されているものがほとんどのため、基本的には「ラズパイPico」で使用できる機能はそのまま使用できます。
XIAO RP2040 端子配列
「XIAO」の端子配列は下図のようになり、メーカー推奨の機能は一部に限定されています。
全ての機能を使用するには「この下」を参照してください。
Raspberry Pi Pico 端子配列
「Pico」に対応する端子は下図のようになり「Pico」のファームウェアを使用することで、これらの機能を同じように使用することができます。
ラズパイPicoの機能を考慮した XIAO RP2040 端子配列
・端子機能一覧表(Raspberry Pi Picoとの比較)
下表左が「XIAO RP2040」、右が「XIAO」の端子に対応する「ラズパイPico」の端子機能一覧表です。
・I/O:入出力端子、D1〜D10まで11点全てが設定可能
・ADC:アナログ入力端子、D0〜D3(A0〜A3)の4点が設定可
・I2C:I2C通信端子、I2C0、I2C1の2系統が使用可能
・UART:UART通信端子、UART0、UART1(送信:TX1のみ)の2系統が使用可能
・SPI:SPI通信端子、D7(CSn)/D7(SCK)/D7(MISO)/D7(MOSI)の1系統が使用可能
・PWM:PWM出力端子、D1〜D10まで11点全てが設定可能
・ファームウェアごとの端子名指定方法の違い
使用する「ファームウェア」や使用する「プログラム言語」によってプログラム内での端子番号の指定方法が異なるので以下にまとめておきます。
ラズパイPicoのファームウェア使用の場合
「Pico」のファームウェアを使用する場合は、使用するプログラム言語が「MicroPython」か「Circuit Python」かで異なります。
先に紹介した端子配列の図から「XIAO」の端子番号「D〜」に対応する「Pico」の端子番号「GP〜」を確認して以下のように指定します。
・CircuitPythonの場合:「GP〜」のように「〜」に番号をつけて「GP1」のように指定
XIAO RP2040のファームウェア使用の場合
「XIAO」のファームウェアを使用する場合は、「D〜」のように「〜」に番号をつけてそのまま指定します。その他の端子機能を使う場合は「SDA」や「TX」のようにそのまま指定することができます。
・本体LED、NeoPixel使用時の注意点
「XIAO RP2040」には下図のように、「本体にフルカラーLED(赤緑青)」と「NeoPixel」が搭載されています。電源LED赤は常時点灯です。
フルカラーLED使用時の注意点
フルカラーLED青 は「ラズパイPico」の本体LED緑「GP25」に相当します。
同様にフルカラーLED赤 は「GP17」、フルカラーLED赤 は「GP16」に相当します。
NeoPixel使用時の注意点
「NeoPixel」とはプログラムで点灯色を制御できるマイコン搭載のフルカラーLEDです。
「XIAO」本体にも1つ搭載されており、ライブラリを使用して簡単に制御できますが、制御用の端子とは別に電源を供給する必要があります。
プログラム内での端子名の指定方法は、使用するファームウェアが「ラズパイPico」用か「XIAO RP2040」用か、また「MicroPython」か「CircuitPython」かで違うため、フルカラーLEDと合わせて以下表にまとめました。
・D3(A3[GP29])端子使用時の注意点
「XIAO RP2040」の「D3(A3)」端子は「ラズパイPico」では「VSYS」端子からの入力電源監視用アナログ入力端子「GP29」として使用されているものです。
「Pico」では内部的に使用されているため実用的ではありませんでしたが「XIAO」ではこれもアナログ入力として使用できます。
5.サンプルプログラム①〜⑦の動作紹介
サンプルプログラム(コピペ)として「MicroPython」と「CircuitPython」の両方で ①〜⑦の7パターン用意しました。それぞれの動作詳細や配線図、使用する部品の詳細は以下のようになります。
①Lチカ
本体LEDの点滅を確認する「Lチカ」プログラムです。
「XIAO」単体でも動作確認できますが、本体LEDの点滅と同時に出力端子D7(GP1)も「ON/OFF」させているため、LEDを接続すると出力の「ON/OFF」も確認できます。(画像は抵抗内蔵LED)
②本体フルカラーLEDの動作確認
本体に搭載されているフルカラーLED(赤緑青)の動作確認を行います。
外付けのボタンを押すごとに「消灯→赤→緑→青」と点灯を繰り返します。
③本体NeoPixelの動作確認
本体に搭載されている「NeoPixel」の制御方法を確認します。
プログラムを実行すると下図のように1秒ごとに「消灯→黄→水色→紫」と繰り返して点灯し続けます。
「NeoPixel」はライブラリ(ws2812.py)を使用することで、赤、緑、青の明るさを指定するだけで簡単に動作確認できます。
④アナログ入力(ADC)
外付けボリュームの電圧をアナログ入力端子で読み取り、開発環境「Thonny」のシリアルモニタに取得したアナログ値と換算した電圧値を表示させて確認します。
ボリュームは上図のように「M5Stack社」製の「ANGLE UNIT」を使用しています。
このボリュームで「0〜3.3V」の電圧調整ができます。
プログラムを実行すると「Thonny」のシリアルモニタに取得した値が表示され続けます。
ボリュームについては、以下のリンクで詳しく紹介しています。
⑤OLED SSD1306で画面表示
「OLED」の表示確認は簡単なデータを表示するだけの「基本編」と、ボタンのON/OFF回数のカウントやアナログ入力値を表示する応用編の2つの動作確認を行なっています。
配線図は上図のようになります。
この配線図で「基本編」と「応用編」両方の動作確認ができます。
ミニブレッドボードに全ての部品を載せたため、上画像のように少し複雑ですが、配線図も参照して接続を行なってください。
OLED表示 基本編
基本編では下画像のように単純な文字と図形の表示を確認します。
OLEDの表示方法は基本的には「ラズパイPico」と同じです。
表示にはライブラリを使用します。ライブラリのインストール方法は以下のリンクで詳しく紹介しています。
OLED表示 応用編
「応用編」では下画像のように、アナログ入力値の表示確認とボタンのON/OFF状態や回数のカウント数確認を行います
実行すると上画像のような表示画面になります。
ボリュームを操作すると画面下でアナログ入力値と換算電圧が変化することが確認できます
ボリュームMAXで上画像のような表示になります。
ボタンを押すとボタン状態(BTN)が「ON」になり、カウント数(CNT)の数値が1づつ増加します。
⑥シリアル通信(UART)テスト
「XIAO RP2040」のUART通信は公式には1系統だけですが、「ラズパイPico」のファームウェアを使用すると、送信だけは2系統使えるため、送信したデータ(文字列:Hello)を自分で受信することで、2系統の動作確認を行います。
受信したデータ「文字列:Hello」に「文字列:World!」を追加して送信し、その結果を外付けのシリアルモニタで確認します。
配線図は上図のようになります。
ブレッドボードを使用して、上画像のように接続しています。
外付けのシリアルモニタは「M5Stack Basic」を使用した、自作のシリアルモニタを使用しています。
このシリアルモニタの作り方や使用方法は、以下のリンクで詳しく紹介しています。
プログラムを実行すると開発環境「Thonny」のシリアルモニタに送信した文字「Hello」が表示されます。
送信(TX1)した「Hello」を受信(RX0)し、「world!」を追加して送信(TX0)した結果をシリアルモニタで確認すると下画像のようになります。
プログラムを実行するたびに受信した「Hello」に「World!」が加算されて送信されるため、シリアルモニタに「Hello World!」が表示されます。
これで2系統のUARTの送受信ができていることが確認できます。
⑦PWM制御
「PWM」制御の動作を本体のフルカラーLEDの明るさを調整することで確認を行います
同じ「スライス」で異なる周波数を設定すると「Micropython」では後で指定した周波数で上書きされ、「Circuitpython」ではエラーになります。
赤と緑のLEDでPWM制御の「Duty比」を小さくすると両方とも同じように暗くなります。
「Duty比」を大きくすると赤と緑は両方とも明るくなります。
青のLEDは別の「スライス」にあるため、赤緑とは別の周波数が指定でき、青と赤のLEDで動作確認すると下画像のような動作になります。
赤の周波数を「10Hz」、青を「1kHz」に設定すると「Duty比」最大時には、赤も青も同じように点灯します。
「Duty比」を下げると、青は暗くなり赤は画像ではわかりにくいですが点滅します。
これで赤と青に別の周波数が設定できていることが確認できます。
PWM制御の「周波数」や「Duty比」については以下のリンクで詳しく紹介しています。
(プログラムはC言語になります。)
6.MicroPythonのサンプルプログラム①〜⑦
「MicroPython」を使用したサンプルプログラムは以下になります。
開発環境に「コピペ」で貼り付けて実行してください。
①Lチカ、入出力
②本体フルカラーLEDの動作確認
③本体NeoPixelの動作確認
④アナログ入力(ADC)
⑤OLED SSD1306で画面表示
⑥シリアル通信(UART)テスト
⑦PWM制御
①Lチカ(MicroPython)
「MicroPython」で「Lチカ(LEDを点滅)」させるプログラムは以下になります。
(XIAO RP2040本体だけで動作確認できます。)
from machine import Pin # 入出力モジュールを準備
import time # タイマーモジュールを準備
# 出力ピン設定
led_red = Pin(17, Pin.OUT) # 本体LED赤ピンを出力設定
led_green = Pin(16, Pin.OUT) # 本体LED緑ピンを出力設定
led_blue = Pin('LED', Pin.OUT) # 本体LED青ピン(25)を出力設定
out = Pin(1, Pin.OUT) # 端子GP1(D7))を出力設定
led_red.value(True) # 本体LED赤を消灯
led_green.value(True) # 本体LED緑を消灯
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
led_blue.value(False) # 本体LED青を点灯
out.value(True) # 出力端子をON(High)
time.sleep(0.5) # 0.5秒待つ
led_blue.value(True) # 本体LED青を消灯
out.value(False) # 出力端子をOFF(Low)
time.sleep(0.5) # 0.5秒待つ
②本体フルカラーLEDの動作確認(MicroPython)
「MicroPython」で本体フルカラーLEDの「赤、緑、青」をボタンを押すごとに切り替えるプログラムは以下になります。
from machine import Pin # 入出力モジュールを準備
import time # タイマーモジュールを準備
# 出力端子設定(フルカラーLED)
led_red = Pin(17, Pin.OUT) # 本体LED赤ピンを出力設定
led_green = Pin(16, Pin.OUT) # 本体LED緑ピンを出力設定
led_blue = Pin("LED", Pin.OUT) # 本体LED青ピン(25)を出力設定
# 入力端子設定(ボタンスイッチ)
btn = Pin(4, Pin.IN, Pin.PULL_UP) # GP4(XIAO:D9)をbtnとして入力端子(プルアップ)に設定
# フルカラーLED全消灯
led_red.value(True) # 本体LED赤を消灯
led_green.value(True) # 本体LED緑を消灯
led_blue.value(True) # 本体LED青を消灯
# 変数宣言
state = False # ボタン状態保持用
cnt = 0 # ボタンON回数カウント用
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
# ボタンスイッチ処理(ON/OFF)
if btn.value() == False and state == False : # ボタンがONでstateがfalseなら
state = True # ボタン状態Trueへ
cnt += 1 # カウント+1
if btn.value() == True:
state = False # ボタン状態Falseへ
# ボタンON回数カウントが4ならゼロリセット
if cnt == 4:
cnt = 0
# ボタンカウント数ごとに点灯LED変更
if cnt == 1:
led_red.value(False) # LED赤点灯
elif cnt == 2:
led_green.value(False) # LED緑点灯
led_red.value(True) # LED赤消灯
elif cnt == 3:
led_blue.value(False) # LED青点灯
led_green.value(True) # LED緑消灯
else:
led_blue.value(True) # LED青消灯
time.sleep (0.2)
③本体NeoPixelの動作確認(MicroPython)
「MicroPython」で本体のNeoPixelの点灯制御を行うプログラムは以下になります。
(XIAO RP2040本体だけで動作確認できます。)
# 以下サイトから ws2812.py をダウンロードしてXIAO本体の「lib」フォルダ内に保存しておく
# https://wiki.seeedstudio.com/XIAO-RP2040-with-MicroPython/
from machine import Pin # 入出力とアナログ入出力制御用モジュールを準備
from ws2812 import WS2812 # NeoPixel制御用ライブラリを使用
import time # タイマーモジュールを準備
# NeoPixel用電源供給用端子(11)を出力設定しHighにする
power = Pin(11,Pin.OUT)
power.value(True)
# NoePixel初期設定
rgb_led = WS2812(12,1) # WS2812(端子番号12, LED数1)
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
rgb_led.pixels_set(0, (30, 10, 0)) # (LED番号0, (赤, 緑, 青))各LED色の明るさを0〜255で指定
rgb_led.pixels_show() # 設定した色構成で点灯実行
time.sleep(1.0)
rgb_led.pixels_set(0, (0, 30, 10)) # (LED番号0, (赤, 緑, 青))各LED色の明るさを0〜255で指定
rgb_led.pixels_show() # 設定した色構成で点灯実行
time.sleep(1.0)
rgb_led.pixels_set(0, (10, 0, 30)) # (LED番号0, (赤, 緑, 青))各LED色の明るさを0〜255で指定
rgb_led.pixels_show() # 設定した色構成で点灯実行
time.sleep(1.0)
rgb_led.pixels_set(0, (0, 0, 0)) # 消灯
rgb_led.pixels_show() # 設定した色構成で点灯実行
time.sleep(1.0)
④アナログ入力(ADC)(MicroPython)
「MicroPython」でアナログ入力値と電圧換算した値をシリアルモニタに表示するプログラムは以下になります。
from machine import ADC # アナログ入出力制御用モジュールを準備
import time # タイマーモジュールを準備
# アナログ入力ピン設定
adc = ADC(29) # 使用するアナログ入力(A0〜3)の端子番号[ADC番号可] 26〜29[0〜3](XIAO:D0〜D3)を設定
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
adc_val = 65535 - adc.read_u16() # アナログ入力(ADC)値を取得
adc_volt = (adc_val * 3.3) / 65535 # アナログ入力(ADC)値を電圧(3.3V)に変換
print("adc_val = {:5d} adc_volt = {:5.2f}V".format(adc_val, adc_volt)) # 結果を表示する
time.sleep(1.0) # 待ち時間
⑤OLED SSD1306で画面表示(MicroPython)
「MicroPython」でOLED「SSD1306」を表示するプログラムについては、単純な表示を行う「基本編」と、ボタンスイッチのON/OFF状態や回数カウント、アナログ入力値の表示を行う「応用編」の2種類準備しました。
OLED表示 基本編(MicroPython)
「MicroPython」でOLED「SSD1306」に単純な表示を行うプログラムは以下になります。
# Thonnyの「パーケージ管理」からssd1306で検索して「micropython-ssd1306」をインストールしておく
from machine import I2C # I2C制御用モジュールを準備
import ssd1306 # 液晶表示器用ライブラリを使用
import time # タイマーモジュールを準備
# I2C設定
i2c = I2C(1, sda=6, scl=7) # (I2C識別ID 0or1, SDA, SCL) SDA/SCL=6/7(XIAO:D4/D5)
# 使用するSSD1306のアドレスを取得して表示(通常は0x3C)
addr = i2c.scan()
print("OLED I2C Address :" + hex(addr[0]))
# ディスプレイ設定(幅, 高さ, 通信仕様)
display = ssd1306.SSD1306_I2C(128, 64, i2c)
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
display.fill(0) # 画面表示初期化
# 文字表示("表示内容", x座標, y座標, 色, フォント, サイズ[倍率])
display.text("OLED SSD1306", 17, 0, True)
display.text("Hello!!", 37, 36, True)
# 線の描画(始点x, 始点y, 終点x, 終点, 色)
display.line(0, 9, 128, 9, True)
# 四角の描画(x座標, y座標, 幅, 高さ, 色)
display.rect(5, 20, 118, 40, True)
display.show() # 画面表示実行
time.sleep(0.5) # 待ち時間
OLED表示 応用編(MicroPython)
「MicroPython」でOLED「SSD1306」にボタンスイッチのON/OFF状態や回数カウント、アナログ入力値の表示を行うプログラムは以下になります。
# Thonnyの「パーケージ管理」からssd1306で検索して「micropython-ssd1306」をインストールしておく
from machine import Pin, I2C, ADC # ボード制御用モジュール
import ssd1306 # 液晶表示器用ライブラリ
import time # タイマーモジュールを準備
# I2C設定
i2c = I2C(1, sda=6, scl=7) # (I2C識別ID 0or1, SDA, SCL) SDA/SCL=6/7(XIAO:D4/D5)
# ディスプレイ設定(幅, 高さ, 通信仕様)
display = ssd1306.SSD1306_I2C(128, 64, i2c)
# 出力端子設定(LED)
led = machine.Pin("LED", machine.Pin.OUT) # LED(GP25))をledとして出力端子に設定
# 入力端子設定(ボタンスイッチ)
btn = Pin(4, Pin.IN, Pin.PULL_UP) # GP4(XIAO:D9)をbtnとして入力端子(プルアップ)に設定
state = False # ボタン状態格納用
cnt = 0 # ボタンのON回数カウント用
# アナログ入力ピン設定
adc = ADC(29) # 使用するアナログ入力(A0〜3)の端子番号[ADC番号可] 26〜29[0〜3](XIAO:D0〜D3)を設定
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
# 液晶画面表示内容設定
display.fill(0) # 画面表示初期化
display.text("SSD1306 TEST", 17, 2, True) # ("内容", x, y, 色) テキスト表示
display.hline(0, 12, 128, True) # (x, y, 長さ, 色) 指定座標から横線
display.vline(64, 12, 20, True) # (x, y, 長さ, 色) 指定座標から 縦線
display.line(0, 32, 128, 32, True) # (x1, y1, x2, y2, 色) 指定座標1から指定座標2までの線
# ボタンスイッチ処理
if btn.value() == 0: # ボタンがONなら
display.text("BTN=ON ", 2, 20, True) # テキスト表示
led.value(False) # LEDを点灯
if state == False: # ボタン状態Falseなら
state = True # ボタン状態True
cnt = cnt + 1 # カウント+1
if btn.value() == 1: # ボタンがOFFなら
display.text("BTN=OFF", 2, 20, True) # テキスト表示
led.value(True) # LEDを消灯
state = False # ボタン状態False
display.text("CNT={:03}".format(cnt), 68, 20, True) # カウント数表示(3桁0埋め)
# アナログ入力処理
adc_val = 65535 - adc.read_u16() # アナログ入力(ADC)値を取得
adc_volt = (adc_val * 3.3) / 65535 # アナログ入力(ADC)値を電圧(3.3V)に変換
display.text("ADC_Val = {:5d}".format(adc_val), 2, 42, True) # アナログ入力値表示
display.text("ADC_Volt= {:4.2f}V".format(adc_volt), 2, 54, True) # アナログ入力電圧換算値表示
display.show() # 設定した内容を表示
time.sleep(0.1) # 待ち時間
⑥2系統のシリアル通信(UART)テスト(MicroPython)
「MicroPython」でシリアル通信(UART)の送受信テストを行うプログラムは以下になります。
from machine import UART # シリアル通信制御用モジュールを準備
import time # タイマーモジュールを準備
# UART0を初期化
uart0 = UART(0, 9600) # (UART番号, ボーレート) ※端子を指定しなければ RX/TX=1/0(XIAO:D7/D6)
#uart0 = UART(0, 9600, rx=29, tx=28) # ※通信端子を指定すれば RX/TX=29/28(XIAO:D3/D2)も選択可
# UART1を初期化
uart1 = UART(1, 9600) # (UART番号, ボーレート) ※RX=5(XIAO未接続), TX=4(XIAO:D9)のみ使用可能
# UART1でデータ送信
uart1.write('Hello') # 文字「Hello」を送信
uart1.flush() # 全てのデータが送信されるまで待機(1文字分待機必要)
time.sleep(0.01) # 1文字分(以上)の待機時間
# UART0でデータ受信
while True: # ずっと繰り返し
if uart0.any() > 0: # 受信データがあれば
data = uart0.readline() # 受信済みの文字データを全て読み込む
print(data) # 受信した文字を表示
# UART0でデータ送信
uart0.write(data + " World!\n") # 受信した文字に「World」を追加して送信
⑦PWM出力(MicroPython)
「MicroPython」で本体フルカラーLEDの明るさをPWM制御で調整するプログラムは以下になります。
from machine import Pin, ADC, PWM # 入出力とアナログ入出力、PWM制御用モジュールを準備
import time # タイマーモジュールを準備
# アナログ入力ピン設定
adc = ADC(29) # 使用するアナログ入力(A0〜3)の端子番号[ADC番号可] 26〜29[0〜3](XIAO:D0〜D3)を設定
# 出力端子設定
led_red = Pin(17, Pin.OUT) # フルカラーLED赤を出力設定
led_green = Pin(16, Pin.OUT) # フルカラーLED緑を出力設定
led_blue = Pin("LED", Pin.OUT) # フルカラーLED青(25)を出力設定
led_red.value(True) # フルカラーLED赤を消灯
led_green.value(True) # フルカラーLED緑を消灯
led_blue.value(True) # フルカラーLED青を消灯
# PWMピン設定
pwm1 = PWM(led_red) # LEDのインスタンスを指定してpwm1としてPWM出力設定
pwm2 = PWM(led_green) # LEDのインスタンスを指定してpwm2としてPWM出力設定
#pwm2 = PWM(led_blue) # 上のgreenをコメントアウトし、ここのblueを有効にすると点滅パターンが変化
pwm1.freq(10) # pwm1の周波数を設定
pwm2.freq(1000) # pwm2の周波数を設定(同じスライスのペア[A/B]の場合は上書きされる)
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
adc_val = adc.read_u16() # ボリュームからのアナログ入力(ADC)値を取得
#adc_val = 50000 # 外付けボリュームを使用しない場合は有効にして数値を変更して動作確認
# PWM出力実行
pwm1.duty_u16(adc_val) # アナログ入力(ADC)値をpwm1のDuty比に設定(0〜65535)
pwm2.duty_u16(adc_val) # アナログ入力(ADC)値をpwm2のDuty比に設定(0〜65535)
time.sleep(0.1) # 待ち時間
7.CircuitPythonのサンプルプログラム①〜⑦
「CircuitPython」を使用したサンプルプログラムは以下になります。
開発環境に「コピペ」で貼り付けて実行してください。
①Lチカ、入出力
②本体フルカラーLEDの動作確認
③本体NeoPixelの動作確認
④アナログ入力(ADC)
⑤OLED SSD1306で画面表示
⑥シリアル通信(UART)テスト
⑦PWM制御
①Lチカ(CircuitPython)
「CircuitPython」で「Lチカ(LEDを点滅)」させるプログラムは以下になります。
(XIAO RP2040本体だけで動作確認できます。)
from board import * # boardモジュールからすべてのピンの定義を準備
from digitalio import DigitalInOut, Direction # 入出力ピン制御用モジュールを準備
import time # タイマーモジュールを準備
# 出力端子設定(フルカラーLED)
led_red = DigitalInOut(GP17) # 本体LED赤端子を設定
led_green = DigitalInOut(GP16) # 本体LED緑端子を設定
led_blue = DigitalInOut(LED) # 本体LED青端子(GP25)を設定
out = DigitalInOut(GP1) # 出力端子GP1(XIAO:D7)を設定
led_red.direction = Direction.OUTPUT # それぞれ出力モードに設定
led_green.direction = Direction.OUTPUT
led_blue.direction = Direction.OUTPUT
out.direction = Direction.OUTPUT
led_red.value = True # 本体LED赤を消灯
led_green.value = True # 本体LED緑を消灯
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
led_blue.value = False # 本体LED青を点灯
out.value = True # 出力端子をON(High)
time.sleep(0.5) # 0.5秒待つ
led_blue.value = True # LEDを消灯
out.value = False # 出力端子をON(High)
time.sleep(0.5) # 0.5秒待つ
②本体フルカラーLEDの動作確認(CircuitPython)
「CircuitPython」で本体フルカラーLEDの赤緑青をボタンを押すごとに切り替えるプログラムは以下になります。
from board import * # 端子機能を使用するためのモジュールを準備
from digitalio import DigitalInOut, Direction, Pull # 入出力ピン制御用モジュールを準備
import time # タイマーモジュールを準備
# 出力端子設定(フルカラーLED)
red = DigitalInOut(GP17) # 本体LED赤を設定
green = DigitalInOut(GP16) # 本体LED緑を設定
blue = DigitalInOut(LED) # 本体LED青(GP25)を設定
red.direction = Direction.OUTPUT # それぞれ出力モードに設定
green.direction = Direction.OUTPUT
blue.direction = Direction.OUTPUT
# 入力端子設定(ボタンスイッチ)
btn = DigitalInOut(GP4) # GP4(XIAO:D9)をbtnとして入力設定
btn.direction = Direction.INPUT # 入力モードに設定
btn.pull = Pull.UP # 内部プルアップ抵抗を有効化
# フルカラーLED全消灯
red.value = True
green.value = True
blue.value = True
# 変数宣言
state = False # ボタン状態保持用
cnt = 0 # ボタンON回数カウント用
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
# ボタンスイッチ処理(ON/OFF)
if btn.value == False and state == False : # ボタンがONでstateがfalseなら
state = True # ボタン状態Trueへ
cnt += 1 # カウント+1
if btn.value == True:
state = False # ボタン状態Falseへ
# ボタンON回数カウントが4ならゼロリセット
if cnt == 4:
cnt = 0
# ボタンカウント数ごとに点灯LED変更
if cnt == 1:
red.value = False # LED赤点灯
elif cnt == 2:
green.value = False # LED緑点灯
red.value = True # LED赤消灯
elif cnt == 3:
blue.value = False # LED青点灯
green.value = True # LED緑消灯
else:
blue.value = True # LED青消灯
time.sleep (0.2)
③本体NeoPixelの動作確認(CircuitPython)
「CircuitPython」で本体のNeoPixelの点灯制御を行うプログラムは以下になります。
(XIAO RP2040本体だけで動作確認できます。)
ライブラリの追加方法は、以下のリンクで詳しく紹介しています。
from board import * # 端子機能を使用するためのモジュールを準備
from digitalio import DigitalInOut, Direction # 入出力ピン制御用モジュールを準備
import time # タイマーモジュールを準備
import neopixel # NeoPicel制御モジュールを準備
# NeoPixel初期設定
PIXEL = neopixel.NeoPixel(GP12, 1) # NeoPixel(信号端子番号, LED数)
# 出力ピン設定(XIAOのファームウェアの場合はここの電源端子の指定は不要なので削除する)
PIXEL_PWR = DigitalInOut(GP11) # NoePixelの電源供給用端子設定
PIXEL_PWR.direction = Direction.OUTPUT # PIXEL_PWRを出力端子に設定
PIXEL_PWR.value = True # PIXEL_PWRをHighで電源供給
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
PIXEL[0] = (30, 10, 0) # (赤, 緑, 青)各LED色の明るさを0〜255で指定
PIXEL.show() # 設定した色構成で点灯実行
time.sleep(1.0)
PIXEL[0] = (0, 30, 30)
PIXEL.show()
time.sleep(1.0)
PIXEL[0] = (10, 0, 30)
PIXEL.show()
time.sleep(1.0)
PIXEL[0] = 0 # 0で消指定
PIXEL.show()
time.sleep(1.0)
④アナログ入力(ADC)(CircuitPython)
「CircuitPython」でアナログ入力値と電圧換算した値をシリアルモニタに表示するプログラムは以下になります。
from board import * # 端子機能を使用するためのモジュールを準備
import analogio # アナログ入出力制御用モジュールを準備
import time # タイマーモジュールを準備
# アナログ入力ピン設定
adc = analogio.AnalogIn(A3) # 使用するアナログ入力(ADC)番号GP26〜GP28[A0〜A2],GP29は設定不可[A3で設定](XIAO:D0〜D3)を設定
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
adc_val = 65535 - adc.value # アナログ入力(ADC)値を取得
adc_volt = (adc_val * 3.3) / 65535 # アナログ入力(ADC)値を電圧(3.3V)に変換
print("ADC_Val = {:5d} ADC_Volt = {:5.2f}V".format(adc_val, adc_volt)) # 結果を表示する
time.sleep(1.0) # 待ち時間
⑤OLED SSD1306で画面表示(基本と応用)(CircuitPython)
「CircuitPython」でOLED「SSD1306」を表示するプログラムについては、単純な表示を行う「基本編」と、ボタンスイッチのON/OFF状態や回数カウント、アナログ入力値の表示を行う「応用編」の2種類準備しました。
「CircuitPython」で「SSD1306」を使用するには以下のサイトからライブラリとフォントデータを本体に保存しておく必要があります。
ライブラリのインストール方法は以下のリンクで詳しく紹介しています。
OLED表示 基本編(CircuitPython)
「CircuitPython」でOLED「SSD1306」に単純な表示を行うプログラムは以下になります。
# 以下のライブラリを[lib]フォルダに保存しておく
# 「adafruit_framebuf.mpy」「adafruit_ssd1306.mpy」
# フォントファイル「font5x8.bin」をルートフォルダに保存しておく
from board import * # 端子機能を使用するためのモジュールを準備
import adafruit_ssd1306 # OLED制御用モジュールを準備
import busio # I2C通信用モジュールを準備
# I2C 通信設定
i2c = busio.I2C(GP7, GP6) # (SCL, SDA) SCL/SDA=GP7/GP6(XIAO:D5/D4)
# 液晶画面設定
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C) # 画面サイズ幅, 高さ, 通信仕様, デバイスアドレス
# 画面表示
display.fill(0) # 画面表示初期化
# 文字表示("表示内容", x座標, y座標, 色, フォント, サイズ[倍率])
display.text("OLED TEST SSD1306", 13, 0, True, font_name="font5x8.bin", size=1)
display.text("Hello!!", 25, 32, True, font_name="font5x8.bin", size=2)
# 線の描画(始点x, 始点y, 終点x, 終点, 色)
display.line(0, 9, 128, 9, True)
# 四角の描画(x座標, y座標, 幅, 高さ, 色)
display.rect(5, 20, 118, 40, True)
display.show() # 画面表示実行
OLED表示 応用編(CircuitPython)
「CircuitPython」でOLED「SSD1306」にボタンスイッチのON/OFF状態や回数カウント、アナログ入力値の表示を行うプログラムは以下になります。
# 以下のライブラリを[lib]フォルダに保存しておく
# 「adafruit_framebuf.mpy」「adafruit_ssd1306.mpy」
# フォントファイル「font5x8.bin」をルートフォルダに保存しておく
from board import * # 端子機能を使用するためのモジュール
from digitalio import DigitalInOut, Direction, Pull # 入出力ピン制御用モジュール
import analogio # アナログ入出力制御用モジュールを準備
import adafruit_ssd1306 # OLED制御用モジュール
import busio # I2C通信用モジュール
# I2C 通信設定
i2c = busio.I2C(GP7, GP6) # (SCL, SDA) SCL/SDA=GP7/GP6(XIAO:D5/D4)
# 液晶画面設定
display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c, addr=0x3C)
# 出力端子設定(LED)
led = DigitalInOut(LED) # 本体LED青(GP25)を設定
led.direction = Direction.OUTPUT # 出力モードに設定
# 入力端子設定(ボタンスイッチ)
btn = DigitalInOut(GP4) # GP4(XIAO:D9)をbtnとして設定
btn.direction = Direction.INPUT # 入力モードに設定
btn.pull = Pull.UP # 内部プルアップ抵抗を有効化
# アナログ入力ピン設定
adc = analogio.AnalogIn(VOLTAGE_MONITOR) # 使用するアナログ入力(ADC)番号(A0〜A3)をadcに設定
state = False # ボタン状態保持用
cnt = 0 # ボタンON回数カウント用
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
# 表示内容設定
display.fill(0) # 表示内容消去
# 文字表示("表示内容", x, y, 色, フォント, サイズ)
display.text("OLED", 3, 0, True, font_name="font5x8.bin", size=1)
display.text("TEST", 3, 9, True, font_name="font5x8.bin", size=1)
display.text("SSD1306", 38, 0, True, font_name="font5x8.bin", size=2)
# 線描画
display.hline(0, 18, 128, True) # (x, y, 長さ, 色) 指定座標から横線
display.vline(62, 18, 18, True) # (x, y, 長さ, 色) 指定座標から 縦線
display.line(0, 36, 128, 36, True) # (x1, y1, x2, y2, 色) 指定座標1から指定座標2までの線
# ボタンスイッチON/OFF、カウント処理
if btn.value == False: # ボタンがONなら
display.text("BTN = ON", 2, 25, True, font_name="font5x8.bin", size=1) # テキスト表示
led.value = False # LED点灯
if state == False: # ボタン2がONかつボタン状態Falseなら
state = True # ボタン状態True
cnt = cnt + 1 # カウント+1
else: # ボタンがONでなければ
display.text("BTN = OFF", 2, 25, True, font_name="font5x8.bin", size=1) # テキスト表示
state = False # ボタン状態False
led.value = True # LED消灯
display.text("CNT = {:04d}".format(cnt), 66, 25, True, font_name="font5x8.bin", size=1) # カウント数表示(3桁0埋め)
# アナログ入力処理
adc_val = 65535 - adc.value # アナログ入力(ADC)値を取得
adc_volt = (adc_val * 3.3) / 65535 # アナログ入力(ADC)値を電圧(3.3V)に変換
display.text("ADC_Val = {:5d}".format(adc_val), 2, 42, True, font_name="font5x8.bin", size=1) # アナログ入力値表示
display.text("ADC_Volt = {:4.2f}V".format(adc_volt), 2, 54, True, font_name="font5x8.bin", size=1) # アナログ入力電圧換算値表示
# 設定した内容を表示
display.show()
⑥2系統のシリアル通信(UART)テスト(CircuitPython)
「CircuitPython」でシリアル通信(UART)の送受信テストを行うプログラムは以下になります。
from board import * # 端子機能を使用するためのモジュールを準備
import busio # I2C通信用モジュールを準備
# UART0を初期化
uart0 = busio.UART(tx=GP0, rx=GP1, baudrate=9600, timeout=0.1)
# UART1を初期化
uart1 = busio.UART(tx=GP4, rx=GP5, baudrate=9600)
# 初回受信時の変なデータを読み捨てる
data = uart0.read() # 全てのデータを読み込む
#print(data) # 変なデータ確認用
data = ""
# UART1でデータ送信(データはbyteデータで送信)
uart1.write(b"Hello")
# UART0でデータ送受信
while True: # ずっと繰り返し
if uart0.in_waiting > 0: # 受信バッファにデータがあれば
data = uart0.read() # 全てのデータを読み込む
print(data) # 受信データ表示
uart0.write(data + b" World!\n") # 受信データに「World!」を追加して送信
⑦PWM出力(CircuitPython)
「CircuitPython」で本体フルカラーLEDの明るさをPWM制御で調整するプログラムは以下になります。
from board import * # 端子機能を使用するためのモジュールを準備
import pwmio # PWM制御用モジュールを準備
import analogio # アナログ入出力制御用モジュールを準備
import time # タイマーモジュールを準備
# アナログ入力ピン設定
adc = analogio.AnalogIn(A3) # 使用するアナログ入力(ADC)番号GP26〜GP28[A0〜A2],GP29は設定不可[A3で設定](XIAO:D0〜D3)を設定
# PWM出力設定 ※同じPWMグループ(スライス)A/Bは同じ周波数を設定しないとエラーになる
# LED 赤と緑は同じPWMグループのため同じ周波数を設定する
pwm_red = pwmio.PWMOut(GP17, frequency=10) # フルカラーLED赤(GP17)を周波数を指定してPWM設定
pwm_green = pwmio.PWMOut(GP16, frequency=10) # フルカラーLED緑(GP16)を周波数を指定してPWM設定
pwm_blue = pwmio.PWMOut(LED, frequency=1000) # フルカラーLED青(LED/GP25)を周波数を指定してPWM設定
# メイン処理 ---------------------------------------------------------
while True: # ずっと繰り返し
adc_val = adc.value # ボリュームからのアナログ入力(ADC)値を取得(0〜65535)
#adc_val = 50000 # 外付けボリュームを使用しない場合は有効にして数値を変更して動作確認
# PWM出力のDuty比を設定(0〜65535)
pwm_red.duty_cycle = adc_val # アナログ入力(ADC)値をDuty比に設定
pwm_green.duty_cycle = 65535 # 65535で消灯
pwm_blue.duty_cycle = adc_val
time.sleep(0.1) # 待ち時間
8.本体の初期化方法
「MicroPython」から「CircuitPython」へ開発環境を変えたい時や、動作がおかしくなったりして初期状態に戻したいと思うこともあると思います。
そんな時のために本体を初期化する方法を紹介します。
以下のサイトにアクセスして、本体リセット用のファイルをダウンロードします。
下画像のようなページが表示されるので「UF2 file」をクリックします。
クリックすると「flash_nuke.uf2」というファイルがダウンロードされます。
「XIAO」を「BOOTSEL」ボタンを押しながらパソコンと接続します。
接続が完了すると表示されるフォルダに、このファイルをドラッグ&ドロップするだけで初期化は完了します。
初期化が完了したら、使用したいファームウェアを再インストールしてください。
9.まとめ
「ラズパイPico」互換ボード「Seeed Studio XIAO RP2040」の使い方を詳しく紹介しました。
「XIAO RP2040」には「Raspberry Pi Pico」に搭載されているコントローラ「RP2040」が搭載されているため「Raspberry Pi Pico」と互換性があり、「Pico」より端子数は少ないですが小型で「Pico」で使用できる機能のほとんどを使用することができます。
「XIAO RP2040」を動作させるためには、専用のファームウェアもありますが「Raspberry Pi Pico」のファームウェアでも同じように動作できます。
プログラム言語には「MicroPython」「CircuitPython」「C言語」が使用でき、本体に搭載されたフルカラーLEDの動作確認をするだけでもプログラミング学習の入門にもなるため、初心者にもおすすめのマイコンボードです。
コメント
おお!
お早い展開 ありがとうございます。
そろそろ かと本日(26日)来てみて、
XIAO RP2040ページ気付きました。
後で、ゆっくり、参照させて戴きます、たのしみ!
CircuitPythonの項も有りあり嬉しいです。
(MicroPythonは、パッケージinstall不可のままで
その後、試していないので。)
長尺のページで、お疲れ様でした :)
ここのところ、ずっと
ラズパイの方に行ってました。
よろしくお願い致します。
いらっしゃいませ^^
思いのほか長編となりました^^;
思いつく限りの機能を試してみましたが、ほぼPico同様に動作するので、これで十分ですね♪
OLEDも動作すると思うのですが・・・もし動かなければ探ってみますので教えてください。
ラズパイライフの合間にゆっくり見てくださいな。
こんにちは
お邪魔いたします
先ず、私の仕掛け。
ボードは、XIAO RP2040
ファームウエアは、XIAO RP2040なので
adafruit-circuitpython-seeeduino_xiao_rp2040-ja-8.2.7.uf2
(現在ファームウエアが3本公開されていますが、私はこれです。
adafruitの当該ページからD/L)
使用バンドルは
adafruit-circuitpython-bundle-8.x-mpy-20231025
(ファームウエアのVer.と合わせる様に というアナウンスが有ります)
Thonny(Ver.4.1.3)
シェルに
Adafruit CircuitPython 8.2.7 on 2023-10-19; Seeeduino XIAO RP2040 with rp2040
と表示されます
Python 3.12.0
(もしかしたらpython3.10.xじゃないと、ダメなのかもです)
さて、こちらのページ CircuitPython作例の
二番、三番を追試して見ました。
二番に関しては、私はボードは、XIAO RP2040なので、
red = DigitalInOut(GP17) ; GP17→LED_REDの様に書き替え
green = DigitalInOut(GP16) ; 同様に→LED_GREEN 々
blue = DigitalInOut(LED) ; 々 →LED_BLUE 々
等して、赤→緑→青と タクトスイッチでLedの発光を
替えられました。上手くいきました:)
三番は半日以上、にらめっこしてみましたが・・・
まだ、成功していません。
む~ 欲求不満です :):)
代わりに
adafruit-circuitpython-bundle-8.x-mpy-20231025
に在るサンプル.pyを3本試しました。
neopixel_pixel.py
neopixel_rainbowio_simpletest.py
neopixel_simpletest.py
これらも、pin名を
PIXEL_PIN = board.NEOPIXEL
の様に書き替える等・等して、
Bootボタン/リセットボタンの間のLEDを
点灯、点滅出来ました。
一つのLed内ですが、色に因って発光箇所が僅かに動くので、それ程綺麗という
感じは致しません。全く同じ箇所で色が変わったら綺麗です。
足4本のRGB-LEDの方が綺麗です。
=====
同じボードのコントロールについて
実験しているつもりなのですが・・・・
どうも、セッティングが微妙に違っている様で
簡単に狙い通りに、なりませんね :)
ファームウエアが3本というのも、混乱の原因です?
まぁXIAO版ファームウエアはタイムスタンプがかなり古いので
使用は問題外と思いますが・・・
なお、ページの終盤で
③本体NeoPixelの動作確認(CircuitPython)
の
二行下に
まるあい (info)?で
[ws2812.py]でんでん(誰かさんが言いました=云々=うんぬん)
のご案内が有りますが・・・
CircuitPythonでは、不要と思いますが、いかがでしょうか?
MicroPythonなら要るのでしょうが・・・
こんな小さなボードなんですが、
楽しめますね。
朝から、ずっと、
こうかな? これはどうかな? なんて楽しんでます :)
プログラミング、解らないのですが、
狙い通り動くと L-tika も また、楽しです。
ありがとうございます
失礼しました。
早速のお試しありがとうございます^^
NEOPIXELのところがうまくいかないようなので見直しましたが、ご指摘の通り「info」のところはおかしいですね。
本体を初期化して何度か動作確認して動いていたのですが、ライブラリは残るので気づきませんでした。
「CircuitPython」ではバンドルデータからライブラリをコピーする必要がありました・・・
早速ライブラリを追加する旨を追記しました。
「XIAO」のファームウェアでも動作確認してみました。
「GP12」→「NEOPIXEL」に変更して、「GP11」の指定は不要(逆にNEOPIXEL_POWERを指定するとエラー)なので削除すると動くと思います。
自分で書いて、自分で動作確認していると気付けないことが多いです^^;
ご指摘ありがとうございました。
はい。
私は、MicroPythonに嫌われて、二日間くらい
時間を無駄にしてから、CircuitPythonだけに
触ってきました。と言っても日は全く浅いです:)
情報を探して検索してみると、まだ人口が少ないですね。
情報が古かったり、そっくり「頂戴して」参照元無しで
自分のページに載せているヒトとかも。
便乗値上げのam///nみたいな業者もいます。
気軽に知的玩具を触って見ようとヒトに対抗していますね。
情報を探している人はたくさん居ると思うので、
どんどん情報発信していただき、人口の裾野を
logikaraさんに、どんどん広めていただきたいと思います。:)
このXIAO RP2040は、L-チカだけでも
ボード上にLedを持っているので、PCさえ有れば
すぐ試せます、自分で調べたりもするので
余程、たのしい時間を過ごせます。
ありがとうございます。
いつもコメントありがとうございます^^
作成の励みになります。
MicroPythonの件はPythonのバージョン問題と思いますので、
是非バージョンダウンのご検討をw
XIAO RP2040は確かに情報が少ないですね。最初は苦労しました。
わかってしまえばPico同等に使えて、ツボも押さえてるのでWi-Fi以外はこれで十分です。
ラズパイ系の一般的な使い方はたくさんの方が紹介してますから
その辺はできるだけ避けて、スキマを探して書いてます。
このため、情報収集して、自分で十分理解して、伝えるためのコピペプログラムや
説明文を作成して・・・と、なかなか時間がかかって、最近の更新頻度はイマイチですが
これからも役立つ情報を発信していければと思いますので、また覗きに来てください♪
コンニチハ
③作例はこれで解決です。
③作例
では
PIXEL = neopixel.NeoPixel(NEOPIXEL,1)
# 出力ピン設定
#PIXEL_PWR = DigitalInOut(11)
#PIXEL_PWR.direction = Direction.OUTPUT
#PIXEL_PWR.value = True
の様に、
7行目の変更と
10~12行目全てをコメントアウトすると
このscriptでNEOPIXELが複雑な色合いですが
3色にローテーションで点ります。
ありがとうございます。
スッキリしました。
今朝はPCがフリースして、焦りました。
マザボのボタン電池を交換して、起動出来ました。
PCはhpですが、使い出してから5~6年目かな
ボタン電池とすると「まぁ、持ったかな。」ですが
起動しなかったり、フリーズは
やっぱり、焦ります :)
失礼しました。、