つれづれなる備忘録

日々の発見をあるがままに綴る

TinkercadによるArduinoシミュレーション11 ~ 測距センサ

1. 超音波距離センサ

 今回はArduinoを用いて超音波距離センサを動作させてみたい。Tinkercad上ではParallax社とSainSmart社の2種類のセンサが選べるが、今回はParallax社のものを使用する。実物は下記で販売されており、使用方法やデータシートもサイト上で確認できるようになっている。基本的には超音波を送信し物体に反射して跳ね返った超音波(エコー信号)を再度受信することで、送信と受信の時間間隔から距離を測定する。 akizukidenshi.com

2. センサの使用方法

 接続しただけで出力が得られるような通常のセンサと違い、超音波距離センサはパルス信号をトリガーとして入力してからエコー信号を受信するという流れになる。接続例を下に示すが、GND,5Vを接続しさらに信号線:SIGをデジタル入出力の7ピンに接続した。波形を観察するため、信号線にオシロスコープを2つ接続した。オシロスコープはそれぞれ分割あたりの時間を500usと5msに設定して、2つのレンジで波形を観察できるようにしている。

超音波距離センサ接続
超音波距離センサ接続
次に7ピンから5us程度のパルス信号を超音波距離センサへ入力すると40kHzで8発の超音波が空気中に送信され、このときSIGはLOWからHIGHに立ち上がり(パルス入力から750us後)、超音波が物体に反射され再び超音波距離センサでエコー信号を受信したときにSIGはHIGHからLOWとなるようなパルス信号が得られる。このときのSIGの波形を下に示す。SIGのHIGHの持続時間であるパルス幅tinは、超音波が超音波距離センサと物体を往復する時間と等しい。
SIGの波形
SIGの波形
最後に空気中の超音波の伝搬速度がわかれば、tinから距離が計算できる。空気中の超音波の伝搬速度は、Parallax社のデータシートから

C_{air}(m/s)=331.5+0.6T_c

今回は温度Tc=22C°とするとCair=344.7(m/s)が得られる。

3. センサ動作のためのスケッチ

 次にスケッチについて説明する。まず出力ピン(7ピン)を出力に設定し、HIGHを5us間出力してからLOWにする。5usだけHIGHにするにはdigitalWrite(pin,HIGH);のあとにdelayMicroseconds(5);として最後にdigitalWrite(pin,LOW);とすればよい。次にpinMode(pin,INPUT);としてピンを出力から入力に設定し直す。SIGのパルス信号のパルス幅を得るには、パルスを検出する関数pulseIn(pin,HIGH);を用いる。一番目の引数でピンを指定し、2番目の引数でパルスがHIGHかLOWかを指定する。HIGHを指定した場合は入力がHIGHに変わってからLOWに戻るまでの時間、すなわちパルス幅をマイクロ秒単位(long型)で返す。以上をlong readUltrasonicDistance(int pin);という関数に定義しておく。loop関数内では、tin=readUltrasonicDistance(7);として7ピンのパルス幅を得る。  次に空気中の超音波の伝搬速度を用いるが、往復であること、距離をcmとすること、時間はマイクロ秒単位であることを考慮して344.7/2(往復)*100(cm)/106(us)=0.01723をtinと掛け合わせる係数とする。最後に計算結果をシリアルモニタ上に表示して100ms待つ。

long tin;
float cm = 0;

long readUltrasonicDistance(int pin)
{
  pinMode(pin, OUTPUT);  //信号をクリア
  digitalWrite(pin, LOW);
  delayMicroseconds(2);
  // Pinから5usのパルスを1発出力
  digitalWrite(pin, HIGH);
  delayMicroseconds(5);
  digitalWrite(pin, LOW);
  // Pinを出力から入力に切り替えて、エコー信号読み出す
  pinMode(pin, INPUT);
  return pulseIn(pin, HIGH); //エコー信号の長さを返す
}

void setup()
{
  pinMode(7, INPUT);
  Serial.begin(9600);
}

void loop()
{
  tin=readUltrasonicDistance(7);  // エコー信号の長さを取得
  cm = 0.01723 * tin; //距離(cm)に変換
  Serial.print(cm);
  Serial.println("cm"); //距離をシリアルモニタに表示
  delay(100); // 100ms待つ
}

4. 実行例

 Tinkercadシミュレーションの実行を下に示す。シミュレーション実行中に超音波距離センサをクリックして物体の位置を変えると、シリアルモニタに出力される距離が変わると同時にオシロスコープ上の波形のパルス幅も同時に変化することが確認できると思う。

超音波距離センサの動作
超音波距離センサの動作

5. まとめ

 今回は超音波距離センサの動作を扱う中で、パルス波形を検出しパルス幅を返す関数pulseIn(pin,value)やマイクロ秒単位の待機を行うdelayMicroseconds(us)を紹介した。