SRF Ultrasonic Range Finder - Serial Mode
このライブラリは、Devantech社製SRFシリーズ超音波距離センサにおいてSerialモードを使用した制御機能を提供する組み込みクラスです。
Library usage requirements | |
---|---|
Type | UART |
Name | SRF_SERIAL |
Version | 1_00_00 |
Code size used | 3.9KB |
Resources used | UART × 1, Timer × 1 |
関連資料
- SRF02 Ultrasonic Range Finder Technical Specification
- SRF02 Ultrasonic Range Finder Technical Specification - Serial Mode
Abstracts
Methods()/Properties | Summary | Note |
---|---|---|
new SRF_SERIAL() | SRF_SERIALインスタンスを生成します。 |
{SRF_SERIAL} Instance
Methods()/Properties | Summary | Note |
---|---|---|
.write() | 書き込みコマンドを実行します。 | |
.read() | 読み出しコマンドを実行します。 | |
.isReady() | 指定されたデバイスアドレスのセンサが実行可能状態であるか確認します。 | |
.scanAddress() | センサがサポートしている全てのデバイスアドレスをスキャンします。 | |
.init() | センサを初期化します。 | |
.changeAddress() | センサのデバイスアドレスを書き換えます。 | |
.startMeasurement() | 測定を開始します。 | |
.checkMeasComp() | 測定完了を確認します。 | |
.getResult() | 測定結果を取得します。 | |
.startMeasAndGetResult() | 測定を開始し、測定完了を待ってから、測定結果を取得します。 | |
.VERSION | バージョン情報 maj : {number} Main Version min : {number} Minor Version rev : {number} Revision |
Details
new SRF_SERIAL(uart[,config])
SRF_SERIALインスタンスを生成します。
Name | Type | M/O | Description | Note |
---|---|---|---|---|
uart | {UART} | mandatory | 事前にオープン済みのUARTインスタンスを指定します。 UARTの設定は、センサの型番によって異なります。使用するセンサの技術仕様を確認してください。 | SRF02を使用する場合は 下記設定となります。 ボーレート : 9600bps ハードウェアフロー : 無効 パリティビット : 無し データビット : 8ビット ストップビット : 2ビット |
config | Object | optional | コンフィグレーション 詳細はconfigを参照してください。 | |
return | {SRF_SERIAL} | - | {SRF_SERIAL} : 生成された{SRF_SERIAL} | 異常が発生した時は、例外となります。 |
config
Name | Type | M/O | Description | Note |
---|---|---|---|---|
address | number | optional | 対象デバイスアドレス 設定範囲: 0x00~0x0F デフォルト値は0x00となります。 | |
rangingMode | number | optional | レンジングモード 測定結果の出力単位を指定します。 0x50: インチ 0x51: センチメートル 0x52: マイクロ秒 デフォルト値は0x51となります。 |
.write(cmd)
書き込みコマンドを実行します。
センサに直接アクセスする際に使用します。
Name | Type | M/O | Description | Note |
---|---|---|---|---|
cmd | number | mandatory | 書き込みコマンド 設定範囲: 0x00~0xFF | |
return | boolean | - | true: 成功 false: 失敗 |
.read(cmd,len)
読み出しコマンドを実行します。
センサに直接アクセスする際に使用します。
Name | Type | M/O | Description | Note |
---|---|---|---|---|
cmd | number | mandatory | 読み出しコマンド 設定範囲: 0x00~0xFF | |
len | number | mandatory | コマンド応答データのバイト長を指定します。 設定範囲: 1~512 | |
return | ArrayBuffer | - | コマンド応答データ 失敗した場合は、サイズが0となります。 |
.isReady([address])
指定されたデバイスアドレスのセンサが実行可能状態であるか確認します。
指定デバイスアドレスのセンサが存在しない場合、実行不可が返却されます。
Name | Type | M/O | Description | Note |
---|---|---|---|---|
address | number | optional | デバイスアドレス 設定範囲: 0x00~0x0F 省略した場合は、現時点で設定されている対象デバイスアドレスとなります。 | |
return | boolean | - | true: 実行可能 false: 実行不可 | パラメータ異常の場合は例外となります。 |
.scanAddress()
センサがサポートしている全てのデバイスアドレスをスキャンします。
各デバイスアドレスに対して.isReady()による状態確認を行います。
Name | Type | M/O | Description | Note |
---|---|---|---|---|
return | Array | - | スキャンリスト 実行可能状態が検出されたデバイスアドレスの一覧が配列型で返却されます。配列の要素にはnumber型のデバイスアドレス値が格納されます。尚、不検出の場合は、配列の要素数が0となります。 |
.init([address[,statusCheck]])
センサを初期化します。
対象デバイスアドレスのセンサに対して.isReady()による状態確認を行います。
切替先デバイスアドレスの指定は、同一バス上にデバイスアドレスが異なる本センサが複数存在する場合、それらを動的に切り替える際に使用します。基本的に、現在選択されている対象デバイスアドレスのセンサが測定完了している状態で切替を行う必要があります。
デフォルトの動作では、切替後のセンサに対して.isReady()による状態確認が行われます。尚、個々のセンサ状態を常に把握できている場合、必ずしも切替毎に状態確認を行う必要はありません。その際、statusCheck
をfalseに指定して状態確認処理をスキップすることが可能です。
同一バス上に同じデバイスアドレスを持ったセンサが複数存在することがないようにしてください。
Name | Type | M/O | Description | Note |
---|---|---|---|---|
address | number | optional | 切替先デバイスアドレス 設定範囲: 0x00~0x0F 省略した場合は、現時点で設定されている対象デバイスアドレスのセンサに対して初期化を行います。 | |
statusCheck | boolean | optional | センサ切替後の状態確認 true: 有効 false: 無効 デフォルト値はtrueとなります。 | このパラメータは切替先デバイスアドレスが指定されている場合のみ有効となります。 |
return | boolean | - | true: 成功 false: 失敗 | パラメータ異常の場合は例外となります。 |
.changeAddress(address)
センサのデバイスアドレスを書き換えます。
本メソッドを実行する前に.init()によって書き換え対象センサのデバイスアドレスが選択され、実行可能状態となっている必要があります。
センサに対してデバイスアドレスの書き換えを発行すると、センサ内のROMが書き換えられ、センサが再起動します。以降、センサのデバイスアドレスは新デバイスアドレスとなります。
本メソッドは、その後、対象デバイスアドレスを新デバイスアドレスに切り替えて.init()を実行し、結果を返却します。したがって、本メソッド後に継続して測定を開始することが可能です。
デバイスアドレスの書き換えは、センサ内のROM書き換えを伴います。予期せぬ故障を避けるため、頻繁な使用は避けてください。
Name | Type | M/O | Description | Note |
---|---|---|---|---|
address | number | mandatory | 新デバイスアドレスを指定します。 設定範囲: 0x00~0x0F | |
return | boolean | - | true: 成功 false: 失敗 | パラメータ異常の場合は例外となります。 |
.startMeasurement()
測定を開始します。
本メソッド実行後、.checkMeasComp()で測定完了を待つ必要があります。
測定完了後、新たに測定を開始する場合は、このメソッドを再度呼び出す必要があります。
Name | Type | M/O | Description | Note |
---|---|---|---|---|
return | boolean | - | true: 成功 false: 失敗 |
.checkMeasComp()
測定完了を確認します。
Name | Type | M/O | Description | Note |
---|---|---|---|---|
return | boolean | - | true: 測定完了 false: 測定中 |
.getResult()
測定結果を取得します。
事前に.checkMeasComp()で測定完了を待つ必要があります。
Name | Type | M/O | Description | Note |
---|---|---|---|---|
return | number | - | 測定結果 レンジングモードで指定されている単位で測定結果が出力されます。尚、距離が測定できなかった場合は0、センサ異常が発生した場合は-1となります。 |
.startMeasAndGetResult()
測定を開始し、測定完了を待ってから、測定結果を取得します。
Name | Type | M/O | Description | Note |
---|---|---|---|---|
return | number | - | 測定結果 レンジングモードで指定されている単位で測定結果が出力されます。尚、距離が測定できなかった場合は0、センサ異常が発生した場合は-1となります。 |
Usage Examples
Sample 1
周期的に距離を測定するサンプルです。
log.setLevel(0,2); //-1:NONE 0:ERROR 1:WARNING 2:DEBUG 3:TRACE, 0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
log.printLevel(2); //0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
if(!('SRF_SERIAL' in this)) { throw new Error('Please import the SRF_SERIAL library.'); }
//Specify the UART connection settings for the SRFxx ultrasonic range finder.
var uart = new UART(1); //UART node number
var ready = uart.open(9600,false,0,0,1); //UART settings for SRF02
if(!ready) {
throw new Error('UART open failed. Check the UART node number.');
}
//var srf = new SRF_SERIAL(uart, { address: 0x00 });
var srf = new SRF_SERIAL(uart);
ready = srf.init();
if(!ready) {
print('srf init failed');
while(1);
}
var actFlag = true;
var measFlag = false;
var MEAS_INTERVAL = 1000; //ms
var tout = setInterval(function() { measFlag = true; }, MEAS_INTERVAL);
while(actFlag) {
if(measFlag) {
var utime = Date.now();
var dist = srf.startMeasAndGetResult();
print(utime + ': ' + dist);
measFlag = false;
}
}
clearInterval(tout);
uart.close();
Sample 2
デバイスアドレスが異なる複数のセンサを順番に切り替えながら距離を測定するサンプルです。
はじめに.scanAddress()を使用してバス上に存在する全てのセンサを把握します。
log.setLevel(0,2); //-1:NONE 0:ERROR 1:WARNING 2:DEBUG 3:TRACE, 0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
log.printLevel(2); //0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
if(!('SRF_SERIAL' in this)) { throw new Error('Please import the SRF_SERIAL library.'); }
var toHexStr = function(val) { return '0x' + ('00' + val.toString(16).toUpperCase()).substr(-2); };
//Specify the UART connection settings for the SRFxx ultrasonic range finder.
var uart = new UART(1); //UART node number
var ready = uart.open(9600,false,0,0,1); //UART settings for SRF02
if(!ready) {
throw new Error('UART open failed. Check the UART node number.');
}
var srf = new SRF_SERIAL(uart);
var list = srf.scanAddress();
if(!list.length) {
print('srf not found');
while(1);
}
print('List[' + list.length + ']: ' + list);
var actFlag = true;
var index = 0;
var measFlag = false;
var MEAS_INTERVAL = 1000; //ms
var tout = setInterval(function() { measFlag = true; }, MEAS_INTERVAL);
while(actFlag) {
if(measFlag) {
var utime = Date.now();
var addr = list[index];
srf.init(addr, false); //Skip status check
var dist = srf.startMeasAndGetResult();
print(utime + ': [' + toHexStr(addr) + '] '+ dist);
if(++index >= list.length) index = 0;
measFlag = false;
}
}
clearInterval(tout);
uart.close();
Sample 3
対象センサのデバイスアドレスを新しいデバイスアドレスに書き換えるサンプルです。
デバイスアドレス書き換え後、距離の測定を継続します。
log.setLevel(0,2); //-1:NONE 0:ERROR 1:WARNING 2:DEBUG 3:TRACE, 0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
log.printLevel(2); //0:DISABLE 1:LOG 2:CONSOLE 3:BOTH
if(!('SRF_SERIAL' in this)) { throw new Error('Please import the SRF_SERIAL library.'); }
var TARGET_ADDRESS = 0x00;
var NEW_ADDRESS = 0x01;
var toHexStr = function(val) { return '0x' + ('00' + val.toString(16).toUpperCase()).substr(-2); };
//Specify the UART connection settings for the SRFxx ultrasonic range finder.
var uart = new UART(1); //UART node number
var ready = uart.open(9600,false,0,0,1); //UART settings for SRF02
if(!ready) {
throw new Error('UART open failed. Check the UART node number.');
}
var srf = new SRF_SERIAL(uart);
ready = srf.init(TARGET_ADDRESS);
if(!ready) {
print('target srf not found');
while(1);
}
ready = srf.changeAddress(NEW_ADDRESS);
if(!ready) {
print('new address srf not found');
while(1);
}
print('Address change successful! [' + toHexStr(TARGET_ADDRESS) + ' to ' + toHexStr(NEW_ADDRESS) + ']');
var actFlag = true;
var measFlag = false;
var MEAS_INTERVAL = 1000; //ms
var tout = setInterval(function() { measFlag = true; }, MEAS_INTERVAL);
while(actFlag) {
if(measFlag) {
var utime = Date.now();
var dist = srf.startMeasAndGetResult();
print(utime + ': ' + dist);
measFlag = false;
}
}
clearInterval(tout);
uart.close();