H.Berlioz “Rákóczi March” from “La Damnation de Faust”

ベルリオーズの劇的物語「ファウストの劫罰」よりいわゆる「ラコッツィ行進曲」。初めてこれを生オケで聴いた時は、打楽器のカッコよさに鳥肌が立った。そんな雰囲気をどうにか醸し出せるところまで来たかな、と思ったので公開。

ベルリオーズ自身「行進曲」と名付けているが、これは単純なマーチではない。軍隊の行進と、それを見つめる者の心象を綴った描写音楽とでも言うべき。ともするとその響きの派手さばかりに目がいきがちだが、実は細かいテンポの揺らしこそが大事なんだというのを痛感。

Qduino Mini by SparkFun

を衝動買いしちまった。出てからけっこう経つが高いし、そもそもATMega32U4ではSLEEP_MODE_PWR_DOWNにまだ成功していないしで、俺には必要性ゼロな筈だった。更には「使ってみました」的な記事も殆ど見当たらないしで「人気ないのかなあ」ぐらいに思っていた。でもLiPo挿しゃそれで動くばかりか充電までしてくれるというし、バッテリー残量も読めるというし、おまけに電源SWまでついてるのになんで使われないのか? の方が凄く気になってきて、とうとうポチってしまったという次第。

それが届いたのでさっそく足を付け、お決まりのBlinkから動かしてみた。むろんこれはOK。サンプルとして提供されているフルカラーLEDとLiPo残量も○。ここまではなんてことなかった。

しかしここで秋月のRTC-8564NBから割り込みを、となったところでブレーキ。このボードの外部割り込みは4つまでで、それらがD0-D3にアサインされている。だがそのD0-D1はRX/TXで、更にはI2CのSCL/SDAがD2とD3に来ているので、RTCからの割り込みを拾うピンが残っていない(!)。I2Cを使う限りattachInterruptできないのか!? と大いに焦った。

お前それはないだろう、とここでATMega32U4のマニュアルを読んでみたが、やはり外部割り込みは5本しかない。ところがその次のページを見て「おや?」となった。ピン変化割り込みの図がATMega328のそれと違う。なになに??? と説明を読むと、どうやらATMega32U4のそれは8本のピンに個別に設定ができる模様。つまりあの面倒なグループという概念がない。Qduinoのピン配置を見ると、確かにPCINT0-7が8本のピンにアサインされている。これならほぼ外部割り込みと同じ使い方ができるんじゃないの? と思って試してみたのが次のコード(Special thanks to ばんとさん)。

#include <avr/sleep.h>
#include <RTC8564.h>

#define PIN_RTC_INT (15)
#define INTERVAL_SECS (1)

RTC8564 rtc;

volatile bool gotInterrupt = false;
volatile unsigned int counter = 0;

void setup() {
  set_sleep_mode(SLEEP_MODE_IDLE);
  while(!Serial){
    sleep_mode();
  }
  Serial.begin(115200);

  pinMode(PIN_RTC_INT, INPUT_PULLUP);
  rtc.begin();
  rtc.setTimer( rtc.TIMING_1_SEC, INTERVAL_SECS, true, true );

  PCMSK0 |= (1 << PCINT1); // on D15
  PCICR  |= (1 << PCIE0); // enable PCI
}

ISR(PCINT0_vect) {
  if (digitalRead(PIN_RTC_INT) == LOW) {
    counter++;
    gotInterrupt = true;
  }
}

void loop() {
  if (gotInterrupt) {
    gotInterrupt = false;
    Serial.println(counter);
  }
  else {
    sleep_mode();
  }
}

なんとまあ、これがあっさり動いてしまった。たった2行の設定とISRの配置だけで! これはPro Microでも使える筈! いやー良かった。

2016-09-24 14.54.03 iPad Air 2 (3.3mm, f/2.4, 1/15 sec, ISO400)

とまあ、QduinoというよりATMega32U4の話題になってしまったが、今日のところはここまで。

追記: よくよく考えてみたら、SoftwareSerialとPCIの衝突問題がそのままだった。嗚呼。

追記:  更によくよく考えてみたら、Pro Micro/QduinoではSerial1でハードウェアシリアル(D0/D1)が使えるので1系統までならSoftwareSerialは不要だった(!)。でも今回、シリアルもういっちょ必要なんだよな … どうしよう。

追記:  ATMega32U4のPro micro/Qduino、これらのシリアルポートがしばしば行方不明になって、遂にはPCをリセットする羽目に。これは俺だけなんだろか? まあひと頃よりはだいぶ良くなったが、いちど発生すると毎回この有様だ。果たしてAVRのせいなのかPCのせいなのか、まるでわからんが困ったもんだ。

割り込み応答ルーチンにブレークポイントはった頃

昨夜はかつての恩人I氏と10年ぶりの再会。昔話で大盛り上がりの後は、いきおいというかやはりというか「最近の若いもんは …」的な愚痴ボヤキ大会に突入。結局「アセンブラな頃は楽しかったネ」な内容なんだが、実際あの時代、ヨソ様より速度を出すとかメモリを節約するとかでウデを競った時代が懐かしい。

そういう意味では、いい歳してArduinoで遊べている俺はシアワセなのかも。ここはいっちょ、I氏もこの方面にハマってくれるのを切に願うばかり ← そういうシメかい!

余剰PCでLinuxを動かしたあの頃

それを思い出した。

数年前、食うに困ってAndroidアプリケーションを書いた時期があった。はなから興味はなかったし、この歳にして嫌いなJavaの入門書の類を買うってのも癪にさわったが、それは思いのほかいい勉強になった。なかでも感心したのは、onなんたらで定義済みのイベントを使わなければ殆ど何もできない、というか「させて貰えない」ところ。ポータブル機器では何より省電力のためにイベントドリブンな作りが必須だが、それを強制するこのポリシーは◎である。

翻ってIOT流行りな昨今、仕事も趣味もArduinoばかりでとても楽しい。が、そこにはOSというモノ、概念がないのでその出来は良くも悪くも作る人次第。特に省電力というところに明確な指針がある訳ではないので、動いたはいいがレスポンスとかバッテリーとかの持ちが悪くて使い物にならない、というケースがしばしば。

そこでふと思ったのは「ArduinoにOSがあれば」。マルチタスクマルチユーザなら申し分ないが、そこまで行かずともシステムコールで割り込みはもちろん、タイマーとかI2Cまでサポートとなれば敷居はぐっと下がり、レベルも大きく底上げされる筈。更にはそこまでいけばsocketとかもOSレベルで見えてくるだろうし。

まずはATMega328限定で …  俺が作ってみようかな。

一難去ってまた一難

ProTrinketにはD2がない。つまりINT0が使えず、attachInterruptで使えるのはD3(=INT1)だけである。むろん割り込み要因がひとつだけならこれでも問題ないが、複数となるとお手上げ … と最初は思っていた。ところがATMega328にはピンチェンジ割り込み(以下PCIとする)という有難い機能があって、24本のピン全部がこれを使える上、SLEEP_MODE_PWR_DOWNからの復帰要因にもなるという。

実は今回正にこの2つめの割り込みを使うという局面を迎え、最初は焦ったが↑を思い出し、D4にタクトスイッチを付けてこれを試してみた。結果はOK。RISEとかFALLINGとかの判別は自分でやらなきゃいかんので少々面倒だが、これなら使える! よぉーし!!! と、この時は安心した。ところがこれを本プロジェクトに組み込んでみたところ、コンパイルでエラーが。

SoftwareSerial.cpp.o (symbol from plugin): In function `SoftwareSerial::read()’:(.text+0x0): multiple definition of `__vector_5’

「んんー? SoftwareSerialとでシンボルがバッティング?? なんでやねん???」と思いつつ調べてみたところ、なんとSoftwareSerialもこのPCIを用いて実装されていて、共存させるにはそっちのソースに手を入れなきゃダメというではないか orz …

アセンブラもどきなソース面に不吉なものを感じはしたが、やはりそう簡単ではなかった。上記対処で動いても、また何か起きそうな気もするし。

果たしてこの先どうしたもんか、寝てから考える事にした。

H.Berlioz “Te Deum”

せっかくの三連休も、この悪天候で出るに出られず。おかげで持ち帰った仕事も終わったし、ここでひさびさのニセピアニスト登場! 曲はベルリオーズの「テ・デウム」より一曲目。大オケ+合唱+独唱+オルガンというベルリオーズならではのそれのヴォーカル譜(のピアノ)なので、いわば練習用のカラオケ。好きな曲なもんで、作りながら歌えて楽しかった。折角だから歌詞載せとこう。

Te Deum laudamus (Hymne)

Te Deum laudamus; te Dominum confitemur,
Te veneratur omnis terra,
Te, aeternum Patrem, omnis terra veneratur.

むかーし、出たばかりのバレンボイムとパリ管のそれをFMで聞き、そのスピード感にやられてソク買いに走った。一昨年だかN響でこれをやった時、聴きに行かなかったのをいまだに後悔している。

ADXL345にいたく感動

秋月の「3軸加速度センサモジュール ADXL345」を仕事で使うことになった。バッテリー駆動の可搬型機器で、Pro Trinket(3.3V)から動かす。節電のためにもスリープ必須、delayでぶん回すなんぞもってのホカである。

最初は周期的に3軸の値を読み、差分で判断しようと考えた。だが、どうもスリープとタイマーとI2Cの相性がよろしくない。かと言って今からRTCを追加する訳にもいかず、ウーンとなってしまった。

一体どーしたもんかと思っていたら、ふとこのモジュールからINT1/2なるピンが出ているのに気づいた。慌てて取説をみるとなんとこのチップ、タップとか自由落下とかを自前で判断して割り込みを発生してくれるというではないか。「なんだそれ、早く言ってよ!」とばかりにその使い方について調べていたら、有難いことにそれをサポートするSparkFunのライブラリを発見! 感涙にむせびつつそれまで使っていたヨソ様のライブラリにご退場願い、サンプルを動かしてみることに。

結論から言えば約3時間後、それは動いた。SLEEP_MODE_PWR_DOWNからもこいつの割り込みでスカッと起きてくる。ヤレヤレという気分である。だがなんでこんなに時間がかかったのか? それは、肝心の割り込みがちーとも上がって来なかったから。Trinketのせいかもと、3番ピンにタクトスイッチを繋いでLチカしたが問題なし。そして悪戦苦闘の末、判明したのはgetInterruptSource()。どういう訳か、最初に一回これを呼んでからでないと割り込みが上がってこないのだ。理由なんぞさっぱりわからないが、動いたので今は○。

2016-09-19 12.42.17
iPad Air 2 (3.3mm, f/2.4, 1/15 sec, ISO320)
SparkFunの製品がないのが申し訳ない

とにかくこれで、仕事がウンと楽になった。苦手だった加速度センサも、これでもう大丈夫。お任せを、ははは! ← 人の褌で相撲を取る男

7セグ好きなわたし

たまたまAmazonで目にした「サインスマート TM1638 7セグメントLED表示器 + 8Keyパッド モジュール」なるものが安かったので買ってみた。尤もUNOとかで動作するであろう事はわかりきっているので、これが3.3V系で使えるかどうかを確かめるためである。まあダメならダメでレベル変換器でも挟めば(たぶん)済む話だが、果たしてその結果は …

2016-09-17 17.43.48 iPad Air 2 (3.3mm, f/2.4, 1/15 sec, ISO250)

ふふっ、ご覧の通りVccもIOピンも3.3VでOK! LEDの明るさを最大(7)にしても大丈夫。1時間以上動かしているが、何ら問題ナシ。

まあこのナリだし、使うとしても飽くまで回路のチェック用だが、場合によってはこのTM1638というICをハダカで使うのもアリかなと考えている。という訳で、まずはひと安心♪