ピン多重化 (Arduino)

Seeed Studio XIAO RP2350 は豊富なインターフェースを備えています。PWM ピンとして使用できる19 個のデジタル I/Oと、ADC ピンとして使用できる3 個のアナログ入力があります。UART、I2C、SPI など 4 種類のシリアル通信インターフェースをサポートしています。この Wiki は、これらのインターフェースについて学び、次のプロジェクトで活用するのに役立ちます。
ハードウェア概要
表面

裏面

準備
現在、互換性の問題により XIAO RP2350 のピン使用にいくつかの問題があります。私たちはこの問題を修正し、Raspberry Pi 公式ライブラリもマージされました。現在のバージョンは 4.2.0 で、次のバージョン 4.2.1 で更新が完了する予定です。

それまでの間、Arduino15/packages/rp2040/hardware/rp2040/4.2.0/variants/seeed_xiao_rp2350(Your Arduino Library Address) にあるこのファイルを置き換えてください。ここをクリックしてファイルをダウンロードできます。完了したら、作業を楽しむことができます。

デジタル
ハードウェアの準備
| Seeed Studio XIAO RP2350 | Grove OLED 付き Seeed Studio Expansion Base for XIAO | Grove - LED |
|---|---|---|
![]() | ![]() | ![]() |
XIAO RP2350 を拡張ボードに取り付け、Grove ケーブルを使用して拡張ボードの A0/D0 インターフェースに Grove LED を接続してください。最後に、USB-C ケーブルで XIAO をコンピュータに接続します。
ソフトウェア実装
この例では、XIAO 拡張ボードに接続されたボタンを使用してリレーのオン/オフ状態を制御します。ボタンが押されるとリレーがオンになり、ボタンを離すとリレーがオフになります。
//define which pin you use
int LED_BUILTIN = D0;
// the setup function runs once when you press reset or power the board
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
効果
すべてが問題なく進めば、プログラムを書き込んだ後、次のような動作が確認できるはずです。

デジタルを PWM として使用
XIAO RP2350 のすべての GPIO ピンは PWM 出力をサポートしています。そのため、任意のピンを使用して PWM を出力し、ライトの明るさを調整したり、サーボを制御したり、その他の機能を実現できます。
ハードウェアの準備
| Seeed Studio XIAO RP2350 | Grove OLED 付き Seeed Studio Expansion Base for XIAO | Grove - LED |
|---|---|---|
![]() | ![]() | ![]() |
XIAO RP2350 を拡張ボードに取り付け、Grove ケーブルを使用して拡張ボードの A0/D0 インターフェースに Grove LED を接続してください。最後に、USB-C ケーブルで XIAO をコンピュータに接続します。
ソフトウェア実装
この例では、PWM 出力を使用してライトの明るさを制御する方法を示します。
int LED_pin = D0; // LED connected to digital pin 10
void setup() {
// declaring LED pin as output
pinMode(LED_pin, OUTPUT);
}
void loop() {
// fade in from min to max in increments of 5 points:
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 3) {
// sets the value (range from 0 to 255):
analogWrite(LED_pin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
// fade out from max to min in increments of 5 points:
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 3) {
// sets the value (range from 0 to 255):
analogWrite(LED_pin, fadeValue);
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
}
効果
プログラムが正常に動作すると、次のような動作結果が確認できます。

アナログ
XIAO MG24(Sense) 開発ボードには、アナログセンサー値を高分解能で読み取るための 12 ビット ADC が搭載されており、より正確な値を読み取るのに役立ちます。
次に、ADC の特性を反映するために 2 つのセンサーを選択します。
ハードウェアの準備
| Seeed Studio XIAO RP2350 | Grove OLED 付き Seeed Studio Expansion Base for XIAO | Grove - Loudness Sensor |
|---|---|---|
![]() | ![]() | ![]() |
ソフトウェア実装
int loudness;
void setup()
{
Serial.begin(9600);// initialize Serial
}
void loop()
{
loudness = analogRead(A0);// read analog data from A0 pin
Serial.println(loudness);
delay(200);
}
実行結果
すべてが問題なく進めば、プログラムを書き込んだ後に次のような結果が確認できます。

UART
Arduino IDE を使用する場合、シリアル通信は多くのプロジェクトで不可欠な要素です。Arduino IDE で Serial を使用するには、まずシリアルモニタウィンドウを開く必要があります。これは、ツールバーの Serial Monitor アイコンをクリックするか、ショートカットキー Ctrl+Shift+M を押すことで行えます。
一般的な使い方
よく使用される Serial 関数には次のようなものがあります:
Serial.begin()-- 指定したボーレートで通信を初期化します。Serial.print()-- 読み取り可能な形式でデータをシリアルポートに送信します。Serial.write()-- バイナリデータをシリアルポートに送信します。Serial.available()-- シリアルポートから読み取ることができるデータがあるかどうかを確認します。Serial.read()-- シリアルポートから 1 バイトのデータを読み取ります。Serial.flush()-- 送信中のシリアルデータの送信が完了するまで待機します。
これらの Serial 関数を使用することで、Arduino ボードとコンピュータの間でデータを送受信でき、インタラクティブなプロジェクトを作成するための多くの可能性が広がります。
以下はサンプルプログラムです:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
void loop() {
// send data to the serial port
Serial.println("Hello World!");
// read data from the serial port
if (Serial.available() > 0) {
// read the incoming byte:
char incomingByte = Serial.read();
// print the incoming byte to the serial monitor:
Serial.print("I received: ");
Serial.println(incomingByte);
}
// wait for a second before repeating the loop
delay(1000);
}
実行結果
すべてが問題なく進めば、プログラムを書き込んだ後に次のような結果が確認できます。

Serial1 の使用方法
上記の XIAO RP2350 のピン配置図に基づいて各パラメータを確認すると、TX と RX ピン(D6、D7)があることが分かります。 使い方も非常によく似ていますが、データを取得するためには シリアルポートモニタリングツール を使用して D6、D7 ピンを監視する必要があります。 そこで次に、D6、D7 ピンを使用して serial1 を利用してみます。
通常、デバイスとコンピュータ間の通信には Serial を使用し、プログラム内で何が起きているかを把握します。
それを踏まえて、このデバイスを別のデバイスとの通信に使いたい場合があります。そのような場合には Serial1 を使用します。
void setup() {
Serial1.begin(115200);
}
void loop() {
if(Serial1.available() > 0)
{
char incominByte = Serial1.read();
Serial1.print("I received : ");
Serial1.println(incominByte);
}
delay(1000);
}
実行結果
すべてが問題なく進めば、プログラムを書き込んだ後に次のような結果が確認できます。

I2C
XIAO RP2350 には I2C インターフェースが搭載されており、多くのセンサーのデータ送信や解析、さらには一部の OLED 画面の使用にも利用できます。
ハードウェア準備
| Seeed Studio XIAO RP2350 | Seeed Studio Expansion Base for XIAO with Grove OLED | Grove - DHT20 Temperature and Humidity Sensor |
|---|---|---|
![]() | ![]() | ![]() |
DHT20 センサーは I2C プロトコルを使用しているため、XIAO Expansion Board 上の I2C ポートを使用してセンサーデータを取得できます。

ソフトウェア実装
この例では、Seeed Studio Expansion Base for XIAO RP2350 を介して DHT20 センサーデータを取得する方法を紹介します。
ステップ 1. Seeed Studio XIAO RP2350 を Expansion Board に取り付け、Type-C ケーブルを接続します。
ステップ 2. Grove Temperature And Humidity Sensor ライブラリをインストールします。
ステップ 3. Arduino にライブラリを追加します。

ステップ 4. ダウンロードしたライブラリから DHTtester デモを開きます。

今回は DHT20 を使用するため、次のコードのように DHT20 用のコードのコメントを解除する必要があります。
// Example testing sketch for various DHT humidity/temperature sensors
// Written by ladyada, public domain
#include "Grove_Temperature_And_Humidity_Sensor.h"
// Uncomment whatever type you're using!
//#define DHTTYPE DHT11 // DHT 11
// #define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
//#define DHTTYPE DHT10 // DHT 10
#define DHTTYPE DHT20 // DHT 20
/*Notice: The DHT10 and DHT20 is different from other DHT* sensor ,it uses i2c interface rather than one wire*/
/*So it doesn't require a pin.*/
// #define DHTPIN 2 // what pin we're connected to(DHT10 and DHT20 don't need define it)
// DHT dht(DHTPIN, DHTTYPE); // DHT11 DHT21 DHT22
DHT dht(DHTTYPE); // DHT10 DHT20 don't need to define Pin
// Connect pin 1 (on the left) of the sensor to +5V
// Connect pin 2 of the sensor to whatever your DHTPIN is
// Connect pin 4 (on the right) of the sensor to GROUND
// Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor
#if defined(ARDUINO_ARCH_AVR)
#define debug Serial
#elif defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_SAM)
#define debug SerialUSB
#else
#define debug Serial
#endif
void setup() {
debug.begin(115200);
debug.println("DHTxx test!");
Wire.begin();
/*if using WIO link,must pull up the power pin.*/
// pinMode(PIN_GROVE_POWER, OUTPUT);
// digitalWrite(PIN_GROVE_POWER, 1);
dht.begin();
}
void loop() {
float temp_hum_val[2] = {0};
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
if (!dht.readTempAndHumidity(temp_hum_val)) {
debug.print("Humidity: ");
debug.print(temp_hum_val[0]);
debug.print(" %\t");
debug.print("Temperature: ");
debug.print(temp_hum_val[1]);
debug.println(" *C");
} else {
debug.println("Failed to get temprature and humidity value.");
}
delay(1500);
}
効果
すべてが順調に進めば、プログラムを書き込んだ後に次のような動作が確認できるはずです。

SPI
XIAO RP2350 チップには複数のペリフェラルが統合されており、その中には SPI インターフェースも含まれます。これを使用して、フラッシュメモリ、ディスプレイ、センサなどの外部 SPI デバイスを接続できます。XIAO RP2350 は高速 SPI 転送モードもサポートしており、最大 80 MHz の SPI 転送レートを実現できます。これにより、ほとんどの SPI デバイスのデータ転送ニーズを満たすことができます。
ハードウェアの準備
| Seeed Studio XIAO RP2350 | Grove - OLED Display 1.12 (SH1107) V3.0 - SPI/IIC |
|---|---|
![]() | ![]() |
上記のようにハードウェアを準備したら、ジャンパワイヤを使用して XIAO と OLED の SPI インターフェースを接続します。配線は次の表を参照してください。
| XIAO RP2350 | OLED Display |
|---|---|
| D8 | SCL |
| D10 | SI |
| D5 | RES |
| D4 | D/C |
| D7 | CS |
| VCC(VBUS) | 5V |
| GND | GND |
ソフトウェア実装
次に、以下のプログラムを例として、SPI インターフェースを使用して OLED 画面表示を制御する方法を紹介します。
u8g2 ライブラリをインストールします。
#include <Arduino.h>
#include <U8g2lib.h>
#include <SPI.h>
#include <Wire.h>
U8G2_SH1107_128X128_1_4W_HW_SPI u8g2(U8G2_R3, /* cs=*/ D7, /* dc=*/ D4, /* reset=*/ D5);
void setup(void) {
u8g2.begin();
}
void loop(void) {
u8g2.firstPage();
do {
u8g2.setFont(u8g2_font_luBIS08_tf);
u8g2.drawStr(0,24,"Hello Seeed!");
} while ( u8g2.nextPage() );
}
setup() 関数では、チップセレクト(cs)、データ/コマンド(dc)、リセットに使用するピンを指定する適切なコンストラクタ引数で U8G2_SH1107_128X128_1_4W_HW_SPI クラスをインスタンス化します。その後、u8g2.begin() 関数を呼び出してディスプレイを初期化します。
loop() 関数では、u8g2.firstPage()、u8g2.setFont()、u8g2.drawStr() 関数を使用して、新しいコンテンツでディスプレイを更新します。u8g2.firstPage() 関数は書き込み用にディスプレイバッファを設定し、u8g2.nextPage() が更新された内容を表示します。do-while ループにより、プログラムが停止するまでコンテンツが継続的に表示されることが保証されます。
全体として、このコードは U8g2 ライブラリを使用して OLED ディスプレイを制御し、その上にテキストを表示する方法を示しています。

まとめ
ここまでで、XIAO RP2350 のピンの基本的な機能を学びました。さあ、これを使って楽しんでみましょう〜

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






_V3.0/img/10402050_Main-02.png)