Warning: Trying to access array offset on value of type bool in /home/cycos/cammy.co.jp/public_html/technical/wp-content/themes/cocoon-master/lib/utils.php on line 2604

Warning: Trying to access array offset on value of type bool in /home/cycos/cammy.co.jp/public_html/technical/wp-content/themes/cocoon-master/lib/utils.php on line 2604

Warning: Trying to access array offset on value of type bool in /home/cycos/cammy.co.jp/public_html/technical/wp-content/themes/cocoon-master/lib/utils.php on line 2632

delay

説明

指定したミリ秒プログラムの動作を止めます。

書き方 delay(ミリ秒)  1000は1秒です
戻り値 なし
引数 (unsigned long)ミリ秒 … 32767より大きい整数を指定するときは、値の後ろにULを付け加えます。例 delay(60000UL)

プログラム例

int ledPin = 13;              // LED connected to digital pin 13

void setup() {
  pinMode(ledPin, OUTPUT);    // sets the digital pin as output
}

void loop() {
  digitalWrite(ledPin, HIGH); // sets the LED on
  delay(1000);                // waits for a second
  digitalWrite(ledPin, LOW);  // sets the LED off
  delay(1000);                // waits for a second
}

注意

delayはプログラムの動き(CPUの動き)を完全に指定した時間止めてしまいます。
上記のプログラム例のように1秒おきに点滅するLEDのプログラムを作った場合、このプログラムは確かにその通りの動きをしますが、残念ながら、1秒間止まっている間、すべての動作が止まってしまいます。

これは、例えばクムクムロボットでいうと、顔を左端から右端に回転させながらLEDを点滅させるプログラムを組みたいと思ったとき、顔の動きは1秒ごとにしか動かないため、カウカクとLEDの点滅と連動をした動きしかできなロボットが出来上がってしまいます。

そんな時はArduinoではmillis()を使うように推奨しています。

delayは割り込みを妨げない実験

delay関数は割り込みを妨げないと記述されているため、タイマー割り込みのライブラリーと合わせて実験をしてみました。

下記は13番に接続されたLED(ほとんどのArduinoのボードに標準で搭載済み)をタイマー割り込みで50msec単位で点滅させておき、loopでは1秒おきに赤いLEDを点滅させるプログラムです。

もし、delayがタイマー割り込みん邪魔をするのであれば、13番のLEDの点滅周期は不定期になるはずですが、決してそんなことはありません。

#include "MsTimer2.h"            // タイマー割り込みを利用する為に必要なヘッダファイル

// 割り込み時に処理される関数
void flash() {
  static boolean output = HIGH;  // プログラム起動前に1回だけHIGH(1)で初期化
  digitalWrite(13, output);      // 13番ピン(LED)を出力する(HIGH>ON LOW>OFF)
  output = !output;              // outputの内容を反転させる
}
void setup() {
  pinMode(13, OUTPUT);           // 13番ピンを出力に設定(LED)
  pinMode(12, OUTPUT);           // 12番ピンを出力に設定(LED)
  MsTimer2::set(50, flash);     // 500ms毎の割り込み、その時に処理する関数flash( )を呼び出し
  MsTimer2::start();             // タイマー割り込み開始
}
// 繰り返し実行される処理
void loop() {
  digitalWrite(12,HIGH) ;
  delay(1000);
  digitalWrite(12,LOW) ;
  delay(1000);
}
タイトルとURLをコピーしました