trykmkmの備忘録

自称組み込みエンジニアのブログ

超音波・レーザ測距センササンプルプログラム(7)

 今回は前回変更したハード上で動作する、超音波測距センサ(SRF02)とレーザ測距センサ(VL530X)の同時測定サンプルを作ります。

 

 (4)で動かしたレーザ測距サンプルをベースに、超音波センサのロジックを組み込みます。

 手順を下記に示します。

 

 ①ベースになるプロジェクトをコピー( (4)で使用したHelloWorld_53L0A1を右クリックし、名前を付けて保存)

f:id:trykmkm:20170927210522p:plain

 

 ②任意の名称を入力し、OKボタンクリック。(ここでは、UltraSonicAndLaser2とする。)

 f:id:trykmkm:20171001003418p:plain

 

 ③UltraSonicAndLaser2のmain.cppのコードを下記の通りに書き換え。(超音波センサのリードロジック追加。SRF02シリアルモードの詳細)

//This software includes the work that is distributed in the Apache License 2.0

#include "mbed.h"
#include "x_nucleo_53l0a1.h"
#include <stdio.h>

/* This VL53L0X Expansion board test application performs a range measurement in polling mode
on the onboard embedded top sensor. */

//#define VL53L0_I2C_SDA D14
//#define VL53L0_I2C_SCL D15
#define VL53L0_I2C_SDA p28 //D14->p28変更
#define VL53L0_I2C_SCL p27 //D15->p27変更

DigitalInOut pin(p12); //リセット制御ピン

Serial uart(p13, p14); //SRF02 UART通信

static X_NUCLEO_53L0A1 *board=NULL;


//UARTデータ送信
void SendCmd(const char address, const char cmd)
{
    uart.putc(address); //データ送信
    wait_us(100); //100us待機
    uart.putc(cmd); //データ送信
    wait_us(100); //100us待機
}


//超音波距離取得
uint16_t getUssDistance(void)
{
    uint16_t distance = 0;
    SendCmd(0x00,0x51);//cmモード設定コマンド送信
    wait_ms(70);//70mS待機
    SendCmd(0x00,0x5E);//データ取得コマンド送信
    wait_ms(10);//10mS待機
    distance = (uart.getc() << 8); //測定データ(MSB)取得
    distance = distance | uart.getc(); //測定データ(LSB)取得
    wait_ms(250); //250mS待機
    return distance;
}

 

/*=================================== Main ==================================
=============================================================================*/
int main()
{
    int status;
    uint32_t distance;

    DevI2C *device_i2c = new DevI2C(VL53L0_I2C_SDA, VL53L0_I2C_SCL);

 

    //センサリセット処理追加
    pin.output();
    pin = 1;
    wait(0.1);
    pin = 0;

/* creates the 53L0A1 expansion board singleton obj */
    //board = X_NUCLEO_53L0A1::instance(device_i2c, A2, D8, D2);
    board = X_NUCLEO_53L0A1::instance(device_i2c);//インスタンス生成方法変更

/* init the 53L0A1 expansion board with default values */
    status = board->init_board();
    if (status) {
        printf("Failed to init board!\n\r");
        return 0;
    }

    while (1) {
        status = board->sensor_centre->get_distance(&distance); //レーザ測距センサデータ取得
        if (status == VL53L0X_ERROR_NONE) {
            printf("LASER (VL5310X) : %4d [cm]\n", distance/10); //レーザ距離表示(cm単位に変更)
            printf("ULTRASONIC (SRF02) : %4d [cm]\n\n", getUssDistance());//超音波距離取得&表示
        }
    }
}

※本来は、通信エラー時の処理を入れるべきですが、あくまで動作確認用のためプログラムの記述は成功ルートのみで済ませました。

 

 ④保存ボタンクリック後、コンパイルボタンをクリックして実行ファイル(UltraSonicAndLaser2_LPC1768.bin)生成。

 

 ⑤mbedをPCに接続し、mbedにUltraSonicAndLaser2_LPC1768.binを保存。

 

 ⑥teratermでmbed Serial portを指定し、ボーレート9600bpsに指定すれば、センサの測定データが連続で出力します。下記にキャプチャを示します。

f:id:trykmkm:20171001005521p:plain