00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "Servo/Servo.h"
00022
00023 #if SERVO50HZCHANNELS > 8
00024 #error "too many 50Hz servos"
00025 #endif
00026
00027
00028
00029
00030 #define MAKENAME(n) const char Servo50HzNames##n[] PROGMEM = "Servo."#n
00031 #define MAKEARRAY(s) static const char* s[] = {\
00032 s##1,s##2,s##3,s##4,s##5,s##6,s##7,s##8};
00033
00034 MAKENAME(1);
00035 MAKENAME(2);
00036 MAKENAME(3);
00037 MAKENAME(4);
00038 MAKENAME(5);
00039 MAKENAME(6);
00040 MAKENAME(7);
00041 MAKENAME(8);
00042 MAKEARRAY(Servo50HzNames);
00043
00044 #undef MAKENAME
00045 #define MAKENAME(s,n) const char Servo50Hz##s##n[] PROGMEM = "Servo."#n"."#s
00046
00047
00048 MAKENAME(Min,1);
00049 MAKENAME(Min,2);
00050 MAKENAME(Min,3);
00051 MAKENAME(Min,4);
00052 MAKENAME(Min,5);
00053 MAKENAME(Min,6);
00054 MAKENAME(Min,7);
00055 MAKENAME(Min,8);
00056 MAKEARRAY(Servo50HzMin);
00057
00058 MAKENAME(Max,1);
00059 MAKENAME(Max,2);
00060 MAKENAME(Max,3);
00061 MAKENAME(Max,4);
00062 MAKENAME(Max,5);
00063 MAKENAME(Max,6);
00064 MAKENAME(Max,7);
00065 MAKENAME(Max,8);
00066 MAKEARRAY(Servo50HzMax);
00067
00068 MAKENAME(Gain,1);
00069 MAKENAME(Gain,2);
00070 MAKENAME(Gain,3);
00071 MAKENAME(Gain,4);
00072 MAKENAME(Gain,5);
00073 MAKENAME(Gain,6);
00074 MAKENAME(Gain,7);
00075 MAKENAME(Gain,8);
00076 MAKEARRAY(Servo50HzGain);
00077
00078 MAKENAME(Offset,1);
00079 MAKENAME(Offset,2);
00080 MAKENAME(Offset,3);
00081 MAKENAME(Offset,4);
00082 MAKENAME(Offset,5);
00083 MAKENAME(Offset,6);
00084 MAKENAME(Offset,7);
00085 MAKENAME(Offset,8);
00086 MAKEARRAY(Servo50HzOffset);
00087 #undef MAKENAME
00088 #undef MAKEARRAY
00089
00090
00091
00093
00107 class Servo50Hz : public Module
00108 {
00109 DECLARE_MODULE(Servo50Hz,Module);
00110 public:
00111
00112
00113
00114
00115 Servo50Hz()
00116 {
00117
00118 AddSocketArray(Servo50HzNames, m_servoSockets, SERVO50HZCHANNELS);
00119 AddSocketArray(Servo50HzMin, m_mins, SERVO50HZCHANNELS);
00120 AddSocketArray(Servo50HzMax, m_maxs, SERVO50HZCHANNELS);
00121 AddSocketArray(Servo50HzGain, m_gains, SERVO50HZCHANNELS);
00122 AddSocketArray(Servo50HzOffset, m_offsets, SERVO50HZCHANNELS);
00123
00124 for (int ct=0; ct< SERVO50HZCHANNELS; ct++)
00125 {
00126 m_mins[ct] = 1000;
00127 m_maxs[ct] = 2000;
00128 m_gains[ct] = 500;
00129 m_offsets[ct] = 1500;
00130 }
00131 }
00132
00133
00134
00135
00136 virtual void ParamChanged(Socket * param)
00137 {
00138 for (int ct=0; ct< SERVO50HZCHANNELS; ct++)
00139 {
00140 if (param == &m_mins[ct] || param == &m_maxs[ct])
00141 {
00142 m_servos[ct].detach();
00143 m_servos[ct].attach(servo50HzPins[ct],m_mins[ct],m_maxs[ct]);
00144 break;
00145 }
00146 }
00147 }
00148
00149
00150
00151 virtual void Init()
00152 {
00153 for (int ct=0; ct< SERVO50HZCHANNELS; ct++)
00154 {
00155 m_servos[ct].attach(servo50HzPins[ct],m_mins[ct],m_maxs[ct]);
00156 }
00157
00158
00159 SetInterval(20);
00160 SetPriority(20);
00161 }
00162
00163
00164 virtual void Loop(const unsigned long& interval)
00165 {
00166 for (int ct=0; ct< SERVO50HZCHANNELS; ct++)
00167 {
00168
00169 float socket = m_servoSockets[ct];
00170 if (socket != m_servoWas[ct])
00171 {
00172 m_servoWas[ct] = socket;
00173 m_servos[ct].writeMicroseconds(((int)(socket * m_gains[ct])) + m_offsets[ct]);
00174 }
00175 }
00176 }
00177
00178 private:
00179
00180 SocketF m_servoSockets[SERVO50HZCHANNELS];
00181 ParameterF m_gains[SERVO50HZCHANNELS];
00182 Parameter16 m_offsets[SERVO50HZCHANNELS];
00183 Parameter16 m_mins[SERVO50HZCHANNELS];
00184 Parameter16 m_maxs[SERVO50HZCHANNELS];
00185 float m_servoWas[SERVO50HZCHANNELS];
00186 Servo m_servos[SERVO50HZCHANNELS];
00187 };
00188
00189 Servo50Hz g_Servo50Hz;
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202