![]() |
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. |
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[] =Code:
unsigned int Find_Distance(void)Code:
if(Get_Camera_State() == 1)Any suggestions? And is the previous code for calculating the range sufficient? |
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. |
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; } |
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 |
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. |
| All times are GMT -5. The time now is 14:22. |
Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi