超音波センサ"HC-SR04"の使い方

概要

今回は mbed LPC1768 と 超音波センサ"HC-SR04" を用いて距離測定を行う。また、測定距離はシリアル通信でPCへ転送し、画面へ出力する。
※筆者浅学なため、文中に誤字や説明が不十分な点があるかと思いますが、その際はご指摘していただければ幸いです。

センサ仕様

HC-SR04 のデータシート:http://www.micropik.com/PDF/HCSR04.pdf

入出力電圧5V
測定可能距離2cm~3m
測定可能角度15度
トリガー入力信号TTL信号 10μs
エコー出力信号TTL信号 測定距離に応じた長さ

回路

センサへの電源はmbedのVU(USB電源 5V)ピンから
トリガーピンはp11、エコーピンはp12から(任意で変更可能)
センサのエコーからは5V出力されるが、mbedのI/Oピンは5Vトレラント入力が可能なのでそのままでも大丈夫
気になる場合は2.2kΩと3.3kΩ用いて分圧する(抵抗値は別の組み合わせでも可)
                 ※Vin = ( 5V * 3.3k) / (2.2k + 3.3k) = 3[V]
                    レベルコンバータがない場合のみこの方法を用いること

mbed LPC1768           HC-SR04
―――――――           ―――――
    VU    l―――――――l Vcc
    p11`   l―――――――l Triger
    p12`   l-―[2.2kΩ]-――l Echo
          l        |  l
          l     [3.3kΩ]‘l
          l        |  l
    GND`  l――――――-―l GND
―――――――           ―――――
※携帯・スマートフォンから閲覧した場合文字ずれが発生するためPCから閲覧してください。

プログラム

今回画面出力時に使用したソフトウェアは”Tera Term”で、キーボード入力があった場合にのみ画面へ出力するプログラムとした。

include the mbed library with this snippet

/* ヘッダーファイル読み込み */
#include "mbed.h"

/* ピンの機能設定  */
Serial PC (USBTX,USBRX);            //USB :シリアル通信
DigitalOut USSTriger (p11);         //P11 :超音波センサ トリガ出力
Timer ActiveTime;

/* 割り込み処理宣言 */
Ticker TrigerTiming;                //Trigerピン :インターバルタイマ
InterruptIn USSEcho (p12);          //p12 :超音波センサ  エコー入力

/* 関数宣言 */
void init(void);
void Output_Monitor(unsigned short Value);

/* グローバル変数宣言*/
unsigned short USSDistance;         //USSDistance:超音波センサ測定距離

/* main関数開始*/
int main() {
    char val;                       //val:PC.readable初期化用変数
    init();
    while(1) {
        if( PC.readable() ){
            Output_Monitor( USSDistance );
            val = PC.getc();
        }
    }
}


/***************************************************
 * @brief       60ms毎の割り込みでUSSTrigerに10usのON出力
 * @param       なし
 * @return      なし
 * @date 2014/12/16 新規作成
 **************************************************/
void Triger (){
    USSTriger = 1;
    wait_us(10);
    USSTriger = 0;
}

/***************************************************
 * @brief       USSEcho立ち上がりでの割り込み
 * @brief       Hiの場合ActiveTimeタイマスタート
 * @param       なし
 * @return      なし
 * @date 2014/12/16 新規作成
 **************************************************/
void RiseEcho(){
    ActiveTime.start();
}

/***************************************************
 * @brief       USSEcho立ち下がりでの割り込み
 * @brief       Lowの場合ActiveTimeタイマ停止+値読み取り
 * @param       なし
 * @return      なし
 * @date 2014/12/16 新規作成
 **************************************************/
void FallEcho(){
    unsigned long ActiveWidth;
    ActiveTime.stop();
    ActiveWidth = ActiveTime.read_us();
    USSDistance = ActiveWidth * 0.0170;
    ActiveTime.reset();
}

/***************************************************
 * @brief       各種機能のプロパティ設定
 * @param       なし
 * @return      なし
 * @date 2014/12/13 新規作成
 **************************************************/
void init(void){   
    TrigerTiming.attach( Triger , 0.060 );      //USSTriger周期 60ms
    USSEcho.rise( RiseEcho );                   //USSEcho立ち上がり時割り込み
    USSEcho.fall( FallEcho );                   //USSEcho立ち下がり時割り込み
}

/***************************************************
 * @brief       Parameterの値をPC画面に出力
 * @param       Value : 画面に出力する値
 * @return      なし
 * @date 2014/12/14 新規作成
 **************************************************/
void Output_Monitor(unsigned short Value){
    PC.printf("%d[cm]\r\n",Value);
}


Please log in to post comments.