Adafruit Feather M0

Arduino界隈で得た数々のノウハウを元に、次はいよいよ派手なのをやってやろう! と思ったらもうメモリが足りない(涙)。そこで「これはやはりZeroしかありますまい」とArduino-M0を買ってみたのが数ヶ月前。

が、それは昨年来の分裂騒動の影響で.orgのIDEしか使えないとあって面倒この上ない。またそのクオリティも.ccのそれに比べて明らかに低く、ブチ切れた挙句そのまま放置となってしまっていた。

そこへ最近.ccと.orgが和解とのニュースが入り、ヤレヤレと思ったのと同時に「ここはやはりCortex-M0をモノにしておこう」と奮起、再度M0に向かった。だがしかし、.orgのIDEが相変わらずのタコでラチ明かず。「なんとかならんのかいな」と、思っていて目についたのがAdafruitのFeather-M0。こんなのが出ていたとは知らなかったが、これなら.ccのIDEで開発できるし、そんな高くもないし「なんとかなっぺぇ!」でソク購入。

2016-10-15-19-29-34-hdr
iPad Air 2 (3.3mm, f/2.4, 1/33 sec, ISO200)
このLEDは1秒間隔で点滅しとります

Blinkなんぞすっとばして、まずは節電。M0の時も情報が少なくて頓挫していたが、まずはこれからとRTCZeroなるライブラリに挑んでみた。そして試行錯誤の末、standbyModeからRTCのそれで復帰するところまで到達したのがこれ。

#include <RTCZero.h>

#define PIN_LED (6)

RTCZero rtcZERO;
volatile unsigned long aCounter = 0;
int alarmSS = 0;

void setup()
{
  pinMode(PIN_LED, OUTPUT);
  digitalWrite(PIN_LED, LOW);

  rtcZERO.begin();
  alarmSS = rtcZERO.getSeconds();
  rtcZERO.attachInterrupt(alarmSR);
  rtcZERO.enableAlarm(rtcZERO.MATCH_SS);
}

void loop()
{
  rtcZERO.setAlarmSeconds(alarmSS = (alarmSS + 1) % 60);
  rtcZERO.standbyMode();
}

void alarmSR() // alarm Service Routine
{
  digitalWrite(PIN_LED, (aCounter++) % 2);
}

standbyModeで何が有難いのか、まだよくわかっちゃいないが恐らく省エネにはなってるだろうし、何より外付けRTCが不要になっただけでも感動。アップロードのたびにリセットボタンをクリクリというのが面倒だし、もうちいスマートなやり方がありそうな気はするが、まずはこれで「ほぼ1秒」なインターバルができたので○。

次は外部割り込み。先は長いのー。

追記:  その外部割り込みに着手。が、 スイッチへの反応が鈍い。なんで? と調べていてわかった。なんとその外部割り込みではrtc.standmyModeから復帰しないではないか! これでは意味ない … と絶望しそうになったが、ググってみればやはり同じ目に遭って困っている人がいた。でも世の中には強者がいるものでこれを戴き、ちょいモディファイでクリア。ヤッタネ!

追記2:  今度はSerial。受信割り込みで復帰してくれるかな? と期待したら、それどころかstandbyMode中はその受信すらしてくれない模様。上記手法で該当ピンのEXTINTを開いてやってもダメ orz… ただいま鋭意調査中。

追記3:  更に困ったことにArduinoの受信バッファが64バイトしかなく、これを超えるデータが来る時はstandbyModeどころかdelayですらアウトという事実が判明。問題山積。嗚呼。

追記4:  受信バッファのサイズを変更(拡大)するにはcoreの修正が必要と知り、やりたくはないがやるしかあるまいと思ったらSAMDの場合のそれを探すのにエライ苦労した。そしてたぶんこれだろうとイジったのは[RingBuffer.h]と[boards.txt]。思い切って1024bytesとしたが、なんとか動いた模様。しかしこれ、IDEもしくはライブラリのバージョンアップの度にやらなきゃいかんかも(恐)。そもそも受信割り込みでstandbyModeから復帰してくれれば不要だろうし。困ったもんだ。