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 パスター
キャステレーテッドホール:
仕様
仕様 | |
---|---|
CPU | ARM Cortex-M0+ CPU(SAMD21G18) 最大48MHzで動作(32.768 kHzから逓倍) |
ストレージ | 256KB Flash、32KB SRAM |
I/O PINs | 14 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に追加する方法について学習してください。
Seeed Studio XIAO SAMD21にはリセットボタンがありません。代わりに、リセットパッドがあります。 このリセットパッドをショート接続し、GNDを適用してボードをリセットします。
ブートローダーモード
時々プログラムがクラッシュしたり、スケッチをアップロードできない場合があります。ボードを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);
}
インターフェース
USB CDC経由のシリアル通信
ATmegaタイプのArduinoとは異なり、Seeed Studio XIAO SAMD21のシリアル通信の実際の状態はUSB CDCです。つまり、通常のシリアル通信よりも高速に実行できます。
したがって、Serial.begin(speed)
でボーレートを指定することは意味がありませんが、それ以外は通常のシリアルとして使用できます。
速度測定
このスケッチを使用して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ピンと同じです。もちろん、他のピンを指定することもできます。
#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の接続の詳細な手順についてはこちらを確認してください。
#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シリアル間のブリッジとしての役割を果たします。
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情報を閲覧します。座標を簡単に測定できます。
その他
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 }
DigitalWrite | Registers | Single Cycle IOBUS | |
---|---|---|---|
波形 | |||
周波数 | 333 kHz | 6 MHz | 24 MHz |
パルス生成に必要なクロックサイクル数 | 144 | 8 | 2 |
ロジックは確実に1サイクル(48MHz)で反転できます。
技術サポート & 製品ディスカッション
私たちの製品をお選びいただき、ありがとうございます!私たちは、お客様の製品体験が可能な限りスムーズになるよう、さまざまなサポートを提供しています。異なる好みやニーズに対応するため、複数のコミュニケーションチャネルを用意しています。