Arduino環境でSeeedStudio XIAO SAMD21を使ってみる

コンピュータ、組み込み

少し古いマイコンですが、SeeedStudioのXIAOを紹介します。
最近のマイコン基板に比べると見落としもしますが、小さいのにArduino環境でできる一通りの機能を搭載している優れものです。
マイコンやArduino入門としては最も学びやすいマイコン基板の一つです。

紹介するもの

SeeedStudio XIAO

特徴
接続Type C
CPUArm Cortex-M0+ 32ビット 48 MHz
ROMフラッシュメモリ 256KByte
SRAM32KByte
GPIO11
PWM10 (8bit 0 ~ 255) (GPIO1 ~ GPIO10)
DAC1 (10bit 0 ~ 1023, 3.3V) (GPIO0)
ADC11 (10bit 0 ~ 1023, 3.3V)
UART1
I2C1
SPI1
その他ユーザLED

SeeedStudio XIAOページ

ピン配置

外観

400穴ブレッドボードでは、左右3列と2列使用することができます。

使ってみて

スペック的には最近のマイコンに見劣りしますが、それでも十分な性能で不満もなく使用できるマイコン基板です。

RP2040搭載基板や、ESP32系では通信ピンを自由に設定できる利点はありますが、ライブラリによってはピン設定が必要であったり、基板のピン配置表が見つからなかったり準備の段階で用意しなければならないことがあります。
XIAO SAMD21ではピン機能は固定ですが、逆に言えば配置を考えなくても良いので「創る」ことに専念できます。
リリースから十分熟成されているので、単純な不具合もなく習得には躓く要素が少ないことがこの基板の魅力だと感じます。

価格面での優位性はあまりありませんが、国内でも多くのショップやサイトが扱っているため入手性が良いです。
今時は必要になってから購入しても数日中には手元に届くと思います。

この基板の規格でCPU違いが多くの種類のラインナップされているので、本当にスペック不足になってから新しいマイコンの使い方を覚えてステップアップすることもできます。

準備

ライブラリ

ボードライブラリ

ボードマネージャのURLhttps://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
検索seeeduino
ボードライブラリSeeed SAMD Boards by Seeed Studio バージョン x.x.x
選択するボードSeeed SAMD Boards > Seeeduino XIAO
※ x.x.x 動作確認では1.8.3[Jan/2023]

モジュールライブラリ

機能やモジュールを使用しない場合インストールの必要はありません。

機能/モジュールライブラリ名検索確認時のバージョン
SSD1306Adafruit SSD1306 by AdafruitSSD13062.5.1
ST7735Adafruit ST7735 and ST7789
Library by Adafruit
ST77351.9.3
関連
SSD1306
ST7735
Adafruit GFX Library by AdafruitGFX1.11.3

スケッチの書き込み

Arduino IDEの書き込みボタンより書き込みができます。

リセット

基板の上面に”RST”とシルクの有る位置にパッドが2つあります。
ワイヤーなどでショートさせることでリセット(再起動)します。

このパッドのショートを素早く2回(0.5秒以内に2回程度)ショートさせるとダウンロードモードになります。
XIAO SAMDは時々プログラムが書き込みできなくなることがあるので、その時はこの操作を行うことでプログラムの書き込みができるようになります。

ブートローダモードの説明 (SeeedStudio Wiki)

基本スケッチ

ボタンLED

説明

タクトボタンとLEDの組み合わせの動作をします。

タクトボタンはPULLDOWN設定します。(押下したらHIGH)
タクトボタンを読み取り、押下されるとLEDが点灯します。
ボタンが離されるとLEDは消灯します。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Seeeduino XIAO SAMD21

【スケッチの説明】
プルダウンしたピンの状態がHighならLEDを点灯、LowならLEDを消灯させます。

【ライブラリ】
Seeed SAMD Boards > Seeeduino XIAO

【準備】
3.3V -> タクトスイッチ -> GPIO0
GPIO1 -> 保護抵抗(200Ω) -> LED -> GND

【バージョン情報】
2023/1/22 : 新規
**********************************************************************/

#define LED 1      //LED
#define BUTTON 0    //タクトスイッチ

void setup()
{
  pinMode(LED, OUTPUT);               //ピン出力設定
  pinMode(BUTTON, INPUT_PULLDOWN);    //プルダウンで入力
}

void loop()
{
  int iStat = digitalRead(BUTTON);
  digitalWrite(LED, iStat);           //ボタンの状態をLEDに出力
}
結果

ボタンが押下されるとLEDは点灯しました。
ボタンが離されるとLEDは消灯しました。

PWM,DAC

説明

PWMを使ってLEDのフェード点灯(ゆっくり点灯させる)を行います。
XIAOでのDACの分解能は10bit(0~1023)で3.3Vまで出力します。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Seeeduino XIAO SAMD21

【スケッチの説明】
DACとPWM出力でのフェード点灯(ゆっくり点灯)とフェード消灯(ゆっくり消灯)を行います。
XIAO SAMD21のDAC分解能は10bit(0 ~ 1023)で3.3Vです。
PWMの分解能は8bit(0 ~ 255)です。
同時に点灯と消灯を行いたいので、DACの分解能はPWM256段階にして4倍します。

【ライブラリ】
Seeed SAMD Boards > Seeeduino XIAO

【準備】
GPIO0 -> 保護抵抗(200Ω) -> LED -> GND
GPIO1 -> 保護抵抗(200Ω) -> LED -> GND

LEDを配線で使用する場合の抵抗値は使用するLEDにより適切な抵抗値を求めてください。

【バージョン情報】
2023/1/22 : 新規
**********************************************************************/

#define DAC A0         //DAC 出力ピン
#define PWM 1         //PWM 出力ピン


void setup()
{
//  pinMode(DAC, OUTPUT);
  pinMode(PWM, OUTPUT);
}

void loop()
{
  for(int i = 0; i < 256; i ++)
  {
    analogWrite(DAC, (i * 4));
    analogWrite(PWM, i);
    delay(2);
  }

  for(int i = 0; i < 256; i ++)
  {
    analogWrite(DAC, (256 - i) * 4);
    analogWrite(PWM, 256 - i);
    delay(2);
  }
}
結果

LEDがゆっくり点灯、ゆっくり消灯しました。
左側のLEDがDAC, 右側のLEDがPWM制御での点滅です。

ADC

説明

DACからの電圧をADCに入力します。
読み取った電圧をCOMに出力します。

XIAO SAMD21ではDACによりアナログ出力ができます。
出力した電圧をADCで読み取ります。

配線

XIAO SAMD21のGPIO0とGPIO1を直接配線します。

スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Seeeduino XIAO SAMD21

【スケッチの説明】
DACからの電圧をADCに入力します。
読み取った電圧をCOMに出力します。

【ライブラリ】
Seeed SAMD Boards > Seeeduino XIAO

【準備】
GPIO0(DAC) <-> GPIO1(ADC)

【バージョン情報】
2023/1/22 : 新規
**********************************************************************/

#define DAC 0
#define ADC 1

void setup()
{
  Serial.begin(115200);

  pinMode(ADC, INPUT);
}

void loop()
{
  int iADC = 0;
  //アナログ出力を、アナログ入力で読み取ります。
  //結果はCOM出力します。
  for(int i = 0; i < 1024; i ++)
  {
    analogWrite(DAC, i);
    iADC = analogRead(ADC);
    Serial.printf("(DAC, ADC) = %d, %d\r\n", i, iADC);
    delay(2);
  }

  for(int i = 0; i < 1024; i ++)
  {
    analogWrite(DAC, 1023 - i);
    iADC = analogRead(ADC);
    Serial.printf("(DAC, ADC) = %d, %d\r\n", 1023 - i, iADC);
    delay(2);
  }
}
結果

入力した電圧を読み取った結果をグラフにしました。
電圧の変化は0V -> 3.3Vまでを約500msで上昇し、3.3V -> 0Vまで約500msで下降します。
設定値したDACに対して読み取ったADCの値はほとんど一致しています。
これまでに評価したADCでは最もきれいな波形です。

DACでの出力をオシロスコープで確認しました。
3.3Vまできれいに出力されています。

UART

説明

COMから読み取ったデータをUARTに送信します。
UARTから読み取ったデータをCOMに送信します。

配線
XIAO SAMD21配線FT232RL
GPIO6(TX)RX
GPIO7(RX)TX
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
Seeeduino XIAO SAMD21

【スケッチの説明】
COMから読み取ったデータをUARTに送信します。
UARTから読み取ったデータをCOMに送信します。

【ライブラリ】
Seeed SAMD Boards > Seeeduino XIAO

【準備】
UARTの通信には、FT232RLを使用します。
XIAO SAMD21 <-> FT232RL
GPIO6(TX) <-> RX
GPIO7(RX) <-> TX

【バージョン情報】
2023/1/22 : 新規
**********************************************************************/

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

void loop()
{
  if(Serial.available() != 0)          //UART1にデータがあれば、読み取った内容をCOMに送信
  {
      Serial1.write(Serial.read());
  }

    if(Serial1.available() != 0)          //COMにデータがあれば、読み取った内容をUART0に送信
  {
      Serial.write(Serial1.read());
  }

}
結果

結果はTeratermを2つ起動して確認します。
1つはCOM用で、もう一つはUART(FT232RL)用です。
結果は省略します。

COM用のTeratermに入力された文字は、UART用のTeraterm画面に表示されます。
UART用のTeratermに入力された文字は、COM用のTeraterm画面に表示されます。

I2C(SSD1306)

説明

I2Cを使ってSSD1306(OLED 0.96inch)モニタのサンプルを動作させます。
XIAO SAMD21 ではI2Cは固定の位置で使用します。
ピン配置表に従い配線します。

そのほかの図形描画サンプルは、Arduinoサンプルを参照してください。
ファイル(F) > スケッチ例 > Adafruit SSD1306 > ssd1306_128x64_i2c

配線
XIAO SAMD21配線SSD1306(0.96inch)
3.3VVCC
GNDGND
GPIO5(SCL)SCL
GPIO4(SDA)SDA
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
SeeedStudio XIAO SAMD21

【スケッチの説明】
SSD1306 OLEDの制御をします。

【ライブラリ】
Seeed SAMD Boards > Seeeduino XIAO
Adafruit SSD1306 by Adafruit
Adafruit GFX Library by Adafruit

【準備】
マイコン基板 <-> SSD1306
3V3         <-> VCC
GND         <-> GND
GPIO4(SDA)  <-> SDA
GPIO5(SCL)  <-> SCL

【バージョン情報】
2022/11/22 : 新規
**********************************************************************/

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128                //解像度 128 x 64 で使用します。
#define SCREEN_HEIGHT 64                //SCREEN_HEIGHTは 32 に設定することができます。

#define OLED_RESET     -1               //使用しないので -1を設定する。
#define SCREEN_ADDRESS 0x3C             //I2Cアドレスは 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
                                        //表示制御にはAdafruit製 SSD1306を使用する。
                                        
void setup()
{  

  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    for(;;);
  }

  display.clearDisplay();               //何か表示されている場合に備えて表示クリア

  display.setTextSize(2);               //フォントサイズは2(番目に小さい)
  display.setTextColor(SSD1306_WHITE);  //色指定はできないが必要
  display.setCursor(20, 0);            //テキストの表示開始位置
  display.print(F("TAMANEGI"));         //表示文字列
  display.setCursor(15, 25);
  display.print(F("OLED 0.96"));
  display.setCursor(25, 45);
  display.print(F("SSD1306"));
  

  display.display();                    //バッファ転送(表示)
}

void loop()
{
}
結果

SSD1306のサンプルスケッチが動作しました。

SPI(ST7735)

説明

SPIを使ってST7735(LCD 1.8inch)モニタのサンプルを動作させます。
Teensy 4.0ではSPIを1系統使用できます。

そのほかのグラフィックのサンプルはArduinoサンプルスケッチを参照してください。
ファイル(F) > スケッチ例 > Adafruit ST7735 and ST7789 Library > graphicstest

配線
XIAO SAMD21配線ST7735(1.8inch)
3.3VVCC
3.3VLED
GNDGND
GPIO0CS
GPIO1RESET
GPIO2AO
GPIO10(SPI MOSI)SDA
GPIO8(SPI CLK)SCK
スケッチ
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/

【マイコン基板】
SeeedStudio XIAO SAMD21

【スケッチの説明】
ST7735 LCDの表示制御します。
デフォルトピンを使用しています。

【ライブラリ】
Seeed SAMD Boards > Seeeduino XIAO
Adafruit ST7735 and ST7789 Library
Adafruit GFX Library

【準備】
マイコン基板 <-> ST7735
3V3            <-> VCC
GND            <-> GND
GPIO0(CS)      <-> CS
GPIO1(Reset)   <-> Reset
GPIO2(DC)      <-> AO
GPIO10(MOSI)   <-> SDA
GPIO18(SCK)    <-> SCK

【バージョン情報】
2023/1/22 : 新規
**********************************************************************/

#include <Adafruit_GFX.h> 
#include <Adafruit_ST7735.h>
#include <SPI.h>

#define TFT_CS    0
#define TFT_RST   1
#define TFT_DC    2
#define TFT_MOSI  10
#define TFT_SCK   8

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

//S/W SPIはこちら。遅いが任意のピンを使用できる。
//Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCK, TFT_RST);

void setup(void) 
{
  tft.initR(INITR_BLACKTAB);                //Init ST7735S初期化
  
  tft.fillScreen(ST77XX_BLACK);               //背景の塗りつぶし

  //テキスト表示
  tft.setRotation(3);                         //画面回転
  tft.setTextSize(3);                         //サイズ

  tft.setCursor(0, 10);                       //カーソル位置                      
  tft.setTextColor(ST77XX_GREEN);             //緑
  tft.printf("TAMANEGI\n");

  tft.setCursor(0, 50);                       //カーソル位置                      
  tft.setTextSize(2);                         //サイズ
  tft.setTextColor(ST77XX_RED);               //赤
  tft.printf("1.8inch LCD\n");
  tft.setTextColor(ST77XX_YELLOW);            //黄
  tft.printf("Res=128 x 160\n");
  tft.setTextColor(ST77XX_BLUE);              //青
  tft.printf("ST7735\n");
}

void loop()
{
}
結果

ST7735のサンプルスケッチが動作しました。

コメント

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