Using Pololu - QTR-8RC Reflectance Sensor Array
Pololu - QTR-8RC Reflectance Sensor Array
In line following a sensor array is an essential part in the robot. I have used the QTR-8RC array and it works like a charm. With Arduino libraries it is easy to configure them but with PIC micro-controllers you have to handle the hardware configuration part manually.
The trick is we need to charge the capacitors attached to each sensor and see how long it takes to drain them. When the sensor is on a white surface, IR rays will reflect to the photo sensitive diode making a path for the capacitors to drain fast while on a black surface there will be not much IR rays coming back making the drainage duration longer. Depending on that, we can see what color surface that is.
The trick is we need to charge the capacitors attached to each sensor and see how long it takes to drain them. When the sensor is on a white surface, IR rays will reflect to the photo sensitive diode making a path for the capacitors to drain fast while on a black surface there will be not much IR rays coming back making the drainage duration longer. Depending on that, we can see what color surface that is.
Header file
/********************************************************************* This is the header file for IR sensors. There are 8 IR Sensors and they will return 1 if they are on a black surface and will return 0 if they are on a white surface. The main functions used here to check the value returned by IRs are 1. set_IR() *********************************************************************/ #ifndef IR #define IR #define HIGH 1 #define LOW 0 #define ON 1 #define OFF 0 #define INPUT 1 #define OUTPUT 0 #define SensorTRISA TRISA #define SensorTRISE TRISE #define SensorPORTA PORTA #define SensorPORTE PORTE #define SensorLATA LATA #define SensorLATE LATE /********************* Initiating variables *************************/ char sensor1, sensor2, sensor3, sensor4; char sensor5, sensor6, sensor7, sensor8; short junction; /*********** Initiate Sensors PORTs as Digital I/Os *****************/ void init_sensor() { // Make all Analog Pins Digital ANSEL0 = 0x00; ANSEL1 = 0; } /********************** Sets sensor pins high ***********************/ void IR_high() { SensorTRISA.B0 = OUTPUT; SensorTRISA.B1 = OUTPUT; SensorTRISA.B2 = OUTPUT; SensorTRISA.B3 = OUTPUT; SensorTRISA.B4 = OUTPUT; SensorTRISA.B5 = OUTPUT; SensorTRISE.B0 = OUTPUT; SensorTRISE.B1 = OUTPUT; SensorLATA.B0 = HIGH; SensorLATA.B1 = HIGH; SensorLATA.B2 = HIGH; SensorLATA.B3 = HIGH; SensorLATA.B4 = HIGH; SensorLATA.B5 = HIGH; SensorLATE.B0 = HIGH; SensorLATE.B1 = HIGH; } /********************** Sets sensor pins low ************************/ void IR_low() { SensorTRISA.B0 = INPUT; SensorTRISA.B1 = INPUT; SensorTRISA.B2 = INPUT; SensorTRISA.B3 = INPUT; SensorTRISA.B4 = INPUT; SensorTRISA.B5 = INPUT; SensorTRISE.B0 = INPUT; SensorTRISE.B1 = INPUT; SensorLATA.B0 = LOW; SensorLATA.B1 = LOW; SensorLATA.B2 = LOW; SensorLATA.B3 = LOW; SensorLATA.B4 = LOW; SensorLATA.B5 = LOW; SensorLATE.B0 = LOW; SensorLATE.B1 = LOW; } /************ Assign PORT values to sensor variables ****************/ void sensor_assign() { sensor1 = SensorPORTA.B0; sensor2 = SensorPORTA.B1; sensor3 = SensorPORTA.B2; sensor4 = SensorPORTA.B3; sensor5 = SensorPORTA.B4; sensor6 = SensorPORTA.B5; sensor7 = SensorPORTE.B0; sensor8 = SensorPORTE.B1; } /*************** Trigger IR and get sensor readings *****************/ void set_IR() { // First, make all the pins outputs and HIGH them for 10us IR_high(); Delay_us(12); // Then make them inputs and clear the PORT register IR_low(); // Now wait for a few microsecond and read the values Delay_us(700); // Assign each input to defined variables sensor_assign(); } #endif
In this above code, sensorn variable will be either 1 or 0 depending on the surface it is on. Note that this is coded using MikroC IDE. Hope this code might help you with your project.
Comments
Post a Comment