8
8
#include < Servo.h>
9
9
#include " FeedBackServo.h"
10
10
11
- static Servo FeedBackServo::Parallax;
12
- static byte FeedBackServo::feedbackPinNumber = 2 ;
13
- static volatile int FeedBackServo::angle;
14
- static float FeedBackServo::thetaPre;
15
- static unsigned int FeedBackServo::tHigh, FeedBackServo::tLow;
16
- static unsigned long FeedBackServo::rise, FeedBackServo::fall;
17
- static int FeedBackServo::turns = 0 ;
18
- static float FeedBackServo::Kp = 1.0 ;
19
-
20
- FeedBackServo::FeedBackServo (byte _feedbackPinNumber = 2 )
11
+ Servo FeedBackServo::Parallax;
12
+ byte FeedBackServo::feedbackPinNumber = 2 ;
13
+ volatile int FeedBackServo::angle;
14
+ float FeedBackServo::thetaPre;
15
+ unsigned int FeedBackServo::tHigh, FeedBackServo::tLow;
16
+ unsigned long FeedBackServo::rise, FeedBackServo::fall;
17
+ int FeedBackServo::turns = 0 ;
18
+ float FeedBackServo::Kp = 1.0 ;
19
+ const int FeedBackServo::unitsFC = 360 ;
20
+ const float FeedBackServo::dcMin = 0.029 ;
21
+ const float FeedBackServo::dcMax = 0.971 ;
22
+ const int FeedBackServo::dutyScale = 1 ;
23
+ const int FeedBackServo::q2min = unitsFC / 4 ;
24
+ const int FeedBackServo::q3max = q2min * 3 ;
25
+
26
+ FeedBackServo::FeedBackServo (byte _feedbackPinNumber)
21
27
{
22
28
// feedback pin number validation
23
29
pinCheck (_feedbackPinNumber);
24
30
feedbackPinNumber = _feedbackPinNumber;
25
31
26
- // convert feedback pin number for use on attachInterrupt function
27
- byte internalPinNumber = convertFeedbackPin ( );
32
+ // convert feedback pin number to interrupt number for use on attachInterrupt function
33
+ byte internalPinNumber = digitalPinToInterrupt (feedbackPinNumber );
28
34
29
35
attachInterrupt (internalPinNumber, feedback, CHANGE);
30
36
}
31
37
32
- void FeedBackServo::setServoControl (byte servoPinNumber = 3 )
38
+ void FeedBackServo::setServoControl (byte servoPinNumber)
33
39
{
34
40
// Servo control pin attach
35
41
Parallax.attach (servoPinNumber);
36
42
}
37
43
38
- void FeedBackServo::setKp (float _Kp = 1.0 ) {
44
+ void FeedBackServo::setKp (float _Kp)
45
+ {
39
46
FeedBackServo::Kp = _Kp;
40
47
}
41
48
42
- void FeedBackServo::rotate (int degree, int threshold = 4 )
49
+ void FeedBackServo::rotate (int degree, int threshold)
43
50
{
44
51
float output, offset, value;
45
- for (int errorAngle = degree - angle; abs (errorAngle) > threshold; errorAngle = degree - angle) {
52
+ for (int errorAngle = degree - angle;
53
+ abs (errorAngle) > threshold;
54
+ errorAngle = degree - angle)
55
+ {
46
56
output = errorAngle * Kp;
47
- if (output > 200.0 )
57
+ if (output > 200.0 )
48
58
output = 200.0 ;
49
- if (output < -200.0 )
59
+ if (output < -200.0 )
50
60
output = -200.0 ;
51
- if (errorAngle > 0 )
61
+ if (errorAngle > 0 )
52
62
offset = 30.0 ;
53
- else if (errorAngle < 0 )
63
+ else if (errorAngle < 0 )
54
64
offset = -30.0 ;
55
65
else
56
66
offset = 0.0 ;
57
-
67
+
58
68
value = output + offset;
59
69
Parallax.writeMicroseconds (1490 - value);
60
70
}
@@ -68,89 +78,55 @@ int FeedBackServo::Angle()
68
78
69
79
void FeedBackServo::pinCheck (byte _feedbackPinNumber)
70
80
{
71
- // Check pin number
72
- #ifdef ARDUINO_AVR_UNO
73
- if (_feedbackPinNumber != 2 && _feedbackPinNumber != 3 )
81
+ // Check pin number
82
+ #ifdef ARDUINO_AVR_UNO
83
+ if (_feedbackPinNumber != 2 &&
84
+ _feedbackPinNumber != 3 )
74
85
exit (1 );
75
- #endif
76
- #ifdef ARDUINO_AVR_LEONARDO
77
- if (_feedbackPinNumber != 0 && _feedbackPinNumber != 1 && _feedbackPinNumber != 2 && _feedbackPinNumber != 3 && _feedbackPinNumber != 7 )
86
+ #endif
87
+ #ifdef ARDUINO_AVR_LEONARDO
88
+ if (_feedbackPinNumber != 0 &&
89
+ _feedbackPinNumber != 1 &&
90
+ _feedbackPinNumber != 2 &&
91
+ _feedbackPinNumber != 3 &&
92
+ _feedbackPinNumber != 7 )
78
93
exit (1 );
79
- #endif
94
+ #endif
80
95
}
81
96
82
- byte FeedBackServo::convertFeedbackPin ()
97
+ void FeedBackServo::feedback ()
83
98
{
84
- byte internalPinNumber;
85
- #ifdef ARDUINO_AVR_UNO
86
- switch (feedbackPinNumber)
99
+ if (digitalRead (feedbackPinNumber))
87
100
{
88
- case 2 :
89
- internalPinNumber = 0 ;
90
- break ;
91
- case 3 :
92
- internalPinNumber = 1 ;
93
- break ;
94
- default :
95
- internalPinNumber = 0 ;
96
- break ;
97
- }
98
- #endif
99
- #ifdef ARDUINO_AVR_LEONARDO
100
- switch (feedbackPinNumber)
101
- {
102
- case 0 :
103
- internalPinNumber = 2 ;
104
- break ;
105
- case 1 :
106
- internalPinNumber = 3 ;
107
- break ;
108
- case 2 :
109
- internalPinNumber = 1 ;
110
- break ;
111
- case 3 :
112
- internalPinNumber = 0 ;
113
- break ;
114
- case 7 :
115
- internalPinNumber = 4 ;
116
- break ;
117
- default :
118
- internalPinNumber = 0 ;
119
- break ;
120
- }
121
- #endif
122
- return internalPinNumber;
123
- }
124
-
125
- static void FeedBackServo::feedback () {
126
- if (digitalRead (feedbackPinNumber)) {
127
101
rise = micros ();
128
102
tLow = rise - fall;
129
103
130
104
int tCycle = tHigh + tLow;
131
- if ((tCycle < 1000 ) || (tCycle > 1200 ))
105
+ if ((tCycle < 1000 ) || (tCycle > 1200 ))
132
106
return ;
133
-
107
+
134
108
float dc = (dutyScale * tHigh) / (float )tCycle;
135
109
float theta = ((dc - dcMin) * unitsFC) / (dcMax - dcMin);
136
110
137
- if (theta < 0.0 )
111
+ if (theta < 0.0 )
138
112
theta = 0.0 ;
139
- else if (theta > (unitsFC - 1.0 ))
113
+ else if (theta > (unitsFC - 1.0 ))
140
114
theta = unitsFC - 1.0 ;
141
115
142
- if ((theta < q2min) && (thetaPre > q3max))
116
+ if ((theta < q2min) && (thetaPre > q3max))
143
117
turns++;
144
- else if ((thetaPre < q2min) && (theta > q3max))
118
+ else if ((thetaPre < q2min) && (theta > q3max))
145
119
turns--;
146
120
147
- if (turns >= 0 )
121
+ if (turns >= 0 )
148
122
angle = (turns * unitsFC) + theta;
149
- else if (turns < 0 )
123
+ else if (turns < 0 )
150
124
angle = ((turns + 1 ) * unitsFC) - (unitsFC - theta);
151
125
152
126
thetaPre = theta;
153
- } else {
127
+ }
128
+ else
129
+ {
154
130
fall = micros ();
155
131
tHigh = fall - rise;
156
132
}
0 commit comments