Ultrasonic Sensor

超音波測距センサーHC-SR04で距離を測定してみます。

使用するデバイス

データシート:HCSR04.pdf

AMAZON:

https://www.amazon.co.jp

https://www.sparkfun.com/products/13959

動作原理について

このデバイスの動作は、測定を開始するトリガ信号をTrigポートに出力すると、T側の超音波トランスデュサーから超音波パルスが発せられ、これが対象物で跳ね返ってR側の超音波レシーバーに戻ってくるまでの間 ー対象物まで往復している間ー Echoポートには正のパルス幅として出力されます。

下記の波形は、上側=Trig出力(最低10usec期間HIGHにする)に対して、下側=Echoポートがパルスとして測距結果を出力しているところです。

下側の波形がHレベルにある区間が波形が送信されてから反射し帰ってくるまでの往復の時間となります。

Echo時間と距離との関係:

クロック100kHzでカウントしていますので、理論上の対象物との距離の分解能は170μという事になります。

もっとも、気温、湿度や気圧の変動を考慮しないと正確な音速を把握することはできないので、

ここで示している値は目安ということになります。

正確な音速で測りたい向きにはBME280などの環境センサーを搭載し、気温、湿度と気圧のデーターを収集する必要があります。

回路ブロックの構成について

トリガ信号をPWM, Echo時間の測定をカウンタを使用して実現します。これはほぼソフトウェアの処理がないので、PSoCならではです。

PWMのコンフィグレーション:

この設定によって、100msec毎に20usecのHighパルスがUS_TRIGポートから出力されます。

COUNTERのコンフィグレーション:

これによって、US_RETポートがHighの区間のみ、100kHzでカウントされます。

コード:

us_main.c

uint16_t us_counter_value;

float f_us_distance;

int main(void)

{

CyGlobalIntEnable; /* Enable global interrupts. */

PWM_3_Start();

for(;;)

{

us_counter_value = Counter_1_ReadCapture();

f_us_distance = (float)(ss_counter_value * 3.4)/2; // result is mm

}

}

Set Trig and Echo Low to initalize module. Place a minimum 10us High level pulse to "Trigger" (module will automatically send eight 40KHz acoustic bursts). At the same time, Gate the microcontroller timer to start timing. Wait to capture the rising edge output of ECHO port to stop the timer. Now read the time of the counter, which is the ultrasonic propagation time in the air. According to the formula: Distance = (ECHO high level time X ultrasonic velocity (Speed of Sound in air 340m/sec) / 2, you can calculate the distance to the obstacle.

ピンのアサイン

以下のようにピンをアサインし測距モジュールと接続します。

VIOを3.3V改造をしている場合に、センサを+5Vで動作させる場合は、抵抗分割するなどしてリターン側のポートを過電圧でラッチアップさせないように気をつけてください。