タイマー割り込みライブラリ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チカ』です。
スケッチ
#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(){
}
プログラムの解説
ライブラリのインクルード
#include "MsTimer2.h"
まず最初に、MsTimer2.h をインクルードします。
Lチカのための定数
#define LEDPIN 13
ボード上のLED(L)が接続されているピン番号を定数LEDPINとして定義しています。Lチカ動作のためのもので、タイマーとは直接関係ありません。
コールバック関数の定義
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チカのための初期化
void setup() {
pinMode(LEDPIN, OUTPUT);
setup()関数の最初、pinMode()関数は、ボード上のLEDが接続された入出力端子LEDPINを出力に設定しています。Lチカ動作のための設定です。
タイマーの設定
MsTimer2::set(1000, callbackfunc);
まず、タイマーの設定を行うには、MsTimer2::set()関数を使用します。
書式:
void MsTimer2::set(unsinged long time, void* func)
引数:
名前 | 型 | 意味 |
---|---|---|
time | unsigned long | タイマーの周期(ms) |
func | void* | コールバックする関数 |
・タイマーの周期はms単位の整数です。よって、1msより短い間隔は指定できません。
・funcはコールバック関数(タイマー割り込みで呼び出したい関数)です。型としては『関数へのポインタ』ですが、要は定義した関数の名前(引数のカッコ部分は書かず、関数名だけ)を記述すれば大丈夫です。
この例では、1000ms=1秒ごとに callbackfunc() を呼び出すように設定しています。
タイマーの開始
MsTimer2::start();
タイマーを開始します。タイマーの開始には MsTimer2::start()関数を使用します。
書式:
void MsTimer2::start()
この関数には、引数も返却値もありません。
loop()内ではなにもしない
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ライブラリを使用すると簡単
コメント