Skip to main content

Seeed Studio XIAO SAMD21 Get Started By Nanase

これは @nanase_coder によって書かれた文書です。(元の日本語文書からSeeedが翻訳:コインサイズ Arduino互換機 Seeed Studio XIAO SAMD21 を使ってみた)。Nanaseさん、この情報を共有していただき、ありがとうございます!

ドキュメント

Seeeduino XIAO の使用方法に関する2つのドキュメントがあり、それぞれ異なる分野に焦点を当てています。参考として以下の表をご確認ください:

SeeedによるドキュメントNanaseによるドキュメント
ピン配置図インターフェース
Seeed Studio XIAO SAMD21 はじめにSeeed Studio XIAO SAMD21 with MicroSDカード(SPI)
Seeed Studio XIAO SAMD21 GPIO 使用方法Seeed Studio XIAO SAMD21 with GPS(UART)
Seeed Studio XIAO SAMD21 リソースSingle Cycle IOBUS

機能

  • ARM Cortex M0 + CPU (SAMD21G18) 48MHz
  • 256 KB Flash、32 KB SRAM
  • USB Type-C
  • SPI、I2C、UART、DMA利用可能
  • コインサイズ(21mm x 17.8mm)
  • ロジックレベル:3.3V

基板の裏面には部品がなく、すべてのピンにキャステレーテッドホールがあるため、他の基板への半田付けが簡単です。

パーツリスト

  • 1 x Seeeduino XIAO
  • 2 x 7ピンヘッダー
  • 4 x パスター

pir

キャステレーテッドホール:

pir

仕様

仕様
CPUARM Cortex-M0+ CPU(SAMD21G18) 最大48MHzで動作(32.768 kHzから逓倍)
ストレージ256KB Flash、32KB SRAM
I/O PINs14 GPIO PINs、11アナログピン、11デジタルピン、1 DAC出力ピン
ピン機能SPI、I2C、UART、PWM、外部割り込み、SWD(パワーパッド)
ロジックレベル3.3V
LED:1ユーザーLED、1電源LED、シリアルポートダウンロード用2つのLED
電源USB Type-Cインターフェース、背面の電源パッド
サイズ21x17.8x3.5mm

ご覧の通り、これはSAMDタイプのArduinoであり、Arduino MKRシリーズに似ているため、技術的には、それらのために書かれたライブラリはSeeed Studio XIAO SAMD21で使用できます。一方で、Arduino UnoのようなATmegaタイプのArduinoとは異なるため、ATmegaの特定のレジスタに依存するライブラリは使用できません。

GPIO 14ピンは、側面の11ピン、リセットピン、および背面のSWD(SWDIO、SWCLK)を指します。

ピン機能のUARTは、USB経由のシリアルとは異なり、Serial1で操作できます。

ボードのリセット

こちらを確認し、Seeed Studio XIAO SAMD21をArduino IDEに追加する方法について学習してください。

pir

Seeed Studio XIAO SAMD21にはリセットボタンがありません。代わりに、リセットパッドがあります。 このリセットパッドをショート接続し、GNDを適用してボードをリセットします。

ブートローダーモード

pir

時々プログラムがクラッシュしたり、スケッチをアップロードできない場合があります。ボードを2回リセットしてブートローダーモードに入ることができます。このモードでは、LEDがゆっくりと点滅し、Seeed Studio XIAO SAMD21はUSBメモリデバイスとして認識されます。シリアルポートは通常モードから分離され、ボード上の以前のプログラムを実行することなく、常にスケッチ書き込みモードになります。

ブートローダーモードから通常モードに戻るには、スケッチをアップロードするか、再度素早く2回リセットします。

Seeed Studio XIAO SAMD21がPCによってUSBデバイスとして認識されていない時にブートローダーモードに入ると、LEDが急速に点滅します。

LCD

元のArduinoと同様に、サンプルスケッチからBasics> Blinkを選択してアップロードします。

void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}

元のArduinoとは逆に、LOWでオンになり、HIGHでオフになります。

2つの点滅可能な内蔵LED

公式ウェブサイトでは、他の2つの内蔵LEDをシリアルポートダウンロード用の2つのLEDとして説明しています。しかし、回路図を見ると、これらのRXとTX LEDに接続された物理的なピンはありません。

USBCore.cppを見ると、シリアルUSB送信/受信が発生するたびにdigitalWriteによってオンになることがわかります。これは、この2つのLEDがプログラム可能であることを意味します。

uint32_t USBDeviceClass::recv(uint32_t ep, void *_data, uint32_t len)
{
if (!_usbConfiguration)
return -1;

#ifdef PIN_LED_RXL
if (rxLEDPulse == 0)
digitalWrite(PIN_LED_RXL, LOW);

rxLEDPulse = TX_RX_LED_PULSE_MS;
#endif

具体的なピン番号は、SAMD Arduinoのようにvariant.h / variant.cppで定義されており、Seeeduino XIAOの場合は以下のように11と12に割り当てられています。

#define PIN_LED_13  (13u)
#define PIN_LED PIN_LED_13
#define LED_BUILTIN PIN_LED

#define PIN_LED_RXL (12u)
#define PIN_LED_TXL (11u)
#define PIN_LED2 PIN_LED_RXL
#define PIN_LED3 PIN_LED_TXL

以下は3つのLEDを点滅させるスケッチです。RXとTXのLEDは青色です。

void setup() {
pinMode(LED_BUILTIN, OUTPUT);
pinMode(PIN_LED2, OUTPUT);
pinMode(PIN_LED3, OUTPUT);
}

void loop() {
digitalWrite(LED_BUILTIN, HIGH);
digitalWrite(PIN_LED2, HIGH);
digitalWrite(PIN_LED3, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
digitalWrite(PIN_LED2, LOW);
digitalWrite(PIN_LED3, LOW);
delay(1000);
}

pir

インターフェース

USB CDC経由のシリアル通信

ATmegaタイプのArduinoとは異なり、Seeed Studio XIAO SAMD21のシリアル通信の実際の状態はUSB CDCです。つまり、通常のシリアル通信よりも高速に実行できます。

したがって、Serial.begin(speed)でボーレートを指定することは意味がありませんが、それ以外は通常のシリアルとして使用できます。

速度測定

pir

このスケッチを使用してSeeed Studio XIAO SAMD21からPCへの転送速度を測定しました。PCからSeeed Studio XIAO SAMD21への転送速度も同じはずです。

横軸はバッファサイズ(Serial.write(buf, len)を使用して一度に送信)です。 1バイトずつ送信すると0.11 Mbps(14.53 KB/s)しか得られませんが、64バイト送信すると6.30 Mbps(805.86 KB/s)と大幅に高速になります。内部バッファのサイズが64バイトであることが推測できます。

上記のように、シリアル通信でLEDが点滅しますが、これによる速度低下はほとんどありませんでした。

SPI(MicroSDカード)

Seeed Studio XIAO SAMD21のロジックレベルは3.3Vです。つまり、レベルシフターなしでSPI経由でmicroSDカードを扱うことができます。 SPIの一部機能はATmegaタイプのArduinoとは異なります。詳細についてはこちらをご確認ください。

ここでは秋月電子のmicro SDカードスロットDIPキットを使用してmicroSDカードを読み取ります。

ここではArduinoのサンプルコードを使用しますが、SD.begin(cs_pin)のパラメータはSSとして指定されています。variant.hによると、SS = 4で、これはD4 / A4 / SDAピンと同じです。もちろん、他のピンを指定することもできます。

pir

pir

#include <SPI.h>
#include <SD.h>

File myFile;

void setup() {
Serial.begin(9600);
while (!Serial) ;

Serial.print("Initializing SD card... ");

if (!SD.begin(SS)) { // <-------------------------------- SS = D4/A4/SDA pin
Serial.println("initialization failed!");
while (1) ;
}
Serial.println("initialization done.");

myFile = SD.open("test.txt", FILE_WRITE);

if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");

myFile.close();
Serial.println("done.");
}
else
Serial.println("error opening test.txt");

myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");

while (myFile.available())
Serial.write(myFile.read());

myFile.close();
}
else
Serial.println("error opening test.txt");
}

void loop() { }

結果:

Initializing SD card...initialization done.
Writing to test.txt...done.
test.txt:
testing 1, 2, 3.

I2C

I2Cも利用可能です。3.3Vデバイスはレベルシフターなしで直接接続できます。

今回は、BME280を使用して温度と湿度、大気圧を測定しました。BME280は3.3Vで動作するため、レベルシフターなしで接続できます。ArduinoとBME280の接続の詳細な手順についてはこちらを確認してください。

pir

pir

#include <Wire.h>
#include "SparkFunBME280.h"

BME280 sensor;

void setup() {
Serial.begin(9600);
Wire.begin();
sensor.beginI2C(); // Wire を用いて I2C 接続開始
}

void loop() {
Serial.print("Temp: ");
Serial.print(sensor.readTempC(), 2);

Serial.print(" °C, Humidity: ");
Serial.print(sensor.readFloatHumidity(), 2);

Serial.print(" %, Pressure: ");
Serial.print(sensor.readFloatPressure() / 100.0, 1);
Serial.println(" hPa");

delay(5000);
}

結果:

Temp: 22.05 °C, Humidity: 44.99 %, Pressure: 1009.0 hPa
Temp: 22.05 °C, Humidity: 44.72 %, Pressure: 1008.9 hPa
Temp: 22.06 °C, Humidity: 44.81 %, Pressure: 1008.9 hPa

UART

前述のように、物理的なUARTピンはUSB CDCのピンとは異なります。Serial1はTXピンとRXピンを使用したシリアル通信に使用されます。

今回は、Seeed Studio XIAO SAMD21をGPS受信機キットに接続し、PCからNMEA情報を取得します。Xiaoを使用すると非常に簡単な作業で、GPSキットとPCシリアル間のブリッジとしての役割を果たします。

pir

pir

void setup() {
Serial.begin(9600);
Serial1.begin(9600);
}

void loop() {
if (Serial.available()) {
char c = (char)Serial.read();
Serial1.write(c);
}

if (Serial1.available()) {
char c = (char)Serial1.read();
Serial.write(c);
}
}

今回はGPSFoxを使用してNMEA情報を閲覧します。座標を簡単に測定できます。

pir

その他

DMA

SAMD型Arduinoの機能の一つとして、XiaoでDMAを使用できます。DMAの詳細についてはこちらを確認してください。

Single Cycle IOBUS

Cortex M0+にはSingle Cycle IOBUSという機能があり、GPIO出力を1クロックサイクルで操作できます。特定のレジスタに書き込むことで、論理を反転させたり、ピンを無効にしたり、ピンの駆動電流を変更したりできます。

DigitalWrite

digitalWriteを使用してパルスを作成できます。これはどのArduinoボードでも動作する方法ですが、オーバーヘッドを繰り返すだけです。

void setup() {
pinMode(PIN_A7, OUTPUT);
}

#define P \
digitalWrite(PIN_A7, HIGH); \
digitalWrite(PIN_A7, LOW);

#define W P P P P P P P P P P P P P P P P
void loop() { W W W W W W W W W W W W W W W W }

レジスタを使用する

digitalWriteを使用せずに、レジスタを直接操作してパルスを作成することもできます。

void setup() {
pinMode(PIN_A7, OUTPUT);
}

#define P \
digitalPinToPort(PIN_A7)->OUTSET.reg = digitalPinToBitMask(PIN_A7); \
digitalPinToPort(PIN_A7)->OUTCLR.reg = digitalPinToBitMask(PIN_A7);

#define W P P P P P P P P P P P P P P P P
void loop() { W W W W W W W W W W W W W W W W }

Use Single Cycle IOBUS

We use IOBUS.h introduced here.

#include "IOBUS.h"

#define digitalPinToIOPin(P) ((g_APinDescription[P].ulPort << 5) + g_APinDescription[P].ulPin)
#define PIN_NUM digitalPinToIOPin(PIN_A7)

void setup() {
IOBUS::pinMode(PIN_NUM, OUTPUT, true);
}

#define P IOBUS::toggleOutput(PIN_NUM);

#define W P P P P P P P P P P P P P P P P
void loop() { W W W W W W W W W W W W W W W W }
DigitalWriteRegistersSingle Cycle IOBUS
波形

pir

pir

pir

周波数333 kHz6 MHz24 MHz
パルス生成に必要なクロックサイクル数14482

ロジックは確実に1サイクル(48MHz)で反転できます。

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

私たちの製品をお選びいただき、ありがとうございます!私たちは、お客様の製品体験が可能な限りスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、複数のコミュニケーションチャネルを用意しています。

Loading Comments...