このブログは、サーバー代など、運営費のため広告やアフェリエイトがあります。
大変申し訳ありませんが、ご理解よろしくお願いします。

このブログは、サーバー代など、運営費のため広告やアフェリエイトがあります。
大変申し訳ありませんが、ご理解よろしくお願いします。

Arduino delayを使わずにMsTimer2でLチカをやってみる

MsTimer2がINSTALLEDになっているかの画像(ライブラリマネージャー) 電子工作
スポンサーリンク

(これはアメブロからの移植です)

こんにちは。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秒点滅を実現できました。

参考になったら、コーヒー1杯奢ってくれるとうれしいです
Buy Me A Coffee
電子工作
スポンサーリンク
シェアする
denshi1996をフォローする
スポンサーリンク

コメント

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