Arduinoのタイマー割り込みをロボットで試してみる

プログラミングのなかで、絶対にほかの処理に影響を与えられないで確実に一定間隔で動作をしてほしいという場合、タイマー割り込みという機能を使います。

Arduinoでは、IDEをダウンロードした素のままの状態ではこの機能を使うことができませんが、Arduinoの公式サイトでは、このタイマー割り込みを使えるようにするための拡張ライブラリーが提供されています。

クムクム[QX-001R3J]で使えるタイマーライブラリー

Arduino公式サイトには、MsTimer2FlexiTimer2というライブラリーが用意されています。
使い方は全く同じなのですが、対応しているCPUによってどちらを使うか選択するようです。
クムクム[QX-001R3J]は、ATMEGA32U4(ArduinoLeonardo)を使用しているため FlexiTimer2を使用してプログラミングを行います。

各タイマー割り込みライブラリが対応しているCPU

FlexiTimer2
ATmega8,ATmega128,ATmega168,ATmega48,ATmega88,ATmega328P,ATmega1280,ATmega2560,AT90USB646,AT90USB1286,ATmega32U4
MsTimer2
ATmega8,ATmega128,ATmega168,ATmega48,ATmega88,ATmega328P,ATmega1280

プログラミング

ライブラリーの準備

まずはライブラリーをダウンロードしArduinoIDEの環境で使えるようにします。

上記サイトからダウンロードしたzipファイルをArduinoIDEのメニュー[スケッチ]-ライブラリーをインクルード-.zip形式のライブラリーをインストールを選択しダウンロードしたファイルをインストール

インストールが終わるとメニュの中にライブラリーが表示されますので、そのライブラリをクリックすることで、IDEソースコードエディタに #include 文が挿入されます。

私の場合は、ダウンロードされたzipファイル名が wimleers-flexitimer2-v1.1-0-g7338cfb.zip だったので、ライブラリ一覧には[wimleers-flexitimer2-v1.1-0-g7338cfb]と表示されていました。

プログラム

動き

このプログラムは、顔を0~180度(右から左)まで1秒間隔で回転をさせる間に、その動きとは全く関係なくLEDの赤色と440Hz,880HzのBEEP音がしっかり500msec単位で点滅と発音を繰り返しています。

メインのloopの中で、顔を動かしたあとに delay(1000)で1秒間メインループはプログラムの動きを一時停止しているにも関わらず、PicoPicoという関数は500msecごとに定期的に動作してるところがポイントです。

関数仕様

FlexiTimer2 :: set(unsigned long units、double Resolution、void(* f)())
この関数は、unitsresolutionで分解能を指定することでより細かいタイマー時間を設定するjことができます。
たとえばunits=1resolution = 1.0/3000f1秒間に3000回呼び出されますが、units=2としたの場合は1秒間に1500回しか呼び出されません。
void(* f)には時間ごとに呼び出す関数の名前を指定します。
例)FlexiTimer2::set(500, 1.0/1000000, flash) ; // 500us毎に割込み発生

FlexiTimer2 :: set(unsigned long ms、void(* f)())
この関数は、ミリ秒単位での割り込みを指定する場合に使用します。
void(* f)には時間ごとに呼び出す関数の名前を指定します。

FlexiTimer2 :: start()
割り込みを有効にします。

FlexiTimer2 :: stop()
割り込みを無効にします。

 

コメント

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