超音波測距センサーと赤外線測距センサーとを使って距離計を作った。
とりあえずセンサーとスケッチの動作確認だけした。
センサー面(左上にあるのが超音波センサー、右上が赤外線センサー):
ディスプレイ面(上段の数字が超音波センサーの計測値、下段が赤外線センサーの計測値):
マイコン基板は、Arduino 互換機(『作って遊べるArduino互換機』)を使った。スケッチは、『Prototyping Lab ―「作りながら考える」ためのArduino実践レシピ (Make:PROJECTS)』に掲載されたものに変更を加えた。変更点は、赤外線用と超音波用のスケッチをニコイチにしたこと、および超音波センサーの出力電圧の代わりにパルス幅を読み取る設定にしたことである。
// 超音波距離センサー LV-MaxSonar-EZ1 のパルス幅出力 (PW) と PSD 測距センサー GP2Y0A21YK のアナログ出力とを LCD に表示する。 #include <LiquidCrystal.h> const int sonorPin = 8; // Arduinoの「D8」に LV-MaxSonar-EZ1 の PW 出力を接続する const int irPin = 0; // Arduino の「A0」に赤外線センサーの出力電圧を接続する
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // LCD シールドの配線は『プロトタイピング』版
void setup() { lcd.begin(16, 2); }
void loop() { lcd.clear();
// 1 行目に "USM: cm" と表示する。 // 2 行目に "InR: cm" と表示する。 lcd.setCursor(0, 0); lcd.print("USM: "); lcd.setCursor(9, 0); lcd.print(" cm"); lcd.setCursor(0, 1); lcd.print("InR: "); lcd.setCursor(9, 1); lcd.print(" cm");
// 超音波センサーの距離を表示する float tU = pulseIn(sonorPin, HIGH); // sonorPin に入力されたパルスのパルス幅 (147μs で 1 インチ) を読み取って float InIn = tU / 147; // インチ単位に変換する。 float InCM = InIn * 2.54; // センチメートル単位に変換する。
// 測定距離が短すぎる (6 インチ未満) 場合の処理 if (InIn < 6.0) { lcd.setCursor(5, 0); lcd.print("Too Close"); }
// 測定距離が長すぎる (256インチ超) 場合の処理 else if (InIn > 256.0) { lcd.setCursor(5, 0); lcd.print("Too Far"); } else { lcd.setCursor(5, 0); lcd.print(InCM); }
// 赤外線センサーの距離を表示する float tI = analogRead(irPin); // 赤外線センサーの出力電圧を読み取って 0~1023 に AD 変換 float V = 5 * tI/1024; // AD 変換値を電圧に変換 if (tI > 80) { // analogRead の値が 80 以上の場合 (約 0.4V 以上の場合) は距離を表示する // float range = (6787 / (tI - 3)) - 4; // Prototyping 版の変換式(使わない) float range = tan((34.56 - V) / 21.92); // ボクの電子工作ノート版の変換式 lcd.setCursor(5, 1); lcd.print(range); } else { lcd.setCursor(5, 1); lcd.print("Too Far"); }
delay(500); // 0.5 秒待ってから繰り返す。 }
|
参考文献: