超音波・レーザ測距センササンプルプログラム(7)
今回は前回変更したハード上で動作する、超音波測距センサ(SRF02)とレーザ測距センサ(VL530X)の同時測定サンプルを作ります。
(4)で動かしたレーザ測距サンプルをベースに、超音波センサのロジックを組み込みます。
手順を下記に示します。
①ベースになるプロジェクトをコピー( (4)で使用したHelloWorld_53L0A1を右クリックし、名前を付けて保存)
②任意の名称を入力し、OKボタンクリック。(ここでは、UltraSonicAndLaser2とする。)
③UltraSonicAndLaser2のmain.cppのコードを下記の通りに書き換え。(超音波センサのリードロジック追加。SRF02シリアルモードの詳細)
#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に指定すれば、センサの測定データが連続で出力します。下記にキャプチャを示します。