【ハロワ】Seeeduino XIAOの使い方などを確認(VSCode PlatformIO)【XIAOで】

Arduino/SAMDArduino,PlatformIO,Seeeduino,VSCode,XIAO,ハロワ

先日届いたXIAOさんを一通り使ってみようと思います。

まずは使いやすい様にXIAOさんに足をつけますね

hello_xiao01

ブレッドボードに足を挿し、XIAOを乗っけまして、、

hello_xiao02

こんな感じで、、、

折角ですからIOピンが判り易い様に、ステッカーも貼ってあげます

hello_xiao03

だいぶ格好よくなりましたが

肉眼では文字が読めず( ノД`)

無くてもいいんじゃね・・・・

しかしUSB Type-Cコネクタはツヤっとしていて良いですね。

USB Micro-Bはなんだかいつも酸化してますので・・・

USBケーブルでPCと接続

XIAOさんにはどうやらブートローダーが既に入って居る様ですので、PlatformIOでササっと動かしてみようと思います。

先ずはプログラムを転送するため、XIAOをPCからシリアルデバイスとして認識してもらわなくてはいけません。

USB Type-CケーブルでおもむろにPCと繋いでみますと

なんかPnPが走ってくれました。

通知にもデバイスの準備が整いました、と。

hello_xiao04

デバイスマネージャを開くと、新しくシリアルポートにCOM5が出来上がっていました。

hello_xiao05

ESP32とはシリアルのコントローラが違いますから、番号が増えてしまうのは致し方ない事・・・

ポートの設定を開くと、速度が9600bpsになっているので115200bpsに変えておきます。

hello_xiao06

なんかXIAOさん、チップLEDがゆっくり点滅していますね

hello_xiao07

これが一体どんな状態なのかは知りませんが

多分大丈夫でしょう(ぇ

PlatformIOでプロジェクト作成

PlatformIOのHomeで「New Project」をポチりましてプロジェクトを作成します。

hello_xiao09

次にプロジェクト名を入れ、ボードの所でxiaoと入力すれば候補で出て来ますのでラクチンです

hello_xiao10

フレームワークはArduinoを選択しました。

そしてFinishとすれば勝手にスケルトンを生成してくれる。

PlatformIOは本当にラクでいいですね。

これの他、フレームワークに「Zephyr RTOS」が候補で出て来ましたが、全く知識が無いので華麗にスルーします。

なんか名前からして凄そうなので、これは後日・・・

さて生成されたプロジェクトファイルを見てみます。

hello_xiao11

ESP32の時とほぼ一緒。

コンパイル用セッティングとPlatformIOのiniファイルを見てみます。

まずは c_cpp_properties.json

c_cpp_properties.json

//
// !!! WARNING !!! AUTO-GENERATED FILE!
// PLEASE DO NOT MODIFY IT AND USE "platformio.ini":
// https://docs.platformio.org/page/projectconf/section_env_build.html#build-flags
//
{
    "configurations": [
        {
            "name": "PlatformIO",
            "includePath": [
                "D:/VSCodeProjects/PlatformIO/XIAO Test/include",
                "D:/VSCodeProjects/PlatformIO/XIAO Test/src",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-cmsis/CMSIS/Core/Include",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-cmsis-atmel/CMSIS/Device/ATMEL",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/cores/arduino",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/cores/arduino/TinyUSB",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/cores/arduino/TinyUSB/Adafruit_TinyUSB_ArduinoCore",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/cores/arduino/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-cmsis/CMSIS/DSP/Include",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/variants/XIAO_m0",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/Adafruit_ZeroDMA",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/Adafruit_ZeroDMA/utility",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/EnergySaving/src",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/FlashStorage/src",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/HID",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/I2S/src",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/LoRaWan",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/SPI",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/Seeed_Arduino_FreeRTOS/src",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/Seeed_Arduino_LCD",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/SoftwareSerial",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/TimerTC3",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/TimerTCC0",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/USBHost/src",
                "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/Wire",
                "C:/Users/【ユーザー名】/.platformio/packages/tool-unity",
                ""
            ],
            "browse": {
                "limitSymbolsToIncludedHeaders": true,
                "path": [
                    "D:/VSCodeProjects/PlatformIO/XIAO Test/include",
                    "D:/VSCodeProjects/PlatformIO/XIAO Test/src",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-cmsis/CMSIS/Core/Include",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-cmsis-atmel/CMSIS/Device/ATMEL",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/cores/arduino",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/cores/arduino/TinyUSB",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/cores/arduino/TinyUSB/Adafruit_TinyUSB_ArduinoCore",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/cores/arduino/TinyUSB/Adafruit_TinyUSB_ArduinoCore/tinyusb/src",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-cmsis/CMSIS/DSP/Include",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/variants/XIAO_m0",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/Adafruit_ZeroDMA",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/Adafruit_ZeroDMA/utility",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/EnergySaving/src",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/FlashStorage/src",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/HID",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/I2S/src",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/LoRaWan",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/SPI",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/Seeed_Arduino_FreeRTOS/src",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/Seeed_Arduino_LCD",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/SoftwareSerial",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/TimerTC3",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/TimerTCC0",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/USBHost/src",
                    "C:/Users/【ユーザー名】/.platformio/packages/framework-arduino-samd-seeed/libraries/Wire",
                    "C:/Users/【ユーザー名】/.platformio/packages/tool-unity",
                    ""
                ]
            },
            "defines": [
                "PLATFORMIO=50101",
                "ARDUINO_SAMD_ZERO",
                "__SAMD21__",
                "__SAMD21G18A__",
                "ARM_MATH_CM0PLUS",
                "SEEED_XIAO_M0",
                "ARDUINO=10805",
                "F_CPU=48000000L",
                "USBCON",
                "USB_VID=0x2886",
                "USB_PID=0x802F",
                "USB_PRODUCT=\"Seeeduino XIAO\"",
                "USB_MANUFACTURER=\"Seeed\"",
                "ARDUINO_ARCH_SAMD",
                "USB_CONFIG_POWER=100",
                ""
            ],
            "cStandard": "c11",
            "cppStandard": "c++11",
            "compilerPath": "C:/Users/【ユーザー名】/.platformio/packages/toolchain-gccarmnoneeabi/bin/arm-none-eabi-gcc.exe",
            "compilerArgs": [
                "-mcpu=cortex-m0plus",
                "-mthumb",
                ""
            ]
        }
    ],
    "version": 4
}

長~いので折りたたんでおきますが

目につくのは、はじめからAdafruitのTinyUSBライブラリを含めているみたい。

関連してWireとUSBHostライブラリも。

それからZeroDMAってなんだ・・・?

なんかウェイト無しで回せる様な凄いやつかと思ったら普通のDMAライブラリでした。

要するにATSAMD21G18Aの、Arduino Zeroとかcortex-m0+のm0(zero)って事なんでしょう

もう一つ、TimerTC3、TimerTCC0っていうのがありますね。

これは割り込みライブラリの様です。

そしてplatformio.ini はこんな感じ。

platformio.ini

[env:seeed_xiao]
platform = atmelsam
board = seeed_xiao
framework = arduino

特にシリアルの速度を指定もしておらず、特別なコンパイルオプションも無し

ボードやらを指定しているだけです。

mainのスケルトンも一応。

main.cpp

#include <Arduino.h>

void setup() {
  // put your setup code here, to run once:
}

void loop() {
  // put your main code here, to run repeatedly:
}

特に目立った所はなく、PlatformIOにお任せでいい感触。

ひとまずハロワ(Hello World!)でも

というわけで、一応ハロワでも・・・?

と思いましてsetupでSerial.beginしようとしたら、候補に「SerialUSB」が飛び込んできまして

そういえばXIAOのシリアルはUSB接続と、Serial1(GPIO 6 TX, GPIO 7 RX)の2系統があったかなと。

XIAOはUSBホストになれる様ですので、USBポートが恐らく物凄く多機能。

ゴッチャにならない様にするシンボルでしょう。

とりあえずUSBポートを使いますが、変なものを読みこまない様に「Serial」でいってみます。

#include <Arduino.h>

void setup() {
  // put your setup code here, to run once:
	Serial.begin(115200);
	while (!Serial);
}

void loop() {
  // put your main code here, to run repeatedly:
	Serial.println("Hello Seeeduino XIAO!");
	delay(1000);
}

一応、モニター速度もiniファイルに書いておきます。

[env:seeed_xiao]
platform = atmelsam
board = seeed_xiao
framework = arduino
monitor_speed = 115200

そしてコンパイルをっと。

多少warningが出ますがキニシナイ

オサーンの趣味ですから、何か問題が出たら見る、、それでいいんです

   :
   :
Linking .pio\build\seeed_xiao\firmware.elf
Building .pio\build\seeed_xiao\firmware.bin
Checking size .pio\build\seeed_xiao\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [=         ]   7.3% (used 2408 bytes from 32768 bytes)
Flash: [          ]   4.2% (used 10952 bytes from 262144 bytes)
====================================== [SUCCESS] Took 13.92 seconds ======================================
ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。

なんかあれですね

ESP32と比べるとサイズが小さいっスね

ESP32は空っぽの中身でも400kbくらいは容量を使っていた様な、、、

XIAOのフラッシュメモリ256kbは小さいかなと思っていましたが、ESP32の様にwifiやBTが無い分、問答無用で使うペリフェラルの制御分が要らないのかもしれません。

まぁとにかくエラーも無いので転送してみます。

ポチっと。

Processing seeed_xiao (platform: atmelsam; board: seeed_xiao; framework: arduino)
----------------------------------------------------------------------------------------------------------Tool Manager: Installing platformio/tool-bossac @ ~1.10700.0
Downloading  [####################################]  100%
Tool Manager: tool-bossac @ 1.10700.190624 has been installed!
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/atmelsam/seeed_xiao.html
PLATFORM: Atmel SAM (6.0.1) > Seeeduino XIAO
HARDWARE: SAMD21G18A 48MHz, 32KB RAM, 256KB Flash
DEBUG: Current (atmel-ice) External (atmel-ice, blackmagic, jlink)
PACKAGES:
 - framework-arduino-samd-seeed 1.8.1
 - framework-cmsis 2.50400.181126 (5.4.0)
 - framework-cmsis-atmel 1.2.0
 - tool-bossac 1.10700.190624 (1.7.0)
 - toolchain-gccarmnoneeabi 1.70201.0 (7.2.1)
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 15 compatible libraries
Scanning dependencies...
No dependencies
Building in release mode
Checking size .pio\build\seeed_xiao\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [=         ]   7.3% (used 2408 bytes from 32768 bytes)
Flash: [          ]   4.2% (used 10952 bytes from 262144 bytes)
Configuring upload protocol...
AVAILABLE: atmel-ice, blackmagic, jlink, sam-ba
CURRENT: upload_protocol = sam-ba
Looking for upload port...
Auto-detected: COM5
Forcing reset using 1200bps open/close on port COM5
Waiting for the new upload port...
Uploading .pio\build\seeed_xiao\firmware.bin
Atmel SMART device 0x10010005 found
Erase flash
done in 0.821 seconds

Write 10952 bytes to flash (172 pages)

[===========                   ] 37% (64/172 pages)
[======================        ] 74% (128/172 pages)
[==============================] 100% (172/172 pages)
done in 0.081 seconds

Verify 10952 bytes of flash with checksum.
Verify successful
done in 0.014 seconds
CPU reset.
====================================== [SUCCESS] Took 17.91 seconds ======================================
ターミナルはタスクで再利用されます、閉じるには任意のキーを押してください。

ちょっ、待てよ~

なんかPlatformIOさん、ダウンロードをはじめましたょ?

どうやらXAIO用のアップローダーが無かった様で、勝手にインストールして動かしてくれたみたいです。

アップロードの速度を強制的に1200bpsにしたぞ!とか出てますが、まぁアップロード速度とか私にとってはどうでもいい事。

そのうち調べてみます。

さて無事に転送された様ですのでシリアルモニタを見てみますと、ちゃんとハロワが1秒毎にシリアルから出ている様子。

hello_xiao12

視界の片隅でなんかチカチカすると思ってXIAOの本体を見ると、LEDが青色に点滅していました。

hello_xiao08

シリアル通信をしていると、このLEDが点灯するのかな。

なんだか芸が細かいカッコイイですね!

よく見るとUSBポートの横にはチップLEDが4個搭載されている様子。

それぞれ操作できるかもしれません。

まとめ

ひとまずXIAOでハロワ(Hello World!)を動かしてみました。

ESP32との大きな違いは、ペリフェラルの制御用のライブラリを殆ど読み込まない事かな。

今日はただのハロワではありますが、およそ10kbしか容量を使わず、懸念だったフラッシュのサイズもあまり気にしなくて良いかもしれません。

ここまで全く問題が起こらず、Arduino互換機としてちゃんと動くっぽい事を証明してくれました。

色々とデバイスの違いを吸収しなくてはいけない事もあるでしょうが、ひとまず今日はこれで。

一度に沢山やるとオサーンの脳はパンクしてしまいますので・・・( ノД`)