超音波・レーザ測距センササンプルプログラム(5)
今回はいよいよ、超音波測距センサ(SRF02)とレーザ測距センサ(VL530X)の同時測定サンプルを製造していきたいと思います。
前回動かしたサンプルをベースに、超音波センサのロジックを組み込みます。
手順を下記に示します。
①ベースになるプロジェクトをコピー(前回使用したHelloWorld_53L0A1を右クリックし、名前を付けて保存)
②任意の名称を入力し、OKボタンクリック。(ここでは、UltraSonicAndLaserとする。)
③前々回使用した、超音波センサ用関数のコードSRF02.cとSRF02.hをUltraSonicAndLaserにコピー。
(SRF02.cとSRF02.hを右クリックでコピーを選択し、フォルダUltraSonicAndLaser上でctrl+v)
④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をコンパイル。
ここで、コンパイルボタンをクリックすれば、実行ファイルが生成されるのですが・・・。
下記のようなエラーが発生しました。
エラー168とは、かぎ括弧の閉じ側が無いとか、関数宣言のところにセミコロンが無い場合に発生するものらしいです。
いろいろ調査してみましたが、上記のエラーを解決することができませんでした。
どうやら、STmicroのLV53L0Xライブラリを使用すると、他のi2cデバイスは使用できなくなるみたいです。
よって、次回は別の方法を模索してみようと思います。
超音波・レーザ測距センササンプルプログラム(4)
今回は、前々回作成したハード上で、STmicroが公開しているレーザ測距センサ(VL53L0X)サンプルプログラムを動作させるサンプルプログラムを作成します。
前回と同様、サンプルプログラムを動かすまでの手順を下記します。
①サンプルコードをmbedの開発環境にインポートするため、まずはブラウザでmbedにログインします。
②ブラウザで下記ページに移動します。
HelloWorld_53L0A1 - a mercurial repository | Mbed
③サンプルコードをインポートします。画面のImpor into Compilerをクリックします。(下記キャプチャ参照)
④サンプルコードインポートを許可します。Importボタンをクリックします。
今回は、Import Nameはそのまま、HelloWorld_53L0A1とします。(下記キャプチャ参照)
⑤開発環境のマイプログラム内にHelloWorld_53L0A1が追加されます。
⑥サンプルコードのリビジョンを変更します。
最新版だとコンパイルが通らないため、コンパイルできるリビジョンに変更します。
マイプログラム内のHelloWorld_53L0A1を選択し、右クリックして、リビジョンをクリックします。
⑦9番目のリビジョンを選択して、ワーキングコピーをこのリビジョンに切り替えるをクリックします。
⑧ファイル名をmain.cppのコードを一部変更します。
理由は、下記の2つのためです。
・既存のコードは、i2cピンがmbed LPC1768ではない
・プログラム起動時にセンサをリセットさせる
main.cppをクリックします。(下図参照)
⑨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に指定すれば、センサの測定データが連続で出力します。下記にキャプチャを示します。
次回は、超音波測距センサとレーザ測距センサの測定データを出力するサンプルプログラムを作成します。
超音波・レーザ測距センササンプルプログラム(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さん)に移動します。
③APIをインポートします。画面のImpor into Compilerをクリックします。(下記キャプチャ参照)
④開発環境のインポート方法を指定します。
今回は、Import Asをprogram、Import NameをSRF02TESTとします。(下記キャプチャ参照)
⑤開発環境のマイプログラム内にSRF02TESTが追加されます。
⑥続いてmbedライブラリをインポートします。
ブラウザで下記URLにアクセスし、画面のImpor into Compilerをクリックします。
mbed - a mercurial repository | Mbed
⑦Import AsをLibraryにし、Target PathにSRF02TESTを指定し、ボタンImportをクリックします。
⑧フォルダSRF02TESTを選択して、右クリックし、新しいファイルをクリック。
⑨ファイル名をmain.cppとしOKボタンクリック。
⑩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秒毎に出力します。下記にキャプチャを示します。
次回は、レーザ測距センサのみのサンプルプログラムを作成します。
超音波・レーザ測距センササンプルプログラム(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を使用するので、ノンコネになります。
以上より、検討した回路図は下記の通りになります。
図 超音波・レーザ測距センササンプルプログラム用回路図
基板配線はブレッドボードを使用しました。実物は下記になります。
図 超音波・レーザ測距センサ用基板(左:部品あり 右:配線のみ )
次回は、各センサを個別に動かしていきたいと思います。
超音波・レーザ測距センササンプルプログラム(1)
私の手元には、とある事情で入手した未使用のままの超音波測距センサ(SRF02)とレーザ測距センサ(VL53L0Xモジュール)があります。
放置したままだともったいないので、測定精度比較サンプルプログラムを作成することにしました。
今回一番のハードルになるのは、レーザ測距センサになります。
実はこのレーザ測距センサ、インターフェースがI2Cになりますが、I2Cのアドレスマップがデータシート上に公開されていません。
どうやって制御するかといえば、Linux、mbed、arduino向けのAPIが公開されており、それを利用するしかありません。
APIのソースコードを解析すれば、他のプラットフォームでも利用できそうですが、この記事では簡単に動かすことを目的としているので、STmicroがAPIを提供してるプラットフォームで動かそうと思います。
よって今回は、mbedを使用することにしました。
使用するセンサ・ボードを下記に示します。
・mbed NXP LPC1768評価キット: マイコン関連 秋月電子通商 電子部品 ネット通販
・超音波センサー SRF02: マイコン関連 秋月電子通商 電子部品 ネット通販
・VL53L0X TOFレーザー測距センサモジュール - VL53L0X - ネット販売
次回以降、回路図、部品制御、プログラムについて記載していこうと思います。
12V・24V入力切替回路(2)
前回の記事の続きになります。
検討した回路を下記に示します。
図 12V・24V入力切替回路
ちなみに、部品は秋月電子で購入できるものから、選定しました。
上記回路の動作概要を説明します。
青枠回路は、Vinが19以上のとき、Q1がONになり、3端子レギュレータで降圧し、12Vを出力します。
緑枠回路は、Vinが19V未満のとき、Q3がOFF、Q2がONになり、Vinをそのまま出力します。
※19Vは、ツェナーダイオードのVz=15Vと、Pch-FETのVgs=4Vの和になります。
この回路を適用すれば、Vinが12Vのとき、入力をそのまま出力します。そして、Vinが24Vのときは、12Vを出力します。
12V・24V入力切替回路(1)
自動車から電源を取得し、耐圧20V負に電源を供給する場合を考えます。
自動車の電源は、12V出力の車両と24V出力の車両があります。
12V出力の場合、直接負荷に入力できますが、24V出力の場合、降圧が必要になります。
上記内容を実現する回路を検討します。
回路の名称は「12V・24V入力切替回路」とします。
下記は、電源入力から負荷までのブロック図です。
図 12V・24V切替回路ブロック図
詳細は次回に記載します。