ミニ四駆ラップタイマーを作った

きっかけ

前回ミニ四駆のコースを自作したので、Arduinoでラップタイマーを作った。
ミニ四駆をチューンアップする時の指標にしたい。

youtu.be

以下のようにシリアルモニタにタイムが記録される。
f:id:nao_bamboo:20150829002342p:plain

作り方

用意するもの

今回使ったのは、Arduino Unoと超音波センサーのHC-SR404。
HC-SR404は秋月電子で買ってきたのだが、スイッチサイエンスのオンラインストアを見ると、不具合が発生していて、現在(2015年8月)販売していないようだ。

mag.switch-science.com

買ってきたものも正にこの症状が出ているので、今から買うならちょっと待った方が良さそうだ。

ブレッドボード図

f:id:nao_bamboo:20150828235358p:plain

ソースコード

ソースコードは以下の通り。
超音波が反射して返ってくるまでの時間を距離に変換し、ミニ四駆が通過したことを検知する。
一箇所、時間=>距離変換で、
duration * 340 * 100 / 1000000 (音が1秒に進むのが340m)
とやってしまうと、Arduino Unoでは桁数の問題のためか計算ができなかった。

//******************
//* ミニ四駆ラップタイマー
//******************

const float kCheckDistance = 5.0;  // ミニ四駆が通過したと判定する距離
int duration = 0;                  // 超音波が反射するまでの片道時間
float distance = 0;                // 測定物までの距離(cm)
float base_time = 0;               // 1ラップ目のスタート時間
float lap_start = 0;               // 各ラップのスタート時間
float lap_end = 0;                 // 各ラップのゴール時間
float lap_time = 0;                // ラップタイム
int lap_count = 0;                 // ラップ数

void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  pinMode(3, INPUT);
}

void loop() {
  digitalWrite(2, HIGH);
  delayMicroseconds(10); // 10μs間出力
  digitalWrite(2, LOW);
  duration = pulseIn(3, HIGH) / 2; 
  
  // 時間から距離を算出
  // duration * 340 * 100 / 1000000が計算できない
  distance = (float) duration * 34  / 1000;

  if(distance > 0 && distance < kCheckDistance) { // 通過判定の場合
    if(lap_count == 0) {
      base_time = (float) millis() / 1000;
      Serial.println("Start!");
    } else {
      Serial.print("[Lap");
      Serial.print(lap_count);
      Serial.print("] "); 
      lap_end = (float) millis() / 1000 - base_time;
      lap_time = lap_end - lap_start;
      Serial.print("Start: ");
      Serial.print(lap_start, 3);
      Serial.print(" End: ");
      Serial.print(lap_end, 3);
      Serial.print(" Laptime: ");
      Serial.println(lap_time, 3);
  
      lap_start = lap_end; // ラップのゴール時間は次のラップのスタート時間
    }
    lap_count++;
    delay(2000); // 2秒間は判定しない
  }
  delay(10);
}

Arduino エントリーキット(Uno版)- Physical Computing Lab

Arduino エントリーキット(Uno版)- Physical Computing Lab