DelayからTimer割り込みに変更
Arduinoの処理でdelay命令を使用すると、その間Arduinoの処理が止まってしまうのでdelay命令を使用しないでタイマー割り込みで処理することにより、サーボモータ、LED、その他センサーを同時に動作させるように改良してみました。変更方法を簡単に説明してみます。
まずはdelay命令を使用した場合(LED1Sec毎の点滅)
1 2 3 4 5 6 7 8 9 10 11 12 |
void setup() { // initialize digital pin 13 as an output. pinMode(13, OUTPUT); } // the loop function runs over and over again forever void loop() { digitalWrite(13, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(13, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second } |
タイマー割り込みの場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
#include <MsTimer2.h> volatile boolean tim1msF; // タイマー 1msフラグ volatile boolean tim10msF; // タイマー 10msフラグ volatile boolean tim100msF; // タイマー 100msフラグ volatile boolean tim1SecF; // タイマー 1Secmsフラグ int tim1msCnt = 0; int tim10msCnt = 0; int tim100msCnt = 0; boolean ledOutF = false; void setup() { // initialize digital pin 13 as an output. pinMode(13, OUTPUT); MsTimer2::set(1, timer1mS); // MsTimer2::start(); } // ********** タイマー割り込み 毎1ms ********** void timer1mS() { tim1msF = true ; // 1mSec毎 tim1msCnt += 1; if (tim1msCnt >= 10) { tim1msCnt = 0; tim10msF = true;// 10mSec毎 tim10msCnt += 1; if ( tim10msCnt >= 10) { tim10msCnt = 0; tim100msF = true;// 100mSec毎 tim100msCnt += 1; if (tim100msCnt >= 10) { tim100msCnt = 0; tim1SecF = true;// 1Sec毎 } } } } // ********** LED 出力 ********** void ledOut() { ledOutF = !ledOutF; // LED 出力反転用フラグ if (ledOutF) { digitalWrite(13, HIGH); // turn the LED on } else { digitalWrite(13, LOW); // turn the LED off } } // ************* LOOP ******************** void loop() { // ******* 毎1mS の処理******************* if (tim1msF) { tim1msF = false ; // ここに処理を記入 } // ******* 毎10mS の処理******************* if (tim10msF) { tim10msF = false ; // ここに処理を記入 } // ******* 毎100mS の処理******************* if (tim100msF) { tim100msF = false ; // ここに処理を記入 } // ******* 毎1Sec の処理******************* if (tim1SecF) { tim1SecF = false ; // ここに処理を記入 ledOut(); } } |
タイマー(TIMER2)割り込みを利用して1mSec毎にtimer1mS()を呼び出すように設定し、1mSec,10mSec,100mSec,1Sec毎にフラグをtrueにして、LOOP処理の中でフラグをチェックしフラグがあれば処理を行うようにしています。今回の例は、最小1mSec単位の処理ができるようにしています。なお、タイマー(TIMER2)は、標準のライブラリーに入っていないのであらかじめライブラリにインストールする必要があります。ライブラリーにインストールする方法は『Arduino timer2』などで検索するといろいろ説明がでてきます。
なお、割り込みの中で使用している変数を割り込み外で使用するときはvolatileを付けないといけないようです。このあたりも検索して調べてもらうと詳しい説明が見つかると思います。
とりあえずマグボットの上下の動き、左右の動き、口のLEDの点滅を同時に制御したいと思いArduinoのサンプルプログラムをタイマー割り込みに変更して使用しています。