{{pfw:banner.png}}
====== Reflection sensors ======
===== Idea =====
A reflection sensor is most of the time a sensor that uses (infrared) light to detect the precence of an object.
===== TCND5000 the demonstrated sensor =====
|{{https://user-images.githubusercontent.com/11397265/154144243-3562aae3-f703-405f-9148-8460dfb92e05.jpg?400|TCND5000}} |{{https://user-images.githubusercontent.com/11397265/154144262-307428fa-ce24-453f-a98e-5db9d4db09f9.jpg?400|Sketch schematics}} |
|{{https://user-images.githubusercontent.com/11397265/154559970-26f69aa7-d06c-43a0-a1d3-ee4ff6014d69.jpg?400|Cosey floor sensors on the front side sm}}|{{https://user-images.githubusercontent.com/11397265/154144288-a7196a4c-be4e-4c2a-8405-c2779fa51ce2.jpg?400|Reflection sensor schematics}}|
**Upper left:** The TNCD5000 is a sensitive photo diode and an infrared led in one case.\\
**Upper right:** A sketch of the TCND5000 driver.\\
**Lower left:** Five sensors mounted on Cosey's PCB.\\
**Lower Right:** Piece of schematics of the Cosey robot, note that the resistor values have changed!
----
===== Pseudo code =====
Function: REFLECTION ( adc -- +n )
Read adc input 'adc' leave the reading '+n'
Function: FLOOR ( adc -- +s )
Read adc input 'adc' and leave the scaled result '+s'
Function: RAVINE ( -- 0|1|2|3 )
Read the three adc inputs from the front of a robot.
Translate the results to the numbers 0 to 3, indicating
which sensor(s) where fired. Zero means non.
Function: BACKWARD? ( -- flag )
Test the sensor on the backside of a robot, leave true
if the sensor is fired, otherwise false
===== Generic Forth =====
\ Reflection sensor example as used with the Cosey robot
\
\ Each sensor output is connected to an ADC input with 12-bit resolution
\
\ Words with hardware dependencies:
\ : **BIS ( mask addr -- ) tuck @ or swap ! ;
\ : **BIC ( mask addr -- ) >r invert r@ @ and r> ! ;
\ : BIT** ( mask addr -- 0|b ) @ and ;
\
\ Needed an ADC routine like this one for the MSP430FR5949:
\
\ We need to clear the ENC bit before setting a new input channel
\ ADC can be used with VCC and VREF (2.5V) as reference voltage
\ : ADC ( adc fl -- +n )
\ 02 800 **bic \ ADC12CTL0 Clear ENC
\ 100 and >r \ Use VREF when fl is true
\ 1F and r> or 820 ! \ ADC12MCTL0 Select input
\ 03 800 **bis \ ADC12CTL0 Set ENC & ADC12SC
\ begin 1 802 bit** 0= until \ ADC12CTL1 ADC12 busy?
\ 860 @ ; \ ADC12MEM0 Read result
\
\ Activate an output on a PCA9632 I2C led output driver
\ The routine /MS waits in steps of 0.1 milliseconds
\ It is used here to give the sensor time to settle
\ : >ON ( b -- ) 8 >pca 1 /ms ; \ b = 1, 4, 10 or 40
\ Read sensor level from input 'adc' using VCC as reference
: REFLECTION ( adc -- +n ) 0 adc ;
\ FLOOR sensor result is scaled and gives a number from 0 to 10
: FLOOR ( adc -- s ) reflection 180 / ;
\ Examples (Cosey's advanced commands):
\ 0 = No ravine Table edge detection
\ 1 = ravine at left
\ 2 = ravine in front
\ 3 = ravine at right
: RAVINE ( -- 0|1|2|3 )
01 >on 01 floor 5 < if 3 exit then \ Right sensor
04 >on 02 floor 5 < if 2 exit then \ Middle sensor
10 >on 05 floor 5 < if 1 exit then \ Left sensor
0 ; \ No floor sensor at all triggered
\ True if reflection sensor on the backside goes over the edge
: BACKWARD? ( -- f ) 10 >on 0E floor 5 < ;
More info look at specific implementations, if any.
**Cosey robot V1.0** {{https://user-images.githubusercontent.com/11397265/154557981-a7b3d33a-0dc0-47c8-b40c-a01395871c94.jpg|Cosey V1 0}}