use for experiment before the demonstration at open-campus
Dependencies: FEP ikarashiMDC omni PID R1370
Fork of omni_sample by
main.cpp@16:7eaf3343f45e, 2017-09-15 (annotated)
- Committer:
- tkNara
- Date:
- Fri Sep 15 10:14:41 2017 +0900
- Revision:
- 16:7eaf3343f45e
- Parent:
- 15:d4ff132a616d
update FEP baud 115200
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tkNara | 15:d4ff132a616d | 1 | #include "omni.h" |
UCHITAKE | 0:6c83a0871cc3 | 2 | #include "mbed.h" |
tknara | 7:ef72ec7390c2 | 3 | #include "ikarashiMDC.h" |
UCHITAKE | 0:6c83a0871cc3 | 4 | #include "pin_config.h" |
eil4nyqn | 1:ba8cdae2652a | 5 | #include "FEP.h" |
tknara | 9:8f9607783d2d | 6 | #include "controller.h" |
tknara | 10:73148221684e | 7 | #include "PID.h" |
tknara | 10:73148221684e | 8 | #include "R1370.h" |
UCHITAKE | 0:6c83a0871cc3 | 9 | |
tkNara | 15:d4ff132a616d | 10 | #define DEBUG |
tknara | 10:73148221684e | 11 | |
tkNara | 15:d4ff132a616d | 12 | #define KP 0.0//1.5 //2.5 |
tkNara | 15:d4ff132a616d | 13 | #define KI 0.0 //0s |
tkNara | 15:d4ff132a616d | 14 | #define KD 0.0 //0.05 |
tknara | 10:73148221684e | 15 | #define RATE 0.01 |
tknara | 7:ef72ec7390c2 | 16 | Omni omni(4); |
tknara | 9:8f9607783d2d | 17 | Serial RS485(RS485_TX,RS485_RX,38400); |
tknara | 9:8f9607783d2d | 18 | Serial pc(USBTX,USBRX,115200); |
tknara | 9:8f9607783d2d | 19 | Controller con(FEP_TX,FEP_RX,200); |
tknara | 10:73148221684e | 20 | DigitalOut RS485control(PA_4); |
tkNara | 15:d4ff132a616d | 21 | DigitalOut attack[2] = {air1_0,air1_1}; |
tkNara | 15:d4ff132a616d | 22 | DigitalOut angle[2] = {air2_0,air2_1}; |
tknara | 12:c7e91c4c2ffa | 23 | DigitalOut powerSw(powerSW); |
tknara | 10:73148221684e | 24 | R1370 R1370(R1370_TX,R1370_RX); |
tkNara | 15:d4ff132a616d | 25 | PID pid(KP,KI,KD,RATE); |
tknara | 7:ef72ec7390c2 | 26 | ikarashiMDC wheels[] { |
tknara | 8:244c057d195c | 27 | ikarashiMDC(&RS485control,0,0,SM,&RS485), |
tknara | 8:244c057d195c | 28 | ikarashiMDC(&RS485control,1,3,SM,&RS485), |
tknara | 8:244c057d195c | 29 | ikarashiMDC(&RS485control,1,0,SM,&RS485), |
tknara | 8:244c057d195c | 30 | ikarashiMDC(&RS485control,0,3,SM,&RS485) |
tknara | 7:ef72ec7390c2 | 31 | }; |
tknara | 7:ef72ec7390c2 | 32 | ikarashiMDC lift[] { |
tknara | 9:8f9607783d2d | 33 | ikarashiMDC(&RS485control,1,1,SM,&RS485) |
tknara | 7:ef72ec7390c2 | 34 | }; |
WAT34 | 3:4cd170cdf049 | 35 | void init() |
WAT34 | 3:4cd170cdf049 | 36 | { |
tknara | 10:73148221684e | 37 | pc.printf("Hello\n"); |
tknara | 8:244c057d195c | 38 | int i; |
tknara | 8:244c057d195c | 39 | for(i = 0;i < 4;i++) { |
tknara | 8:244c057d195c | 40 | wheels[i].braking = true; |
tknara | 8:244c057d195c | 41 | } |
tkNara | 15:d4ff132a616d | 42 | omni.setWheelRadian(PI/4,3*PI/4,5*PI/4,7*PI/4); |
tknara | 9:8f9607783d2d | 43 | lift[0].braking = true; |
WAT34 | 3:4cd170cdf049 | 44 | } |
tknara | 10:73148221684e | 45 | void pidInit() |
tknara | 10:73148221684e | 46 | { |
tknara | 10:73148221684e | 47 | pid.reset(); |
tknara | 10:73148221684e | 48 | pid.setInputLimits(-180.0,180.0); |
tknara | 10:73148221684e | 49 | pid.setOutputLimits(-1.0,1.0); |
tknara | 10:73148221684e | 50 | pid.setMode(1); |
tknara | 10:73148221684e | 51 | pid.setSetPoint(0.0); |
tknara | 10:73148221684e | 52 | pid.setBias(0.0); |
tknara | 10:73148221684e | 53 | } |
tkNara | 15:d4ff132a616d | 54 | void gyroInit() |
tknara | 5:dee9310ec990 | 55 | { |
tkNara | 15:d4ff132a616d | 56 | R1370.update(); |
tkNara | 15:d4ff132a616d | 57 | R1370.setZeroPoint(R1370.getAngle()); |
tknara | 5:dee9310ec990 | 58 | } |
UCHITAKE | 0:6c83a0871cc3 | 59 | int main() |
tkNara | 15:d4ff132a616d | 60 | { |
tknara | 14:1d9ae3128002 | 61 | bool airFlag1 = 0,airFlag2 = 0,airStatus1 = 0,airStatus2 = 0,pidflag = 0; |
tknara | 12:c7e91c4c2ffa | 62 | int error_val = 0,i = 0; |
tkNara | 16:7eaf3343f45e | 63 | float nowAngle = 0,rote = 0.0;//,oldAngle = 0; |
tknara | 8:244c057d195c | 64 | init(); |
tknara | 10:73148221684e | 65 | pidInit(); |
tkNara | 15:d4ff132a616d | 66 | gyroInit(); |
tkNara | 15:d4ff132a616d | 67 | while(1) |
tknara | 10:73148221684e | 68 | { |
tkNara | 15:d4ff132a616d | 69 | if(con.receiveState()==0) |
tknara | 10:73148221684e | 70 | { |
tkNara | 15:d4ff132a616d | 71 | if(R1370.update()==0) |
tkNara | 15:d4ff132a616d | 72 | { |
tkNara | 15:d4ff132a616d | 73 | if(con.getButton1(6)==0) { |
tkNara | 15:d4ff132a616d | 74 | powerSw = 0; |
tkNara | 15:d4ff132a616d | 75 | } else { |
tkNara | 15:d4ff132a616d | 76 | powerSw = 1; |
tkNara | 15:d4ff132a616d | 77 | } |
tkNara | 16:7eaf3343f45e | 78 | for(i=0;i<6;i++){ |
tkNara | 16:7eaf3343f45e | 79 | pc.printf("%d,%d\n",i,con.getButton2(i)); |
tkNara | 16:7eaf3343f45e | 80 | } |
tkNara | 15:d4ff132a616d | 81 | error_val = 0; |
tkNara | 15:d4ff132a616d | 82 | nowAngle = R1370.getAngle(); |
tkNara | 16:7eaf3343f45e | 83 | /*if((con.getStick(0)==0)&&(pidflag==1)) { |
tkNara | 15:d4ff132a616d | 84 | pc.printf("zeroPointSet\n"); |
tkNara | 15:d4ff132a616d | 85 | pidflag = 0; |
tkNara | 15:d4ff132a616d | 86 | R1370.setZeroPoint(nowAngle); |
tkNara | 15:d4ff132a616d | 87 | }else if(con.getStick(0)!=0) { |
tkNara | 15:d4ff132a616d | 88 | pidflag = 1; |
tkNara | 16:7eaf3343f45e | 89 | if((con.getButton2(0)==0)&&(con.getButton2(2)==1)){ |
tkNara | 16:7eaf3343f45e | 90 | rote = 0.15; |
tkNara | 16:7eaf3343f45e | 91 | }else if((con.getButton2(0)==1)&&(con.getButton2(2)==0)){ |
tkNara | 16:7eaf3343f45e | 92 | rote = -0.15; |
tkNara | 16:7eaf3343f45e | 93 | }else { |
tkNara | 16:7eaf3343f45e | 94 | rote = 0.0; |
tkNara | 16:7eaf3343f45e | 95 | } |
tkNara | 16:7eaf3343f45e | 96 | omni.computeXY(-1*con.getStick(2),con.getStick(3),rote);//(-1*con.getStick(0))/3.0); |
tkNara | 15:d4ff132a616d | 97 | }else if((con.getStick(0)==0)&&(pidflag==0)) { |
tkNara | 15:d4ff132a616d | 98 | pid.setProcessValue(R1370.getDeviation(nowAngle)); |
tkNara | 15:d4ff132a616d | 99 | omni.computeXY(-1*con.getStick(2),con.getStick(3),-1*pid.compute()); |
tkNara | 16:7eaf3343f45e | 100 | }*/ |
tkNara | 16:7eaf3343f45e | 101 | if((con.getButton2(0)==0)&&(con.getButton2(2)==1)){ |
tkNara | 16:7eaf3343f45e | 102 | rote = 0.15; |
tkNara | 16:7eaf3343f45e | 103 | }else if((con.getButton2(0)==1)&&(con.getButton2(2)==0)){ |
tkNara | 16:7eaf3343f45e | 104 | rote = -0.15; |
tkNara | 16:7eaf3343f45e | 105 | }else { |
tkNara | 16:7eaf3343f45e | 106 | rote = 0.0; |
tkNara | 15:d4ff132a616d | 107 | } |
tkNara | 16:7eaf3343f45e | 108 | omni.computeXY(-1*con.getStick(2),con.getStick(3),rote); |
tkNara | 15:d4ff132a616d | 109 | pc.printf("Now%lf:D%lf:set%lf:PID%lf ",R1370.getAngle(),R1370.getDeviation(nowAngle),R1370.getZeroPoint(),-1*pid.compute()); |
tkNara | 15:d4ff132a616d | 110 | for(i = 0; i < 4; i++) { |
tkNara | 15:d4ff132a616d | 111 | pc.printf("%lf,",omni.getOutput(i)); |
tkNara | 15:d4ff132a616d | 112 | wheels[i].setSpeed(omni.getOutput(i)); |
tkNara | 15:d4ff132a616d | 113 | } |
tkNara | 15:d4ff132a616d | 114 | pc.printf("\n"); |
tkNara | 15:d4ff132a616d | 115 | //昇降 |
tkNara | 15:d4ff132a616d | 116 | lift[0].setSpeed(con.getStick(1)); |
tkNara | 15:d4ff132a616d | 117 | //アーム攻撃(toggle) |
tkNara | 15:d4ff132a616d | 118 | pc.printf("%d\n",con.getButton2(1)); |
tkNara | 15:d4ff132a616d | 119 | if((con.getButton2(1)==0)&&(airFlag1 == 0)) |
tkNara | 15:d4ff132a616d | 120 | { |
tkNara | 15:d4ff132a616d | 121 | if(airStatus1==1) { |
tkNara | 15:d4ff132a616d | 122 | attack[0]=0; |
tkNara | 15:d4ff132a616d | 123 | attack[1]=1; |
tkNara | 15:d4ff132a616d | 124 | airFlag1=1; |
tkNara | 15:d4ff132a616d | 125 | airStatus1=0; |
tkNara | 15:d4ff132a616d | 126 | }else if(airStatus1==0) { |
tkNara | 15:d4ff132a616d | 127 | attack[0]=1; |
tkNara | 15:d4ff132a616d | 128 | attack[1]=0; |
tkNara | 15:d4ff132a616d | 129 | airFlag1=1; |
tkNara | 15:d4ff132a616d | 130 | airStatus1=1; |
tkNara | 15:d4ff132a616d | 131 | } |
tkNara | 15:d4ff132a616d | 132 | }else if(con.getButton2(1)==1){ |
tkNara | 15:d4ff132a616d | 133 | airFlag1=0; |
tkNara | 15:d4ff132a616d | 134 | attack[0]=0; |
tkNara | 15:d4ff132a616d | 135 | attack[1]=0; |
tkNara | 15:d4ff132a616d | 136 | } |
tkNara | 15:d4ff132a616d | 137 | //アーム角度(toggle) |
tkNara | 15:d4ff132a616d | 138 | if((con.getButton2(3)==0)&&(airFlag2 == 0)) |
tkNara | 15:d4ff132a616d | 139 | { |
tkNara | 15:d4ff132a616d | 140 | if(airStatus2==1) { |
tkNara | 15:d4ff132a616d | 141 | angle[0]=0; |
tkNara | 15:d4ff132a616d | 142 | angle[1]=1; |
tkNara | 15:d4ff132a616d | 143 | airFlag2=1; |
tkNara | 15:d4ff132a616d | 144 | airStatus2=0; |
tkNara | 15:d4ff132a616d | 145 | }else if(airStatus2==0) { |
tkNara | 15:d4ff132a616d | 146 | angle[0]=1; |
tkNara | 15:d4ff132a616d | 147 | angle[1]=0; |
tkNara | 15:d4ff132a616d | 148 | airFlag2=1; |
tkNara | 15:d4ff132a616d | 149 | airStatus2=1; |
tkNara | 15:d4ff132a616d | 150 | } |
tkNara | 15:d4ff132a616d | 151 | }else if(con.getButton2(3)==1){ |
tkNara | 15:d4ff132a616d | 152 | airFlag2=0; |
tkNara | 15:d4ff132a616d | 153 | angle[0]=0; |
tkNara | 15:d4ff132a616d | 154 | angle[1]=0; |
tkNara | 15:d4ff132a616d | 155 | } |
tknara | 14:1d9ae3128002 | 156 | }else { |
tkNara | 15:d4ff132a616d | 157 | //pc.printf("gyro_error\n"); |
tknara | 5:dee9310ec990 | 158 | } |
tknara | 12:c7e91c4c2ffa | 159 | }else { |
tkNara | 15:d4ff132a616d | 160 | //pc.printf("FEP_error\n"); |
tknara | 12:c7e91c4c2ffa | 161 | error_val++; |
tkNara | 15:d4ff132a616d | 162 | if(error_val > 5) powerSw = 0; |
tkNara | 15:d4ff132a616d | 163 | else powerSw = 1; |
UCHITAKE | 0:6c83a0871cc3 | 164 | } |
UCHITAKE | 0:6c83a0871cc3 | 165 | } |
UCHITAKE | 0:6c83a0871cc3 | 166 | } |