概要
去年に購入したまま積んでいたXIAOと拡張ボードをやっと触ることができましたので紹介したいと思います。本家ストアから購入したほうが安いですが、時間と送料が結構かかるので秋月電子さんあたりのほうがおすすめです。
Seeeduino XIAO
Seeeduino XIAOは非常に小型なボードです。7ピン×2で14ピンと裏側にもパッドがあります。
ちょっと面倒なのがリセットボタンがありません。USB Type-Cコネクタの上にパッドはありますので、ショートさせることでリセットをすることができるようです。
上側にもVINとGNDのパッドの他に、左側に4箇所パッドがありますね。ちなみに標準ではピンヘッダはついていませんので、自分で付ける必要があります。
ピンヘッダ付きも販売はされていますので、国内でもそのうち手にはいると思います。Digi-Keyさんとかだとすでに取り扱っていますね。
- Seeeduino XIAO(秋月電子)
- Seeeduino XIAO(スイッチサイエンス)
- SEEEDUINO XIAO ARDUINO MCU(Digi-Key)
- SEEEDUINO XIAO (PRE-SOLDERED)(Digi-Key)
ちなみに販売している状態ですと、シールがはられていませんのでまっさらなシールドだけでかっこ悪いです。真っ白を含む4種類のシールが付属しているので、なにか貼ったほうがかっこいいと思います。
Arduino IDEでの開発
上記のページなどにまとまっています。
ボードマネージャのURL追加
Arduino IDEの環境設定から、下の方にある追加のボードマネージャのURL欄の右側にあるボタンを押します。
ここにSeeedstudioのボードマネージャのURLを追記します。
- https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json
上記のURLになります。
この状態で、「ツール」→「ボード」→「ボードマネージャ」を選択して、検索欄にSeeedで絞り込むと上記の結果になりました。上にあるSeeed SAMDがXIAOのボードマネージャになります。ここの紹介文にXIAOはまだないですが、Wio Terminalと同じシリーズのチップになります。
はい、ボードから選択できるようになりました。
USBシリアル出力
void setup() {
SerialUSB.begin(115200);
while (!SerialUSB);
}
void loop() {
void setup() {
Serial.begin(115200);
while (!Serial);
}
void loop() {
Serial.println("Hello,World");
delay(1000);
}
SerialもしくはSerialUSBがUSB経由でのシリアル出力のようです。
上記に定義済みの変数が設定されています。
#define SERIAL_PORT_USBVIRTUAL SerialUSB
#define SERIAL_PORT_MONITOR SerialUSB
#define SERIAL_PORT_HARDWARE Serial1
#define SERIAL_PORT_HARDWARE_OPEN Serial1
// Alias Serial to SerialUSB
#define Serial SerialUSB
抜粋してみると、USBシリアルはSerialUSBで、ピンを使ったシリアルはSerial1を使うみたいです。ただし、一般的なSerialはSerialUSBに置換されていますね。
Lチカ
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, LOW);
delay(200);
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
}
上記でLチカできます。LOWを200ミリ秒、HIGHを1秒に設定してみました。動かしてみたところ一瞬光ってから消える動作をしているのでLOWにすると光るLEDのようです。
#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
定義を見てみるとこんな感じでした。PIN_LEDか、Arduino UNOなどでもよく使われているLED_BUILTINあたりを使うのが良さそうです。
Groveシールド
Seeedさんの商品ですので、Groveシールドも販売されています。このシールドを使うことでGroveが使えるようになります。XIAOは小さくて便利なのですが、入出力の接続が面倒なんですよね。
- Seeeduino Xiao用Groveシールド(秋月電子)
- Grove Shield for Seeeduino XIAO(スイッチサイエンス)
- GROVE SHIELD FOR SEEEDUINO XIA(Digi-Key)
上記で購入できます。
こんなボードで、右側を折って短くすることも可能です。
裏側はこんな感じになっています。
こんな感じにGroveケーブルでボタンを接続してみました。
const int8_t btnPin = 0;
void setup() {
Serial.begin(115200);
while(!Serial);
pinMode(btnPin, INPUT);
}
void loop() {
Serial.println(digitalRead(btnPin));
delay(100);
}
単純なスケッチですね。
拡張ボード
去年の年末にさらにすごい拡張ボードが販売されました。上記のようにXIAOの裏側にあるパッドにピンが伸びていますね。これで裏側にあるリセットピンが使えるようになっています。Grove端子もあります。
裏側です。マイクロSDカードとコイン電池がありますね。電池があるってことはRTCも内蔵されていますね。電池はCR1220でしたが手元にはない、、、
A0/D0のGroveにボタンを接続して、前回のスケッチを動かすとGrove経由でボタンの状態が取得できました。
- Seeeduino Xiao用拡張ボード(秋月電子)
- SEEEDUINO XIAO EXPANSION BOARD(Digi-Key)
上記で購入できます。
I2Cスキャン
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(115200);
while (!Serial);
Serial.println("\nI2C Scanner");
}
void loop() {
int nDevices = 0;
Serial.println("Scanning...");
for (byte address = 1; address < 127; ++address) {
Wire.beginTransmission(address);
byte error = Wire.endTransmission();
if (error == 0) {
Serial.print("I2C device found at address 0x");
if (address < 16) {
Serial.print("0");
}
Serial.print(address, HEX);
Serial.println(" !");
++nDevices;
} else if (error == 4) {
Serial.print("Unknown error at address 0x");
if (address < 16) {
Serial.print("0");
}
Serial.println(address, HEX);
}
}
if (nDevices == 0) {
Serial.println("No I2C devices found\n");
} else {
Serial.println("done\n");
}
delay(5000);
}
とりあえず汎用的なI2Cスキャナを動かしてみたいと思います。
Scanning...
I2C device found at address 0x3C !
I2C device found at address 0x51 !
done
2つデバイスを発見しました。
- 0x3C:SSD1315?(LCD)
- 0x51:PCF8563(RTC)
上記の2つですね。
LCDライブラリ
定番のu8g2ライブラリを利用します。
上記のキットと同じSSD1315が搭載されていると思います。ただし、SSD1306と互換性があるようですので、ライブラリ上ではSSD1306として動きます。
RTCライブラリ
上記ライブラリを利用する必要があるようです。他のライブラリマネージャに登録されているPCF8563用ライブラリはXIAOでは利用できないようです。
ZIP形式でダウンロードしてZIP形式のライブラリをインストールから入れておく必要があります。
スケッチ例
#include <Arduino.h>
#include <U8x8lib.h>
#include <PCF8563.h>
PCF8563 pcf;
#include <Wire.h>
U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);
//U8X8_SSD1306_128X64_NONAME_SW_I2C u8x8(/* clock=*/ SCL, /* data=*/ SDA, /* reset=*/ U8X8_PIN_NONE); // OLEDs without Reset of the Display
void setup() {
Serial.begin(115200);
u8x8.begin();
u8x8.setFlipMode(1);
Wire.begin();
pcf.init();//initialize the clock
pcf.stopClock();//stop the clock
pcf.setYear(20);//set year
pcf.setMonth(10);//set month
pcf.setDay(23);//set dat
pcf.setHour(17);//set hour
pcf.setMinut(33);//set minut
pcf.setSecond(0);//set second
pcf.startClock();//start the clock
}
void loop() {
Time nowTime = pcf.getTime();//get current time
u8x8.setFont(u8x8_font_chroma48medium8_r); // choose a suitable font
u8x8.setCursor(0, 0);
u8x8.print(nowTime.day);
u8x8.print("/");
u8x8.print(nowTime.month);
u8x8.print("/");
u8x8.print("20");
u8x8.print(nowTime.year);
u8x8.setCursor(0, 1);
u8x8.print(nowTime.hour);
u8x8.print(":");
u8x8.print(nowTime.minute);
u8x8.print(":");
u8x8.println(nowTime.second);
delay(1000);
}
本家のサンプルスケッチです。これで画面上に時刻が表示されますね。
動作が不安定な場合
ちょっと変なスケッチを転送してしまうとシリアルポートとして認識しなくなることがあります。その場合にはWio Terminalと同じなんですが2連続でリセットをするとダウンロードモードに強制的になります。その状態で転送しなおすことで元に戻ると思います。
とはいえ、標準だとリセットボタンがないのでちょっと面倒です。拡張ボードを使うとリセットボタンが押しやすくていいですね。
まとめ
まだあまり日本語の情報が無い気もしますが、結構使いやすいボードだと思います。USBコントローラも内蔵されているので、USBデバイスとしてパソコンからUSBキーボードなどに見せたり、USBホストとして他のUSBデバイスから情報を取得することも可能です。
値段のわりにかなりパワフルなボードなので、通信を利用しない場合にはこのボードをシステムの中に内蔵してしまうのが良さそうです。
コメント