Arduinoのタイマー割り込みを使おうとすると若干煩雑なのでライブラリが欲しいですよね。それに、ポータビリティも大事だと思うんです!筆者はATmega32U4しか持っていないので、ATmega328P前提のコードだと動かないことがあるんです…。
でも例によってライブラリ使う人が少ない業界だなーという印象で、これ使っておけば鉄板みたいなライブラリは無いのかも。
FlexiTimer2
一番メンテされてそうなライブラリで、名前の通りタイマー2を使うもの。後述するMsTimer2
の改良版で、割り込み間隔を自由に設定できます。
#include <FlexiTimer2.h>
void flash() {
static boolean output = HIGH;
Serial.println(output);
output = !output;
}
void setup() {
Serial.begin(9600);
FlexiTimer2::set(500, flash); // 500ms period
FlexiTimer2::start();
}
void loop() {
}
上のサンプルだとMsTimer2
との違いが全くわかりませんが、3引数のFlexiTimer2::set(units, resolution, f)
を使えば1msより細かい単位での割り込みが指定できます。
- wimleers/flexitimer2
- Arduino Playground - FlexiTimer2
- MsTimer2 and FlexiTimer2 Arduino Libraries, Run a Function At Regular Intervals
MsTimer2
1ms単位で割り込み間隔を指定できます。やはりタイマー2を使います。
#include <MsTimer2.h>
void flash() {
static boolean output = HIGH;
Serial.println(output);
output = !output;
}
void setup() {
Serial.begin(9600);
MsTimer2::set(500, flash); // 500ms period
MsTimer2::start();
}
void loop() {
}
ネット上にはATmega32U4で動かないという記述も見つかりますが、最新バージョンでは対応済みです。
- PaulStoffregen/MsTimer2
- Arduino Playground - MsTimer2
- MsTimer2 and FlexiTimer2 Arduino Libraries, Run a Function At Regular Intervals
現在GitHubリポジトリをメンテしているPaul StoffregenさんはTeensyを開発しているPJRC社の社長さんかな…?
対応アーキテクチャ
両ライブラリとも下記のアーキテクチャに対応しています。
- ATMega48/88/168/8
- ATMega128
- ATmega328P
- ATmega1280
- ATmega2560
- AT90USB1286
- AT90USB646
- ATmega32U4(note: uses timer4 on ATmega32U4)
- Teensy 3.0
- Teensy 3.1
注意点
割り込みのタイミングでレジスタがクリアされちゃうので、割り込みを使う場合は割り込まれる側の変数宣言にvolatile
キーワードをつけましょう。当然ですけど、これはライブラリを使わなくても同じです。