タイマー割り込みでLEDを点滅させます

〔Arduinoの動かせ方入門に戻る〕



タイマー(TIMER2)割り込みを利用してボードに付属(搭載)の13番ピン接続LEDを点灯させます。

割込みとは?
 たとえば、Aさんと電話していて、Bさんから割込みキャッチホンがはいれば、
 Bさんと話して終わったらAさんと続きを話しますよね、これと同じ事です。
 プログラムのloop( )を処理中にTIMER2割込みがはいれば、loop( )を一時中断後、
 指定の割り込み関数(下記サンプルスケッチではflash( )です)を処理して再びloop( )を再開します。

《タイマー割込みを利用する為のスケッチをダウンロード》

@まずはこちらのサイトにアクセスし、"MsTimer2.zip"をダウンロードします。

A"MsTimer2.zip"を解凍します。
  ArduinoIDEがインストールされているフォルダー、インストール先を変更していないなら
  [C:\Program Files\arduino-x.x.x\libraries]です。(x.x.xはIDEのバージョンです)
  この場所に上記解凍ファイルを[MsTimer2]ディレクトリ丸ごと移動します。

《スケッチの実行》

"MsTimer2.zip"に付属のサンプルスケッチを動かします。

@arduinoボードはUSBケーブルで接続して、arduino IDE(1.0.1)を起動させます。

AIDEのメニューバーから[ファイル]→[スケッチの例]→[MsTimer2]→[FlashLed]を選択して、
  サンプルスケッチを読み込みます。

CIDEツールバーの赤枠部分「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。

upload

D正常終了後、内蔵13番LEDが1秒毎に点滅すると思います。

下記に"FlashLed"のスケッチを記載します、ただし日本語コメントを追記しています。
---------------------------------------------------------------------
#include <MsTimer2.h>            // タイマー割り込みを利用する為に必要なヘッダファイル

// 割り込み時に処理される関数
void flash() {
  static boolean output = HIGH;  // プログラム起動前に1回だけHIGH(1)で初期化される

  digitalWrite(13, output);      // 13番ピン(LED)に出力する(HIGH>ON LOW>OFF)
  output = !output;              // 現在のoutput内容を反転(HIGH→LOW/LOW→HIGH)させoutputにセットする
}
// 電源起動時とリセットの時だけのみ処理される関数(初期化と設定処理)
void setup() {
  pinMode(13, OUTPUT);           // 13番ピンを出力に設定(13番ピンにLEDが接続されている為)

  MsTimer2::set(500, flash);     // 500ms毎にflash( )割込み関数を呼び出す様に設定
  MsTimer2::start();             // タイマー割り込み開始
}
// 繰り返し実行される処理の関数(メインの処理)
void loop() {
     // 今回は無処理(通常は何か処理が記述されています)
}
---------------------------------------------------------------------
このサンプルは500ms毎にflash( )割込み関数が呼び出されます、flash( )割込み関数内では
LEDをON/OFFしているだけですが、定周期で何か他の処理をさせたい場合に役立ちます。

スケッチの処理図
ですのでflash( )の処理が500msを超えるとちょっとぉまずくなります。
尚、flash( )は名前を変更可能です。

MsTimer2の他の関数(メソッド)として、
MsTimer2::stop( ) が有ります、これはタイマー割り込みを停止させます。
尚、MsTimer2に関する内容は”Arduino 日本語リファレンス”を参照下さい。

(注意) MsTimer2を使うとtone( )関数が利用できません、
    また13番ピンと11番ピンからのPWM出力(analogWrite( )関数)もできません。


※ 可変抵抗を利用してLEDの点滅速度を可変したい人はこちらを参考にして下さい。

《FlexiTimer2》  *1)

「MsTimer2に基づいているのでFlexiTimer2と呼ばれるが、
それは設定可能なタイマーの分解能を有しているため、より多くの柔軟性を提供しています。」
らしい、
"MsTimer2"は、ARDUINO MEGA/Arduino Leonardo等では利用出来なかったが
"FlexiTimer2"では対応しています。
なので、"FlexiTimer2"を使う事をお勧めします、使い方は"MsTimer2"と同じです。

ダウンロードは、こちらです。

FlexiTimer2::set(500, flash) ; // 500ms毎に割込み発生
とこの様に記述出来ますが、以下の様にも記述可能です。
FlexiTimer2::set(500, 1.0/1000, flash) ; // 500ms毎に割込み発生
これで、"us"単位でも割込みを発生させる事が出来る様になりました。
FlexiTimer2::set(500, 1.0/1000000, flash) ; // 500us毎に割込み発生

《Timer1/3/4/5》  *1)

その他のタイマーを利用したい場合はこちら(GitHub)のページを利用しましょう。

ATmega168/328(Arduino Uno等):
Timer1を使用する場合、9/10ピンのPWM出力が無効になります。
ATmega2560(Arduino Mega):
Timer1を使用する場合、11/12ピンのPWM出力が無効になります。
Timer3を使用する場合、2/3/5ピンのPWM出力が無効になります。
Timer4を使用する場合、6/7/8ピンのPWM出力が無効になります。
Timer5を使用する場合、44/45/46ピンのPWM出力が無効になります。

※ これを利用すると、millis(), micros(), delay() and delayMicroseconds()が使えないみたいな事が
  書いて有るので、いまいちかもね。



追記(*1) 2015/04/20


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2015 Shigehiro Kimura All Rights Reserved.