I have built the IR Emitter/Detector basic sensors as in the sensor tut, using the default values given. Two sensors, left & right.
As I understand, the sensor should have zero voltage to input pins when the detector is not active (ie, not near object). So I use the code below, and my right wheel does turn backwards, and keeps going, regardless of the sensor being open or obstructed. Any value I give to threshold results in the same behaviour. If I swap >threshold for <threshold it just ignores the IR section and photovores fine. Am I missing something obvious?
(I have been over the electronics, couldn't find any shorts....)
//SoR Include
#include "SoR_Utils.h" //includes all the technical stuff
int main(void)
{
//declare variables here
//int i=250;//a 'whatever' variable
int sensor_left=0;//left photoresistor
int sensor_right=0;//right photoresistor
int ir_left=0;//left ir sensor
int ir_right=0;//right ir sensor
int threshold=200;//the larger this number, the more likely your robot will drive straight
int threshold2=8;
/****************INITIALIZATIONS*******************/
//other stuff Im experimenting with for SoR
//uartInit(); // initialize the UART (serial port)
//uartSetBaudRate(9600);// set the baud rate of the UART for our debug/reporting output
//rprintfInit(uartSendByte);// initialize rprintf system
//timerInit(); // initialize the timer system
configure_ports(); // configure which ports are analog, digital, etc.
a2dInit(); // initialize analog to digital converter (ADC)
a2dSetPrescaler(ADC_PRESCALE_DIV32); // configure ADC scaling
a2dSetReference(ADC_REFERENCE_AVCC); // configure ADC reference voltage
//rprintf("Initialization Complete\r\n");
/**************************************************/
/*********ADD YOUR CODE BELOW THIS LINE **********/
LED_off();//turn LED on
while(1)
{
//store sensor data
sensor_left=a2dConvert8bit(5);
sensor_right=a2dConvert8bit(4);
ir_left=a2dConvert8bit(3);
ir_right=a2dConvert8bit(2);
if (ir_left>threshold)//turn slowly back-right
{
servo_right(27);
servo_left(35);
}
else if (ir_right>threshold)//turn slowly back-left
{
servo_left(42);
servo_right(35);
}
else
{
//detects more light on left side of robot
if(sensor_left > sensor_right && (sensor_left - sensor_right) > threshold2)
{
//go left
servo_left(44);
servo_right(44);
}
//detects more light on right side of robot
else if(sensor_right > sensor_left && (sensor_right - sensor_left) > threshold2)
{
//go right
servo_left(25);
servo_right(25);
}
//light is about equal on both sides
else
{
if(sensor_left>threshold2 && sensor_right>threshold2)
{
//go straight
servo_left(25);
servo_right(44);
}
else //stay put
{
servo_left(35);
servo_right(35);
}
}
}
/* Servo Test Code
i=250;
while(i>0)
{
servo_left(40);
i--;
}
i=250;
while(i>0)
{
servo_left(24);
i--;
}
*/
//rprintf("Initialization Complete\r\n");
//output message to serial (use hyperterminal)
//print("Hello, World! Read My Analog: %u\r\n", sensor_0);
delay_cycles(500);//a small delay to prevent crazy oscillations
}
/*********ADD YOUR CODE ABOVE THIS LINE **********/
return 0;
}