{{pfw:banner.png}} ====== 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
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 [[https://home.hccnet.nl/willem.ouwerkerk/egel-for-msp430/egel%20for%20launchpad.html#e008|chapter 8]], [[https://home.hccnet.nl/willem.ouwerkerk/egel-for-msp430/egel%20for%20launchpad.html#e013|chapter 13]] and/or [[https://home.hccnet.nl/willem.ouwerkerk/egel-for-msp430/egel%20for%20launchpad.html#e017|chapter 17]].