SRF01超声波传感器

概览

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,误接会造成损坏。

SRF01_ultrasonic_sensor_3.png

规格参数

电源

该传感器允许 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以上版本才能使用该软件。

SRF01_ultrasonic_sensor_4.png

Acroname_S22.jpg

SRF01_ultrasonic_sensor_testpro.png

用 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,但此时不是很未定。

SRF01_ultrasonic_sensor_connectonly1test_result.png

附录

控制指令

指令发送格式:在“break”后接两位数据,第一位是传感器的地址 1 - 16 (0x01 - 0x10),然后是实际的指令本身,见下。

指令(80-84)成为“真指令”,因为他们完成了一次有效的测量。另外一组指令(86-89)成为“伪指令”,他们与“真指令”功能相似,但不会触发8个周期的超声波检测,可以用于超声波已经被其他传感器触发的情况,您可以用此使两个超声波传感器进行同步测量。注:指令 (92) 用于触发超声波脉冲,不进行超声波检测。

指令十进制 指令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。 产品原始链接:原始页面

<File:nextredirectltr.png>Go Shopping SRF01 超声波传感器 (SKU:SEN0004)