(これはアメブロからの移植です)
こんにちは。Yukiです。
今回は、Arduinoでdelay関数を使わずに、MsTimer2でLチカをしてみようと思います。
- 今回使用しているボードはArduino Nanoです
- Arduino IDEのバージョンは1.8.16です
なぜdelayを使わないのか
delay関数を使ってしまうと、delay関数の指定した時間分プログラムは止まってしまいます。
私の語彙力がないので上の文章ではわかりにくいので、簡単なプログラムで説明します。
void setup() {
pinMode(4,OUTPUT);
}
void loop() {
digitalWrite(4,HIGH);
delay(1000); //ここで1秒間プログラム全体が停止してしまう。
digitalWrite(4,LOW);
delay(1000); //ここで1秒間プログラム全体が停止してしまう。
}例えば、
- 4番ピンにつながっているLEDを1秒間隔で点滅させる
- 14番ピンにつながっているスイッチを押したら5番ピンのLEDを点灯させる
このようなプログラムをしたい場合、delay関数を使用すると、プログラムが複雑になってしまいます。下にプログラムの参考例を書いておきますが、分かりにくいプログラムです。また、点滅は1秒間のように見えますが、誤差が大きいです。
void setup() {
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(14, INPUT_PULLUP);
}
void loop() {
static int i = 0, j = 0; //staticで宣言することで値が消えない
i++;
if (i >= 1000)
{
if (j == 0)
{
digitalWrite(4, HIGH);
j = 1;
}
else
{
digitalWrite(4, LOW);
j = 0;
}
i = 0;
}
if (digitalRead(14) == 0)
{
digitalWrite(5, HIGH);
}
else
{
digitalWrite(5, LOW);
}
delay(1); //1ms待つことで大体1000msを測定しているこのようにプログラムが長い・わかりにくい・デバッグしにくいのスリーアウトです。さらに、時間が正確ではないため、通信などの、時間の精度が要求させるような箇所では、使えません。
これらのデメリットから、タイマーという、マイコンの機能を使用します。
タイマーとは
キッチンタイマーなどと同じで一定時間たてば通知してくれるような機能です。
Arduino UNOであるATMEGA328PにはTimer0,Timer1,Timer2があります。
ただしTimer0はArduino内部で使用されています。
具体的にはdelayはTimer0で動作しています。
そのためTimer0は基本いじらないのが通例です。
今回はTimer2を使用したライブラリ MsTimer2を使用したいと思います。
MsTimer2の準備
まずはMsTimer2というライブラリをダウンロード&インストールします。
スケッチ → ライブラリをインクルード → ライブラリを管理… からライブラリマネージャを起動
ライブラリマネージャの上にある検索欄にmstimer2と入力し、mstimer2をインストールします。

上の画像のように、INSTALLEDになれば準備完了です。
MsTimer2を使ってLチカする
実は、MsTimer2のスケッチ例に、Lチカ用のプログラム例があります。
なので、今回は、先ほど行った
- 4番ピンにつながっているLEDを1秒間隔で点滅させる
- 14番ピンにつながっているスイッチを押したら5番ピンのLEDを点灯させる
をMsTimer2を使って行おうと思います。
#include <MsTimer2.h> //MsTimer2を使用するため
void led()
{
static bool q = true; //bool型 true もしくはfalseを保持できる
digitalWrite(4, q);
q = !q; // !をつけることでNOTできる(trueとfalseを変えられる)
}
void setup() {
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(14, INPUT_PULLUP);
MsTimer2::set(1000, led); //1000msごとにled()を読み出し
MsTimer2::start(); //MsTimer2スタート
}
void loop() {
if (digitalRead(14) == 0)
{
digitalWrite(5, HIGH);
}
else
{
digitalWrite(5, LOW);
}
}MsTimer2を使うと、簡単にタイマー機能を使うことが出来ます。
また、比較的わかりやすく、処理速度に依存しない、正確な1秒点滅を実現できました。


コメント