Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp
00001 #if 0 00002 #include "mbed.h" 00003 #include "Nunchuck.h" 00004 #define R 0 00005 #define L 1 00006 00007 #define DEBUG 0 00008 #define DEBUG_R 1 00009 #define CALIB 0 00010 00011 #define SetupCMD 'A' 00012 #define Respons 'S' 00013 DigitalOut debugLed1(D6); 00014 DigitalOut debugLed2(D7); 00015 bool send = false; 00016 union floatInByte 00017 { 00018 uint16_t si; 00019 unsigned char c[2]; 00020 }; 00021 class AnalogInLPF : public AnalogIn 00022 { 00023 private: 00024 float alpha; 00025 float prevAnalog; 00026 float nowAnalog; 00027 public : AnalogInLPF(PinName pin,float alpha_) : AnalogIn(pin) 00028 { 00029 alpha = alpha_; 00030 prevAnalog = 0.0; 00031 } 00032 float read(){ 00033 nowAnalog = AnalogIn::read(); 00034 nowAnalog = nowAnalog*alpha + (1-alpha)*prevAnalog; 00035 prevAnalog = nowAnalog; 00036 return nowAnalog; 00037 } 00038 short read_u16(){ 00039 nowAnalog = AnalogIn::read(); 00040 nowAnalog = nowAnalog*alpha + (1-alpha)*prevAnalog; 00041 prevAnalog = nowAnalog; 00042 return short(nowAnalog*0xFFFF); 00043 } 00044 }; 00045 class InLPF 00046 { 00047 private: 00048 float alpha; 00049 float prevAnalog; 00050 float nowAnalog; 00051 public : InLPF(float alpha_ = 0.2) 00052 { 00053 alpha = alpha_; 00054 prevAnalog = 0.0; 00055 } 00056 float read(float in){ 00057 nowAnalog = in; 00058 nowAnalog = nowAnalog*alpha + (1-alpha)*prevAnalog; 00059 prevAnalog = nowAnalog; 00060 return nowAnalog; 00061 } 00062 short read_u16(float in){ 00063 nowAnalog = in; 00064 nowAnalog = nowAnalog*alpha + (1-alpha)*prevAnalog; 00065 prevAnalog = nowAnalog; 00066 return short(nowAnalog*0xFFFF); 00067 } 00068 }; 00069 uint16_t map(uint16_t in, uint16_t inMin, uint16_t inMax, uint16_t outMin, uint16_t outMax); 00070 #define LP 0.7 00071 AnalogInLPF ArmSense[4] = {AnalogInLPF(A6,LP),AnalogInLPF(A5,LP),AnalogInLPF(A4,LP),AnalogInLPF(A3,LP)}; 00072 InLPF ArmSense2[4] = {InLPF(LP),InLPF(LP),InLPF(LP),InLPF(LP)}; 00073 #if !CALIB 00074 //1号機 00075 //uint16_t MinimumRangeR[4] = {4000,40000,53500,16000}; 00076 //uint16_t MaxmumRangeR[4] = {55000,51000,58900,45000}; 00077 //uint16_t MinimumRangeL[4] = {31500,8000,30000,19800}; 00078 //uint16_t MaxmumRangeL[4] = {48000,46400,46200,45000}; 00079 //2号機 00080 uint16_t MinimumRangeR[4] = {0xffff-43000,48000,52100,0xffff-52000}; 00081 uint16_t MaxmumRangeR[4] = {0xffff-29800,53300,56000,0xffff-28400}; 00082 uint16_t MinimumRangeL[4] = {62900,11300,37700,14200}; 00083 uint16_t MaxmumRangeL[4] = {45800,56000,27900,44000}; 00084 #endif 00085 #if CALIB 00086 uint16_t MinimumRangeR[4] = {0,0,0,0}; 00087 uint16_t MaxmumRangeR[4] = {0xffff,0xffff,0xffff,0xffff}; 00088 uint16_t MinimumRangeL[4] = {0,0,0,0}; 00089 uint16_t MaxmumRangeL[4] = {0xffff,0xffff,0xffff,0xffff}; 00090 #endif 00091 //uint16_t MinimumRangeL[4] = {19000,35000,35600,21000}; 00092 //uint16_t MaxmumRangeL[4] = {49000,57000,43000,42000 }; 00093 bool ReverseL[4] = {true,false,true,true}; 00094 bool ReverseR[4] = {true,false,false,false}; 00095 //AnalogIn ArmSense[4] = {AnalogIn(A6),AnalogIn(A5),AnalogIn(A4),AnalogIn(A3)}; 00096 Nunchuck ctrl(D4,D5); 00097 Serial dev(D1,D0); 00098 Serial sbdbt(D13,D12); 00099 #define dataNum 12 00100 void waitTime(float ti){ 00101 Timer t; 00102 t.start(); 00103 while(ti > t.read()); 00104 t.stop(); 00105 return; 00106 } 00107 Timer timer; 00108 char *tmp[2]; 00109 char RXData[dataNum] = {'0'}; 00110 void RX(){ 00111 if(dev.getc() == '0'){ 00112 timer.reset(); 00113 debugLed1 = true; 00114 for(int i = 1 ; i < dataNum;i++){ 00115 RXData[i] = dev.getc(); 00116 } 00117 //if(DEBUG && !DEBUG_R)sbdbt.printf("L:"); 00118 for(int i = 0 ;i < 4 ; i++){ 00119 floatInByte in;//( (uint16_t)tmp[R][5 + i*2] << 8 ) | (uint16_t)tmp[R][4 + i*2]; 00120 in.c[0] = RXData[4 + i*2];//tmp[R][5 + i*2]; 00121 in.c[1] = RXData[5 + i*2];//tmp[R][4 + i*2]; 00122 uint16_t in_ = ArmSense2[i].read_u16(float(in.si)/0xffff); 00123 uint16_t intt = map(in_,MinimumRangeL[i],MaxmumRangeL[i],0,65535); 00124 intt = ReverseL[i] == true ? 0xffff - intt : intt; 00125 floatInByte intt_; 00126 intt_.si = intt; 00127 //if(DEBUG && !DEBUG_R)sbdbt.printf(" %5d ",intt); 00128 //uint16_t intt = map(in_,13107,52428,0,65535); 00129 RXData[4 + i*2] = intt_.c[0];//uint8_t(intt>>8);//マスター片腕 00130 RXData[5 + i*2] = intt_.c[1];//uint8_t(intt&0xff); //マスター片腕 00131 }//if(DEBUG && !DEBUG_R)sbdbt.printf("\n"); 00132 00133 timer.reset(); 00134 send = true; 00135 } 00136 } 00137 void print(int N,char RXdata[12]){ 00138 floatInByte data; 00139 for(int i = 0 ; i < 2 ; i ++){ 00140 data.c[i] = RXdata[N+i]; 00141 } 00142 sbdbt.printf("%d ",data.si); 00143 } 00144 double offset[4] = {0,0,0,-132}; 00145 double range[4] = {120,120,90,240}; 00146 double range2[4] = {120,120,90,9}; 00147 int main() { 00148 00149 dev.baud(115200); 00150 00151 sbdbt.baud(115200); 00152 for(int i = 0 ; i < 2; i++) 00153 { 00154 tmp[i] = new char[dataNum]; 00155 } 00156 debugLed1 = true; 00157 for(int i = 0 ; i < 50 ; i ++ ){ 00158 debugLed2 = !debugLed2; 00159 wait(0.1); 00160 } 00161 dev.attach(RX, Serial::RxIrq); 00162 dev.putc('L'); 00163 timer.start(); 00164 while(1) { 00165 //送信データ格納 00166 00167 00168 tmp[R][0] = 'H'; 00169 tmp[R][1] = ctrl.analogx();//ヌンチャクアナログX 00170 tmp[R][2] = ctrl.analogy();//ヌンチャクアナログy 00171 tmp[R][3] = (ctrl.buttonc()<<1)|(ctrl.buttonz());//ヌンチャクzボタンとCボタン 00172 for(int i = 0 ;i < 4 ; i++){ 00173 floatInByte intt_; 00174 //if(i==0 && DEBUG && DEBUG_R)sbdbt.printf("R:"); 00175 uint16_t in = ArmSense[i].read_u16(); 00176 //if(DEBUG && DEBUG_R)sbdbt.printf(" %5d ",intt); 00177 uint16_t intt = map(in, MinimumRangeR[i],MaxmumRangeR[i],0,65535); 00178 intt = ReverseR[i] == true ? 0xffff - intt : intt; 00179 intt_.si = intt; 00180 //uint16_t intt = map(in_,13107,52428,0,65535); 00181 tmp[R][4 + i*2] = intt_.c[0];//uint8_t(intt>>8);//マスター片腕 00182 tmp[R][5 + i*2] = intt_.c[1];//uint8_t(intt&0xff); //マスター片腕 00183 } 00184 //if(DEBUG && DEBUG_R)sbdbt.printf("\n"); 00185 tmp[L] = RXData; 00186 char** SerialData = tmp; 00187 00188 //送信データを送る 00189 //SerialData = tmp; 00190 if(send == true){ 00191 for(int j = 0; j < 2 ; j++){ 00192 for(int i = 0 ; i < dataNum ; i++){ 00193 //if(!DEBUG)sbdbt.printf("%3d ",SerialData[j][i]); 00194 //if(!DEBUG)sbdbt.putc(SerialData[j][i]); 00195 } 00196 } 00197 sbdbt.printf("R:"); 00198 for(int i = 4 ; i < 12 ; i+=2)print(i,SerialData[R]); 00199 sbdbt.printf("L:"); 00200 for(int i = 4 ; i < 12 ; i+=2)print(i,SerialData[L]); 00201 00202 for(int j = 0; j < 2 ; j++){ 00203 for(int i = 0 ; i < dataNum ; i++){ 00204 //sbdbt.printf("%3d ",SerialData[j][i]); 00205 if(!DEBUG)sbdbt.putc(SerialData[j][i]); 00206 } 00207 } 00208 if(!DEBUG)sbdbt.printf("\n"); 00209 } 00210 dev.putc('L'); 00211 send = false; 00212 while(timer.read_ms() >= 2000){ 00213 debugLed2 = true; 00214 waitTime(0.1); 00215 debugLed2 = false; 00216 waitTime(0.1); 00217 } 00218 debugLed1 = false; 00219 waitTime(0.01); 00220 #if DEBUG 00221 int RL = R; 00222 if(DEBUG_R){sbdbt.printf("R:");RL = R;} 00223 if(!DEBUG_R){sbdbt.printf("L:");RL = L;} 00224 for(int i = 4 ; i < 12 ; i+=2)print(i,SerialData[RL]); 00225 sbdbt.printf("\n"); 00226 #endif 00227 } 00228 } 00229 uint16_t map(uint16_t in, uint16_t inMin, uint16_t inMax, uint16_t outMin, uint16_t outMax) { 00230 // check it's within the range 00231 if (inMin<inMax) { 00232 if (in <= inMin) 00233 return outMin; 00234 if (in >= inMax) 00235 return outMax; 00236 } else { // cope with input range being backwards. 00237 if (in >= inMin) 00238 return outMin; 00239 if (in <= inMax) 00240 return outMax; 00241 } 00242 // calculate how far into the range we are 00243 float scale = float(in-inMin)/float(inMax-inMin); 00244 // calculate the output. 00245 return uint16_t(outMin + scale*float(outMax-outMin)); 00246 } 00247 #endif
Generated on Sun Aug 7 2022 22:31:28 by
1.7.2