Arduino UNO R3 でタイマー割り込みを使う

Arduino

タイマー割り込みライブラリMsTimer2

Arduino UNO R3以前でもタイマー割り込み機能があるはずだよな?ServoでPWMを出力し続けるなど、タイマー割り込み機能がないと実現できないはずだしな?と思って探したら、ちゃんと MsTimer2 というライブラリがありました。

※このライブラリは Arduino UNO R3 のためのものです。R3とR4では搭載しているマイクロプロセッサが異なるため、割り込みのようなハードウェアに密着した機能には互換性がありません。

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

MsTimer2は標準ではインストールされないライブラリなので、手動でインストールが必要です。

1.

①Arduino IDEを起動し、メニューバーの『ツール』→『ライブラリを管理』を選択するか、またはArduino IDEウィンドウ左側の本棚のアイコンをクリックして『ライブラリマネージャー』を表示します。

2.

②Arduino IDEウィンドウの左側に『ライブラリマネージャー』が表示されrので、上部のテキスト入力欄に『MsTimer2』と入力します。

③下に検索結果が表示されるので、『MsTimer2』の項の『インストール』ボタンをクリックします。

※『MsTimer2』という項目が表示されるのに『インストール』ボタンがなく、代わりに『削除』と表示されている場合は、すでにMsTimer2がインストールされています。

3.

④『ライブラリMsTimer2○○のインストールに成功しました』(○○はバージョン)というメッセージが表示されたらインストール完了です(このメッセージは数秒で自動的に消えてしまいます)。

早速サンプル

MsTimer2の基本的な使用法は非常に簡単なので、サンプルスケッチを見ていただくのが早いと思います。ネタは例によって『Lチカ』です。

スケッチ

C++
#include "MsTimer2.h"

#define LEDPIN 13

void callbackfunc()
{
  static bool led=false;
  if(led){
    digitalWrite(LEDPIN, HIGH);
  }else{
    digitalWrite(LEDPIN, LOW);
  }
  led = !led;
}

void setup() {
  pinMode(LEDPIN, OUTPUT);
  MsTimer2::set(1000, callbackfunc);
  MsTimer2::start();
}

void loop(){
 
}

プログラムの解説

ライブラリのインクルード
C++
#include "MsTimer2.h"

まず最初に、MsTimer2.h をインクルードします。

Lチカのための定数
C++
#define LEDPIN 13

ボード上のLED(L)が接続されているピン番号を定数LEDPINとして定義しています。Lチカ動作のためのもので、タイマーとは直接関係ありません。

コールバック関数の定義
C++
void callbackfunc()
{
  static bool led=false;
  if(led){
    digitalWrite(LEDPIN, HIGH);
  }else{
    digitalWrite(LEDPIN, LOW);
  }
  led = !led;
}

コールバック関数は、タイマー割り込みによってシステムから自動的に呼び出される関数です。つまり、この関数の中に『タイマー割り込みによって定期的に実行したい処理』を記述します。

ここではコールバック関数に callbackfunc() というそのまんまな名前を付けていますが、関数の名前は任意です(タイマー設定の際に『どの関数を呼ぶか』を設定します)。

内容も任意です。『必ずやらなければ行けないこと』『返さなければいけない値』などはありません。単に『タイマー割り込みによって定期的に実行したい処理』を書くだけです。

この例では、この関数が1回呼び出されるたびにLEDPINの出力をHIGH→LOW→HIGH→LOW→…と交互に切り替えるようになっています。

Lチカのための初期化
C++
void setup() {
  pinMode(LEDPIN, OUTPUT);

setup()関数の最初、pinMode()関数は、ボード上のLEDが接続された入出力端子LEDPINを出力に設定しています。Lチカ動作のための設定です。

タイマーの設定
C++
  MsTimer2::set(1000, callbackfunc);

まず、タイマーの設定を行うには、MsTimer2::set()関数を使用します。

書式:

C++
void MsTimer2::set(unsinged long time, void* func)

引数:

名前意味
timeunsigned longタイマーの周期(ms)
funcvoid*コールバックする関数

・タイマーの周期はms単位の整数です。よって、1msより短い間隔は指定できません。

・funcはコールバック関数(タイマー割り込みで呼び出したい関数)です。型としては『関数へのポインタ』ですが、要は定義した関数の名前(引数のカッコ部分は書かず、関数名だけ)を記述すれば大丈夫です。

この例では、1000ms=1秒ごとに callbackfunc() を呼び出すように設定しています。

タイマーの開始
C++
  MsTimer2::start();

タイマーを開始します。タイマーの開始には MsTimer2::start()関数を使用します。

書式:

C++
void MsTimer2::start()

この関数には、引数も返却値もありません。

loop()内ではなにもしない
C++
void loop(){
 
}

setup()関数内だけでタイマー割り込み処理に必要な作業は終わっているので、loop()内には何も記述しなくてもLチカします。

loop()内に処理を記述すると、タイマー割り込みとloop()内の処理が相互に無関係に実行されます。

実行結果

ボード上のLED(L)が、点灯(1秒)→消灯(1秒)→点灯(1秒)→消灯(1秒)→…を繰り返します。

Arduino UNO R4で実行しようとすると

このプログラムを Arduino UNO R4で実行しようとすると、

MsTimer2 library only works on AVR architecture
#error MsTimer2 library only works on AVR architecture

というエラーが出てしまい、動作しません。

まとめ

・Arduino UNO R3以前で一定時間ごとに割り込み処理を行うためには、MsTimer2ライブラリを使用すると簡単

コメント

タイトルとURLをコピーしました