Kiko Ishimoto / Mbed 2 deprecated robocon2017mbed_controlLnew

Dependencies:   MyLibdd mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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