RIG InMoov Project
flex_double.ino
Go to the documentation of this file.
1 
11 #include "settings.h"
12 
13 int current_pos [6] = { 0 };
14 
15 enum
16 {
17  CANCEL_SIGNAL = 255,
18  MIN_SIGNAL = 250,
19  MAX_SIGNAL = 249,
20  START_RESPONSE = 252,
21  END_RESPONSE = 251,
22  CALIB_RESPONSE_LEN = FLEXS * 2,
23  MIN_LIM = 0,
24  MAX_LIM = 1,
25 };
26 
27 void setup ()
28 {
29  serialSetup ();
30 }
31 
32 void loop ()
33 {
34  static int flex_amount, servo_id, servo_angle, i = 0;
35 
36  serialCmdWrite (CANCEL_SIGNAL);
37  if (i % DELAY_MS == 0)
38  {
39  serialDebugWrite (CANCEL_SIGNAL);
40  }
41  for (int flex_index = 0; flex_index < FLEXS; flex_index++)
42  {
43  flex_amount = analogGetInt (flex_index);
44  if (flex_amount < 0)
45  {
46  continue;
47  }
48 
49  servo_angle = getAdjustedFlex (flex_index, flex_amount);
50  if (servo_angle < 0)
51  {
52  continue;
53  }
54 
55  servo_id = getServoIDFromFlexIndex (flex_index);
56  if (servo_id < 0)
57  {
58  continue;
59  }
60 
61  softSerialServoCmd (servo_id, servo_angle);
62  if (i % DELAY_MS == 0)
63  {
64  i = 0;
65  softSerialServoDebug (servo_id, servo_angle);
66  }
67  }
68  i++;
69 }
70 
71 int analogGetInt (uint8_t flex_index)
72 {
73  int pin, flex_amount;
74 
75  pin = getFlexPinFromIndex (flex_index);
76  if (pin < 0)
77  {
78  return -1;
79  }
80 
81  flex_amount = analogRead (pin);
82  return flex_amount;
83 }
84 
85 int getAdjustedFlex (uint8_t flex_index, int flex_amount)
86 {
87  int flex_min, flex_max;
88 
89  if ((flex_min = getFlexMin (flex_index)) < 0)
90  {
91  return -1;
92  }
93 
94  if ((flex_max = getFlexMax (flex_index)) < 0)
95  {
96  return -1;
97  }
98 
99  if (flex_amount > flex_max)
100  {
101  flex_amount = flex_max;
102  }
103  else if (flex_amount < flex_min)
104  {
105  flex_amount = flex_min;
106  }
107 
108  if (reverse [flex_index])
109  {
110  return map (flex_amount, flex_min, flex_max, 0, 180);
111  }
112  return map (flex_amount, flex_min, flex_max, 180, 0);
113 }
114 
115 int getFlexMax (uint8_t flex_index)
116 {
117  if (flex_index > FLEXS)
118  {
119  return -1;
120  }
121 
122  return limit [flex_index] [MAX_LIM];
123 }
124 
125 int getFlexMin (uint8_t flex_index)
126 {
127  if (flex_index > FLEXS)
128  {
129  return -1;
130  }
131 
132  return limit [flex_index] [MIN_LIM];
133 }
134 
135 void softSerialServoCmd (uint8_t servo_id, int servo_angle)
136 {
137  int servo_index = getServoIndexFromID (servo_id), difference;
138 
139  if (servo_index < 0)
140  {
141  return;
142  }
143 
144  if (NOISE_CONTROL)
145  {
146  difference = current_pos [servo_index] - servo_angle;
147  if ((difference * difference) < 1)
148  {
149  return;
150  }
151 
152  current_pos [servo_index] = servo_angle;
153  }
154 
155  serialCmdWrite (servo_id);
156  serialCmdWrite (servo_angle);
157 }
158 
159 void softSerialServoDebug (uint8_t servo_id, int servo_angle)
160 {
161  int servo_index = getServoIndexFromID (servo_id), difference;
162 
163  if (servo_index < 0)
164  {
165  return;
166  }
167 
168  if (NOISE_CONTROL)
169  {
170  difference = current_pos [servo_index] - servo_angle;
171  if ((difference * difference) < 1)
172  {
173  return;
174  }
175 
176  current_pos [servo_index] = servo_angle;
177  }
178 
179  serialDebugWrite (servo_id);
180  serialDebugWrite (servo_angle);
181 }
uint8_t reverse[SERVOS]
Definition: servo_rhand.h:47
uint8_t current_pos[SERVOS]
Definition: servo.ino:39
void setup()
Definition: servo.ino:61
void loop()
Definition: servo.ino:100
int getServoIndexFromID(uint8_t servo_id)
Definition: servo_rhand.h:74
uint8_t limit[SERVOS][2]
Definition: servo_rhand.h:34