_SKU_SEN0004__SRF01_超声波测距传感器 - jimaobian/DFRobotWikiCn GitHub Wiki
概览
SRF01一款高性能的单探头超声波,其采用了Devantech最新的第二代自动调节技术,能够在自动校正后实现0cm无死区探测,探测范围为0-6米。设计上充分考虑了用户安装需求,配备了橡胶安装圈。接线方面,采用一根标准TTL引脚作为UART模式下的读写信号线。数据帧为1位起始位,1位结束位,无校验位。可以接到多种控制器上,如:Arduino,Basic Stamps 或 PICAXE等。初始波特率为9600,也可以通过指令设置为19200 或 38400 。在一个引脚上可以连接最多16个SRF01传感器。测量单位为Cm 或 Inches。 注意事项:本产品不包含3-pin JST连接线,接口为TTL并非RS232,误接会造成损坏。
规格参数
电源
该传感器允许 3.3V-12V之间的任何电源供电,建议最大供电为 5.5V。内部工作电压为3.3V,本传感器已包含降压电路。I/O接口工作电压也为3.3V,5V亦可。工作电流约为25mA,11mA的待机电流,睡眠模式下只有约55uA。
单线串口通信
数据帧为1位起始位,1位结束位,无校验位。串口为TTL电平信号。**注意事项:本产品不包含3-pin JST连接线,接口为TTL并非RS232,误接会造成损坏。**与SRF01通信的串口输入输出是通过同一根信号线上。SRF01会一直监听信号线,直到有信号传输。通信格式为“break”后接两个一位字节的指令,分别是地址位和实际的指令。break 是一个1.5ms左右的低电平。用来在这一根数据线上同步传送数据。默认的地址可以被修改为1-16中的任何一个。因此,在控制器的同一个引脚上,最多可以连接16个传感器。
波特率
上电后,默认的通信波特率是9600,根据您的需求,可以自行改为 19200 或 38400。一旦更改,下次上电之后,就不会再变为9600了。发送指令的时候,只需在break后加上广播地址0,再加上指令 0x64 (19200) 或 0x65 (38400),该修改可以对所有的SRF01的波特率同时进行修改。
连线
连线图在 测试 部分可以看到。如果你要使用多个SRF01,你只需要将所有的信号线连接到同一个串口上。只需要确定所有的传感器有不同的地址。该模块上有一个47K的上拉电阻,当没有数据传送时,可以将Tx线的电平至高到3.3V。
工作模式
标准模式
标准模式下,测距范围为18cm (7 inches) 至 600cm (19ft)。无需进行校准。该模式适用于商业开发中高级模式不能满足要求的情况。设置进入标准模式,发送指令 清除 高级模式:99 十进制或 0x63.
高级模式
这是出厂默认模式。该模式下,超声波测距范围甚至可以测到0cm。由于测0cm需要传感器所用的晶振有极其精准的锁定功能。而且需要有5次30cm以上的有效测量,之后“lock”位就被置1,从而可以进行0cm的测量。 测量时,SRF01会自动修改传感器的lock位。lock的状态也可以读取,在状态寄存器的0位。high(或 逻辑1)表示自锁,可以进行0cm的测量。但是,自锁状态不会一直保持下去,将会自动释放,该位变为0,之后当满足条件时将会重新设定。
睡眠模式
当处于睡眠模式下时,传感器的所有功能都会停止。模块停止运行,功耗会变为最小值,仅为监视器的静态电流和芯片的漏电电流之和。通常在55uA。可以发送0xFF唤醒模块,不要发送任何其他的—没有“break”,没有地址位。因为0xFF字节不是一个指令,只是Rx线上用来唤醒SRF01模块。唤醒之后,经过2s,等待处理器晶振工作稳定之后再进行操作。
测试
用上位机测试
我们有一个很小的测试软件,用C#编写,可以通过Acroname S22模块进行控制。一个小型肖特基二极管用作保护SRF01,避免驱动S22的驱动线(来自PC端的数据)。你需要下载并安装 FTDI VCP 的驱动来使用S22. 完整的工程指导,包括所有的源文件,可以在 这里下载。提醒:您需要安装Microsoft Visual C# 2008以上版本才能使用该软件。
用 Arduino 测试
1 接线
2 上传样例
正确接线之后,选中串口号,版型。可以上传代码进行测试。
/******************************************************************
* Arduino example for SRF01 and LCD03. *
* Takes a range in CM and displayes it on the LCD03 screen *
* Both the SRF01 and the LCD0 use their own software serial port *
* *
* By James Henderson, 2012
* Modified by leff DFRobot
******************************************************************/
#include <SoftwareSerial.h>
#define SRF_TXRX 0x05 // Defines pin 5 to be used as RX and TX for SRF01
#define SRF_ADDRESS 0x01 // Address of the SFR01
#define GETSOFT 0x5D // Byte to tell SRF01 we wish to read software version
#define GETRANGE 0x54 // Byte used to get range from SRF01
#define GETSTATUS 0x5F // Byte used to get the status of the transducer
SoftwareSerial srf01 = SoftwareSerial(SRF_TXRX, SRF_TXRX); // Sets up software serial port for the SRF01
void setup(){
srf01.begin(9600);
Serial.begin(9600);
srf01.listen(); // Make sure that the SRF01 software serial port is listening for data as only one software serial port can listen at a time
delay(200); // Waits some time to make sure everything is powered up
Serial.println("SRF01 Example");
byte softVer;
SRF01_Cmd(SRF_ADDRESS, GETSOFT); // Request the SRF01 software version
while (srf01.available() < 1);
softVer = srf01.read(); // Read software version from SRF01
}
void loop(){
byte hByte, lByte, statusByte, b1, b2, b3;
SRF01_Cmd(SRF_ADDRESS, GETRANGE); // Get the SRF01 to perform a ranging and send the data back to the arduino
while (srf01.available() < 2);
hByte = srf01.read(); // Get high byte
lByte = srf01.read(); // Get low byte
int range = ((hByte<<8)+lByte); // Put them together
Serial.println("Range = ");
Serial.println(range, DEC); // Print range result to the screen
Serial.println(" "); // Print some spaces to the screen to make sure space direcly after the result is clear
SRF01_Cmd(SRF_ADDRESS, GETSTATUS); // Request byte that will tell us if the transducer is locked or unlocked
while (srf01.available() < 1);
statusByte = srf01.read(); // Reads the SRF01 status, The least significant bit tells us if it is locked or unlocked
int newStatus = statusByte & 0x01; // Get status of lease significan bit
if(newStatus == 0){
Serial.println("Unlocked"); // Prints the word unlocked followd by a couple of spaces to make sure space after has nothing in
}
else {
Serial.println("Locked "); // Prints the word locked followd by a couple of spaces to make sure that the space after has nothing in
}
delay(100);
}
void SRF01_Cmd(byte Address, byte cmd){ // Function to send commands to the SRF01
pinMode(SRF_TXRX, OUTPUT);
digitalWrite(SRF_TXRX, LOW); // Send a 2ms break to begin communications with the SRF01
delay(2);
digitalWrite(SRF_TXRX, HIGH);
delay(1);
srf01.write(Address); // Send the address of the SRF01
srf01.write(cmd); // Send commnd byte to SRF01
pinMode(SRF_TXRX, INPUT);
int availbleJunk = srf01.available(); // As RX and TX are the same pin it will have recieved the data we just sent out, as we dont want this we read it back and ignore it as junk before waiting for useful data to arrive
for(int x = 0; x < availbleJunk; x++) byte junk = srf01.read();
}
3 测试结果
打开IDE窗口,选好波特率,距离信息会显示在窗口内。官方给出的测距范围是0-600cm,实测可以到700cm,但此时不是很未定。
附录
控制指令
指令发送格式:在“break”后接两位数据,第一位是传感器的地址 1 - 16 (0x01 - 0x10),然后是实际的指令本身,见下。
- 两个指令(80-81)用于设置测量结果的单位 英寸/厘米,无返回值;等待70mS之后,可以发送指令 94 ,获得测距结果。
- 两个指令(83-84)与上述指令功能相同,但同时会将测距结果返回到控制器。
指令(80-84)成为“真指令”,因为他们完成了一次有效的测量。另外一组指令(86-89)成为“伪指令”,他们与“真指令”功能相似,但不会触发8个周期的超声波检测,可以用于超声波已经被其他传感器触发的情况,您可以用此使两个超声波传感器进行同步测量。注:指令 (92) 用于触发超声波脉冲,不进行超声波检测。
- 指令 93 用于获取SRF01的固件版本号。
- 指令 94 用来获取两个字节的测量结果,高字节在前。并将他们结合成16位的数据。
- 指令 95 用来获取当前传感器状态, 0 代表 “封锁”, 1 代表“解锁”。上电之后,传感器出于封锁状态 0,当解锁指令发送后,模块从睡眠模式中推出,状态位变为解锁状态 1。变化过程中,经历了6次有效测量,注意:测距应当至少为30cm。参见 高级模式。
- 指令 96 用来进入睡眠模式, 参见 睡眠模式。
- 指令 98 用来进入高级模式, 参见 高级模式。
指令十进制 | 指令16进制 | 寄存器可读写性 | 含义 |
80 | 0x50 | 是 | 实际测量模式 -单位为 英寸 |
81 | 0x51 | 是 | 实际测量模式 - 单位为-厘米 |
83 | 0x53 | 否 | 实际测量模式- 单位为 英寸, 测量完成会自动通过TX将结果送回 |
84 | 0x54 | 否 | 实际测量模式- 单位为 厘米, 测量完成会自动通过TX将结果送回 |
86 | 0x56 | 是 | 伪测量模式 - 单位为 英寸 |
87 | 0x57 | 是 | 伪测量模式 - 单位为 厘米 |
89 | 0x59 | 否 | 伪测量模式 - 单位为 英寸,测量完成会自动通过TX将结果送回 |
90 | 0x5A | 是 | 伪测量模式 - 单位为 厘米,测量完成会自动通过TX将结果送回 |
92 | 0x5C | 是 | 发送8个周期 40kHz的超声波脉冲- 不进行超声波接收 |
93 | 0x5D | 否 | 获得软件版本号- 返回一位数据 |
94 | 0x5E | 否 | 获得测距结果,返回两个字节的信息,高位在前 |
95 | 0x5F | 否 | 获取状态,返回一个字节的状态信息。0代表“封锁”,1 代表 “高级模式 |
96 | 0x60 | 是 | 睡眠模式 |
97 | 0x61 | 是 | 解锁 |
98 | 0x62 | 是 | 进入高级模式(出厂默认)- 封锁状态下,测量距离可至0。 |
99 | 0x63 | 是 | 解除高级模式— 测量距离最低约为12cm/5in |
100 | 0x64 | 是 | 设置波特率为19200 |
101 | 0x65 | 是 | 设置波特率为 38400 |
160 | 0xA0 | 否 | 更改I2C地址的指令列 第一个 |
165 | 0xA5 | 否 | 更改I2C地址的指令列 第三个 |
170 | 0xAA | 否 | 更改I2C地址的指令列 第二个 |
上表中有返回值的指令都不可以访问地址0,也就是说 SRF01 在此时同时也在传送数据,所以该地址被保护。 上表中无返回值的指令都可以访问地址0,但更改地址的指令除外。 访问地址0的优点在于可以发送测距指令如0x51(81十进制),所有的SRF01就可以同时开始测距,70mS之后,您就可以得到每个地址相应的结果。
LED闪烁信息
在测量距离时,LED灯会不断地闪烁。如果传感器解锁,LED将会闪烁一下,然后常亮。如果传感器上锁,LED将会闪烁一下,熄灭。
如果您给SRF01上电,在没有发送任何指令的情况下,LED将会按照一定的方式闪烁,表示当前的地址信息。一次长闪之后,紧跟着多次短闪。一旦您发送指令,闪烁将会停止。
地址十进制 | 地址16进制 | 长闪 | 短闪 |
1 | 01 | 1 | 0 |
2 | 02 | 1 | 1 |
3 | 03 | 1 | 2 |
4 | 04 | 1 | 3 |
5 | 05 | 1 | 4 |
6 | 06 | 1 | 5 |
7 | 07 | 1 | 6 |
8 | 08 | 1 | 7 |
8 | 08 | 1 | 7 |
9 | 09 | 1 | 8 |
10 | 0A | 1 | 9 |
11 | 0B | 1 | 10 |
12 | 0C | 1 | 11 |
13 | 0D | 1 | 12 |
14 | 0E | 1 | 13 |
15 | 0F | 1 | 14 |
16 | 10 | 1 | 15 |
更改 SRF01 的地址
如需更改传感器地址,控制器上只能连一个传感器,如果一个引脚上连接了多个,则不能成功。按照地址的正确顺序写入即可。 例如: 将地址为 1 的传感器 更改为 5(1 为初始地址);写入:0xA0, 0xAA, 0xA5, 0x05 。这条指令一定要按照正确的写入顺序,此外,当中不允许插入其他指令。这条指令要分为4次输入。即: "break" 0x01, 0xA0 "break" 0x01, 0xAA "break" 0x01, 0xA5 "break" 0x01, 0x05 结束过后,新的地址将会保存在闪存内,掉电不会丢失。你最好将设置后的传感器贴上标签进行标记。切记不要将多个传感器设为同一个地,否则由于总线冲突将会造成不可预测的后果。
组装 SRF01
发货清单中附带的一个橡皮圈,是套在 SRF01 上的,用于将此传感器固定于您的开发板上。板的厚度最大为1.7mm。 产品原始链接:原始页面
Go Shopping SRF01 超声波传感器 (SKU:SEN0004)