en:pfw:measuring-distance
Table of Contents
Measuring distances
The idea is to measuring distance using ultrasonic and other sensors.
Ultrasonic sensors
The most well known ultrasonic sensor is the HC-SR04 but there are a lot of different types available. Most use the same protocol. Some of them are different. Some sensors have a larger range at a higher voltage.
Note that there is a lot of difference in quality. The HC-SR04 mentioned is of cheap Chinese manufacture.
Sensor | Voltage | Range data |
---|---|---|
HC-SR04 | 5 Volt | 2 cm to 220 cm |
US-015 | 5 Volt | 8 cm to 350 cm |
RCW-0001 | 3 to 5 Volt | 1 cm to 350 cm |
US-100 | 2.4 to 5 Volt | 4 cm to 350 cm |
Some US-sensor modules
Most sensors have four wires and use two wires for communication.
1) VCC = Mostly % Volt but some work from 2.4 Volt 2) TRIG = Trigger input ( 10 µsec. positive pulse ) 3) ECHO = Result, the length of the positive pulse is the measured distance 4) GND = Ground pin
Pseudo code
Name | Function |
---|---|
US-ON | Activate I/O pins |
DISTANCE | Do one measurement, leave scaled result |
MEASURE | Print measured distance until a key is pressed |
Function: US-ON ( -- ) Initialise one output and one input with pullup Set the output low. Function: DISTANCE ( -- distance ) Give 10 µsec. pulse in the trigger output Wait until the echo input goes high Initialise a counter Increase counter in a loop until echo goes low again Scale result, converting the count to a distance in centimeter Function: MEASURE ( -- ) Perform US-ON the start an endless loop Perform DISTANCE, Perform . wait 40 millisec. Do this loop until a key is pressed
Generic Forth
\ This example uses bits P1.3 and P1.4 on the MSP430G2553 using noForth \ Not in Generic Forth: MS hex \ Words with hardware dependencies: : *BIS ( mask addr -- ) tuck c@ or swap c! ; : *BIC ( mask addr -- ) >r invert r@ c@ and r> c! ; : BIT* ( mask addr -- b ) c@ and ; : US-ON ( -- ) 08 22 *bic \ P1DIR P1.3 Input with pullup 08 27 *bis \ P1REN 08 21 *bis \ P1OUT 10 22 *bis \ P1DIR P1.4 Output 10 21 *bic ; \ P1OUT \ The trigger pulse must be about 10 microseconds. The formula below \ is only correct for an 8 MHz MSP430 running noForth: 20 93 */ : DISTANCE ( -- distance in cm ) 10 21 *bis noop noop noop 10 21 *bic \ P1OUT Trigger begin 8 20 bit* until \ P1IN Wait for echo 0 begin 1+ 8 20 bit* 0= until \ P1IN Measure echo dm 20 dm 93 */ ; ( Scale result to centimeter ) : MEASURE ( -- ) \ Show distance in 2 cm steps us-on begin distance . 40 ms key? until ;
More info look at the Egel project chapter 8, chapter 13 and/or chapter 17.
en/pfw/measuring-distance.txt · Last modified: 2023-09-04 18:16 by uho