359 |
kaklik |
1 |
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
|
|
2 |
<!-- saved from url=(0054)http://www.robot-electronics.co.uk/htm/srf08tech.shtml -->
|
|
|
3 |
<HTML><HEAD><TITLE>SRF08 Ultra sonic range finder</TITLE>
|
|
|
4 |
<META http-equiv=Content-Type content="text/html; charset=windows-1253">
|
|
|
5 |
<META content="MSHTML 6.00.2600.0" name=GENERATOR></HEAD>
|
|
|
6 |
<BODY>
|
|
|
7 |
<P align=center><B><FONT size=5>SRF08 Ultra sonic range finder </FONT><FONT
|
|
|
8 |
size=3><BR>Technical Specification</FONT></B></P>
|
|
|
9 |
<P align=left>Communication with the SRF08 ultrasonic rangefinder is via the I2C
|
|
|
10 |
bus. This is available on popular controllers such as the OOPic and Stamp BS2p,
|
|
|
11 |
as well as a wide variety of micro-controllers. To the programmer the SRF08
|
|
|
12 |
behaves in the same way as the ubiquitous 24xx series eeprom's, except that the
|
|
|
13 |
I2C address is different. The default shipped address of the SRF08 is 0xE0. It
|
|
|
14 |
can be changed by the user to any of 16 addresses E0, E2, E4, E6, E8, EA, EC,
|
|
|
15 |
EE, F0, F2, F4, F6, F8, FA, FC or FE, therefore up to 16 sonar's can be used. In
|
|
|
16 |
addition to the above addresses, all sonar's on the I2C bus will respond to
|
|
|
17 |
address 0 - the General Broadcast address. This means that writing a ranging
|
|
|
18 |
command to I2C address 0 (0x00) will start all sonar's ranging at the same time.
|
|
|
19 |
This should be useful in ANN Mode (See below). The results must be read
|
|
|
20 |
individually from each sonar's real address. We have <A
|
|
|
21 |
href="http://www.robot-electronics.co.uk/htm/examples.shtml">examples</A> of
|
|
|
22 |
using the SRF08 module with a wide range of popular controllers.</P>
|
|
|
23 |
<P align=left><B>Connections<BR></B>The "Do Not Connect" pin should be left
|
|
|
24 |
unconnected. It is actually the CPU MCLR line and is used once only in our
|
|
|
25 |
workshop to program the PIC16F872 on-board after assembly, and has an internal
|
|
|
26 |
pull-up resistor. The SCL and SDA lines should each have a pull-up resistor to
|
|
|
27 |
+5v somewhere on the I2C bus. You only need one pair of resistors, not a pair
|
|
|
28 |
for every module. They are normally located with the bus master rather than the
|
|
|
29 |
slaves. The SRF08 is always a slave - never a bus master. If you need them, I
|
|
|
30 |
recommend 1.8k resistors. Some modules such as the OOPic already have pull-up
|
|
|
31 |
resistors and you do not need to add any more. </P>
|
|
|
32 |
<P align=center><IMG height=232
|
|
|
33 |
src="SRF08 Ultra sonic range finder_files/srf08con.jpg" width=302 border=0></P>
|
|
|
34 |
<P align=left><B>Registers</B><BR> The SRF08 appears as a set of 36
|
|
|
35 |
registers.</P>
|
|
|
36 |
<DIV align=center>
|
|
|
37 |
<CENTER>
|
|
|
38 |
<TABLE cellSpacing=0 cellPadding=0 width="53%" bgColor=#ffffcc border=1>
|
|
|
39 |
<TBODY>
|
|
|
40 |
<TR>
|
|
|
41 |
<TD width="24%">
|
|
|
42 |
<P align=center>Location</P></TD>
|
|
|
43 |
<TD width="32%">
|
|
|
44 |
<P align=center>Read</P></TD>
|
|
|
45 |
<TD width="44%">
|
|
|
46 |
<P align=center>Write</P></TD></TR>
|
|
|
47 |
<TR>
|
|
|
48 |
<TD width="24%">
|
|
|
49 |
<P align=center>0</P></TD>
|
|
|
50 |
<TD width="32%">
|
|
|
51 |
<P align=center>Software Revision</P></TD>
|
|
|
52 |
<TD width="44%">
|
|
|
53 |
<P align=center>Command Register</P></TD></TR>
|
|
|
54 |
<TR>
|
|
|
55 |
<TD width="24%">
|
|
|
56 |
<P align=center>1</P></TD>
|
|
|
57 |
<TD width="32%">
|
|
|
58 |
<P align=center>Light Sensor</P></TD>
|
|
|
59 |
<TD width="44%">
|
|
|
60 |
<P align=center>Max Gain Register (default 31) </P></TD></TR>
|
|
|
61 |
<TR>
|
|
|
62 |
<TD width="24%">
|
|
|
63 |
<P align=center>2</P></TD>
|
|
|
64 |
<TD width="32%">
|
|
|
65 |
<P align=center>1st Echo High Byte</P></TD>
|
|
|
66 |
<TD width="44%">
|
|
|
67 |
<P align=center>Range Register (default 255)</P></TD></TR>
|
|
|
68 |
<TR>
|
|
|
69 |
<TD width="24%">
|
|
|
70 |
<P align=center>3</P></TD>
|
|
|
71 |
<TD width="32%">
|
|
|
72 |
<P align=center>1st Echo Low Byte</P></TD>
|
|
|
73 |
<TD width="44%">
|
|
|
74 |
<P align=center>N/A</P></TD></TR>
|
|
|
75 |
<TR>
|
|
|
76 |
<TD width="24%">
|
|
|
77 |
<P align=center>~~~~</P></TD>
|
|
|
78 |
<TD width="32%">
|
|
|
79 |
<P align=center>~~~~</P></TD>
|
|
|
80 |
<TD width="44%">
|
|
|
81 |
<P align=center>~~~~</P></TD></TR>
|
|
|
82 |
<TR>
|
|
|
83 |
<TD width="24%">
|
|
|
84 |
<P align=center>34</P></TD>
|
|
|
85 |
<TD width="32%">
|
|
|
86 |
<P align=center>17th Echo High Byte</P></TD>
|
|
|
87 |
<TD width="44%">
|
|
|
88 |
<P align=center>N/A</P></TD></TR>
|
|
|
89 |
<TR>
|
|
|
90 |
<TD width="24%">
|
|
|
91 |
<P align=center>35</P></TD>
|
|
|
92 |
<TD width="32%">
|
|
|
93 |
<P align=center>17th Echo Low Byte</P></TD>
|
|
|
94 |
<TD width="44%">
|
|
|
95 |
<P align=center>N/A</P></TD></TR></TBODY></TABLE></CENTER></DIV>
|
|
|
96 |
<P align=left>Only locations 0, 1 and 2 can be written to. Location 0 is the
|
|
|
97 |
command register and is used to start a ranging session. It cannot be read.
|
|
|
98 |
Reading from location 0 returns the SRF08 software revision. By default,
|
|
|
99 |
the ranging lasts for 65mS, but can be changed by writing to the range register
|
|
|
100 |
at location 2. If you do so, then you will likely need to change the analogue
|
|
|
101 |
gain by writing to location 1. See the <B>Changing Range</B> and <B>Analogue
|
|
|
102 |
Gain</B> sections below.</P>
|
|
|
103 |
<P align=left>Location 1 is the onboard light sensor. This data is updated every
|
|
|
104 |
time a new ranging command has completed and can be read when range data is
|
|
|
105 |
read. The next two locations, 2 and 3, are the 16bit unsigned result from the
|
|
|
106 |
latest ranging - high byte first. The meaning of this value depends on the
|
|
|
107 |
command used, and is either the range in inches, or the range in cm or the
|
|
|
108 |
flight time in uS. A value of zero indicates that no objects were detected.
|
|
|
109 |
There are up to a further 16 results indicating echo's from more distant
|
|
|
110 |
objects. </P>
|
|
|
111 |
<P align=left><B>Commands</B><BR>The are three commands to initiate a ranging
|
|
|
112 |
(80 to 82), to return the result in inches, centimeters or microseconds. There
|
|
|
113 |
is also an ANN mode (Artificial Neural Network) mode which is described later
|
|
|
114 |
and a set of commands to change the I2C address.</P>
|
|
|
115 |
<DIV align=center>
|
|
|
116 |
<CENTER>
|
|
|
117 |
<TABLE cellSpacing=0 cellPadding=0 width="77%" bgColor=#ffffcc border=1>
|
|
|
118 |
<TBODY>
|
|
|
119 |
<TR>
|
|
|
120 |
<TD align=middle width="34%" colSpan=2>Command</TD>
|
|
|
121 |
<TD align=middle width="94%" rowSpan=2>Action</TD></TR>
|
|
|
122 |
<TR>
|
|
|
123 |
<TD align=middle width="16%">Decimal</TD>
|
|
|
124 |
<TD align=middle width="18%">Hex</TD></TR>
|
|
|
125 |
<TR>
|
|
|
126 |
<TD align=middle width="16%">80</TD>
|
|
|
127 |
<TD align=middle width="18%">0x50</TD>
|
|
|
128 |
<TD align=left width="94%">Ranging Mode - Result in inches</TD></TR>
|
|
|
129 |
<TR>
|
|
|
130 |
<TD align=middle width="16%">81</TD>
|
|
|
131 |
<TD align=middle width="18%">0x51</TD>
|
|
|
132 |
<TD align=left width="94%">Ranging Mode - Result in centimeters</TD></TR>
|
|
|
133 |
<TR>
|
|
|
134 |
<TD align=middle width="16%">82</TD>
|
|
|
135 |
<TD align=middle width="18%">0x52</TD>
|
|
|
136 |
<TD align=left width="94%">Ranging Mode - Result in micro-seconds</TD></TR>
|
|
|
137 |
<TR>
|
|
|
138 |
<TD align=middle width="16%"> </TD>
|
|
|
139 |
<TD align=middle width="18%"> </TD>
|
|
|
140 |
<TD align=left width="94%"> </TD></TR>
|
|
|
141 |
<TR>
|
|
|
142 |
<TD align=middle width="16%">83</TD>
|
|
|
143 |
<TD align=middle width="18%">0x53</TD>
|
|
|
144 |
<TD align=left width="94%">ANN Mode - Result in inches</TD></TR>
|
|
|
145 |
<TR>
|
|
|
146 |
<TD align=middle width="16%">84</TD>
|
|
|
147 |
<TD align=middle width="18%">0x54</TD>
|
|
|
148 |
<TD align=left width="94%">ANN Mode - Result in centimeters</TD></TR>
|
|
|
149 |
<TR>
|
|
|
150 |
<TD align=middle width="16%">85</TD>
|
|
|
151 |
<TD align=middle width="18%">0x55</TD>
|
|
|
152 |
<TD align=left width="94%">ANN Mode - Result in micro-seconds</TD></TR>
|
|
|
153 |
<TR>
|
|
|
154 |
<TD align=middle width="16%"> </TD>
|
|
|
155 |
<TD align=middle width="18%"> </TD>
|
|
|
156 |
<TD align=left width="94%"> </TD></TR>
|
|
|
157 |
<TR>
|
|
|
158 |
<TD align=middle width="16%">160</TD>
|
|
|
159 |
<TD align=middle width="18%">0xA0</TD>
|
|
|
160 |
<TD align=left width="94%">1st in sequence to change I2C address</TD></TR>
|
|
|
161 |
<TR>
|
|
|
162 |
<TD align=middle width="16%">165</TD>
|
|
|
163 |
<TD align=middle width="18%">0xA5</TD>
|
|
|
164 |
<TD align=left width="94%">3rd in sequence to change I2C address</TD></TR>
|
|
|
165 |
<TR>
|
|
|
166 |
<TD align=middle width="16%">170</TD>
|
|
|
167 |
<TD align=middle width="18%">0xAA</TD>
|
|
|
168 |
<TD align=left width="94%">2nd in sequence to change I2C
|
|
|
169 |
address</TD></TR></TBODY></TABLE></CENTER></DIV>
|
|
|
170 |
<P align=left><B>Ranging Mode</B><BR>To initiate a ranging, write one of the
|
|
|
171 |
above commands to the command register and wait the required amount of time for
|
|
|
172 |
completion and read as many results as you wish. The echo buffer is cleared at
|
|
|
173 |
the start of each ranging. The first echo range is placed in locations 2,3. the
|
|
|
174 |
second in 4,5, etc. If a location (high and low bytes) is 0, then there will be
|
|
|
175 |
no further reading in the rest of the registers. The default and recommended
|
|
|
176 |
time for completion of ranging is 65mS, however you can shorten this by writing
|
|
|
177 |
to the range register before issuing a ranging command. Light sensor data at
|
|
|
178 |
location 1 will also have been updated after a ranging command. </P>
|
|
|
179 |
<P align=left><B>ANN Mode<BR></B>ANN mode (Artificial Neural Network) is
|
|
|
180 |
designed to provide the multi echo data in a way that is easier to input to a
|
|
|
181 |
neural network, at least I hope it is - I've not actually done it yet. ANN mode
|
|
|
182 |
provides a 32 byte buffer (locations 4 to 35 inclusive) where each byte
|
|
|
183 |
represents the 65536uS maximum flight time divided into 32 chunks of 2048uS each
|
|
|
184 |
- equivalent to about 352mm of range. If an echo is received within a bytes time
|
|
|
185 |
slot then it will be set to no-zero, otherwise it will be zero. So if an echo is
|
|
|
186 |
received from within the first 352mm, location 4 will be non-zero. If an object
|
|
|
187 |
is detected 3m away the location 12 will be non-zero (3000/352 = 8) (8+4=12).
|
|
|
188 |
Arranging the data like this should be better for a neural net than the other
|
|
|
189 |
formats. The input to your network should be 0 if the byte is zero and 1 if its
|
|
|
190 |
non-zero. I have a SOFM (Self Organizing Feature Map) in mind for the neural
|
|
|
191 |
net, but will hopefully be useful for any type. </P>
|
|
|
192 |
<DIV align=center>
|
|
|
193 |
<CENTER>
|
|
|
194 |
<TABLE cellSpacing=0 cellPadding=0 width="71%" bgColor=#ffffcc border=1>
|
|
|
195 |
<TBODY>
|
|
|
196 |
<TR>
|
|
|
197 |
<TD align=middle width="20%">Location 4</TD>
|
|
|
198 |
<TD align=middle width="20%">Location 5</TD>
|
|
|
199 |
<TD align=middle width="20%">Location 6</TD>
|
|
|
200 |
<TD align=middle width="20%">Location 7</TD>
|
|
|
201 |
<TD align=middle width="20%">Locations 8 - 35</TD></TR>
|
|
|
202 |
<TR>
|
|
|
203 |
<TD align=middle width="20%">0 - 352mm</TD>
|
|
|
204 |
<TD align=middle width="20%">353 - 705mm</TD>
|
|
|
205 |
<TD align=middle width="20%">706 - 1057mm</TD>
|
|
|
206 |
<TD align=middle width="20%">1058 - 1410mm</TD>
|
|
|
207 |
<TD align=middle width="20%">and so on</TD></TR></TBODY></TABLE></CENTER></DIV>
|
|
|
208 |
<P align=left>Locations 2,3 contain the range of the nearest object converted to
|
|
|
209 |
inches, cm or uS and is the same as for Ranging Mode.</P>
|
|
|
210 |
<P align=left><B>Checking for Completion of Ranging</B><BR>You do not have to
|
|
|
211 |
use a timer on your own controller to wait for ranging to finish. You can take
|
|
|
212 |
advantage of the fact that the SRF08 will not respond to any I2C activity whilst
|
|
|
213 |
ranging. Therefore, if you try to read from the SRF08 (we use the software
|
|
|
214 |
revision number a location 0) then you will get 255 (0xFF) whilst ranging. This
|
|
|
215 |
is because the I2C data line (SDA) is pulled high if nothing is driving it. As
|
|
|
216 |
soon as the ranging is complete the SRF08 will again respond to the I2C bus, so
|
|
|
217 |
just keep reading the register until its not 255 (0xFF) anymore. You can then
|
|
|
218 |
read the sonar data. Your controller can take advantage of this to perform other
|
|
|
219 |
tasks while the SRF08 is ranging. </P>
|
|
|
220 |
<P align=left><B>Changing the Range</B><BR>The maximum range of the SRF08 is set
|
|
|
221 |
by an internal timer. By default, this is 65mS or the equivalent of 11 metres of
|
|
|
222 |
range. This is much further than the 6 metres the SRF08 is actually
|
|
|
223 |
capable of. It is possible to reduce the time the SRF08 listens for an echo, and
|
|
|
224 |
hence the range, by writing to the range register at location 2. The range can
|
|
|
225 |
be set in steps of about 43mm (0.043m or 1.68 inches) up to 11
|
|
|
226 |
metres. <BR>The range is ((Range Register x 43mm) + 43mm) so setting the
|
|
|
227 |
Range Register to 0 (0x00) gives a maximum range of 43mm. Setting the Range
|
|
|
228 |
Register to 1 (0x01) gives a maximum range of 86mm. More usefully, 24 (0x18)
|
|
|
229 |
gives a range of 1 metre and 140 (0x8C) is 6 metres. Setting 255 (0xFF) gives
|
|
|
230 |
the original 11 metres (255 x 43 + 43 is 11008mm). There are two reasons you may
|
|
|
231 |
wish to reduce the range.<BR>1. To get at the range information quicker<BR>2. To
|
|
|
232 |
be able to fire the SRF08 at a faster rate.<BR>If you only wish to get at the
|
|
|
233 |
range information a bit sooner and will continue to fire the SRF08 at 65ms of
|
|
|
234 |
slower, then all will be well. However if you wish to fire the SRF08 at a faster
|
|
|
235 |
rate than 65mS, you will definitely need to reduce the gain - see next
|
|
|
236 |
section.<BR>The range is set to maximum every time the SRF08 is powered-up. If
|
|
|
237 |
you need a different range, change it once as part of your system initialization
|
|
|
238 |
code.<BR></P>
|
|
|
239 |
<P align=left><B>Analogue Gain</B><BR>The analogue gain register sets the
|
|
|
240 |
<I>Maximum</I> gain of the analogue stages. To set the maximum gain, just write
|
|
|
241 |
one of these values to the gain register at location 1. During a ranging, the
|
|
|
242 |
analogue gain starts off at its minimum value of 94. This is increased at
|
|
|
243 |
approx. 70uS intervals up to the maximum gain setting, set by register
|
|
|
244 |
1. Maximum possible gain is reached after about 390mm of range. The purpose
|
|
|
245 |
of providing a limit to the maximum gain is to allow you to fire the sonar more
|
|
|
246 |
rapidly than 65mS. Since the ranging can be very short, a new ranging can be
|
|
|
247 |
initiated as soon as the previous range data has been read. A potential hazard
|
|
|
248 |
with this is that the second ranging may pick up a distant echo returning from
|
|
|
249 |
the previous "ping", give a false result of a close by object when there is
|
|
|
250 |
none. To reduce this possibility, the maximum gain can be reduced to limit the
|
|
|
251 |
modules sensitivity to the weaker distant echo, whilst still able to detect
|
|
|
252 |
close by objects. The maximum gain setting is stored only in the CPU's RAM and
|
|
|
253 |
is initialized to maximum on power-up, so if you only want do a ranging every
|
|
|
254 |
65mS, or longer, you can ignore the Range and Gain Registers.<BR><I><B><FONT
|
|
|
255 |
color=#ff00ff>Note</FONT></B></I> - Effective in Ranging Mode only, in ANN mode,
|
|
|
256 |
gain is controlled automatically. </P>
|
|
|
257 |
<DIV align=center>
|
|
|
258 |
<CENTER>
|
|
|
259 |
<TABLE height=714 cellSpacing=0 cellPadding=0 width=428 bgColor=#ffffcc
|
|
|
260 |
border=1>
|
|
|
261 |
<TBODY>
|
|
|
262 |
<TR>
|
|
|
263 |
<TD align=middle width=157 colSpan=2 height=19>Gain Register</TD>
|
|
|
264 |
<TD align=middle width=265 height=40 rowSpan=2>Maximum Analogue Gain</TD></TR>
|
|
|
265 |
<TR>
|
|
|
266 |
<TD align=middle width=77 height=19>Decimal</TD>
|
|
|
267 |
<TD align=middle width=80 height=19>Hex</TD></TR>
|
|
|
268 |
<TR>
|
|
|
269 |
<TD align=middle width=74 height=19>0</TD>
|
|
|
270 |
<TD align=middle width=81 height=19>0x00</TD>
|
|
|
271 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to 94</TD></TR>
|
|
|
272 |
<TR>
|
|
|
273 |
<TD align=middle width=74 height=19>1</TD>
|
|
|
274 |
<TD align=middle width=81 height=19>0x01</TD>
|
|
|
275 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to 97</TD></TR>
|
|
|
276 |
<TR>
|
|
|
277 |
<TD align=middle width=74 height=19>2</TD>
|
|
|
278 |
<TD align=middle width=81 height=19>0x02</TD>
|
|
|
279 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
280 |
100</TD></TR>
|
|
|
281 |
<TR>
|
|
|
282 |
<TD align=middle width=74 height=19>3</TD>
|
|
|
283 |
<TD align=middle width=81 height=19>0x03</TD>
|
|
|
284 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
285 |
103</TD></TR>
|
|
|
286 |
<TR>
|
|
|
287 |
<TD align=middle width=74 height=19>4</TD>
|
|
|
288 |
<TD align=middle width=81 height=19>0x04</TD>
|
|
|
289 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
290 |
107</TD></TR>
|
|
|
291 |
<TR>
|
|
|
292 |
<TD align=middle width=74 height=19>5</TD>
|
|
|
293 |
<TD align=middle width=81 height=19>0x05</TD>
|
|
|
294 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
295 |
110</TD></TR>
|
|
|
296 |
<TR>
|
|
|
297 |
<TD align=middle width=74 height=19>6</TD>
|
|
|
298 |
<TD align=middle width=81 height=19>0x06</TD>
|
|
|
299 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
300 |
114</TD></TR>
|
|
|
301 |
<TR>
|
|
|
302 |
<TD align=middle width=74 height=19>7</TD>
|
|
|
303 |
<TD align=middle width=81 height=19>0x07</TD>
|
|
|
304 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
305 |
118</TD></TR>
|
|
|
306 |
<TR>
|
|
|
307 |
<TD align=middle width=74 height=19>8</TD>
|
|
|
308 |
<TD align=middle width=81 height=19>0x08</TD>
|
|
|
309 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
310 |
123</TD></TR>
|
|
|
311 |
<TR>
|
|
|
312 |
<TD align=middle width=74 height=19>9</TD>
|
|
|
313 |
<TD align=middle width=81 height=19>0x09</TD>
|
|
|
314 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
315 |
128</TD></TR>
|
|
|
316 |
<TR>
|
|
|
317 |
<TD align=middle width=74 height=19>10</TD>
|
|
|
318 |
<TD align=middle width=81 height=19>0x0A</TD>
|
|
|
319 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
320 |
133</TD></TR>
|
|
|
321 |
<TR>
|
|
|
322 |
<TD align=middle width=74 height=19>11</TD>
|
|
|
323 |
<TD align=middle width=81 height=19>0x0B</TD>
|
|
|
324 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
325 |
139</TD></TR>
|
|
|
326 |
<TR>
|
|
|
327 |
<TD align=middle width=74 height=19>12</TD>
|
|
|
328 |
<TD align=middle width=81 height=19>0x0C</TD>
|
|
|
329 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
330 |
145</TD></TR>
|
|
|
331 |
<TR>
|
|
|
332 |
<TD align=middle width=74 height=19>13</TD>
|
|
|
333 |
<TD align=middle width=81 height=19>0x0D</TD>
|
|
|
334 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
335 |
152</TD></TR>
|
|
|
336 |
<TR>
|
|
|
337 |
<TD align=middle width=74 height=19>14</TD>
|
|
|
338 |
<TD align=middle width=81 height=19>0x0E</TD>
|
|
|
339 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
340 |
159</TD></TR>
|
|
|
341 |
<TR>
|
|
|
342 |
<TD align=middle width=74 height=19>15</TD>
|
|
|
343 |
<TD align=middle width=81 height=19>0x0F</TD>
|
|
|
344 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
345 |
168</TD></TR>
|
|
|
346 |
<TR>
|
|
|
347 |
<TD align=middle width=74 height=19>16</TD>
|
|
|
348 |
<TD align=middle width=81 height=19>0x10</TD>
|
|
|
349 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
350 |
177</TD></TR>
|
|
|
351 |
<TR>
|
|
|
352 |
<TD align=middle width=74 height=19>17</TD>
|
|
|
353 |
<TD align=middle width=81 height=19>0x11</TD>
|
|
|
354 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
355 |
187</TD></TR>
|
|
|
356 |
<TR>
|
|
|
357 |
<TD align=middle width=74 height=19>18</TD>
|
|
|
358 |
<TD align=middle width=81 height=19>0x12</TD>
|
|
|
359 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
360 |
199</TD></TR>
|
|
|
361 |
<TR>
|
|
|
362 |
<TD align=middle width=74 height=19>19</TD>
|
|
|
363 |
<TD align=middle width=81 height=19>0x13</TD>
|
|
|
364 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
365 |
212</TD></TR>
|
|
|
366 |
<TR>
|
|
|
367 |
<TD align=middle width=74 height=19>20</TD>
|
|
|
368 |
<TD align=middle width=81 height=19>0x14</TD>
|
|
|
369 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
370 |
227</TD></TR>
|
|
|
371 |
<TR>
|
|
|
372 |
<TD align=middle width=74 height=19>21</TD>
|
|
|
373 |
<TD align=middle width=81 height=19>0x15</TD>
|
|
|
374 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
375 |
245</TD></TR>
|
|
|
376 |
<TR>
|
|
|
377 |
<TD align=middle width=74 height=19>22</TD>
|
|
|
378 |
<TD align=middle width=81 height=19>0x16</TD>
|
|
|
379 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
380 |
265</TD></TR>
|
|
|
381 |
<TR>
|
|
|
382 |
<TD align=middle width=74 height=19>23</TD>
|
|
|
383 |
<TD align=middle width=81 height=19>0x17</TD>
|
|
|
384 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
385 |
288</TD></TR>
|
|
|
386 |
<TR>
|
|
|
387 |
<TD align=middle width=74 height=19>24</TD>
|
|
|
388 |
<TD align=middle width=81 height=19>0x18</TD>
|
|
|
389 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
390 |
317</TD></TR>
|
|
|
391 |
<TR>
|
|
|
392 |
<TD align=middle width=74 height=19>25</TD>
|
|
|
393 |
<TD align=middle width=81 height=19>0x18</TD>
|
|
|
394 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
395 |
352</TD></TR>
|
|
|
396 |
<TR>
|
|
|
397 |
<TD align=middle width=74 height=19>26</TD>
|
|
|
398 |
<TD align=middle width=81 height=19>0x20</TD>
|
|
|
399 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
400 |
395</TD></TR>
|
|
|
401 |
<TR>
|
|
|
402 |
<TD align=middle width=74 height=19>27</TD>
|
|
|
403 |
<TD align=middle width=81 height=19>0x21</TD>
|
|
|
404 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
405 |
450</TD></TR>
|
|
|
406 |
<TR>
|
|
|
407 |
<TD align=middle width=74 height=19>28</TD>
|
|
|
408 |
<TD align=middle width=81 height=19>0x22</TD>
|
|
|
409 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
410 |
524</TD></TR>
|
|
|
411 |
<TR>
|
|
|
412 |
<TD align=middle width=74 height=19>29</TD>
|
|
|
413 |
<TD align=middle width=81 height=19>0x23</TD>
|
|
|
414 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
415 |
626</TD></TR>
|
|
|
416 |
<TR>
|
|
|
417 |
<TD align=middle width=74 height=19>30</TD>
|
|
|
418 |
<TD align=middle width=81 height=19>0x24</TD>
|
|
|
419 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
420 |
777</TD></TR>
|
|
|
421 |
<TR>
|
|
|
422 |
<TD align=middle width=74 height=19>31</TD>
|
|
|
423 |
<TD align=middle width=81 height=19>0x25</TD>
|
|
|
424 |
<TD align=middle width=265 height=19>Set Maximum Analogue Gain to
|
|
|
425 |
1025</TD></TR></TBODY></TABLE></CENTER></DIV>
|
|
|
426 |
<P align=left>Note that the relationship between the Gain Register setting and
|
|
|
427 |
the actual gain is not a linear one. Also there is no magic formula to say "use
|
|
|
428 |
this gain setting with that range setting". It depends on the size, shape and
|
|
|
429 |
material of the object and what else is around in the room. Try playing with
|
|
|
430 |
different settings until you get the result you want. If you appear to get false
|
|
|
431 |
readings, it may be echo's from previous "pings", try going back to firing the
|
|
|
432 |
SRF08 every 65mS or longer (slower). <BR>If you are in any doubt about the
|
|
|
433 |
Range and Gain Registers, remember they are automatically set by the SRF08 to
|
|
|
434 |
their default values when it is powered-up. You can ignore and forget about them
|
|
|
435 |
and the SRF08 will work fine, detecting objects up to 6 metres away every 65mS
|
|
|
436 |
or slower.</P>
|
|
|
437 |
<P align=left><B>Light Sensor</B><BR>The SRF08 has a light sensor on-board. A
|
|
|
438 |
reading of the light intensity is made by the SRF08 each time a ranging takes
|
|
|
439 |
place in either Ranging or ANN Modes ( The A/D conversion is actually done just
|
|
|
440 |
before the "ping" whilst the +/- 10v generator is stabilizing). The reading
|
|
|
441 |
increases as the brightness increases, so you will get a maximum value in bright
|
|
|
442 |
light and minimum value in darkness. It should get close to 2-3 in complete
|
|
|
443 |
darkness and up to about 248 (0xF8) in bright light. The light intensity can be
|
|
|
444 |
read from the Light Sensor Register at location 1 at the same time that
|
|
|
445 |
you are reading the range data.</P>
|
|
|
446 |
<P align=left><B>LED</B><BR>The red LED is used to flash out a code for the I2C
|
|
|
447 |
address on power-up (see below). It also gives a brief flash during the "ping"
|
|
|
448 |
whilst ranging.</P>
|
|
|
449 |
<P align=left><B>Changing the I2C Bus Address</B><BR>To change the I2C address
|
|
|
450 |
of the SRF08 you must have only one sonar on the bus. Write the 3 sequence
|
|
|
451 |
commands in the correct order followed by the address. Example; to change the
|
|
|
452 |
address of a sonar currently at 0xE0 (the default shipped address) to 0xF2,
|
|
|
453 |
write the following to address 0xE0; (0xA0, 0xAA, 0xA5, 0xF2 ). These commands
|
|
|
454 |
must be sent in the correct sequence to change the I2C address, additionally, No
|
|
|
455 |
other command may be issued in the middle of the sequence. The sequence must be
|
|
|
456 |
sent to the command register at location 0, which means 4 separate write
|
|
|
457 |
transactions on the I2C bus. When done, you should label the sonar with its
|
|
|
458 |
address, however if you do forget, just power it up without sending any
|
|
|
459 |
commands. The SRF08 will flash its address out on the LED. One long flash
|
|
|
460 |
followed by a number of shorter flashes indicating its address. The flashing is
|
|
|
461 |
terminated immediately on sending a command the SRF08.</P>
|
|
|
462 |
<DIV align=center>
|
|
|
463 |
<CENTER>
|
|
|
464 |
<TABLE cellSpacing=0 cellPadding=0 width="45%" bgColor=#ffffcc border=1>
|
|
|
465 |
<TBODY>
|
|
|
466 |
<TR>
|
|
|
467 |
<TD align=middle width="45%" colSpan=2>Address</TD>
|
|
|
468 |
<TD align=middle width="25%" rowSpan=2>Long Flash</TD>
|
|
|
469 |
<TD align=middle width="30%" rowSpan=2>Short flashes</TD></TR>
|
|
|
470 |
<TR>
|
|
|
471 |
<TD align=middle width="23%">Decimal</TD>
|
|
|
472 |
<TD align=middle width="22%">Hex</TD></TR>
|
|
|
473 |
<TR>
|
|
|
474 |
<TD align=middle width="23%">224</TD>
|
|
|
475 |
<TD align=middle width="22%">E0</TD>
|
|
|
476 |
<TD align=middle width="25%">1</TD>
|
|
|
477 |
<TD align=middle width="30%">0</TD></TR>
|
|
|
478 |
<TR>
|
|
|
479 |
<TD align=middle width="23%">226</TD>
|
|
|
480 |
<TD align=middle width="22%">E2</TD>
|
|
|
481 |
<TD align=middle width="25%">1</TD>
|
|
|
482 |
<TD align=middle width="30%">1</TD></TR>
|
|
|
483 |
<TR>
|
|
|
484 |
<TD align=middle width="23%">228</TD>
|
|
|
485 |
<TD align=middle width="22%">E4</TD>
|
|
|
486 |
<TD align=middle width="25%">1</TD>
|
|
|
487 |
<TD align=middle width="30%">2</TD></TR>
|
|
|
488 |
<TR>
|
|
|
489 |
<TD align=middle width="23%">230</TD>
|
|
|
490 |
<TD align=middle width="22%">E6</TD>
|
|
|
491 |
<TD align=middle width="25%">1</TD>
|
|
|
492 |
<TD align=middle width="30%">3</TD></TR>
|
|
|
493 |
<TR>
|
|
|
494 |
<TD align=middle width="23%">232</TD>
|
|
|
495 |
<TD align=middle width="22%">E8</TD>
|
|
|
496 |
<TD align=middle width="25%">1</TD>
|
|
|
497 |
<TD align=middle width="30%">4</TD></TR>
|
|
|
498 |
<TR>
|
|
|
499 |
<TD align=middle width="23%">234</TD>
|
|
|
500 |
<TD align=middle width="22%">EA</TD>
|
|
|
501 |
<TD align=middle width="25%">1</TD>
|
|
|
502 |
<TD align=middle width="30%">5</TD></TR>
|
|
|
503 |
<TR>
|
|
|
504 |
<TD align=middle width="23%">236</TD>
|
|
|
505 |
<TD align=middle width="22%">EC</TD>
|
|
|
506 |
<TD align=middle width="25%">1</TD>
|
|
|
507 |
<TD align=middle width="30%">6</TD></TR>
|
|
|
508 |
<TR>
|
|
|
509 |
<TD align=middle width="23%">238</TD>
|
|
|
510 |
<TD align=middle width="22%">EE</TD>
|
|
|
511 |
<TD align=middle width="25%">1</TD>
|
|
|
512 |
<TD align=middle width="30%">7</TD></TR>
|
|
|
513 |
<TR>
|
|
|
514 |
<TD align=middle width="23%">240</TD>
|
|
|
515 |
<TD align=middle width="22%">F0</TD>
|
|
|
516 |
<TD align=middle width="25%">1</TD>
|
|
|
517 |
<TD align=middle width="30%">8</TD></TR>
|
|
|
518 |
<TR>
|
|
|
519 |
<TD align=middle width="23%">242</TD>
|
|
|
520 |
<TD align=middle width="22%">F2</TD>
|
|
|
521 |
<TD align=middle width="25%">1</TD>
|
|
|
522 |
<TD align=middle width="30%">9</TD></TR>
|
|
|
523 |
<TR>
|
|
|
524 |
<TD align=middle width="23%">244</TD>
|
|
|
525 |
<TD align=middle width="22%">F4</TD>
|
|
|
526 |
<TD align=middle width="25%">1</TD>
|
|
|
527 |
<TD align=middle width="30%">10</TD></TR>
|
|
|
528 |
<TR>
|
|
|
529 |
<TD align=middle width="23%">246</TD>
|
|
|
530 |
<TD align=middle width="22%">F6</TD>
|
|
|
531 |
<TD align=middle width="25%">1</TD>
|
|
|
532 |
<TD align=middle width="30%">11</TD></TR>
|
|
|
533 |
<TR>
|
|
|
534 |
<TD align=middle width="23%">248</TD>
|
|
|
535 |
<TD align=middle width="22%">F8</TD>
|
|
|
536 |
<TD align=middle width="25%">1</TD>
|
|
|
537 |
<TD align=middle width="30%">12</TD></TR>
|
|
|
538 |
<TR>
|
|
|
539 |
<TD align=middle width="23%">250</TD>
|
|
|
540 |
<TD align=middle width="22%">FA</TD>
|
|
|
541 |
<TD align=middle width="25%">1</TD>
|
|
|
542 |
<TD align=middle width="30%">13</TD></TR>
|
|
|
543 |
<TR>
|
|
|
544 |
<TD align=middle width="23%">252</TD>
|
|
|
545 |
<TD align=middle width="22%">FC</TD>
|
|
|
546 |
<TD align=middle width="25%">1</TD>
|
|
|
547 |
<TD align=middle width="30%">14</TD></TR>
|
|
|
548 |
<TR>
|
|
|
549 |
<TD align=middle width="23%">254</TD>
|
|
|
550 |
<TD align=middle width="22%">FE</TD>
|
|
|
551 |
<TD align=middle width="25%">1</TD>
|
|
|
552 |
<TD align=middle width="30%">15</TD></TR></TBODY></TABLE></CENTER></DIV>
|
|
|
553 |
<P align=left>Take care not to set more than one sonar to the same address,
|
|
|
554 |
there will be a bus collision and very unpredictable results.</P>
|
|
|
555 |
<P align=left><B>Current Consumption</B><BR>Average current consumption measured
|
|
|
556 |
on our prototype is around 12mA during ranging, and 3mA standby. The module will
|
|
|
557 |
automatically go to standby mode after a ranging, whilst waiting for a new
|
|
|
558 |
command on the I2C bus. The actual measured current profile is as follows; </P>
|
|
|
559 |
<DIV align=center>
|
|
|
560 |
<CENTER>
|
|
|
561 |
<TABLE cellSpacing=0 width=400 bgColor=#ffffcc border=1>
|
|
|
562 |
<TBODY>
|
|
|
563 |
<TR>
|
|
|
564 |
<TD align=middle width=253>Operation</TD>
|
|
|
565 |
<TD align=middle width=62>Current</TD>
|
|
|
566 |
<TD align=middle width=65>Duration</TD></TR>
|
|
|
567 |
<TR>
|
|
|
568 |
<TD align=middle width=253>Ranging command received - Power on</TD>
|
|
|
569 |
<TD align=middle width=62>275mA</TD>
|
|
|
570 |
<TD align=middle width=65>3uS</TD></TR>
|
|
|
571 |
<TR>
|
|
|
572 |
<TD align=middle width=253>+/- 10v generator Stabilization</TD>
|
|
|
573 |
<TD align=middle width=62>
|
|
|
574 |
<P align=center>25mA</P></TD>
|
|
|
575 |
<TD align=middle width=65>600uS</TD></TR>
|
|
|
576 |
<TR>
|
|
|
577 |
<TD align=middle width=253>8 cycles of 40kHz "ping"</TD>
|
|
|
578 |
<TD align=middle width=62>40mA</TD>
|
|
|
579 |
<TD align=middle width=65>200uS</TD></TR>
|
|
|
580 |
<TR>
|
|
|
581 |
<TD align=middle width=253>Ranging</TD>
|
|
|
582 |
<TD align=middle width=62>11mA</TD>
|
|
|
583 |
<TD align=middle width=65>65mS max</TD></TR>
|
|
|
584 |
<TR>
|
|
|
585 |
<TD align=middle width=253>Standby</TD>
|
|
|
586 |
<TD align=middle width=62>3mA</TD>
|
|
|
587 |
<TD align=middle width=65>indefinite</TD></TR></TBODY></TABLE></CENTER></DIV>
|
|
|
588 |
<P align=left>The above values are for guidance only, they are not tested on
|
|
|
589 |
production units. </P>
|
|
|
590 |
<P align=left> You can have a look at the <A
|
|
|
591 |
href="http://www.robot-electronics.co.uk/images/srf08schematic.gif">schematic</A>
|
|
|
592 |
and <A href="http://www.robot-electronics.co.uk/files/srf08.c">software</A> </P>
|
|
|
593 |
<P align=left>Your feedback/comments/criticisms and wish lists are very welcome,
|
|
|
594 |
as always.<BR>Regards, Gerry.
|
|
|
595 |
<BR>gerry@robot-electronics.co.uk</P></BODY></HTML>
|