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 #include "mbed.h" 00002 #define R 0 00003 #define L 1 00004 00005 #define DEBUG 0 00006 #define DEBUG_R 1 00007 #define CALIB 0 00008 00009 #define SetupCMD 'A' 00010 #define Respons 'S' 00011 DigitalOut debugLed1(D6); 00012 DigitalOut debugLed2(D7); 00013 bool send = false; 00014 union floatInByte 00015 { 00016 uint16_t si; 00017 unsigned char c[2]; 00018 }; 00019 class AnalogInLPF : public AnalogIn 00020 { 00021 private: 00022 float alpha; 00023 float prevAnalog; 00024 float nowAnalog; 00025 public : AnalogInLPF(PinName pin,float alpha_) : AnalogIn(pin) 00026 { 00027 alpha = alpha_; 00028 prevAnalog = 0.0; 00029 } 00030 float read(){ 00031 nowAnalog = AnalogIn::read(); 00032 nowAnalog = nowAnalog*alpha + (1-alpha)*prevAnalog; 00033 prevAnalog = nowAnalog; 00034 return nowAnalog; 00035 } 00036 short read_u16(){ 00037 nowAnalog = AnalogIn::read(); 00038 nowAnalog = nowAnalog*alpha + (1-alpha)*prevAnalog; 00039 nowAnalog = float(short(nowAnalog*0xFFFF)&0xFF00)/0xFFFF; 00040 prevAnalog = nowAnalog; 00041 return short(nowAnalog*0xFFFF); 00042 } 00043 }; 00044 class InLPF 00045 { 00046 private: 00047 float alpha; 00048 float prevAnalog; 00049 float nowAnalog; 00050 public : InLPF(float alpha_ = 0.2) 00051 { 00052 alpha = alpha_; 00053 prevAnalog = 0.0; 00054 } 00055 float read(float in){ 00056 nowAnalog = in; 00057 nowAnalog = nowAnalog*alpha + (1-alpha)*prevAnalog; 00058 prevAnalog = nowAnalog; 00059 return nowAnalog; 00060 } 00061 short read_u16(float in){ 00062 nowAnalog = in; 00063 nowAnalog = nowAnalog*alpha + (1-alpha)*prevAnalog; 00064 prevAnalog = nowAnalog; 00065 return short(nowAnalog*0xFFFF)&0xFF00; 00066 } 00067 }; 00068 uint16_t map(uint16_t in, uint16_t inMin, uint16_t inMax, uint16_t outMin, uint16_t outMax); 00069 #define LP 0.30 00070 AnalogInLPF ArmSense[4] = {AnalogInLPF(A6,LP-0.018),AnalogInLPF(A5,LP),AnalogInLPF(A4,LP),AnalogInLPF(A3,LP)}; 00071 InLPF ArmSense2[4] = {InLPF(LP),InLPF(LP),InLPF(LP),InLPF(LP)}; 00072 #if !CALIB 00073 //1号機 00074 /* 00075 uint16_t MinimumRangeR[4] = {12800,41414,26368,11776}; 00076 uint16_t MaxmumRangeR[4] = {36608,52242,55552,38144}; 00077 uint16_t MinimumRangeL[4] = {23040,24832,24576,32256}; 00078 uint16_t MaxmumRangeL[4] = {44312,47296,59392,58624}; 00079 00080 bool ReverseL[4] = {false,true,true,false}; 00081 bool ReverseR[4] = {true,false,true,false}; 00082 */ 00083 /* 00084 uint16_t MinimumRangeR[4] = {14592,41414,16128,12288}; 00085 uint16_t MaxmumRangeR[4] = {41216,52242,61952,38144}; 00086 uint16_t MinimumRangeL[4] = {23040,18176,11008,34303}; 00087 uint16_t MaxmumRangeL[4] = {44312,47296,60106,58368}; 00088 00089 bool ReverseL[4] = {false,true,true,false}; 00090 bool ReverseR[4] = {true,false,true,false}; 00091 */ 00092 /* 00093 uint16_t MinimumRangeR[4] = {1280,42240,36096,17152}; 00094 uint16_t MaxmumRangeR[4] = {45312,52992,58624,41216}; 00095 uint16_t MinimumRangeL[4] = {23040,18432,24576,58112}; 00096 uint16_t MaxmumRangeL[4] = {45312,58112,59392,30976}; 00097 */ 00098 //2号機 00099 //17468 23308 00100 00101 uint16_t MinimumRangeR[4] = {19900,41216,45056,13002}; 00102 uint16_t MaxmumRangeR[4] = {42544,53248,60676,38312}; 00103 uint16_t MinimumRangeL[4] = {21500,19432,10190,55588}; 00104 uint16_t MaxmumRangeL[4] = {43520,43300,43264,30208}; 00105 00106 bool ReverseL[4] = {false,true,true,true}; 00107 bool ReverseR[4] = {true,false,true,false}; 00108 00109 #endif 00110 #if CALIB 00111 uint16_t MinimumRangeR[4] = {0,0,0,0}; 00112 uint16_t MaxmumRangeR[4] = {0xffff,0xffff,0xffff,0xffff}; 00113 uint16_t MinimumRangeL[4] = {0,0,0,0}; 00114 uint16_t MaxmumRangeL[4] = {0xffff,0xffff,0xffff,0xffff}; 00115 #endif 00116 //uint16_t MinimumRangeL[4] = {19000,35000,35600,21000}; 00117 //uint16_t MaxmumRangeL[4] = {49000,57000,43000,42000 }; 00118 //AnalogIn ArmSense[4] = {AnalogIn(A6),AnalogIn(A5),AnalogIn(A4),AnalogIn(A3)}; 00119 Serial dev(D1,D0); 00120 Serial sbdbt(D13,D12); 00121 #define dataNum 12 00122 void waitTime(float ti){ 00123 Timer t; 00124 t.start(); 00125 while(ti > t.read()); 00126 t.stop(); 00127 return; 00128 } 00129 Timer timer; 00130 char *tmp[2]; 00131 char RXData[dataNum] = {'0'}; 00132 void RX(){ 00133 if(dev.getc() == '0'){ 00134 timer.reset(); 00135 debugLed1 = true; 00136 for(int i = 1 ; i < dataNum;i++){ 00137 RXData[i] = dev.getc(); 00138 } 00139 //if(DEBUG && !DEBUG_R)sbdbt.printf("L:"); 00140 for(int i = 0 ;i < 4 ; i++){ 00141 floatInByte in;//( (uint16_t)tmp[R][5 + i*2] << 8 ) | (uint16_t)tmp[R][4 + i*2]; 00142 in.c[0] = RXData[4 + i*2];//tmp[R][5 + i*2]; 00143 in.c[1] = RXData[5 + i*2];//tmp[R][4 + i*2]; 00144 uint16_t in_ = ArmSense2[i].read_u16(float(in.si)/0xffff); 00145 //uint16_t intt = map(in_,ReverseL[i] == true ? 0xffff - MaxmumRangeL[i] : MinimumRangeL[i],ReverseL[i] == true ? 0xffff - MinimumRangeL[i] : MaxmumRangeL[i],0,65535); 00146 uint16_t intt = map(in_,MinimumRangeL[i],MaxmumRangeL[i],0,65535); 00147 #if !CALIB 00148 intt = ReverseL[i] == true ? 0xffff - intt : intt; 00149 #endif 00150 floatInByte intt_; 00151 intt_.si = intt; 00152 //if(DEBUG && !DEBUG_R)sbdbt.printf(" %5d ",intt); 00153 //uint16_t intt = map(in_,13107,52428,0,65535); 00154 RXData[4 + i*2] = 0;//intt_.c[0];//uint8_t(intt>>8);//マスター片腕 00155 RXData[5 + i*2] = intt_.c[1];//uint8_t(intt&0xff); //マスター片腕 00156 }//if(DEBUG && !DEBUG_R)sbdbt.printf("\n"); 00157 00158 timer.reset(); 00159 send = true; 00160 } 00161 } 00162 void print(int N,char RXdata[12]){ 00163 floatInByte data; 00164 for(int i = 0 ; i < 2 ; i ++){ 00165 data.c[i] = RXdata[N+i]; 00166 } 00167 sbdbt.printf("%d ",data.si); 00168 } 00169 double offset[4] = {0,0,0,-132}; 00170 double range[4] = {120,120,90,240}; 00171 double range2[4] = {120,120,90,9}; 00172 int main() { 00173 00174 dev.baud(115200); 00175 00176 sbdbt.baud(115200); 00177 for(int i = 0 ; i < 2; i++) 00178 { 00179 tmp[i] = new char[dataNum]; 00180 } 00181 debugLed1 = true; 00182 for(int i = 0 ; i < 10 ; i ++ ){ 00183 debugLed2 = !debugLed2; 00184 wait(0.01); 00185 } 00186 wait(0.5); 00187 dev.attach(RX, Serial::RxIrq); 00188 dev.putc('L'); 00189 timer.start(); 00190 int count = 0; 00191 while(1) { 00192 //送信データ格納 00193 tmp[R][0] = 'H'; 00194 tmp[R][1] = 0; 00195 tmp[R][2] = 0; 00196 tmp[R][3] = 0; 00197 00198 for(int i = 0 ;i < 4 ; i++){ 00199 floatInByte intt_; 00200 uint16_t in = ArmSense[i].read_u16(); 00201 uint16_t intt = map(in, MinimumRangeR[i],MaxmumRangeR[i],0,65535); 00202 #if !CALIB 00203 intt = ReverseR[i] == true ? 0xffff - intt : intt; 00204 #endif 00205 intt_.si = intt; 00206 tmp[R][4 + i*2] = 0;//intt_.c[0];//uint8_t(intt>>8);//マスター片腕 00207 tmp[R][5 + i*2] = intt_.c[1];//uint8_t(intt&0xff); //マスター片腕 00208 } 00209 //if(DEBUG && DEBUG_R)sbdbt.printf("\n"); 00210 tmp[L] = RXData; 00211 char** SerialData = tmp; 00212 00213 //送信データを送る 00214 //SerialData = tmp; 00215 if(count > 20 && send == true){ 00216 #if CALIB 00217 sbdbt.printf("R:"); 00218 for(int i = 4 ; i < 12 ; i+=2)print(i,SerialData[R]); 00219 sbdbt.printf("L:"); 00220 for(int i = 4 ; i < 12 ; i+=2)print(i,SerialData[L]); 00221 #endif 00222 for(int j = 0; j < 2 ; j++){ 00223 for(int i = 0 ; i < dataNum ; i++){ 00224 //sbdbt.printf("%3d ",int8_t(SerialData[j][i])); 00225 #if !CALIB 00226 if(!DEBUG)sbdbt.putc(SerialData[j][i]); 00227 #endif 00228 } 00229 } 00230 count = 0; 00231 if(!DEBUG)sbdbt.printf("\n"); 00232 } 00233 dev.putc('L'); 00234 send = false; 00235 while(timer.read_ms() >= 2000){ 00236 debugLed2 = true; 00237 waitTime(0.1); 00238 debugLed2 = false; 00239 waitTime(0.1); 00240 } 00241 debugLed1 = false; 00242 waitTime(1.0/1000); 00243 count ++; 00244 } 00245 } 00246 uint16_t map(uint16_t in, uint16_t inMin, uint16_t inMax, uint16_t outMin, uint16_t outMax) { 00247 // check it's within the range 00248 if (inMin<inMax) { 00249 if (in <= inMin) 00250 return outMin; 00251 if (in >= inMax) 00252 return outMax; 00253 } else { // cope with input range being backwards. 00254 if (in >= inMin) 00255 return outMin; 00256 if (in <= inMax) 00257 return outMax; 00258 } 00259 // calculate how far into the range we are 00260 float scale = float(in-inMin)/float(inMax-inMin); 00261 // calculate the output. 00262 return uint16_t(outMin + scale*float(outMax-outMin)); 00263 }
Generated on Fri Jul 29 2022 13:26:35 by
1.7.2