Arduinoのタイマー割り込みライブラリの調査

  • 18
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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より細かい単位での割り込みが指定できます。

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で動かないという記述も見つかりますが、最新バージョンでは対応済みです。

現在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キーワードをつけましょう。当然ですけど、これはライブラリを使わなくても同じです。