●Arduinoでタイマー

タイマーと言ってもパソコンのアプリケーションやVisualBasicなどのタイマーとは全く違って、ハードウエアにべったりな仕組みで割り込みにより動作します。
マイコンには、クロックとともにカウントアップするレジスタがハード的に作られており、 値がオーバーフローすると割り込みを発生させる仕組みによりタイマーは動作します。
時間の設定はどうするのかって?それは、オーバーフロー毎に初期値に任意の値を入れて桁溢れまでの時間を調整して設定してるんです。

AVRマイコンには3つのタイマーがハードウエア的に存在しておりUNOの場合では、

Timer0 : システムの動作や時間の管理などで使われている、5と6番のPWM出力で利用される。
Timer1 : Servoライブラリで使われており、デジタルピン9・10番のPWMで利用される。
Timer2 : tone()とデジタルピン3・11番のPWMで利用される。

マイコンの種類が変わると変わりますので調べる必要があります。
しかしながら、ハードウエアのレジスタを設定してタイマーを使うのはメチャメチャ難解になって 時間がかかってしょうがないのでサクッとMsTimer2ライブラリを使用します。
なぜ、2が付いているのかって?たぶんそれは、Timer2を利用(占領)して動作するからだと思います。
占領するから他の処理は同じTimerを使えなくなっちゃいます。
そのため、tone()と3,11番ピンのPWMは使用できなくなるのは承知の上で。

MsTimer2ライブラリで指定できる時間は1/1000秒単位で割り込み間隔を指定します。
指定出来る範囲は、1ミリ秒〜4294967295ミリ秒までですので長い方は気にしなくてもいいようです。

Timer2が使われていて他のタイマーが使いたい時は、TimerOneなどを検索してください。
ちなみにTimer0はシステムの動作に使われているため占有する事はできないはずです。


▼ライブラリのインストール

ライブラリマネージャを開いて、mstimer2と検索してインストールします。




▼サンプルプログラム

ライブラリをインストールしたら次のプログラムをコンパイル出来るはずです。
実行すると基板上のLEDが1秒毎にチカチカします。

#include <MsTimer2.h>

volatile int i;

void timer() {
  i=!i;
  digitalWrite(LED_BUILTIN,i);
}

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  MsTimer2::set(1000, timer);
  MsTimer2::start();
}

void loop() {
}

要となるのは赤文字部分の3行のみです、ほんと、ライブラリはすばらしいですね。
ちなみにタイマーを無効にするには MsTimer2::stop() を呼び出します。
簡単そうなんですけど割り込みですからね。
Arduinoで割り込みを使うを押さえておくとチョットはラッキーになれるかもしれません。


▲トップページ > マイコンなど