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