help getting servo values from camera

I’m not very experienced in C so I was hoping someone could help me out. I’m trying to get the PWM values of the camera servos so i can use them in my code. Is there a function that returns these values? Is there a function that says if its locked on or searching? last thing, i went into the camera menu through the IFI loader, and Kevin said to adjust the pan gain if the camera is oscilating, but i didnt find that option. Thanks a bunch for the help :slight_smile:

Since the default code just uses PWMs 1 and 2 for the camera servos, you should be able to just read the values in directly from the pwm01 and pwm02 variables at any point in the loop after the Camera_Handler() function is called.

As for knowing if the camera is locked on, you can use the camera confidence value - the higher it is, the more sure the camera is that it is locked on to a target. There’s a predefined threshold macro (its default value is 20), so you can just do something like this:

if (T_Packet_Data.confidence >= CONFIDENCE_THRESHOLD_DEFAULT)
{
  // locked on
}
else
{
  // searching
}

Edit: Alternately, you can call the Get_Tracking_State() function, which will return SEARCHING, TARGET_IN_VIEW, or CAMERA_ON_TARGET.

I’ve never used the camera menu, so unfortunately I can’t help you with the last point.

// Tracking_State values
#define STATE_SEARCHING 0
#define STATE_TARGET_IN_VIEW 1
#define STATE_PAN_ON_TARGET 2
#define STATE_TILT_ON_TARGET 4

those are the camera state values.

about the PWMS of noyur servos, you should be able to get them simply be reading the values of your pwms for them (default is 1 and 2).

Okay, I’ll address this question by question:

1)Is there a function that returns camera PWM values?
Short Answer: No, you don’t need one, the PWM value is just a variable you can access in your code.
Long Answer: If you look in tracking.h you’ll find two #define statements with which you can change the PWMs for the pan/tilt servos. If you look at these you’ll note they say something like “#define PAN_SERVO pwm07” if that was the case the PWM in use would be the seventh one. In other parts of the program, you can read the value of pwm07 (or whatever pwm the servo is set to) just like any other variable. EDIT: Whoops, I just realized that this advice only applies to the Streamlined version. If you are using Bells and Whistles, I think you can change it in the menu, but I am not certain. EDIT2: My previous edit was wrong, the Bells and Whistles code’s PWMs are changed in the same as the Streamlined’s. Now that I think about it, it makes sense to do it that way–having the PWM assignment menu configurable would be dangerous.

2)Is there a function that says if the camera is locked on?
Short Answer: Yes. Get_Tracking_State() in tracking.c.
Long Answer: When you call Get_Tracking_State, the function will return a 0 if it is searching; 1 if the target is in view, but the camera is not locked on; or 2 if the camera is locked on.

3)How do I adjust pan gain?
Long Answer: This depends on the version on Kevin’s code that you are using. In the Bells and Whistles code, it should be changeable in the tracking menu (I don’t know where, I don’t use the Bells and Whistles version); in the Streamlined version, you should be able to change it in tracking.h. In tracking.h, there is a #define statement for “PAN_GAIN_DEFAULT.” Changing the number “PAN_GAIN_DEFAULT” is being defined as (by default, 3) will change the pan gain. Note of caution: don’t use decimals, they will be truncated in the camera code. EDIT: To change the pan gain in the Bells and Whistles version, type ‘t’ at the terminal and you should see the option for it.

As I said I’m a c noob. Are these variables predefined in the code, or should I define it in User_routines.c? Could I do something like:

if(STATE_TARGET_IN_VIEW == 1) {
// code…
}

thanks again

Great, thanks! Thats what I wanted to know about the search state function.

i tried using the function Get_Tracking_State but i get the error “could not find definition of symbol ‘Get_Tracking_State’ in file”
Any suggestions?

Just put this at the top of whatever file you’re writing in:

#include "tracking.h"

It already has been.

That’s weird. Can you post which version of Kevin’s code you are using (streamlined vs bells & whistles) and how you are calling the Get_Tracking_State() function?

if(Get_Tracking_State() == X) {
//do code
}

Now I’m really puzzled. I just compiled some camera code with

if (Get_Tracking_State() == 2)
{
//do stuff
}  

in user_routines.c->Default_Routine() file and it worked fine. I tried removing tracking.h from the includes and got something errors, but not the same as yours. Judging from this thread, it appears that this problem has been encountered before and is caused by misspellings/miscapitalization, and Kevin Watson himself suggests here that it can be caused by overly long directory names. If neither one of those works, I’m out of ideas.

wow good find. i had the same bug as him. i didnt know you couldn’t have a space in your if statement… :yikes:
Thanks