Skip to main content

ピンマルチプレクシング (Arduino)

note

この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues

ピンマルチプレクシング (Arduino)

Seeed Studio XIAO RP2350 は豊富なインターフェースを備えています。19個のデジタルI/OPWMピンとして使用でき、3つのアナログ入力ADCピンとして使用できます。また、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(Arduinoライブラリのアドレス)に移動し、こちらをクリックしてファイルをダウンロードしてください。完了後、作業を楽しむことができます!

デジタル

ハードウェア準備

Seeed Studio XIAO RP2350Seeed Studio XIAO 用拡張ベース(Grove OLED付き)Grove - LED

XIAO RP2350 を拡張ボードに取り付け、Groveケーブルを使用して拡張ボードのA0/D0インターフェースにGrove LEDを接続してください。最後に、USB-Cケーブルを使用してXIAOをコンピュータに接続します。

ソフトウェア実装

この例では、XIAO拡張ボードに接続されたボタンを使用してリレーのオン/オフ状態を制御します。ボタンが押されるとリレーがオンになり、ボタンが離されるとリレーがオフになります。

// 使用するピンを定義
int LED_BUILTIN = D0;
// setup関数はリセットを押すかボードに電源を入れたときに1回実行されます
void setup() {
// デジタルピンLED_BUILTINを出力として初期化
pinMode(LED_BUILTIN, OUTPUT);
}

// loop関数は永遠に繰り返し実行されます
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // LEDをオンにする (HIGHは電圧レベル)
delay(1000); // 1秒待機
digitalWrite(LED_BUILTIN, LOW); // 電圧をLOWにしてLEDをオフにする
delay(1000); // 1秒待機
}

効果

すべてが順調に進めば、プログラムをアップロードした後、以下のような効果が確認できるはずです。

デジタルをPWMとして使用

XIAO RP2350のすべてのGPIOピンはPWM出力をサポートしています。そのため、任意のピンを使用してPWMを出力し、ライトの明るさを調整したり、サーボを制御したり、その他の機能を実現することができます。

ハードウェア準備

Seeed Studio XIAO RP2350Seeed Studio XIAO用拡張ベース(Grove OLED付き)Grove - LED

XIAO RP2350を拡張ボードに取り付け、Groveケーブルを使用してGrove LEDを拡張ボードのA0/D0インターフェースに接続してください。最後に、USB-Cケーブルを使用してXIAOをコンピュータに接続します。

ソフトウェア実装

この例では、PWM出力を使用してライトの明るさを制御する方法を示します。

int LED_pin = D0;    // デジタルピン10に接続されたLED

void setup() {
// LEDピンを出力として宣言
pinMode(LED_pin, OUTPUT);
}

void loop() {
// 最小値から最大値まで5ポイントずつ増加してフェードイン
for (int fadeValue = 0 ; fadeValue <= 255; fadeValue += 3) {
// 値を設定(範囲は0から255)
analogWrite(LED_pin, fadeValue);
// 30ミリ秒待機して減光効果を確認
delay(30);
}

// 最大値から最小値まで5ポイントずつ減少してフェードアウト
for (int fadeValue = 255 ; fadeValue >= 0; fadeValue -= 3) {
// 値を設定(範囲は0から255)
analogWrite(LED_pin, fadeValue);
// 30ミリ秒待機して減光効果を確認
delay(30);
}
}

効果

プログラムが正常に実行されると、以下のような動作効果が確認できます。

アナログ

XIAO MG24(Sense) 開発ボードには12ビットのADCが搭載されており、アナログセンサーの値を高解像度で読み取ることができます。これにより、より正確な値を取得することが可能です。

次に、ADCの特性を反映するために2つのセンサーを選択します。

ハードウェア準備

Seeed Studio XIAO RP2350Seeed Studio XIAO用拡張ベース(Grove OLED付き)Grove - ラウドネスセンサー

ソフトウェア実装

int loudness;

void setup()
{
Serial.begin(9600);// シリアル通信を初期化
}

void loop()
{
loudness = analogRead(A0);// A0ピンからアナログデータを読み取る
Serial.println(loudness);
delay(200);
}

効果

すべてが順調に進めば、プログラムをアップロードした後、以下のような効果が確認できるはずです。

UART

Arduino IDEを使用する際、シリアル通信は多くのプロジェクトにおいて重要な部分です。
Arduino IDEでシリアル通信を使用するには、まずシリアルモニターウィンドウを開く必要があります。これは、ツールバーのシリアルモニターアイコンをクリックするか、Ctrl+Shift+Mのショートカットキーを押すことで行えます。

一般的な使用法

よく使用されるシリアル関数には以下のものがあります:

  • Serial.begin() -- 指定したボーレートで通信を初期化します。
  • Serial.print() -- シリアルポートにデータを読みやすい形式で送信します。
  • Serial.write() -- シリアルポートにバイナリデータを送信します。
  • Serial.available() -- シリアルポートから読み取れるデータがあるかどうかを確認します。
  • Serial.read() -- シリアルポートから1バイトのデータを読み取ります。
  • Serial.flush() -- 送信中のシリアルデータの送信が完了するまで待機します。

これらのシリアル関数を使用することで、Arduinoボードとコンピュータ間でデータを送受信でき、インタラクティブなプロジェクトを作成する可能性が広がります。

以下はサンプルプログラムです:

void setup() {
// シリアル通信を9600ビット/秒で初期化
Serial.begin(9600);
}

void loop() {
// シリアルポートにデータを送信
Serial.println("Hello World!");

// シリアルポートからデータを読み取る
if (Serial.available() > 0) {
// 受信したバイトを読み取る
char incomingByte = Serial.read();
// 受信したバイトをシリアルモニターに表示
Serial.print("I received: ");
Serial.println(incomingByte);
}

// ループを繰り返す前に1秒待機
delay(1000);
}

効果

すべてが順調に進めば、プログラムをアップロードした後、以下のような効果が確認できるはずです。

Serial1の使用方法

上記のXIAO RP2350のピン図に基づいて、特定のパラメータを確認すると、TXとRXピン(D6, D7)があることがわかります。
使用方法は非常に似ていますが、D6, D7ピンを監視するためにシリアルポートモニタリングツールを使用する必要があります。
次に、D6, D7ピンを使用してSerial1を使用します。

tip

通常、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 RP2350Seeed Studio XIAO 用拡張ベース(Grove OLED付き)Grove - DHT20 温湿度センサー

DHT20 センサーは I2C プロトコルを使用しているため、XIAO 拡張ボードの I2C ポートを使用してセンサーデータを取得できます。

ソフトウェア実装

この例では、Seeed Studio XIAO RP2350 用拡張ベースを使用して DHT20 センサーのデータを取得する方法を紹介します。

ステップ 1. Seeed Studio XIAO RP2350 を拡張ボードに取り付け、Type-C ケーブルを接続します。

ステップ 2. Grove Temperature And Humidity Sensor ライブラリをインストールします。

ステップ 3. ライブラリを Arduino に追加します。

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

DHT20 を使用するため、以下のコードのように DHT20 のコードをアンコメントする必要があります。

// 各種 DHT 湿度/温度センサーのテスト用スケッチ
// 作成者: ladyada, パブリックドメイン

#include "Grove_Temperature_And_Humidity_Sensor.h"

// 使用するセンサーのタイプをアンコメントしてください!
//#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

/*注意: DHT10 と DHT20 は他の DHT* センサーと異なり、I2C インターフェースを使用します(ワイヤー1本ではありません)*/
/*したがって、ピンを定義する必要はありません。*/
// #define DHTPIN 2 // 接続するピン(DHT10 と DHT20 は定義不要)
// DHT dht(DHTPIN, DHTTYPE); // DHT11 DHT21 DHT22
DHT dht(DHTTYPE); // DHT10 DHT20 はピンを定義不要

// センサーのピン1(左側)を +5V に接続
// センサーのピン2を DHTPIN に接続
// センサーのピン4(右側)を GROUND に接続
// ピン2(データ)からピン1(電源)に 10K 抵抗を接続

#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 テスト開始!");
Wire.begin();

/*WIO link を使用する場合、電源ピンをプルアップする必要があります。*/
// pinMode(PIN_GROVE_POWER, OUTPUT);
// digitalWrite(PIN_GROVE_POWER, 1);

dht.begin();
}

void loop() {
float temp_hum_val[2] = {0};
// 温度または湿度の読み取りには約 250 ミリ秒かかります!
// センサーの読み取り値は最大 2 秒前の値である可能性があります(非常に遅いセンサーです)

if (!dht.readTempAndHumidity(temp_hum_val)) {
debug.print("湿度: ");
debug.print(temp_hum_val[0]);
debug.print(" %\t");
debug.print("温度: ");
debug.print(temp_hum_val[1]);
debug.println(" *C");
} else {
debug.println("温度と湿度の値を取得できませんでした。");
}

delay(1500);
}

効果

すべてが順調に進めば、プログラムをアップロードした後、以下のような効果が確認できるはずです。

SPI

XIAO RP2350 チップは複数の周辺機器を統合しており、その中には外部SPIデバイス(フラッシュメモリ、ディスプレイ、センサーなど)を接続するためのSPIインターフェースが含まれています。XIAO RP2350は高速SPI転送モードもサポートしており、最大80 MHzのSPI転送速度を実現できます。これにより、ほとんどのSPIデバイスのデータ転送ニーズを満たすことができます。

ハードウェア準備

Seeed Studio XIAO RP2350Grove - OLED Display 1.12 (SH1107) V3.0 - SPI/IIC

上記のハードウェアを準備した後、ジャンパーワイヤーを使用してXIAOとOLEDのSPIインターフェースを接続します。以下の表を参考に配線してください。

XIAO RP2350OLED Display
D8SCL
D10SI
D5RES
D4D/C
D7CS
VCC(VBUS)5V
GNDGND

ソフトウェア実装

次に、以下のプログラムを例として、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()関数では、U8G2_SH1107_128X128_1_4W_HW_SPIクラスが適切なコンストラクタ引数を使用してインスタンス化されます。この引数は、チップセレクト(cs)、データ/コマンド(dc)、リセットに使用されるピンを指定します。その後、u8g2.begin()関数を呼び出してディスプレイを初期化します。

loop()関数では、u8g2.firstPage()u8g2.setFont()u8g2.drawStr()関数を使用して新しいコンテンツでディスプレイを更新します。u8g2.firstPage()関数は書き込み用のディスプレイバッファを設定し、u8g2.nextPage()関数は更新されたコンテンツを表示します。このdo-whileループは、プログラムが停止するまでコンテンツが継続的に表示されることを保証します。

全体として、このコードはU8g2ライブラリを使用してOLEDディスプレイを制御し、テキストを表示する方法を示しています。

仕上げ

XIAO RP2350 ピンの基本的な機能について学びましたね。さあ、これを使って楽しみましょう!

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

私たちの製品を選んでいただきありがとうございます!製品の使用体験がスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、いくつかのコミュニケーションチャネルをご用意しています。

Loading Comments...