タイマー割り込みで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ボードに書込みを行います。
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-2020 Shigehiro Kimura All Rights Reserved.