Menu
CoddyTech

micros()で測定する

CoddyのArduinoジャーニー「delayを使わないタイミング制御」セクションの一部。レッスン 16/18。

millis()はミリ秒単位で数えるため、短い時間を測るには大まかすぎます。2.5 msの押下は、2または3と表示されます。micros()も同じ種類の時計ですが、マイクロ秒、つまり1秒の100万分の1単位で数えます。1ミリ秒あたり1000マイクロ秒です。

Unoでは4マイクロ秒刻みで増加し、こちらもunsigned longを返します。時間を測るには、前後で値を読み取り、差し引きます。

unsigned long start = micros();
int reading = analogRead(A0);
unsigned long took = micros() - start;
Serial.println(took);   // 約110:analogRead()には約0.1 msかかる

数える速度がとても速いため、micros()はmillis()よりずっと早く数値が尽きます。約70分後に0から再び始まります。短い時間の測定にはこれを使い、数分を超える時間にはmillis()を使いましょう。

challenge icon

チャレンジ

簡単

ボタンが押されている時間をマイクロ秒単位で測定します。

  • ボタンが押されたとき、micros() を pressedAt に保存します
  • ボタンが離されたとき、micros() - pressedAt を出力します

Run を押し、ボタンをタップしてから、Check を押します。

自分で試してみよう

const int buttonPin = 2;

bool wasPressed = false;
unsigned long pressedAt = 0;

void setup() {
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.begin(9600);
}

void loop() {
  bool pressed = digitalRead(buttonPin) == LOW;

  if (pressed && !wasPressed) {
    // ボタンが押されたところ:時刻を記録する
  }

  if (!pressed && wasPressed) {
    // ボタンが離されたところ:押されていた時間をマイクロ秒単位で出力する
  }

  wasPressed = pressed;
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

delayを使わないタイミング制御のすべてのレッスン

自分で練習してみよう: Arduinoプレイグラウンド