arduinoの館->TopPage->各種ライブラリ->タイマー割り込みタイマー割り込みライブラリ<補足情報>現在、MsTimer2ライブラリの作者に、割り込み間隔の正確さについて確認を依頼中です。公開中のライブラリを元に私が修正を入れたものを作者宛にメールし、確認をお願い中です。そのライブラリソースを貼っておきます(右クリックでダウンロードしてください)。一応動作確認は行いましたが、この内容は無保証です。riskでお使いください。Librariesとして公開されています(バージョン0011公開時点)。以下に、タイマー割り込みの概要と、arduinoでのタイマー割り込み使用方法、サンプルスケッチを纏めます。点けたり消したりしても人間の目には点灯したままにしか見えないからです。見えるようになります。いうものが利用されます。「一定の時間間隔で特定の関数(処理)を呼び出す」仕組みです。行いたい場合などに使用します。これとよく対比されるのは遅延処理とか時間稼ぎ処理とか言われる処理です。delay()関数やdelayMicroseconds()関数などがそれにあたります。これら遅延処理の関数をループ処理の中に挟み込んでおけば、一定の間隔を空けて処理を繰り返すことが出来ます。その点ではタイマー割り込みと似ているのですが、動作タイミングの正確さという意味では少し違ってきます。以下の図にその違いを記します。遅延処理の場合まずは遅延処理を利用した場合の処理フローです。この図では、「処理A」と「遅延処理」をグルグルと繰り返すという処理内容になっています。遅延処理の間、arduinoはこの1秒間「何もしないということ」をしています(くまのプーさんと一緒です)。一般的にこの遅延機能は処理と処理の間に最低でも1秒間以上空ける必要があるときに用いられます。次にタイマー割り込みを利用した場合の処理フローです。制御を移し、処理Aが片付いたら中断したところからまた処理を再開するという流れになっています。正確に1秒毎に処理Aが実行されるので、「正確な時間間隔」で処理するのに適しています。呼び出されるので、当然ながら処理Aに要する処理時間は割り込み間隔(この図なら1秒)以内に収まってないといけません。定期的に処理を行いたいのかによってどちらを利用すればよいかを判断すればよいかと思います。用が足りると思われます。タイマー割り込みを用いる最も典型的な応用例は「時計」でしょう。ように設定しておいて、割り込みが発生する毎に秒針を1秒進めるといった具合です。時間がかかる処理を行うようにしています。割り込み間隔の精度ですが、これはarduinoボード上に使用するクリスタルの精度がそのまま現れます。超高精度オシレータを登載しているarduinoも見たこと無いですが...タイマー割り込みライブラリMsTimer2arduinoのタイマー割り込みライブラリは「MsTimer2」という名前で公開されています。arduino-IDEに組み込んでください。公開されていないようです)公式ページのここでダウンロードできます。うち、タイマー2というモノを利用して提供されます。自動的にカウントし、指定されたカウント値に達したらハードウェア割り込みを発生させるという機能を持っています。苦い薬も飲みやすくしてくれています。任意のユーザー関数を呼び出してくれるようになっています。正確に任意の関数を呼び出してくれます。用いられるタイマーですので、これらと同時に使うことは出来ません。読み解かないとよく解りません。「タイマーをスタートさせる機能」、「タイマーを停止させる機能」があります。割り込み間隔と割り込み先を指定するのは以下の書式で行います。関数名)ミリ秒に指定出来る範囲は、1ミリ秒~4294967295ミリ秒までです。最長約50日間隔で割り込みを発生することが出来ます(笑)。long型で定義されています。ULをつけないとコンパイル時にエラーが出るはずです。そんなに長い間隔で使うタイマー割り込みって、用途を思いつきませんが...。カウントの開始と中断はそれぞれMsTimer2::start()MsTimer2::stop()にて行います。startでカウント開始、stopでカウント中断です。両関数とも引数は要りません。したら、あとはカウントしっぱなしという使い方が多いと思います。サンプルスケッチ以下に、MsTimer2を使ったサンプルスケッチを記します。入っていたサンプルスケッチを殆どそのままです。全角不等号に置換してあります。{}0.5秒毎にLEDを点けたり消したりするスケッチです。loop()関数ですが、ご覧の通り何もしてませんね。空回しという状態です。このloop()関数に相当しています。普通はこのloop()関数内で主だった処理を行いながら、時々割り込みが入るという使い方をします。毎にflash()関数を呼び出すように設定しています。タイマーがカウントを始めます。(※:私のreduino-nanoはLEDが3番ピンなので...普通のarduinoであれば13番に設定してください)そして、flash()関数です。HIGHとLOWを繰り返します。