ラズパイPICO互換ボード XIAO RP2040の使い方

XIAO RP2040の使い方アイキャッチ1

ラズパイPICOに使用されているコントローラー「RP2040」を搭載した、Seeed社製の「seeed Studio XIAO RP2040」の使い方を詳しく紹介します。

「XIAO RP2040」を動作させるためには、専用のファームウェアもありますが「Raspberry Pi Pico」のファームウェアでも同じように動作するので、これを使った方法を「MicroPython(初心者向け)」と「Circuit Python」で紹介します。

互換品なので、既存の「Pico」のプログラムをそのまま流用できますが、端子の使い方やコード内での端子名の指定方法等、いくつか注意点があるため、その辺りも詳しく紹介します。

「XIAO RP2040」専用に最適化されたファームウェアは以下のサイトから入手できます。

CircuitPython - Seeed Studio XIAO RP2040 Download
Seeed Studio XIAO RP2040 is a microcontroller using the Raspberry RP2040 chip. It runs at up to 133 MHz, is built with rich interfaces in a tiny thumb size, and...
「RaspberryPi Pico」のファームウェアを使用した方法はメーカー非推奨と思います。
十分に動作確認を行なっておりますが、使い方によっては破損につながる可能性もあるかもしれませんので、自己責任でご使用ください。
スポンサーリンク

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 RP2040の比較
ラズパイPicoとXIAO RP2040の比較

「Pico」と同様に基板上にはブートボタン(XIAO:B/Pico:BOOTSEL)があり、開発環境の準備も「Pico」と同じファームウェアを使うことで同じように準備することができます。


開発環境の準備は以下のリンクで詳しく紹介しています。

ラズパイPicoの使い方 MicroPython&開発環境Thonny、SSLエラーの対処方法も紹介
Raspberry Pi Picoので開発環境Thonnyを使用した「Python(MicroPython)」でのプログラミング方法について初期設定からパッケージ(ライブラリ)の追加、動作確認の方法まで詳しく紹介します。
ラズパイPicoの使い方 CircuitPython&開発環境Thonny
Raspberry Pi PicoでCircuitPythonを使ったプログラミング方法を開発環境Thonnyを使用してインストールからライブラリの追加、サンプルプログラム(コピペ)による動作確認(液晶表示SSD1306を例に)まで詳しく紹介します。
ラズパイPico/Pico WのArduinoIDEインストール方法と初期設定、使い方紹介
Raspberry Pi Pico/Pico WのC言語での開発環境 ArduinoIDEのインストールから初期設定、使い方、Lチカでの動作確認まで詳しく紹介します。
スポンサーリンク

2.外観

外観は下写真のようになります。
「ラズパイPico」のUSBは「micro-B」ですが「XIAO」には「Type-C」が搭載されています。
その他にも「Pico」には無い「電源LED赤」や「フルカラーLED(赤緑青)」「NeoPixel」「リセットボタン:R」が実装されています。
「ブートボタン:B」は「Pico」と同様にファームウェアの書き込み時に使用します。

ラズパイPico互換 XIAO RP2040外観
ラズパイPico互換 XIAO RP2040外観
ラズパイPico互換 XIAO RP2040外観
ラズパイPico互換 XIAO RP2040外観
端子は実装されておらず、付属もしていないため別途購入して半田付けする必要があります。

半田付けは下画像のように、ブレッドボードにピンヘッダーを差し込んでから行うと簡単に半田付けすることができます。

ラズパイPico互換 XIAO RP2040ハンダ付
ラズパイPico互換 XIAO RP2040ハンダ付
ラズパイPico互換 XIAO RP2040ハンダ付
ラズパイPico互換 XIAO RP2040ハンダ付
スポンサーリンク

3.基本仕様

「XIAO RP2040」の基本仕様は以下表のようになります。

ItemValue
コントローラ
CPU
RP2040
Dual-core ARM Cortex M0+ processor up to 133MHz
Flash Memory2MB
SRAM264KB
入出力(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)
USBType-C
電源電圧3.3V/5V DC
外形寸法20×17.5×3.5mm

4.端子配列、機能、各機能の注意点

「XIAO RP2040」の端子配列について「ラズパイPico」との比較や、各機能を使う上での注意点について詳しく紹介します。

・端子配列(Raspberry Pi Picoとの比較)

「XIAO RP2040」の端子は「ラズパイPico」に使用されているコントローラ「RP2040」の端子と直接接続されているものがほとんどのため、基本的には「ラズパイPico」で使用できる機能はそのまま使用できます。

「XIAO RP2040」専用のファームウェアを使用した場合は推奨機能のみの使用となりますが「ラズパイPico」のファームウェアを使用する場合は「Pico」と同じ機能が使用できます。
このため「Pico」の端子配列も確認しておくと色々と応用が効くため、以下で比較して紹介します。

XIAO RP2040 端子配列

「XIAO」の端子配列は下図のようになり、メーカー推奨の機能は一部に限定されています。
全ての機能を使用するには「この下」を参照してください。

XIAO RP2040端子配列

Raspberry Pi Pico 端子配列

「Pico」に対応する端子は下図のようになり「Pico」のファームウェアを使用することで、これらの機能を同じように使用することができます。

ラズパイPicoのXIAO対応端子配列

ラズパイPicoの機能を考慮した XIAO RP2040 端子配列

「Pico」のファームウェアを使用する場合は以下のように「Pico」と同様に多くの機能が使用できます。今回ここで紹介するものは、以下の端子配列を参照するとわかりやすいと思います。
XIAO RP2040ラズパイPico対応端子配列

・端子機能一覧表(Raspberry Pi Picoとの比較)

下表左が「XIAO RP2040」、右が「XIAO」の端子に対応する「ラズパイPico」の端子機能一覧表です。

XIAO RP2040端子機能一覧表

・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点全てが設定可能

「GP〜」は「ラズパイPico」の端子番号です。
「ラズパイPico」の端子機能一覧表を見ると、他にも多くの機能を割り付けて使用できることが確認できます。(ラズパイPicoのファームウェア使用時)
I2Cは2系統が使用可能で、UARTも送信だけなら2系統使用可能です。
※SPI端子も使用できる端子がありますが、1系統には変わりなく、あまり実用的ではないと思うので省略しています。
PWM出力は全てのI/O端子で使用可能ですが、同じPWM番号(スライス)のものはA/Bでペアになっていて、Duty比は個別に設定できますが周波数は同じジェネレーターを使用するため共通になります。

・ファームウェアごとの端子名指定方法の違い

使用する「ファームウェア」や使用する「プログラム言語」によってプログラム内での端子番号の指定方法が異なるので以下にまとめておきます。

ラズパイPicoのファームウェア使用の場合

「Pico」のファームウェアを使用する場合は、使用するプログラム言語が「MicroPython」か「Circuit Python」かで異なります。

先に紹介した端子配列の図から「XIAO」の端子番号「D〜」に対応する「Pico」の端子番号「GP〜」を確認して以下のように指定します。

・MicroPythonの場合:「GP〜」のGPは付けずに「〜」の番号のみで指定
・CircuitPythonの場合:「GP〜」のように「〜」に番号をつけて「GP1」のように指定
その他の端子機能を使う場合、端子ごとに1つの端子でも複数の指定方法があるものがありますが、基本的には使いたい機能に対応した端子を確認して、端子番号で指定すれば使用することができます。

XIAO RP2040のファームウェア使用の場合

「XIAO」のファームウェアを使用する場合は、「D〜」のように「〜」に番号をつけてそのまま指定します。その他の端子機能を使う場合は「SDA」や「TX」のようにそのまま指定することができます。


・本体LED、NeoPixel使用時の注意点

「XIAO RP2040」には下図のように、「本体にフルカラーLED(赤緑青)」と「NeoPixel」が搭載されています。電源LED赤は常時点灯です。

XIAO RP2040 本体LED、NeoPixel詳細

フルカラーLED使用時の注意点

フルカラーLED青 は「ラズパイPico」の本体LED緑「GP25」に相当します。
同様にフルカラーLED赤 は「GP17」、フルカラーLED赤 は「GP16」に相当します。

フルカラーLEDは初期状態では点灯してしまうので、「True」で初期化して消灯しておきます。点灯させる時に指定する「True/False」は「ラズパイPico」と逆になるので注意しましょう。

NeoPixel使用時の注意点

「NeoPixel」とはプログラムで点灯色を制御できるマイコン搭載のフルカラーLEDです。
「XIAO」本体にも1つ搭載されており、ライブラリを使用して簡単に制御できますが、制御用の端子とは別に電源を供給する必要があります。

制御用端子は「ラズパイPico」の「GP12」相当し、電源端子は「GP11」に相当します。
このため「NeoPixel」を使用するときは「GP11」を「True(High)」にしておく必要があります。
※「XIAO RP2040」用のファームウェアを使用する場合は電源端子「GP11(NEOPIXEL _POWER)」の指定は不要(指定するとエラーになる)

プログラム内での端子名の指定方法は、使用するファームウェアが「ラズパイPico」用か「XIAO RP2040」用か、また「MicroPython」か「CircuitPython」かで違うため、フルカラーLEDと合わせて以下表にまとめました。

XIAO RP2040端子番号指定方法
「ラズパイPico」のファームウェアを使用する場合の端子名の指定方法は、同じ端子でも複数存在します。また、プログラムの書き方によっても異なるため、ご自身で使い慣れた方法で指定してください。

・D3(A3[GP29])端子使用時の注意点

「XIAO RP2040」の「D3(A3)」端子は「ラズパイPico」では「VSYS」端子からの入力電源監視用アナログ入力端子「GP29」として使用されているものです。
「Pico」では内部的に使用されているため実用的ではありませんでしたが「XIAO」ではこれもアナログ入力として使用できます。

XIAO RP2040 アナログ端子A3の注意点
「Pico」では汎用的に使用できなかったため「Pico」のファームウェアで「CircuitPython」を使用する場合、端子名に「GP29」と指定すると、クラスのリストに設定が無いためエラーになります。
「Pico」のファームウェアで「CircuitPython」で「GP29(XIAO:D3)」を使用する場合、端子名の指定は入出力や通信端子として使用する場合でも端子名は「A3」と指定しましょう。

5.サンプルプログラム①〜⑦の動作紹介

サンプルプログラム(コピペ)として「MicroPython」と「CircuitPython」の両方で ①〜⑦の7パターン用意しました。それぞれの動作詳細や配線図、使用する部品の詳細は以下のようになります。

①Lチカ

本体LEDの点滅を確認する「Lチカ」プログラムです。

基本的には「ラズパイPico」と同じプログラムでも動作しますが「XIAO」の本体LEDはフルカラーLEDで「ラズパイPico」の本体LED緑に相当するのは「XIAO」のフルカラーLEDの青色になります。
xiao動作確認Lチカ

「XIAO」単体でも動作確認できますが、本体LEDの点滅と同時に出力端子D7(GP1)も「ON/OFF」させているため、LEDを接続すると出力の「ON/OFF」も確認できます。(画像は抵抗内蔵LED)

フルカラーLEDの赤色と緑色は初期状態では点灯してしまうので、「True」で初期化して消灯しておきます。点灯させる時に指定する「True/False」は「ラズパイPico」とは逆になるので注意しましょう。

②本体フルカラーLEDの動作確認

本体に搭載されているフルカラーLED(赤緑青)の動作確認を行います。
外付けのボタンを押すごとに「消灯→赤→緑→青」と点灯を繰り返します。

xiao動作確認フルカラーLED

③本体NeoPixelの動作確認

本体に搭載されている「NeoPixel」の制御方法を確認します。
プログラムを実行すると下図のように1秒ごとに「消灯→黄→水色→紫」と繰り返して点灯し続けます。

xiao動作確認NeoPixel

「NeoPixel」はライブラリ(ws2812.py)を使用することで、赤、緑、青の明るさを指定するだけで簡単に動作確認できます。

「NeoPixel」を制御するためにはライブラリが必要です。
「MicroPython」では、以下サイトから「ws2812.py」をダウンロードして開発環境「Thonny」で開き、「XIAO」本体内の [lib]フォルダ に保存します。
https://wiki.seeedstudio.com/XIAO-RP2040-with-MicroPython/#light-up-rgb-led-on-the-seeed-studio-xiao-rp2040

「CircuitPython」では以下サイトからダウンロードできるBundleデータの中のライブラリ「neopixel.mpy」を、USBで認識されている「XIAO」本体の[lib]フォルダに保存しておく必要があります。
https://circuitpython.org/libraries


④アナログ入力(ADC)

外付けボリュームの電圧をアナログ入力端子で読み取り、開発環境「Thonny」のシリアルモニタに取得したアナログ値と換算した電圧値を表示させて確認します。

xiao動作確認アナログ入力

ボリュームは上図のように「M5Stack社」製の「ANGLE UNIT」を使用しています。
このボリュームで「0〜3.3V」の電圧調整ができます。

xiao動作確認アナログ入力シリアルモニタ表示

プログラムを実行すると「Thonny」のシリアルモニタに取得した値が表示され続けます。

Groveコネクタ付きケーブルは「Seeed社」製と「M5Stack社」製では白色と黄色の配線が逆なため注意しましょう。

ボリュームについては、以下のリンクで詳しく紹介しています。

ボリューム(可変抵抗器)の使い方、つなぎ方、抵抗値計算等を回路図も使って詳しく解説
ボリュームというと音量調節のイメージですが、明るさや回転数等を調整するのにも使用されます。「抵抗(固定抵抗器)」が固定の抵抗値を持つのに対して「可変抵抗器」は抵抗値を調整することができます。このボリューム(可変抵抗器)について紹介します。

⑤OLED SSD1306で画面表示

「OLED」の表示確認は簡単なデータを表示するだけの「基本編」と、ボタンのON/OFF回数のカウントやアナログ入力値を表示する応用編の2つの動作確認を行なっています。

XIAO RP2040配線図OLEDSSD1306

配線図は上図のようになります。
この配線図で「基本編」と「応用編」両方の動作確認ができます。

xiao動作確認 OLED SSD1306 表示1

ミニブレッドボードに全ての部品を載せたため、上画像のように少し複雑ですが、配線図も参照して接続を行なってください。

OLED表示 基本編

基本編では下画像のように単純な文字と図形の表示を確認します。

xiao動作確認 OLED SSD1306 表示基本編

OLEDの表示方法は基本的には「ラズパイPico」と同じです。
表示にはライブラリを使用します。ライブラリのインストール方法は以下のリンクで詳しく紹介しています。

ラズパイPicoでSSD1306有機ELディスプレイの使い方 MicroPython編
液晶表示器のないRaspberry Pi PicoでOLED SSD1306の使い方をMicroPythonのサンプルプログラムで紹介。開発環境はTonnyを使用します。
ラズパイPicoでSSD1306有機ELディスプレイの使い方 CircuitPython編
液晶表示器のないRaspberry Pi Picoで表示器OLED SSD1306を使う方法。今回は開発環境Tonnyを使用したCircuitPythonでの使用方法を紹介します。
Pythonのバージョンによってはライブラリのインストール時にエラーが出るかもしれません、バージョン3.9、3.10で動作確認済みですので、エラーが出る場合はバージョンを変更して動作確認してみてください。
プログラム実行時にエラーが出る場合は、OLEDの接続を確認してください。
OLEDが接続されていなかったり、配線が間違っていると、プログラムが正しくてもエラーが出ます。

OLED表示 応用編

「応用編」では下画像のように、アナログ入力値の表示確認とボタンのON/OFF状態や回数のカウント数確認を行います

xiao動作確認 OLED SSD1306 表示応用編

実行すると上画像のような表示画面になります。

xiao動作確認 OLED SSD1306 表示応用編

ボリュームを操作すると画面下でアナログ入力値と換算電圧が変化することが確認できます

xiao動作確認 OLED SSD1306 表示応用編

ボリュームMAXで上画像のような表示になります。

xiao動作確認 OLED SSD1306 表示応用編

ボタンを押すとボタン状態(BTN)が「ON」になり、カウント数(CNT)の数値が1づつ増加します。


⑥シリアル通信(UART)テスト

「XIAO RP2040」のUART通信は公式には1系統だけですが、「ラズパイPico」のファームウェアを使用すると、送信だけは2系統使えるため、送信したデータ(文字列:Hello)を自分で受信することで、2系統の動作確認を行います。

「XIAO RP2040」では「D6/7(RX/TX)」端子(UART0)が使用できます。
「ラズパイPico」のファームウェアでは送信のみですが「D9(TX1[GP4])」も使用できます。
UART0は「D2/3(GP28/29)」にも割り付けて使用できます。

受信したデータ「文字列:Hello」に「文字列:World!」を追加して送信し、その結果を外付けのシリアルモニタで確認します。

XIAO RP2040配線図シリアル通信

配線図は上図のようになります。

xiao動作確認 シリアル通信

ブレッドボードを使用して、上画像のように接続しています。

外付けのシリアルモニタは「M5Stack Basic」を使用した、自作のシリアルモニタを使用しています。
このシリアルモニタの作り方や使用方法は、以下のリンクで詳しく紹介しています。

M5Stackをシリアルモニターに使用。パソコン不要でデータ確認Atom、Arduinoに便利
マイコンボードのシリアル出力を液晶やパソコンではなく、外付けして単体で確認できるシリアルモニタが欲しかったのでM5Stackで作りました。 ATOMやArduino等のマイコンボードのデータが手軽に確認できて便利と思うので紹介します。

プログラムを実行すると開発環境「Thonny」のシリアルモニタに送信した文字「Hello」が表示されます。

xiao動作確認 シリアル通信シリアルモニタ表示

送信(TX1)した「Hello」を受信(RX0)し、「world!」を追加して送信(TX0)した結果をシリアルモニタで確認すると下画像のようになります。

xiao動作確認 シリアル通信

プログラムを実行するたびに受信した「Hello」に「World!」が加算されて送信されるため、シリアルモニタに「Hello World!」が表示されます。
これで2系統のUARTの送受信ができていることが確認できます。


⑦PWM制御

「PWM」制御の動作を本体のフルカラーLEDの明るさを調整することで確認を行います

PWM制御の周波数は「スライス」というグループで管理されており、同じ「スライス」のペア「A/B」は同じ周波数にする必要があります。
フルカラーLEDの赤と緑は同じ「スライス」のペアのため同じ周波数にする必要があり、青は別のスライスのため、異なる周波数が設定できます。

同じ「スライス」で異なる周波数を設定すると「Micropython」では後で指定した周波数で上書きされ、「Circuitpython」ではエラーになります。

xiao動作確認 PWM制御

赤と緑のLEDでPWM制御の「Duty比」を小さくすると両方とも同じように暗くなります。

xiao動作確認 PWM制御

「Duty比」を大きくすると赤と緑は両方とも明るくなります。

青のLEDは別の「スライス」にあるため、赤緑とは別の周波数が指定でき、青と赤のLEDで動作確認すると下画像のような動作になります。

xiao動作確認 PWM制御

赤の周波数を「10Hz」、青を「1kHz」に設定すると「Duty比」最大時には、赤も青も同じように点灯します。

xiao動作確認 PWM制御

「Duty比」を下げると、青は暗くなり赤は画像ではわかりにくいですが点滅します。
これで赤と青に別の周波数が設定できていることが確認できます。

PWM制御の「周波数」や「Duty比」については以下のリンクで詳しく紹介しています。
(プログラムはC言語になります。)

PWM制御とは?Arduino(ESP32)コマンドで使い方を詳しく紹介
PWM制御の基本動作からArduinoコマンドを使ったプログラミング方法、サンプルプログラムを使用して音(ブザー)と光(LED)で動作確認しながら使い方を詳しく紹介します。

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種類準備しました。

SSD1306で表示を行うにはライブラリをインストールしておく必要があります。
Thonnyの「パーケージ管理」から「ssd1306」で検索して「micropython-ssd1306」をインストールしてください。
※Pythonのバージョンによってはライブラリがインストールできない場合があります。(バージョン3.9、3.10は動作確認済み)
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本体だけで動作確認できます。)

NeoPixcelを制御するには、以下サイトからダウンロードできるBundleデータの中のライブラリ「neopixel.mpy」を、USBで認識されている「XIAO」本体の[lib]フォルダに保存しておく必要があります。
https://circuitpython.org/libraries

ライブラリの追加方法は、以下のリンクで詳しく紹介しています。

ラズパイPicoの使い方 CircuitPython&開発環境Thonny
Raspberry Pi PicoでCircuitPythonを使ったプログラミング方法を開発環境Thonnyを使用してインストールからライブラリの追加、サンプルプログラム(コピペ)による動作確認(液晶表示SSD1306を例に)まで詳しく紹介します。
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」を使用するには以下のサイトからライブラリとフォントデータを本体に保存しておく必要があります。

CircuitPython - Libraries
The easiest way to program microcontrollers

ライブラリのインストール方法は以下のリンクで詳しく紹介しています。

ラズパイPicoの使い方 CircuitPython&開発環境Thonny
Raspberry Pi PicoでCircuitPythonを使ったプログラミング方法を開発環境Thonnyを使用してインストールからライブラリの追加、サンプルプログラム(コピペ)による動作確認(液晶表示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」をクリックします。

ラズパイPicoの初期化方法

クリックすると「flash_nuke.uf2」というファイルがダウンロードされます。

「XIAO」を「BOOTSEL」ボタンを押しながらパソコンと接続します。
接続が完了すると表示されるフォルダに、このファイルをドラッグ&ドロップするだけで初期化は完了します。

初期化が完了したら、使用したいファームウェアを再インストールしてください。

初期化するとラズパイPico本体に保存されたプログラムやライブラリ等のデータが全て消去されます。必要なファイルのバックアップを取ってから行うようにしましょう。

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の動作確認をするだけでもプログラミング学習の入門にもなるため、初心者にもおすすめのマイコンボードです。

コメント

  1. とんかつ より:

    おお!

    お早い展開 ありがとうございます。

    そろそろ かと本日(26日)来てみて、
    XIAO RP2040ページ気付きました。

    後で、ゆっくり、参照させて戴きます、たのしみ!
    CircuitPythonの項も有りあり嬉しいです。
    (MicroPythonは、パッケージinstall不可のままで
    その後、試していないので。)

    長尺のページで、お疲れ様でした :)

    ここのところ、ずっと
    ラズパイの方に行ってました。

    よろしくお願い致します。

    • logikara より:

      いらっしゃいませ^^

      思いのほか長編となりました^^;
      思いつく限りの機能を試してみましたが、ほぼPico同様に動作するので、これで十分ですね♪

      OLEDも動作すると思うのですが・・・もし動かなければ探ってみますので教えてください。
      ラズパイライフの合間にゆっくり見てくださいな。

  2. とんかつ より:

    こんにちは
    お邪魔いたします

    先ず、私の仕掛け。
    ボードは、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 も また、楽しです。

    ありがとうございます

    失礼しました。

    • logikara より:

      早速のお試しありがとうございます^^
      NEOPIXELのところがうまくいかないようなので見直しましたが、ご指摘の通り「info」のところはおかしいですね。

      本体を初期化して何度か動作確認して動いていたのですが、ライブラリは残るので気づきませんでした。
      「CircuitPython」ではバンドルデータからライブラリをコピーする必要がありました・・・
      早速ライブラリを追加する旨を追記しました。

      「XIAO」のファームウェアでも動作確認してみました。
      「GP12」→「NEOPIXEL」に変更して、「GP11」の指定は不要(逆にNEOPIXEL_POWERを指定するとエラー)なので削除すると動くと思います。

      自分で書いて、自分で動作確認していると気付けないことが多いです^^;
      ご指摘ありがとうございました。

      • とんかつ より:

        はい。

        私は、MicroPythonに嫌われて、二日間くらい
        時間を無駄にしてから、CircuitPythonだけに
        触ってきました。と言っても日は全く浅いです:)

        情報を探して検索してみると、まだ人口が少ないですね。
        情報が古かったり、そっくり「頂戴して」参照元無しで
        自分のページに載せているヒトとかも。
        便乗値上げのam///nみたいな業者もいます。
        気軽に知的玩具を触って見ようとヒトに対抗していますね。

        情報を探している人はたくさん居ると思うので、
        どんどん情報発信していただき、人口の裾野を
        logikaraさんに、どんどん広めていただきたいと思います。:)

        このXIAO RP2040は、L-チカだけでも
        ボード上にLedを持っているので、PCさえ有れば
        すぐ試せます、自分で調べたりもするので
        余程、たのしい時間を過ごせます。

        ありがとうございます。

        • logikara より:

          いつもコメントありがとうございます^^
          作成の励みになります。

          MicroPythonの件はPythonのバージョン問題と思いますので、
          是非バージョンダウンのご検討をw

          XIAO RP2040は確かに情報が少ないですね。最初は苦労しました。
          わかってしまえばPico同等に使えて、ツボも押さえてるのでWi-Fi以外はこれで十分です。

          ラズパイ系の一般的な使い方はたくさんの方が紹介してますから
          その辺はできるだけ避けて、スキマを探して書いてます。

          このため、情報収集して、自分で十分理解して、伝えるためのコピペプログラムや
          説明文を作成して・・・と、なかなか時間がかかって、最近の更新頻度はイマイチですが
          これからも役立つ情報を発信していければと思いますので、また覗きに来てください♪

  3. とんかつ より:

    コンニチハ

    ③作例はこれで解決です。

    ③作例
    では

    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年目かな
    ボタン電池とすると「まぁ、持ったかな。」ですが
    起動しなかったり、フリーズは

    やっぱり、焦ります :)

    失礼しました。、

タイトルとURLをコピーしました