cameraManager.c
Go to the documentation of this file.
1 /*
2  * File: cameraManager.c
3  * Author: Chris Hajduk
4  *
5  * Created on March 8, 2014, 5:22 PM
6  */
7 
8 //Header Files
9 #include "cameraManager.h"
10 #include "main.h"
11 #include "PWM.h"
12 #include "../Common/Common.h" //To get Earth Radius Constant
13 
14 
15 
16 float distance = 0;
17 long double lastLongitude = 0;
18 long double lastLatitude = 0;
19 long int cameraTimerCount = 0;
20 float pictureDistance = 10; //In meters
22 int triggerSignal = 0;
23 int gimbalOffset = 240;//was MIDDLE_PWM -42; 300 at current config gets the camera pointed towards the ground
24 int goProgimbalOffset = 325;//gets the gimbal arm horizontal to the ground at current configuration
25 int verticalOffset = -100;//at current calibration of servos, -100 gets us looking face down; 400 gives 20 degrees from straight down in case we want to look forward ish
26 int rollLimit = 30;
27 char overrideTrigger = 0;
28 char resting = 1;
29 char lockGoProPitch = 0;
30 char lockGoProRoll = 0;
31 
32 unsigned int cameraPollingRuntime(long double latitude, long double longitude, long int time, unsigned int* pictureCount, int rollAngle, int pitchAngle){
33  distance = getDistance(latitude, longitude, lastLatitude, lastLongitude);
34 // char str[16];
35 // sprintf(&str, "%f", distance);
36 // UART1_SendString(&str);
37 
38  if (time - cameraTimerCount > 2500/2){
40  //(distance >= pictureDistance || distance <= -pictureDistance) &&
41  if (((( (rollAngle <= rollLimit || rollAngle >= -rollLimit) && (pitchAngle <= rollLimit || pitchAngle >= -rollLimit)))|| overrideTrigger) && resting){// && pitch <= 20 && pitch >= -20 && roll >= -20 && roll <= 20){
42  lastLongitude = longitude;
43  lastLatitude = latitude;
45  overrideTrigger = 0;
46  (*pictureCount) = 1;
47  resting = 0;
48  }
49  else{
50  resting = 1;
52  *pictureCount = 0;
53  }
54  }
55  return lastSignal;
56 }
57 
58 void triggerCamera(int pwmSignal){
59  overrideTrigger = 1;
60  triggerSignal = pwmSignal;
61 }
62 
65 }
66 
67 //camera gimbal (roll; no pitch needed)
68 int cameraGimbalStabilization(float rollAngle){
69  if (rollAngle > LEFT_GIMBAL_MOTION_LIMIT){//makes sure servo doesn't go past set limits
70  rollAngle = LEFT_GIMBAL_MOTION_LIMIT;
71  }
72  if (rollAngle < -RIGHT_GIMBAL_MOTION_LIMIT){
73  rollAngle = -RIGHT_GIMBAL_MOTION_LIMIT;
74  }
75 
76  return gimbalOffset - 675/GIMBAL_MOTION_RANGE * rollAngle;//1024 is the same as GIMBAL_PWM_RANGE; 675 for some reason gives better stabiization with motion range at 30
77  //compared to 1024 with range at 60. This is being used for all of the stabilization codes (camera, GoPro, vertical)
78  //note: when moving the gimbal code over from an older version of the code, the gimbals stabilized backwards for an unkown reason.
79  //to remedy this, the + 675 in the above code was changed to -675. The other stabilization codes were changed like this too
80 }
81 
82 void setGimbalOffset(int pwmSignal){
83  gimbalOffset = pwmSignal; // + MIDDLE_PWM;
84 }
85 /* **********************
86  * GO PRO
87  * **********************/
88 //GoPro gimbal (roll)
89 int goProGimbalStabilization(float rollAngle){
90  if (!lockGoProRoll){
91  if (rollAngle > LEFT_GIMBAL_GOPRO_MOTION_LIMIT){
93  }
94  if (rollAngle < - RIGHT_GIMBAL_GOPRO_MOTION_LIMIT){
95  rollAngle = - RIGHT_GIMBAL_GOPRO_MOTION_LIMIT;
96  }
97  }
98  else{
99  rollAngle = 0;
100  }
101  return goProgimbalOffset + 675/GOPRO_GIMBAL_MOTION_RANGE * rollAngle;
102 }// there is a plus because the servo is facing the opposite way in terms of the camera gimbal servo
103 
104 void setGoProGimbalOffset(int pwmSignal){
105  goProgimbalOffset = pwmSignal; // + MIDDLE_PWM;
106 }
107 
108 //GoPro gimbal (pitch)
109 int goProVerticalstabilization(float pitchAngle){
110  if (!lockGoProPitch){
111  if (pitchAngle > UP_MOTION_LIMIT){
112  pitchAngle = UP_MOTION_LIMIT;
113  }
114  if (pitchAngle < - DOWN_MOTION_LIMIT){
115  pitchAngle = - DOWN_MOTION_LIMIT;
116  }
117  }
118  else{
119  pitchAngle = -45;
120  }
121 
122  return verticalOffset - 675/VERTICAL_MOTION_RANGE * pitchAngle;
123 }
124 
125 void setVerticalOffset(int pwmSignal){
126  verticalOffset = pwmSignal; // + MIDDLE_PWM;
127 }
128 
129 void lockGoPro(int lock){
130  lockGoProPitch = 0;
131  lockGoProRoll = 0;
132  if (lock & 0b0001)
133  lockGoProPitch = 1;
134  if (lock & 0b0010)
135  lockGoProRoll = 1;
136 
137 }
char lockGoProRoll
Definition: cameraManager.c:30
float getDistance(long double lat1, long double lon1, long double lat2, long double lon2)
Definition: Common.c:33
#define UP_MOTION_LIMIT
Definition: cameraManager.h:22
void setGimbalOffset(int pwmSignal)
Definition: cameraManager.c:82
#define VERTICAL_MOTION_RANGE
Definition: cameraManager.h:21
char overrideTrigger
Definition: cameraManager.c:27
void setVerticalOffset(int pwmSignal)
#define LEFT_GIMBAL_GOPRO_MOTION_LIMIT
Definition: cameraManager.h:19
float distance
Definition: cameraManager.c:16
char lockGoProPitch
Definition: cameraManager.c:29
#define MIN_PWM
Definition: PWM.h:31
int triggerSignal
Definition: cameraManager.c:22
#define RIGHT_GIMBAL_MOTION_LIMIT
Definition: cameraManager.h:17
long int cameraTimerCount
Definition: cameraManager.c:19
int gimbalOffset
Definition: cameraManager.c:23
void triggerCamera(int pwmSignal)
Definition: cameraManager.c:58
#define GOPRO_GIMBAL_MOTION_RANGE
Definition: cameraManager.h:18
int cameraGimbalStabilization(float rollAngle)
Definition: cameraManager.c:68
static unsigned long int time
Definition: timer.c:11
int verticalOffset
Definition: cameraManager.c:25
char resting
Definition: cameraManager.c:28
#define LEFT_GIMBAL_MOTION_LIMIT
Definition: cameraManager.h:16
#define DOWN_MOTION_LIMIT
Definition: cameraManager.h:23
void lockGoPro(int lock)
#define GIMBAL_MOTION_RANGE
Definition: cameraManager.h:15
int goProGimbalStabilization(float rollAngle)
Definition: cameraManager.c:89
void setGoProGimbalOffset(int pwmSignal)
int lastSignal
Definition: cameraManager.c:21
int goProgimbalOffset
Definition: cameraManager.c:24
#define RIGHT_GIMBAL_GOPRO_MOTION_LIMIT
Definition: cameraManager.h:20
long double lastLatitude
Definition: cameraManager.c:18
long double lastLongitude
Definition: cameraManager.c:17
void setTriggerDistance(float distance)
Definition: cameraManager.c:63
unsigned int cameraPollingRuntime(long double latitude, long double longitude, long int time, unsigned int *pictureCount, int rollAngle, int pitchAngle)
Definition: cameraManager.c:32
int goProVerticalstabilization(float pitchAngle)
int rollLimit
Definition: cameraManager.c:26
float pictureDistance
Definition: cameraManager.c:20