trykmkmの備忘録

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

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

 今回で、超音波・レーザ測距センササンプルプログラムシリーズも最終回にしようと思います。

 最終回は、(6)で作成したハード(ブレッドボード基板)を、ユニバーサル基板で実装しようと思います。プログラムは(7)で作成したものが動きます。

 

 基板は、秋月電子で販売している片面ガラス・ユニバーサル基板を使用します。

 また、マイコンモジュール、センサ類がとり外せるように、ピンヘッダを使用します。

 Nch MOSFETは、BSS138を変更します。そのまま実装できる2KS4017を使用します。ただし、パッドが超音波測距センサに接触するので、基板中央側に足を曲げて少し倒します。

 

 基板に使用する部品一式は下記の通りです。

 ・片面ガラス・ユニバーサル基板(ブレッドボード配線パターンタイプ): パーツ一般 秋月電子通商 電子部品 ネット通販

 ・NchパワーMOSFET 2SK4017(Q) (60V5A): 半導体 秋月電子通商 電子部品 ネット通販

 ・分割ロングピンソケット 1x42 (42P): パーツ一般 秋月電子通商 電子部品 ネット通販

 

 基板配線図は下記の通りになります。

f:id:trykmkm:20171003000548p:plain

 

 図1 基板配線図

 

 実物は下記写真の通りになります。

f:id:trykmkm:20171003005111j:plain f:id:trykmkm:20171003005124j:plain

図2 部品実装基板(左:表面 右:裏面) 

 

 上記基板に部品を実装していきます。

 超音波測距センサ(SRF02)は、グラつくので下記部品を使用して固定します。

 

 ・プラスチックナット+連結(6角ジョイント)スペーサー(10mm)セット: 電子工作便利商品 秋月電子通商 電子部品 ネット通販

 ・【共立エレショップ】>> ジュラコン中空スペーサー M3×1mm[RoHS]★受注単位有★: 【能動・受動・機構パーツ】 << 電子部品,半導体,キットの通販

 ・3mmプラスチックネジ(7mm)+ナットセット: 電子工作便利商品 秋月電子通商 電子部品 ネット通販

 

f:id:trykmkm:20171003010705j:plain f:id:trykmkm:20171003010724j:plain

図3 部品装着基板(左:横 右:真上) 

 

 最後に、基板を土台に固定します。

 土台は、下記の部品を使用しました。

 

 ・アクリル板強化透明 180×320×1.0mm IR001SS1の通販ならマルツオンライン(120mm x 130mm にカット)

 ・樹脂ネジ M3 8mm(西川電子部品)  2個

 ・樹脂スペーサー M3 3mm(西川電子部品) 2個

 ・樹脂ナット M3 (超音波測距センサを固定したものと同じ) 2個

 ・PD.2125BL | RS Pro ゴム足 黒,高さ:3.5mm, 粘着剤付き | RS Pro 【通販RS】

 ・https://ec.cando-web.co.jp/item/4521006213936

 

仕上がったものは、下記になります。

f:id:trykmkm:20171003013951j:plain

図4 測距ユニット 横置き

 

f:id:trykmkm:20171003014545j:plain

図5 測距ユニット 縦置き (ブックエンドに輪ゴムで固定)

超音波・レーザ測距センササンプルプログラム(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

 

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

 前回、音波測距センサ(SRF02)とレーザ測距センサ(VL530X)の同時測定サンプルプログラムの作成にトライしましたが、実現できませんでした。

 

 よって今回は、前回とは別の方法でプログラム作成を模索したいと思います。

 方法は下記2つです。 

 

 ①ST-micro以外のライブラリ・APIを使用

 ②超音波センサをi2cではなく、uartモードで使用。

 

  まずは、①の方法を実施してみたいと思います。

 VL530X用のAPIを公開しているユーザさんのリンクを下記します。

  ・GitHub - dbaba/vl53l0x-mbedos: Pololu mbed OS 5 library for VL53L0X time-of-flight distance sensor

  ・GitHub - ARMmbed/VL53L0X-mbedOS

 

 両APIを使用してみて、付属のサンプルや、簡単なサンプルを作成して実行ファイルを生成してみましたが、プログラムが動作しませんでした。

 どうやらデータのi2cの受信でコケている感じです。

 

 よって、②の方法で行きたいと思います。

 

 ②はSRF02をuartで使用するため、ハードを変更します。

 回路図は下記の通りです。

 SRF02をUARTで接続するのはもちろんですが、modeピンをGND接続する必要があります。

f:id:trykmkm:20170930001256p:plain

図1 超音波・レーザ測距センササンプルプログラム用回路図2

 

 基板配線はブレッドボードを使用しました。実物は下記になります。

f:id:trykmkm:20170930005712j:plain f:id:trykmkm:20170930005735j:plain

図2 超音波・レーザ測距センサ用基板2(左:部品あり 右:配線のみ )

 

 次回は、音波測距センサとレーザ測距センサの同時測定サンプルプログラムの作成します。

 

 

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

 今回はいよいよ、超音波測距センサ(SRF02)とレーザ測距センサ(VL530X)の同時測定サンプルを製造していきたいと思います。

 

 前回動かしたサンプルをベースに、超音波センサのロジックを組み込みます。

  手順を下記に示します。

 

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

f:id:trykmkm:20170927210522p:plain

 

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

f:id:trykmkm:20170927210604p:plain

  

 

 ③前々回使用した、超音波センサ用関数のコードSRF02.cとSRF02.hをUltraSonicAndLaserにコピー。

(SRF02.cとSRF02.hを右クリックでコピーを選択し、フォルダUltraSonicAndLaser上でctrl+v)

f:id:trykmkm:20170927213435p:plain

 

 ④UltraSonicAndLaserのmain.cppのコードを下記の通りに書き換え。

  (超音波センサのリードロジック追加)

//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>

#include "SRF02.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 resetPin(p12);

SRF02 sensor(p28,p27,0xE0); //SRF02インスタンス(SDAピン, SCLピン, i2cデバイスアドレス指定)

static X_NUCLEO_53L0A1 *board=NULL;


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

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

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

    /* 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("Distance : %ld\n", distance);
            printf("LASER(LV53L0X) : %4d [cm]\n",distance/10); //cm単位に変更

            //超音波センサ距離取得
            int distance = sensor.readcm();
            //USBシリアルポートに距離出力
            printf("ULTRASONIC(SRF02) : %4d [cm]\n",distance);
            //0.5秒待機
            wait(0.5);
        }
    }
}

 

⑤UltraSonicAndLaserをコンパイル

 ここで、コンパイルボタンをクリックすれば、実行ファイルが生成されるのですが・・・。

 下記のようなエラーが発生しました。

f:id:trykmkm:20170927221650p:plain

 エラー168とは、かぎ括弧の閉じ側が無いとか、関数宣言のところにセミコロンが無い場合に発生するものらしいです。

  

 いろいろ調査してみましたが、上記のエラーを解決することができませんでした。

 どうやら、STmicroのLV53L0Xライブラリを使用すると、他のi2cデバイスは使用できなくなるみたいです。

 よって、次回は別の方法を模索してみようと思います。

 

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

 今回は、前々回作成したハード上で、STmicroが公開しているレーザ測距センサ(VL53L0X)サンプルプログラムを動作させるサンプルプログラムを作成します。

 

 前回と同様、サンプルプログラムを動かすまでの手順を下記します。

 

 ①サンプルコードをmbedの開発環境にインポートするため、まずはブラウザでmbedにログインします。

 

 ②ブラウザで下記ページに移動します。

 HelloWorld_53L0A1 - a mercurial repository | Mbed

 

 ③サンプルコードをインポートします。画面のImpor into Compilerをクリックします。(下記キャプチャ参照)

f:id:trykmkm:20170924012251p:plain

 

 ④サンプルコードインポートを許可します。Importボタンをクリックします。

  今回は、Import Nameはそのまま、HelloWorld_53L0A1とします。(下記キャプチャ参照)

f:id:trykmkm:20170924012316p:plain

 

 ⑤開発環境のマイプログラム内にHelloWorld_53L0A1が追加されます。

 

 ⑥サンプルコードのリビジョンを変更します。

  最新版だとコンパイルが通らないため、コンパイルできるリビジョンに変更します。

 マイプログラム内のHelloWorld_53L0A1を選択し、右クリックして、リビジョンをクリックします。

f:id:trykmkm:20170924024109p:plain

 

⑦9番目のリビジョンを選択して、ワーキングコピーをこのリビジョンに切り替えるをクリックします。

f:id:trykmkm:20170924024737p:plain

 

⑧ファイル名をmain.cppのコードを一部変更します。

  理由は、下記の2つのためです。

  ・既存のコードは、i2cピンがmbed LPC1768ではない

  ・プログラム起動時にセンサをリセットさせる

  main.cppをクリックします。(下図参照)

 f:id:trykmkm:20170924013802p:plain

 

⑨main.cppを下記コードに変更

//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 resetPin(p12);

static X_NUCLEO_53L0A1 *board=NULL;


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

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

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

    /* 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("Distance : %ld\n", distance);
            printf("LASER(LV53L0X) : %4d [cm]\n",distance/10); //cm単位に変更
        }
    }
}

 

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

 

⑪mbedをPCに接続し、mbedにHelloWorld_53L0A1_LPC1768.binを保存。

 

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

f:id:trykmkm:20170924025120p:plain

 

 次回は、超音波測距センサとレーザ測距センサの測定データを出力するサンプルプログラムを作成します。

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

 今回は、前回作成したハード上で、超音波測距センサのみを動作させるサンプルプログラムを作成します。

 

 プログラムは、一定間隔で超音波測距センサからi2cでデータを取得し、usbポートから測定データを出力します。

 

 まずは、コーディングの前に、mbed USBシリアルドライバをインストールする必要があります。

 下記URLより、インストーラをダウンロードし、実行し、インストールします。

 https://os.mbed.com/media/downloads/drivers/mbedWinSerial_16466.exe

 

 次に、コーディングをしていきます。

 ここでは、超音波測距センサ(SRF02)のAPIを公開している方がいらっしゃるので、有り難く利用させていただくことにします。

 手順を下記に記します。

 

 ①APIをmbedの開発環境にインポートするため、まずはブラウザでmbedにログインします。

 

 ②ブラウザで下記のAPIのページ(Robinson Lopez Monzonさん)に移動します。

 SRF02 | Mbed

 

 ③APIをインポートします。画面のImpor into Compilerをクリックします。(下記キャプチャ参照)

f:id:trykmkm:20170918012042p:plain

 

 ④開発環境のインポート方法を指定します。

  今回は、Import Asをprogram、Import NameをSRF02TESTとします。(下記キャプチャ参照)

f:id:trykmkm:20170922201351p:plain

 

 ⑤開発環境のマイプログラム内にSRF02TESTが追加されます。

f:id:trykmkm:20170922202801p:plain

 

 ⑥続いてmbedライブラリをインポートします。

  ブラウザで下記URLにアクセスし、画面のImpor into Compilerをクリックします。

  mbed - a mercurial repository | Mbed

 

 ⑦Import AsをLibraryにし、Target PathにSRF02TESTを指定し、ボタンImportをクリックします。

f:id:trykmkm:20170922211339p:plain

 

 ⑧フォルダSRF02TESTを選択して、右クリックし、新しいファイルをクリック。

f:id:trykmkm:20170922212719p:plain

 

 ⑨ファイル名をmain.cppとしOKボタンクリック。

f:id:trykmkm:20170922212936p:plain

 

⑩main.cppに下記コードを記述(SRF02 i2cモード詳細)

#include "mbed.h"
#include "SRF02.h"

SRF02 sensor(p28,p27,0xE0); //SRF02インスタンス(SDAピン, SCLピン, i2cデバイスアドレス指定)
Serial pc(USBTX, USBRX); //シリアルポートインスタンス(usb指定)

int main() {

    while(1) {


        //距離取得
        int distance = sensor.readcm();

        //USBシリアルポートに距離出力
        pc.printf("ULTRASONIC(SRF02) : %4d [cm]\n",distance);

        //0.5秒待機
        wait(0.5);
    }
}

 

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

 

⑫mbedをPCに接続し、mbedにSRF02TEST_LPC1768.binを保存。

 

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

f:id:trykmkm:20170924002510p:plain

 

次回は、レーザ測距センサのみのサンプルプログラムを作成します。

 

 

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

 今回は、超音波・レーザ測距センササンプルプログラムを実行させるハードについて検討していきます。

 

 mbedの電源はUSBから供給し、各センサはmbed経由でUSBから電源を受電します。

 

 超音波測距センサとレーザ測距センサは、それぞれインターフェースにi2cがあるので、i2cバス接続をします。なお、各センサは内部プルアップ抵抗があるので、プルアップ抵抗を実装しません。

 

 レーザ測距センサは、リセット(SHDN)ピンがあるので、mbedの任意のピンをDigital outとして使用し、センサのON/OFF制御を実施します。

 ただし、レーザ測距センサのリセットピンは、2.8Vでプルアップされているため、mbedの信号レベル5Vと異なります。mbedのピンをハイインピーダンス出力できれば問題ないのですが、できるかわからないため、N-ch MOS FETをかませます。

 なお、このセンサは、I2Cは5Vに対応しているので、I2Cのレベルシフタ回路は実装しません。

 

 超音波センサは、インターフェースにI2CとUARTを選択できるMODEピンがあります。ノンコネでI2C、GND接続でUARTになります。今回はI2Cを使用するので、ノンコネになります。

 

 以上より、検討した回路図は下記の通りになります。

f:id:trykmkm:20170923013656p:plain

図 超音波・レーザ測距センササンプルプログラム用回路図

 

 基板配線はブレッドボードを使用しました。実物は下記になります。

f:id:trykmkm:20170924001950j:plain  f:id:trykmkm:20170924002105j:plain

図 超音波・レーザ測距センサ用基板(左:部品あり 右:配線のみ )

 

 次回は、各センサを個別に動かしていきたいと思います。