ok guys... i need some help.
i need to create a table w/ ranges and corresponding voltage readings for my range finder. its non-linear, so thats really not going to help me.
I then need a code solution to go to the closest value, as i really only need estimated distances in increments of 5cm.
help? its part of the scan routine, foundin the code below.
EDIT: Solution Found!:
www.basicxandrobotics.com/ir%20curve%20fit.pdf
we found this equation there:
IRValue = 4187.8(Range)-0.9042
Equation 1
where IRValue is the value returned by the infrared sensor, and Range is the actual distance to the object in units
of centimeters.
which they later show w/ algerbra being converted to this:
cm = pow((4187.8/averagevoltage), 1.1060); //applied to the IDE script.
#include <Servo.h>
//open analog pins - 3 , 5. open digital pins - 8 10 11 12
//declare servos
Servo panhorizontal;
Servo panverticle;
int panhorizontalpos = 0;
int panverticlepos = 0;
//declare 'scan look positions'
int lookleft = 0;
int lookright = 0;
int lookforward = 0;
int lookdown = 1;
int avgscan[2];
int avgvoltage = 0;
int cm = 0;
//motor drive speed
int stepspeedread = 0;
int outputValue = 0;
//set pins
//analog
int rangesensor = 0;
int motorspeed = 1;
int legpotleft = 2;
int legpotright = 4;
//digital
int led1 = 13;
int led2 = 0;
int driveleft1 =1;
int driveleft2 =2;
int driveright1 =4;
int driveright2 =7;
//pwm
int driveleftenable = 3;
int driverightenable = 5;
void setup()
{
Serial.begin(9600); //???
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(driveleft1, OUTPUT);
pinMode(driveleft2, OUTPUT);
pinMode(driveright1, OUTPUT);
pinMode(driveright2, OUTPUT);
//PWM pins
//pinMode(driveleftenable, OUTPUT);
//pinMode(driverightenable, OUTPUT);
panhorizontal.attach(6);
panverticle.attach(9);
//motortest? via motortest();
}
void loop()
{
scansidetoside();
scandown();
if (lookdown > 10){turn180();}
if (lookforward < 15 && lookright < 15 && lookleft < 15){turn180();}
if (lookforward < 15 && lookright > 15 && lookleft < 15){turnright();}
if (lookforward < 15 && lookright > 15 && lookleft > 15){turnleft();}
if (lookforward < 15 && lookleft > 15 && lookright > 15){turnright();}
takestep();
}
void takestep(int side, int dir, int delaytime)
{
// read the analog in value:
stepspeedread = analogRead(motorspeed);
// map it to the range of the analog out:
outputValue = map(stepspeedread, 0, 1023, 0, 255);
digitalWrite(dir, HIGH);
analogWrite(side, outputValue);
delay(delaytime);
digitalWrite(dir, LOW);
analogWrite(side, 0);
}
void scansidetoside()
{
for(panhorizontalpos = 0; panhorizontalpos < 90; panhorizontalpos += 1)
{
panhorizontal.write(panhorizontalpos);
delay(15);
}
lookright = scan();
for(panhorizontalpos = 90; panhorizontalpos > -90; panhorizontalpos-=1)
{
panhorizontal.write(panhorizontalpos);
delay(15);
}
lookleft = scan();
for(panhorizontalpos = -90; panhorizontalpos <= 0; panhorizontalpos+=1)
{
panhorizontal.write(panhorizontalpos);
delay(15);
}
lookforward = scan();
}
void scandown()
{
for(panverticlepos = 0; panverticlepos < 45; panhorizontalpos += 1)
{
panverticle.write(panhorizontalpos);
delay(15);
}
lookdown = scan();
for(panverticlepos = 45; panverticlepos > 0; panhorizontalpos -= 1)
{
panverticle.write(panhorizontalpos);
delay(15);
}
}
int scan()
{
cm = 0;
for (int i=0; i <= 2; i++){
avgscan *= analogRead(rangesensor); *
- }*
- int averagevoltage = (avgscan[0]+avgscan[1]+avgscan[2])/3;*
- cm = pow((4187.8/averagevoltage), 1.1060);*
- return cm;*
}
void turn180(){}
void turnright(){}
void turnleft(){}
void takestep(){}
void motortest(){}