サンプルソースがArduinoサイトのPlaygroundとLearning>Examples>Complex Sensorsの中にあります。前者はpulseIn()を使って反射波の時間を計測しており、後者は変数を用いて時間をカウントしています。今回は前者のpulseIn()を用いた方法を参考にします。pulseIn()の場合は、unsigned long(正の整数値:0〜4,294,967,295までの値)の変数タイプを用います。尚、接続方法は以下の通りです。
//反射波の変数を用意
unsigned long echo = 0;
//信号ピンを9番ピンに設定
int signalPin = 9;
void setup(){
//出力用にシリアル通信開始
Serial.begin(9600);
}
void loop(){
//まず信号ピンを出力に設定(発信用)
pinMode(signalPin, OUTPUT);
//2マイクロ秒間LOWで出力
digitalWrite(signalPin, LOW);
delayMicroseconds(2);
//5マイクロ秒間HIGHで出力
digitalWrite(signalPin, HIGH);
delayMicroseconds(5);//超音波発信
//信号ピンをLOWに戻す
digitalWrite(signalPin, LOW);
//信号ピンを入力に設定(受信用)
pinMode(signalPin, INPUT);
//信号ピンをHIGHに設定
digitalWrite(signalPin, HIGH);
//反射波が戻ってくるまでの時間を計測し
//片道の時間(半分の値)にする
echo = pulseIn(signalPin, HIGH)/2;
//ミリメートル単位に変換
int distance = echo*0.34442;
//距離を出力
Serial.println(distance);
delay(250);
}
「PING)))」では、ひとつの信号端子(SIG)だけで超音波の発信と受信を切り替えて制御する必要があります。まず最初に信号端子をLOWに設定(2マイクロ秒程度)しておき、その後5マイクロ秒間HIGHにすると、超音波が発信します。その後、物体に反射して戻ってくる超音波を感知させるために、信号端子を「デジタル出力」から「デジタル入力」に切り替えます。「デジタル入力」に切り替えられた信号端子は、反射波を受信するとHIGHになります。反射波がなくなればLOWになるので、それまでの継続時間をpulseIn()でカウントします。pulseIn()の括弧内には、ピン番号とHIGHかLOWの値を入れます。HIGHを入れれば、そのピンがHIGHになるまで待機し、HIGHになったときに時間(マイクロ秒単位)の計測を開始し、次にLOWになるときに時間の計測を終了します。今回の場合は、発信した超音波が反射して戻ってくるまでの時間を計測してくれることになります。計測した時間は超音波が往復して戻ってくるまでの時間なので、計測時間の半分が実際の距離に要した時間となります。音速は344.42m/secなので、1マイクロ秒で0.34442mmの距離を進むことになります。従って、pulseIn()で求めた時間(往復)を片道分の時間にするため2で割り、0.34442をかければミリメートル単位で出力することになります。
0 件のコメント:
コメントを投稿