seeeduino-xiaoのスリープ時は約70uA（5V電源、LED無し、RTC復帰）

# 1. はじめに
seeeduino-xiao(以後xiaoと記す)はArduinoテイストな小型マイコンボードです。今回は、xiaoのスリープ時の電流を測りました。結論はタイトルの通りです。


# 2. xiaoのコーディングとタイマースリープ

## 2.1. 準備～ライブラリのインストールなど

xiaoのコーディングは、arduino-IDEで行います。 ボードマネージャへの登録などがありますので、初めての方は、[こちら](https://wiki.seeedstudio.com/jp/Seeeduino-XIAO/)を参考にしてください。 
(```https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json``` を追加します。他のが既に記載されている場合は、「,」で区切って追記します。）

そして、RTCタイマーを使うには、[Seeed_Arduino_RTC ライブラリ](https://github.com/Seeed-Studio/Seeed_Arduino_RTC)が必要です(2021年5月現在)。Arduino-IDEからライブラリを追加します。 検索フィルタに Seeed Arduino RTCと入力すると1つだけに絞られるはずです。

## 2.2.  コーディング

次のプログラムを使いました。xiaoのプログラム焼き込みは、リセットをする必要があるので、[こちら](https://wiki.seeedstudio.com/jp/Seeeduino-XIAO/)を参考にしながら実施しましょう。

```c++
#include "RTC_SAMD21.h"
#include "DateTime.h"
#include <EnergySaving.h>

EnergySaving myPowSave;
RTC_SAMD21 myRtc;

#define PIN_LED 13

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

  pinMode(PIN_LED,OUTPUT);
  digitalWrite(PIN_LED,HIGH);//LED off (active LOW)

  myRtc.adjust(DateTime(2030, 4, 1, 8, 30, 0) );
  myRtc.attachInterrupt(dummyfunc); 
  myPowSave.begin(WAKE_RTC_ALARM); 

  myRtc.disableAlarm();
  DateTime timeNow = myRtc.now();
  const uint16_t uiAlmNextSec = 10;
  DateTime timeAlarm = DateTime(timeNow.year(), timeNow.month(), timeNow.day(), timeNow.hour(), timeNow.minute(), timeNow.second() + uiAlmNextSec);
  myRtc.setAlarm(timeAlarm);
  myRtc.enableAlarm(myRtc.MATCH_SS); 

}

void loop()
{
  for(uint16_t uilp=0; uilp<3; uilp++)
  {
    digitalWrite(PIN_LED,HIGH);
    delay(1000);
    digitalWrite(PIN_LED,LOW);
    delay(1000);
  }
  digitalWrite(PIN_LED,HIGH);
  
  myPowSave.standby();
}

void dummyfunc(){}
```


このプログラムは次の内容です。

- 初期化
    - ピンの初期設定
    - RTCの初期設定
    - RTCの(復帰用)アラーム設定
    - スリープ復帰トリガ設定
- ループ
    - LED点滅処理
    - LED消灯(HIGHで消える)
    - スリープ突入
    - （スリープ復帰後はスリープ突入直後に戻る、つまりループ処理）

xiaoのチップはSAMD21なので、RTCについてもSAMD21用のライブラリを呼び出します。このライブラリは、他のRTCライブラリと使い方がほぼ同じです。

xiaoのLEDは、負論理で接続されていますので、HIGHで消灯し、LOWで点灯します。

スリープは、EnergySavingというライブラリで、standbyという名称になっています。

スリープ復帰は、スリープ処理した後の処理に戻ります。ですので、リセットがかかって処理の先頭から再開などのような類ではありません。

RTCのタイマーアラーム（割り込み信号）は、```enableAlarm(myRtc.MATCH_SS);```と設定することで、毎分同じ秒数になるとスリープから復帰します。この部分を変更すると、異なる周期で復帰できます。どんな設定があるかは[こちら](https://github.com/Seeed-Studio/Seeed_Arduino_RTC/blob/master/src/RTC_SAMD21.h#L38)をご覧下さい。西暦まで一致させるように設定すると、1回のみの復帰になります。（正確にはカウンタが戻る頃まで。つまり、百年周期ぐらい？）

1回目のアラームは、起動してから10秒後にしています。なので、起動しスリープ後10秒で復帰し、その後は1分周期で復帰します。


# 3. 測定

## 3.1. 測定系

測定には、 横河電機のGS610を用いました。これは、電源とその測定を同時に行うことので電源です。今回は、xiaoにGS610から5Vを供給しつつ、その電流を測定しました。
スリープしてない時はピン13に接続された橙色のLEDが点滅するので、状態を目安にして、通常時とsleep時の電流を記録しました。

## 3.2. 測定結果

|状態|電流[mA]|備考|
|---|---|---|
|通常|14.9||
|sleep|1.5|LEDあり|
|sleep|0.066|LED無し|

LED無しの時のsleep状態の電流値。
![xiaoSleepRemLeds.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698531/450abc16-b99c-3eae-883a-2e202740bd05.jpeg)


## 3.3. LED無しとは？

xiaoの緑LEDは3.3Vが供給されていると常時点灯してしまいます。用途によりますがLEDの消費電力は大きい場合があります。例えば電池駆動の場合、LED点灯の電力はかなり大きいです。そこで、実力行使ということでLEDを取り外しました。

![xiao_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698531/25d13af6-d684-a8b7-6b1a-843cd5bf73f7.jpeg)

拡大写真

![xiao_rmLed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698531/d5e188ea-e86e-a02d-59bf-e9ec4c7f5b23.jpeg)



# 4. おわりに
xiaoは、600円程度（2021年現在）で購入できるマイコンです。USB接続して開発できるにも関わらず、とても小さいので、そのまま実装に移すこともできます。ホビーにはもってこいのマイコンです。場合によっては実務も可能でしょう。
小型ということで、電池駆動を考えたくなります。そこで、スリープ時の電流を知りたいと思いました。70uAと、結構小さいので、電池駆動もいけそうだと思っています。今回は5Vでしたが、回路上は3.3Vなので、3.3Vで確認しても良かったなと思います。なお、「スリープ」は「スタンバイ」と呼よばれることもあるようです。回路としては「スタンバイ」と表現した方が判り易いのかもしれません。
また、Arduino-IDEのボードマネージャにseeeduino関連をインストールするとxiaoのスケッチ例にEnergy Savingという項目にWakeUpOnRTCInterruptというスケッチが予め入っています。ところが、冒頭のincludeでRTCInt.hが無いためビルドできないので、RTCのライブラリを導入する方法で対処しました。

ところで、xiaoの存在は発売当初から知っていたものの、その価値は正直感じませんでした。ESP32があるからです。あちらも単体では非常に安く購入できますので、無線の使えないxiaoって？という印象でした。しかし、最近になり、RaspberryPi-Picoという素晴らしいマイコンが出ました。これもまた、無線の使えないマイコンです。そこで、比較対象になるのが同じ価格帯のxiaoということになります。IOの数では、picoですが、面積でいくとxiaoです。ケースバイケースだと思います。非常に楽しみな時代になってきました。


# 謝辞
LEDを取り外してくれたR.I.(96)君に感謝申し上げます。