|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
|
|
Thread Tools | Rate Thread | Display Modes |
|
|
|
#1
|
|||
|
|||
|
Re: Value of degree to calculate range?
ahh no ones responding and im still confused!
Sorry to be a bother, but we're stuck here. Thanks |
|
#2
|
|||
|
|||
|
Re: Value of degree to calculate range?
So you should have
EXACTLY as many array values as the number of different PWM values your camera would possibly output. I would put some bound checking too... because you will crash the program if you give it a bad index value! You said that your tilt center is 144, and that tilt_max is 194. I'm assuming the robot won't get tall enough tilt the camera down past the center. Is this correct? Thus your array should contain 51 entries. 194-144 + 1 =51 ... add 1 since the set is inclusive on both sides So we want a value of 144 to point to array[0] and 194 to point to array[50] so all you need to do is subtract 144 from the PWM value I'm not sure how you got 67 entries? can you explain. Last edited by Salik Syed : 13-02-2007 at 19:00. |
|
#3
|
|||
|
|||
|
Re: Value of degree to calculate range?
OHHH I get it now. I got 67 from this: it takes ...wait a minute...i have no idea where I got 67 form now that I think about it. When I did it, it made sense. But now that I know how to do it (and it makes A LOT of sense now) I can't think of how to do it incorrectly in order to figure out where I got 67 from. If I think of it I'll certainly let you know.
Here's what I have now: this segment of code is in User_Routines.c at the top before the functions (at the variable declarations): Code:
const rom unsigned int targetRange[] =
{
USHRT_MAX, // zero index is undefined
53, //0
51,
50,
49,
47,
46,
45,
44,
42,
41,
40, //10
39,
38,
37,
35,
34,
33,
32,
31,
30,
29, //20
28,
27,
26,
25,
24,
23,
22,
21,
20,
19, //30
18,
17,
16,
15,
14,
13,
12,
11,
10,
10, //40
9,
8,
7,
6,
5,
4,
3,
2,
1,
0,
};
Code:
unsigned int Find_Distance(void)
{
return(targetRange[pwm07-144]);
}
Code:
if(Get_Camera_State() == 1)
{
if(((Get_Tracking_State() == CAMERA_ON_TARGET) || (Get_Tracking_State() == TARGET_IN_VIEW)) && (Find_Distance() > 20))
{
pwm01 = 150; //Desired Forward Velocity
pwm02 = 150;
Switch3_LED = 1;
}
else if(((Get_Tracking_State() == CAMERA_ON_TARGET) || (Get_Tracking_State() == TARGET_IN_VIEW)) && (Find_Distance() <= 20))
{
pwm01 = 127;
pwm02 = 127;
I_Want_To_Search = 0; //Stops calling Servo_Track().
Switch3_LED = 0;
}
else
{
Switch3_LED = 0;
}
}
Any suggestions? And is the previous code for calculating the range sufficient? |
|
#4
|
|||
|
|||
|
Re: Value of degree to calculate range?
Can you try using a different variable ...are you sure pwm07 isn't being overwritten to some other garbage value?
Try println what range outputs. Is this always true?: Get_Camera_State() == 1 I am almost certain it is a problem with one of those things, because your table looks perfect. |
|
#5
|
|||
|
|||
|
Re: Value of degree to calculate range?
Try a simpler version first. Maybe something that just drives forward if the light is in view and stops the motors otherwise. That will help you debug.
What's the purpose of USHRT_MAX? Don't fight with the C arrays, just start from zero. Your code expects a value for targetRange[0] when pwm07 is at its minimum of 144. Jason |
|
#6
|
|||
|
|||
|
Re: Value of degree to calculate range?
Ok, so I should take out USHRT_MAX.
Also, the purpose of the code I wrote IS to move forward if the camera see's the target, but I guess I could take out the RANGE part for now for debugging. Thanks Also, I think you are right about Get_Camera_State() == 1 always. before I was trying to make abutton that stopped the camera from tracking and started it to track by calling Camera_Idle() and Restart_Camera() but I changed that so I stopped calling or started calling Servo_Track(), so Get_Camera_State() no longer is changed. Thanks for pointing that out. |
|
#7
|
|||
|
|||
|
Re: Value of degree to calculate range?
Table should have as many entries as you have pwm values to go from 0 to 90 degrees. Change the spread sheet to reflect your configuration. Camera height, degrees per pwm step, number of steps required to go from 0 to 90.
Then subtract your minimum pwm value from the current pwm value to get your index into the table. Here is an example with some additional "bullet proofing": #define MIN_TILT_PWM 144 unsigned int Find_Distance(void) { unsigned int returnValue; // using int here because value could go negative int distanceIndex = (int)pwm07 - (int)MIN_TILT_PWM; // check to make sure we have a value that is in range // are we too small if( distanceIndex < 0 ) { returnValue = USHRT_MAX; } // are we too big // note: sizeof an array divided by size of the first element gives size of the array // array indexing is zero based so a 50 element array is accessed using index values from 0 to 49 else if( distanceIndex >= sizeof(targetRange)/sizeof(targetRange[0]) ) { returnValue = 0; } // we are just right else { // go to the table to get our range value returnValue = targetRange[ distanceIndex ]; } return returnValue; } |
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| How to calculate arm angles? | SoD | Programming | 5 | 31-01-2007 14:17 |
| White Paper Discuss: Spreedsheet to Calculate the Ranking of Teams | Joe Johnson | Extra Discussion | 27 | 29-03-2005 11:16 |
| How to calculate planetary gear ratios? | sanddrag | Technical Discussion | 2 | 27-02-2005 11:55 |
| How do you Calculate Belt Length? | Gabriel | Technical Discussion | 7 | 08-11-2004 14:54 |
| Microbiology Degree? | Jillian B. | Chit-Chat | 1 | 26-09-2003 20:19 |