![](/media/cache/group/default_image.jpg.50x50_q85.jpg)
大会本番用
Dependencies: mbed SpeedController hcsr04 Encoder CruizCore_R1370P
main.cpp@2:0be4cfbdf408, 2020-03-27 (annotated)
- Committer:
- maxnagazumi
- Date:
- Fri Mar 27 06:31:20 2020 +0000
- Revision:
- 2:0be4cfbdf408
- Parent:
- 1:a692014d8e41
soho;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
maxnagazumi | 0:c0e9bbc27454 | 1 | #include "mbed.h" |
maxnagazumi | 0:c0e9bbc27454 | 2 | #include "EC.h" |
maxnagazumi | 0:c0e9bbc27454 | 3 | #include "SpeedController.h" |
maxnagazumi | 0:c0e9bbc27454 | 4 | #include "math.h" |
maxnagazumi | 0:c0e9bbc27454 | 5 | #include "R1370P.h" |
maxnagazumi | 0:c0e9bbc27454 | 6 | #include"hcsr04.h" |
maxnagazumi | 0:c0e9bbc27454 | 7 | #define RESOLUTION 500 |
maxnagazumi | 0:c0e9bbc27454 | 8 | |
maxnagazumi | 0:c0e9bbc27454 | 9 | CAN can1(PB_5,PB_13); |
maxnagazumi | 1:a692014d8e41 | 10 | /* |
maxnagazumi | 2:0be4cfbdf408 | 11 | 0 start/stop |
maxnagazumi | 1:a692014d8e41 | 12 | 1 to 4 , 6 to 9 |
maxnagazumi | 1:a692014d8e41 | 13 | 5 stop |
maxnagazumi | 1:a692014d8e41 | 14 | 10 clock move |
maxnagazumi | 1:a692014d8e41 | 15 | 11 not clock move |
maxnagazumi | 1:a692014d8e41 | 16 | 12 speed change |
maxnagazumi | 1:a692014d8e41 | 17 | */ |
maxnagazumi | 0:c0e9bbc27454 | 18 | Ec2multi ec[]= { |
maxnagazumi | 0:c0e9bbc27454 | 19 | Ec2multi(PC_5,PB_2,RESOLUTION), |
maxnagazumi | 0:c0e9bbc27454 | 20 | Ec2multi(PA_11,PB_1,RESOLUTION), |
maxnagazumi | 0:c0e9bbc27454 | 21 | Ec2multi(PB_12,PB_15,RESOLUTION), |
maxnagazumi | 0:c0e9bbc27454 | 22 | Ec2multi(PC_4,PB_14,RESOLUTION) |
maxnagazumi | 0:c0e9bbc27454 | 23 | }; //2逓倍用class |
maxnagazumi | 0:c0e9bbc27454 | 24 | |
maxnagazumi | 0:c0e9bbc27454 | 25 | Ec2multi ecXY[]= { |
maxnagazumi | 0:c0e9bbc27454 | 26 | Ec2multi(PC_6,PB_8,RESOLUTION), |
maxnagazumi | 0:c0e9bbc27454 | 27 | Ec2multi(PC_8,PB_9,RESOLUTION) |
maxnagazumi | 0:c0e9bbc27454 | 28 | }; |
maxnagazumi | 0:c0e9bbc27454 | 29 | |
maxnagazumi | 0:c0e9bbc27454 | 30 | SpeedControl motor[]= { |
maxnagazumi | 0:c0e9bbc27454 | 31 | SpeedControl(PA_5,PC_7,50,ec[0]), |
maxnagazumi | 0:c0e9bbc27454 | 32 | SpeedControl(PC_9,PA_1,50,ec[1]), |
maxnagazumi | 0:c0e9bbc27454 | 33 | SpeedControl(PA_10,PB_4,50,ec[2]), |
maxnagazumi | 0:c0e9bbc27454 | 34 | SpeedControl(PA_9,PA_7,50,ec[3]) |
maxnagazumi | 0:c0e9bbc27454 | 35 | }; |
maxnagazumi | 0:c0e9bbc27454 | 36 | |
maxnagazumi | 0:c0e9bbc27454 | 37 | DigitalIn button(USER_BUTTON); |
maxnagazumi | 0:c0e9bbc27454 | 38 | Serial pc(USBTX, USBRX); // tx, rx |
maxnagazumi | 0:c0e9bbc27454 | 39 | R1370P gyro(PC_10,PC_11); // tx, rx |
maxnagazumi | 0:c0e9bbc27454 | 40 | |
maxnagazumi | 2:0be4cfbdf408 | 41 | /*HCSR04 echo[]= { |
maxnagazumi | 0:c0e9bbc27454 | 42 | HCSR04(PC_0,PC_12)//A |
maxnagazumi | 0:c0e9bbc27454 | 43 | ,HCSR04(PA_15,PB_7)//A |
maxnagazumi | 0:c0e9bbc27454 | 44 | ,HCSR04(PH_1,PB_0)// B |
maxnagazumi | 0:c0e9bbc27454 | 45 | ,HCSR04(PC_3,PB_10)//B |
maxnagazumi | 2:0be4cfbdf408 | 46 | };*/ |
maxnagazumi | 0:c0e9bbc27454 | 47 | |
maxnagazumi | 1:a692014d8e41 | 48 | //自己位置取得 |
maxnagazumi | 1:a692014d8e41 | 49 | double theta; |
maxnagazumi | 1:a692014d8e41 | 50 | double angle; |
maxnagazumi | 0:c0e9bbc27454 | 51 | |
maxnagazumi | 0:c0e9bbc27454 | 52 | class Location |
maxnagazumi | 0:c0e9bbc27454 | 53 | { |
maxnagazumi | 0:c0e9bbc27454 | 54 | public: |
maxnagazumi | 0:c0e9bbc27454 | 55 | Location():x_(0),y_(0) |
maxnagazumi | 0:c0e9bbc27454 | 56 | { |
maxnagazumi | 0:c0e9bbc27454 | 57 | for(int i =0; i<2; i++) { |
maxnagazumi | 0:c0e9bbc27454 | 58 | old_count[i]=0; |
maxnagazumi | 0:c0e9bbc27454 | 59 | } |
maxnagazumi | 0:c0e9bbc27454 | 60 | } |
maxnagazumi | 0:c0e9bbc27454 | 61 | void calXY() |
maxnagazumi | 0:c0e9bbc27454 | 62 | { |
maxnagazumi | 0:c0e9bbc27454 | 63 | double ec_count[2]= {}; |
maxnagazumi | 0:c0e9bbc27454 | 64 | double ax,ay,bx,by; |
maxnagazumi | 0:c0e9bbc27454 | 65 | double atheta,btheta; |
maxnagazumi | 0:c0e9bbc27454 | 66 | atheta = (45+theta)/180*3.14; |
maxnagazumi | 0:c0e9bbc27454 | 67 | btheta = (135+theta)/180*3.14; |
maxnagazumi | 0:c0e9bbc27454 | 68 | |
maxnagazumi | 0:c0e9bbc27454 | 69 | ec_count[0]=ecXY[0].getCount(); |
maxnagazumi | 0:c0e9bbc27454 | 70 | ec_count[1]=ecXY[1].getCount(); |
maxnagazumi | 0:c0e9bbc27454 | 71 | ax = (ec_count[0]-old_count[0])*cos(atheta); |
maxnagazumi | 0:c0e9bbc27454 | 72 | ay = (ec_count[0]-old_count[0])*sin(atheta); |
maxnagazumi | 0:c0e9bbc27454 | 73 | bx = (ec_count[1]-old_count[1])*cos(btheta); |
maxnagazumi | 0:c0e9bbc27454 | 74 | by = (ec_count[1]-old_count[1])*sin(btheta); |
maxnagazumi | 0:c0e9bbc27454 | 75 | x_=x_+ax + bx; |
maxnagazumi | 0:c0e9bbc27454 | 76 | y_=y_+ay + by; |
maxnagazumi | 0:c0e9bbc27454 | 77 | old_count[0]=ec_count[0]; |
maxnagazumi | 0:c0e9bbc27454 | 78 | old_count[1]=ec_count[1]; |
maxnagazumi | 0:c0e9bbc27454 | 79 | } |
maxnagazumi | 0:c0e9bbc27454 | 80 | double getX() |
maxnagazumi | 0:c0e9bbc27454 | 81 | { |
maxnagazumi | 0:c0e9bbc27454 | 82 | return x_; |
maxnagazumi | 0:c0e9bbc27454 | 83 | } |
maxnagazumi | 0:c0e9bbc27454 | 84 | double getY() |
maxnagazumi | 0:c0e9bbc27454 | 85 | { |
maxnagazumi | 0:c0e9bbc27454 | 86 | return y_; |
maxnagazumi | 0:c0e9bbc27454 | 87 | } |
maxnagazumi | 0:c0e9bbc27454 | 88 | |
maxnagazumi | 0:c0e9bbc27454 | 89 | private: |
maxnagazumi | 0:c0e9bbc27454 | 90 | double x_; |
maxnagazumi | 0:c0e9bbc27454 | 91 | double y_; |
maxnagazumi | 0:c0e9bbc27454 | 92 | double old_count[2]; |
maxnagazumi | 0:c0e9bbc27454 | 93 | }; |
maxnagazumi | 0:c0e9bbc27454 | 94 | |
maxnagazumi | 0:c0e9bbc27454 | 95 | |
maxnagazumi | 0:c0e9bbc27454 | 96 | |
maxnagazumi | 0:c0e9bbc27454 | 97 | //目的地決定 |
maxnagazumi | 0:c0e9bbc27454 | 98 | int plot[][2]= { |
maxnagazumi | 0:c0e9bbc27454 | 99 | {0,0} |
maxnagazumi | 2:0be4cfbdf408 | 100 | ,{2000,16000} |
maxnagazumi | 2:0be4cfbdf408 | 101 | ,{8000,16000} |
maxnagazumi | 2:0be4cfbdf408 | 102 | ,{4000,0} |
maxnagazumi | 2:0be4cfbdf408 | 103 | ,{0,0} |
maxnagazumi | 2:0be4cfbdf408 | 104 | ,{0,4000} |
maxnagazumi | 2:0be4cfbdf408 | 105 | ,{4000,4000} |
maxnagazumi | 2:0be4cfbdf408 | 106 | ,{4000,0} |
maxnagazumi | 2:0be4cfbdf408 | 107 | ,{0,0} |
maxnagazumi | 0:c0e9bbc27454 | 108 | }; |
maxnagazumi | 0:c0e9bbc27454 | 109 | |
maxnagazumi | 0:c0e9bbc27454 | 110 | double aimTheta[]= {//目標角度を指定 |
maxnagazumi | 0:c0e9bbc27454 | 111 | 0,0,0,0,0,0,0,0,0,0,0,0 |
maxnagazumi | 0:c0e9bbc27454 | 112 | }; |
maxnagazumi | 0:c0e9bbc27454 | 113 | |
maxnagazumi | 0:c0e9bbc27454 | 114 | double zMin[]= { //速度の最少を指定 |
maxnagazumi | 2:0be4cfbdf408 | 115 | 0,0,0,0,0,0,0,0,0,0,0,0 |
maxnagazumi | 0:c0e9bbc27454 | 116 | }; |
maxnagazumi | 0:c0e9bbc27454 | 117 | |
maxnagazumi | 0:c0e9bbc27454 | 118 | //出力を計算 |
maxnagazumi | 0:c0e9bbc27454 | 119 | int x,y; |
maxnagazumi | 0:c0e9bbc27454 | 120 | |
maxnagazumi | 0:c0e9bbc27454 | 121 | class WheelOmega |
maxnagazumi | 0:c0e9bbc27454 | 122 | { |
maxnagazumi | 0:c0e9bbc27454 | 123 | public: |
maxnagazumi | 0:c0e9bbc27454 | 124 | WheelOmega(): max_(0),vx_(0),vy_(0),theta_(0) |
maxnagazumi | 0:c0e9bbc27454 | 125 | { |
maxnagazumi | 0:c0e9bbc27454 | 126 | for(int i=0; i<4; i++) { |
maxnagazumi | 0:c0e9bbc27454 | 127 | omega[i]=0; |
maxnagazumi | 0:c0e9bbc27454 | 128 | } |
maxnagazumi | 0:c0e9bbc27454 | 129 | } |
maxnagazumi | 0:c0e9bbc27454 | 130 | void setOmega(double max,double k) |
maxnagazumi | 0:c0e9bbc27454 | 131 | { |
maxnagazumi | 0:c0e9bbc27454 | 132 | max_=max; |
maxnagazumi | 0:c0e9bbc27454 | 133 | k_=k; |
maxnagazumi | 0:c0e9bbc27454 | 134 | |
maxnagazumi | 0:c0e9bbc27454 | 135 | } |
maxnagazumi | 0:c0e9bbc27454 | 136 | void setVxy(double vx,double vy,double aimtheta_) |
maxnagazumi | 0:c0e9bbc27454 | 137 | { |
maxnagazumi | 0:c0e9bbc27454 | 138 | vx_=vx; |
maxnagazumi | 0:c0e9bbc27454 | 139 | vy_=vy; |
maxnagazumi | 0:c0e9bbc27454 | 140 | theta_=aimtheta_ - theta; |
maxnagazumi | 0:c0e9bbc27454 | 141 | if(theta_>30) {//目標角度まで30度以上空いていたら補正、係数調整のため30は適当 |
maxnagazumi | 0:c0e9bbc27454 | 142 | theta_=30; |
maxnagazumi | 0:c0e9bbc27454 | 143 | } |
maxnagazumi | 0:c0e9bbc27454 | 144 | if(theta_<-30) { |
maxnagazumi | 0:c0e9bbc27454 | 145 | theta_=-30; |
maxnagazumi | 0:c0e9bbc27454 | 146 | } |
maxnagazumi | 0:c0e9bbc27454 | 147 | } |
maxnagazumi | 0:c0e9bbc27454 | 148 | void calOmega() |
maxnagazumi | 0:c0e9bbc27454 | 149 | { |
maxnagazumi | 0:c0e9bbc27454 | 150 | double theta_rad=45/180*3.14; |
maxnagazumi | 0:c0e9bbc27454 | 151 | omega[0]=max_*vx_*cos(theta_rad)-max_*vy_*cos(theta_rad) + theta_*k_; |
maxnagazumi | 0:c0e9bbc27454 | 152 | omega[1]=-max_*vx_*cos(theta_rad)-max_*vy_*cos(theta_rad)+theta_*k_; |
maxnagazumi | 0:c0e9bbc27454 | 153 | omega[2]=-max_*vx_*cos(theta_rad)+max_*vy_*cos(theta_rad)+theta_*k_; |
maxnagazumi | 0:c0e9bbc27454 | 154 | omega[3]=max_*vx_*cos(theta_rad)+max_*vy_*cos(theta_rad)+theta_*k_; |
maxnagazumi | 0:c0e9bbc27454 | 155 | }; |
maxnagazumi | 0:c0e9bbc27454 | 156 | double getOmega(int i) |
maxnagazumi | 0:c0e9bbc27454 | 157 | { |
maxnagazumi | 0:c0e9bbc27454 | 158 | return omega[i]; |
maxnagazumi | 0:c0e9bbc27454 | 159 | } |
maxnagazumi | 0:c0e9bbc27454 | 160 | private: |
maxnagazumi | 0:c0e9bbc27454 | 161 | double max_,vx_,vy_,theta_,k_; |
maxnagazumi | 0:c0e9bbc27454 | 162 | double omega[4]; |
maxnagazumi | 0:c0e9bbc27454 | 163 | }; |
maxnagazumi | 0:c0e9bbc27454 | 164 | |
maxnagazumi | 0:c0e9bbc27454 | 165 | WheelOmega omega; |
maxnagazumi | 0:c0e9bbc27454 | 166 | //パラメタ処理 |
maxnagazumi | 0:c0e9bbc27454 | 167 | double pControl(double distance_,double zMin,double newtime) |
maxnagazumi | 0:c0e9bbc27454 | 168 | { |
maxnagazumi | 0:c0e9bbc27454 | 169 | double z,zMax,olddistance,oldtime; |
maxnagazumi | 0:c0e9bbc27454 | 170 | double diftime_; |
maxnagazumi | 0:c0e9bbc27454 | 171 | diftime_ = newtime - oldtime; |
maxnagazumi | 0:c0e9bbc27454 | 172 | oldtime= newtime; |
maxnagazumi | 0:c0e9bbc27454 | 173 | z=0.004*distance_ - 0.1*(olddistance-distance_)/diftime_; |
maxnagazumi | 0:c0e9bbc27454 | 174 | zMax=2; |
maxnagazumi | 0:c0e9bbc27454 | 175 | if(z>zMax) { |
maxnagazumi | 0:c0e9bbc27454 | 176 | z=zMax; |
maxnagazumi | 0:c0e9bbc27454 | 177 | } |
maxnagazumi | 0:c0e9bbc27454 | 178 | if(z<zMin) { |
maxnagazumi | 0:c0e9bbc27454 | 179 | z=zMin; |
maxnagazumi | 0:c0e9bbc27454 | 180 | } |
maxnagazumi | 0:c0e9bbc27454 | 181 | if(newtime<1) { |
maxnagazumi | 0:c0e9bbc27454 | 182 | z=z*newtime; |
maxnagazumi | 0:c0e9bbc27454 | 183 | } |
maxnagazumi | 0:c0e9bbc27454 | 184 | olddistance = distance_; |
maxnagazumi | 0:c0e9bbc27454 | 185 | return z; |
maxnagazumi | 0:c0e9bbc27454 | 186 | } |
maxnagazumi | 0:c0e9bbc27454 | 187 | |
maxnagazumi | 0:c0e9bbc27454 | 188 | //超音波 |
maxnagazumi | 2:0be4cfbdf408 | 189 | /*class Sonic |
maxnagazumi | 0:c0e9bbc27454 | 190 | { |
maxnagazumi | 1:a692014d8e41 | 191 | public: |
maxnagazumi | 0:c0e9bbc27454 | 192 | Sonic() |
maxnagazumi | 0:c0e9bbc27454 | 193 | { |
maxnagazumi | 0:c0e9bbc27454 | 194 | for(int i=0; i<4; i++) { |
maxnagazumi | 0:c0e9bbc27454 | 195 | sonic_cm[i]=0; |
maxnagazumi | 0:c0e9bbc27454 | 196 | } |
maxnagazumi | 0:c0e9bbc27454 | 197 | } |
maxnagazumi | 0:c0e9bbc27454 | 198 | |
maxnagazumi | 0:c0e9bbc27454 | 199 | void cal_sonic() |
maxnagazumi | 0:c0e9bbc27454 | 200 | { |
maxnagazumi | 0:c0e9bbc27454 | 201 | for(int i=0; i<4; i++) { |
maxnagazumi | 0:c0e9bbc27454 | 202 | echo[i].start(); |
maxnagazumi | 0:c0e9bbc27454 | 203 | } |
maxnagazumi | 0:c0e9bbc27454 | 204 | for(int i=0; i<4; i++) { |
maxnagazumi | 0:c0e9bbc27454 | 205 | sonic_cm[i] =echo[i].get_dist_cm(); |
maxnagazumi | 0:c0e9bbc27454 | 206 | } |
maxnagazumi | 0:c0e9bbc27454 | 207 | } |
maxnagazumi | 0:c0e9bbc27454 | 208 | double get_sonic(int i) |
maxnagazumi | 0:c0e9bbc27454 | 209 | { |
maxnagazumi | 0:c0e9bbc27454 | 210 | return sonic_cm[i]; |
maxnagazumi | 0:c0e9bbc27454 | 211 | } |
maxnagazumi | 0:c0e9bbc27454 | 212 | |
maxnagazumi | 0:c0e9bbc27454 | 213 | private: |
maxnagazumi | 0:c0e9bbc27454 | 214 | double sonic_cm[4]; |
maxnagazumi | 0:c0e9bbc27454 | 215 | }; |
maxnagazumi | 0:c0e9bbc27454 | 216 | |
maxnagazumi | 2:0be4cfbdf408 | 217 | */ |
maxnagazumi | 1:a692014d8e41 | 218 | class CAN_ticker |
maxnagazumi | 1:a692014d8e41 | 219 | { |
maxnagazumi | 1:a692014d8e41 | 220 | public: |
maxnagazumi | 2:0be4cfbdf408 | 221 | CAN_ticker():x(0) |
maxnagazumi | 2:0be4cfbdf408 | 222 | { |
maxnagazumi | 2:0be4cfbdf408 | 223 | data[0]=0; |
maxnagazumi | 2:0be4cfbdf408 | 224 | } |
maxnagazumi | 2:0be4cfbdf408 | 225 | void canmsg_read() |
maxnagazumi | 1:a692014d8e41 | 226 | { |
maxnagazumi | 1:a692014d8e41 | 227 | CANMessage msg; |
maxnagazumi | 1:a692014d8e41 | 228 | if(can1.read(msg)) { |
maxnagazumi | 1:a692014d8e41 | 229 | if(msg.id == 1) { |
maxnagazumi | 2:0be4cfbdf408 | 230 | x=(short)(msg.data[0]); |
maxnagazumi | 1:a692014d8e41 | 231 | } |
maxnagazumi | 1:a692014d8e41 | 232 | } |
maxnagazumi | 1:a692014d8e41 | 233 | } |
maxnagazumi | 1:a692014d8e41 | 234 | int get_xCAN() |
maxnagazumi | 1:a692014d8e41 | 235 | { |
maxnagazumi | 1:a692014d8e41 | 236 | return x; |
maxnagazumi | 1:a692014d8e41 | 237 | } |
maxnagazumi | 1:a692014d8e41 | 238 | private: |
maxnagazumi | 2:0be4cfbdf408 | 239 | char data[0]; |
maxnagazumi | 1:a692014d8e41 | 240 | int x; |
maxnagazumi | 1:a692014d8e41 | 241 | }; |
maxnagazumi | 1:a692014d8e41 | 242 | //手動出力 |
maxnagazumi | 2:0be4cfbdf408 | 243 | double canOmega[4]= { |
maxnagazumi | 2:0be4cfbdf408 | 244 | 0,0,0,0 |
maxnagazumi | 2:0be4cfbdf408 | 245 | }; |
maxnagazumi | 1:a692014d8e41 | 246 | void calOmega_CAN(int canx) |
maxnagazumi | 1:a692014d8e41 | 247 | { |
maxnagazumi | 2:0be4cfbdf408 | 248 | static double a=0.1; |
maxnagazumi | 2:0be4cfbdf408 | 249 | static int count=0; |
maxnagazumi | 1:a692014d8e41 | 250 | switch(canx) { |
maxnagazumi | 1:a692014d8e41 | 251 | case 1: |
maxnagazumi | 1:a692014d8e41 | 252 | canOmega[0]=0; |
maxnagazumi | 2:0be4cfbdf408 | 253 | canOmega[1]=a; |
maxnagazumi | 1:a692014d8e41 | 254 | canOmega[2]=0; |
maxnagazumi | 2:0be4cfbdf408 | 255 | canOmega[3]=-a; |
maxnagazumi | 2:0be4cfbdf408 | 256 | printf(" 1"); |
maxnagazumi | 1:a692014d8e41 | 257 | break; |
maxnagazumi | 1:a692014d8e41 | 258 | case 2: |
maxnagazumi | 2:0be4cfbdf408 | 259 | canOmega[0]=a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 260 | canOmega[1]=a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 261 | canOmega[2]=-a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 262 | canOmega[3]=-a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 263 | printf(" 2"); |
maxnagazumi | 1:a692014d8e41 | 264 | break; |
maxnagazumi | 1:a692014d8e41 | 265 | case 3: |
maxnagazumi | 2:0be4cfbdf408 | 266 | canOmega[0]=a; |
maxnagazumi | 1:a692014d8e41 | 267 | canOmega[1]=0; |
maxnagazumi | 2:0be4cfbdf408 | 268 | canOmega[2]=-a; |
maxnagazumi | 1:a692014d8e41 | 269 | canOmega[3]=0; |
maxnagazumi | 2:0be4cfbdf408 | 270 | printf(" 3"); |
maxnagazumi | 1:a692014d8e41 | 271 | break; |
maxnagazumi | 1:a692014d8e41 | 272 | case 4: |
maxnagazumi | 2:0be4cfbdf408 | 273 | canOmega[0]=-a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 274 | canOmega[1]=a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 275 | canOmega[2]=a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 276 | canOmega[3]=-a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 277 | printf(" 4"); |
maxnagazumi | 1:a692014d8e41 | 278 | break; |
maxnagazumi | 1:a692014d8e41 | 279 | case 5: |
maxnagazumi | 1:a692014d8e41 | 280 | for(int i=0; i<4; i++) { |
maxnagazumi | 1:a692014d8e41 | 281 | canOmega[i]=0; |
maxnagazumi | 1:a692014d8e41 | 282 | } |
maxnagazumi | 2:0be4cfbdf408 | 283 | printf(" 5"); |
maxnagazumi | 1:a692014d8e41 | 284 | break; |
maxnagazumi | 1:a692014d8e41 | 285 | case 6: |
maxnagazumi | 2:0be4cfbdf408 | 286 | canOmega[0]=a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 287 | canOmega[1]=-a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 288 | canOmega[2]=-a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 289 | canOmega[3]=a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 290 | printf(" 6"); |
maxnagazumi | 1:a692014d8e41 | 291 | break; |
maxnagazumi | 1:a692014d8e41 | 292 | case 7: |
maxnagazumi | 2:0be4cfbdf408 | 293 | canOmega[0]=0; |
maxnagazumi | 2:0be4cfbdf408 | 294 | canOmega[1]=-a; |
maxnagazumi | 2:0be4cfbdf408 | 295 | canOmega[2]=0; |
maxnagazumi | 2:0be4cfbdf408 | 296 | canOmega[3]=a; |
maxnagazumi | 2:0be4cfbdf408 | 297 | printf(" 7"); |
maxnagazumi | 1:a692014d8e41 | 298 | break; |
maxnagazumi | 1:a692014d8e41 | 299 | case 8: |
maxnagazumi | 2:0be4cfbdf408 | 300 | canOmega[0]=-a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 301 | canOmega[1]=-a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 302 | canOmega[2]=a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 303 | canOmega[3]=a*1.4; |
maxnagazumi | 2:0be4cfbdf408 | 304 | printf(" 8"); |
maxnagazumi | 1:a692014d8e41 | 305 | break; |
maxnagazumi | 1:a692014d8e41 | 306 | case 9: |
maxnagazumi | 2:0be4cfbdf408 | 307 | canOmega[0]=-a; |
maxnagazumi | 2:0be4cfbdf408 | 308 | canOmega[1]=0; |
maxnagazumi | 2:0be4cfbdf408 | 309 | canOmega[2]=a; |
maxnagazumi | 2:0be4cfbdf408 | 310 | canOmega[3]=0; |
maxnagazumi | 2:0be4cfbdf408 | 311 | printf(" 9"); |
maxnagazumi | 1:a692014d8e41 | 312 | break; |
maxnagazumi | 1:a692014d8e41 | 313 | case 10: |
maxnagazumi | 1:a692014d8e41 | 314 | for(int i=0; i<4; i++) { |
maxnagazumi | 2:0be4cfbdf408 | 315 | canOmega[i]=a; |
maxnagazumi | 1:a692014d8e41 | 316 | } |
maxnagazumi | 2:0be4cfbdf408 | 317 | printf(" 10"); |
maxnagazumi | 1:a692014d8e41 | 318 | break; |
maxnagazumi | 1:a692014d8e41 | 319 | case 11: |
maxnagazumi | 1:a692014d8e41 | 320 | for(int i=0; i<4; i++) { |
maxnagazumi | 2:0be4cfbdf408 | 321 | canOmega[i]=-a; |
maxnagazumi | 1:a692014d8e41 | 322 | } |
maxnagazumi | 2:0be4cfbdf408 | 323 | printf(" 11"); |
maxnagazumi | 1:a692014d8e41 | 324 | break; |
maxnagazumi | 1:a692014d8e41 | 325 | case 12: |
maxnagazumi | 2:0be4cfbdf408 | 326 | wait(0.2); |
maxnagazumi | 2:0be4cfbdf408 | 327 | if(count==1) { |
maxnagazumi | 2:0be4cfbdf408 | 328 | a=0.1; |
maxnagazumi | 2:0be4cfbdf408 | 329 | count=0; |
maxnagazumi | 1:a692014d8e41 | 330 | } else { |
maxnagazumi | 2:0be4cfbdf408 | 331 | a=0.05; |
maxnagazumi | 2:0be4cfbdf408 | 332 | count=1; |
maxnagazumi | 1:a692014d8e41 | 333 | } |
maxnagazumi | 2:0be4cfbdf408 | 334 | printf(" 12 Speed change"); |
maxnagazumi | 1:a692014d8e41 | 335 | break; |
maxnagazumi | 1:a692014d8e41 | 336 | |
maxnagazumi | 1:a692014d8e41 | 337 | } |
maxnagazumi | 2:0be4cfbdf408 | 338 | printf(" %f\r\n",a); |
maxnagazumi | 2:0be4cfbdf408 | 339 | int i=0; |
maxnagazumi | 2:0be4cfbdf408 | 340 | while(i<4) { |
maxnagazumi | 2:0be4cfbdf408 | 341 | motor[i].turn(canOmega[i]); |
maxnagazumi | 2:0be4cfbdf408 | 342 | i++; |
maxnagazumi | 1:a692014d8e41 | 343 | } |
maxnagazumi | 1:a692014d8e41 | 344 | } |
maxnagazumi | 1:a692014d8e41 | 345 | |
maxnagazumi | 1:a692014d8e41 | 346 | //ticker に入れる関数 |
maxnagazumi | 1:a692014d8e41 | 347 | Ticker ticker; |
maxnagazumi | 1:a692014d8e41 | 348 | Ticker canTicker; |
maxnagazumi | 1:a692014d8e41 | 349 | Ticker locTicker; |
maxnagazumi | 0:c0e9bbc27454 | 350 | |
maxnagazumi | 0:c0e9bbc27454 | 351 | //出力 |
maxnagazumi | 0:c0e9bbc27454 | 352 | void motorOut() |
maxnagazumi | 0:c0e9bbc27454 | 353 | { |
maxnagazumi | 0:c0e9bbc27454 | 354 | for(int i=0; i<4; i++) { |
maxnagazumi | 0:c0e9bbc27454 | 355 | motor[i].Sc(omega.getOmega(i)); |
maxnagazumi | 0:c0e9bbc27454 | 356 | } |
maxnagazumi | 0:c0e9bbc27454 | 357 | } |
maxnagazumi | 1:a692014d8e41 | 358 | CAN_ticker canx; |
maxnagazumi | 1:a692014d8e41 | 359 | void ticker_CanRead() |
maxnagazumi | 1:a692014d8e41 | 360 | { |
maxnagazumi | 2:0be4cfbdf408 | 361 | canx.canmsg_read(); |
maxnagazumi | 2:0be4cfbdf408 | 362 | /*for(int i=0; i<4; i++) { |
maxnagazumi | 2:0be4cfbdf408 | 363 | motor[i].Sc(canOmega[i]); |
maxnagazumi | 2:0be4cfbdf408 | 364 | }*/ |
maxnagazumi | 1:a692014d8e41 | 365 | } |
maxnagazumi | 1:a692014d8e41 | 366 | |
maxnagazumi | 1:a692014d8e41 | 367 | Location location; |
maxnagazumi | 1:a692014d8e41 | 368 | void calLoc() |
maxnagazumi | 1:a692014d8e41 | 369 | { |
maxnagazumi | 1:a692014d8e41 | 370 | theta=gyro.getAngle()-angle; //角度受け取り |
maxnagazumi | 1:a692014d8e41 | 371 | location.calXY(); |
maxnagazumi | 1:a692014d8e41 | 372 | } |
maxnagazumi | 0:c0e9bbc27454 | 373 | int main() |
maxnagazumi | 0:c0e9bbc27454 | 374 | { |
maxnagazumi | 0:c0e9bbc27454 | 375 | can1.frequency(1000000); |
maxnagazumi | 0:c0e9bbc27454 | 376 | gyro.initialize(); //main関数の最初に一度だけ実行 |
maxnagazumi | 0:c0e9bbc27454 | 377 | gyro.acc_offset(); |
maxnagazumi | 2:0be4cfbdf408 | 378 | angle=gyro.getAngle();//角度初期化 |
maxnagazumi | 0:c0e9bbc27454 | 379 | double z; |
maxnagazumi | 0:c0e9bbc27454 | 380 | printf("start\r\n"); |
maxnagazumi | 0:c0e9bbc27454 | 381 | motor[0].setEquation(0.008031,-0.022300,-0.008839,-0.016290); |
maxnagazumi | 0:c0e9bbc27454 | 382 | motor[1].setEquation(0.008878,-0.016622,-0.009702,-0.015806); |
maxnagazumi | 0:c0e9bbc27454 | 383 | motor[2].setEquation(0.008637,-0.016537,-0.009397,-0.012159); |
maxnagazumi | 0:c0e9bbc27454 | 384 | motor[3].setEquation(0.008096,-0.014822,-0.008801,-0.016645); |
maxnagazumi | 0:c0e9bbc27454 | 385 | |
maxnagazumi | 0:c0e9bbc27454 | 386 | motor[0].setDutyLimit(0.4); |
maxnagazumi | 0:c0e9bbc27454 | 387 | motor[1].setDutyLimit(0.4); |
maxnagazumi | 0:c0e9bbc27454 | 388 | motor[2].setDutyLimit(0.4); |
maxnagazumi | 0:c0e9bbc27454 | 389 | motor[3].setDutyLimit(0.4); |
maxnagazumi | 0:c0e9bbc27454 | 390 | |
maxnagazumi | 2:0be4cfbdf408 | 391 | motor[0].setPDparam( 0.01790, 0.00560); |
maxnagazumi | 2:0be4cfbdf408 | 392 | motor[1].setPDparam( 0.01705, 0.00620); |
maxnagazumi | 2:0be4cfbdf408 | 393 | motor[2].setPDparam( 0.01790, 0.00620); |
maxnagazumi | 2:0be4cfbdf408 | 394 | motor[3].setPDparam( 0.01680, 0.00560); |
maxnagazumi | 0:c0e9bbc27454 | 395 | |
maxnagazumi | 1:a692014d8e41 | 396 | int first=0; |
maxnagazumi | 1:a692014d8e41 | 397 | while(first==0) { |
maxnagazumi | 0:c0e9bbc27454 | 398 | printf("waiting\r\n"); |
maxnagazumi | 0:c0e9bbc27454 | 399 | if(button==0) { |
maxnagazumi | 0:c0e9bbc27454 | 400 | wait(1); |
maxnagazumi | 1:a692014d8e41 | 401 | ticker.attach(&motorOut,0.05); |
maxnagazumi | 1:a692014d8e41 | 402 | first++; |
maxnagazumi | 0:c0e9bbc27454 | 403 | break; |
maxnagazumi | 0:c0e9bbc27454 | 404 | } |
maxnagazumi | 0:c0e9bbc27454 | 405 | } |
maxnagazumi | 0:c0e9bbc27454 | 406 | |
maxnagazumi | 1:a692014d8e41 | 407 | int canX=20;//can変数 |
maxnagazumi | 0:c0e9bbc27454 | 408 | int n=1,dx,dy,aimX,aimY; |
maxnagazumi | 0:c0e9bbc27454 | 409 | double vx_,vy_,vx,vy,newtime,distance; |
maxnagazumi | 0:c0e9bbc27454 | 410 | Timer time; |
maxnagazumi | 0:c0e9bbc27454 | 411 | time.start(); |
maxnagazumi | 1:a692014d8e41 | 412 | locTicker.attach(&calLoc,0.05); |
maxnagazumi | 1:a692014d8e41 | 413 | canTicker.attach(&ticker_CanRead,0.1);//can読み込み |
maxnagazumi | 0:c0e9bbc27454 | 414 | while(1) { |
maxnagazumi | 2:0be4cfbdf408 | 415 | canX=canx.get_xCAN();//0で手\動化 |
maxnagazumi | 2:0be4cfbdf408 | 416 | if(canX==13) {//手動化 |
maxnagazumi | 2:0be4cfbdf408 | 417 | wait(0.2); |
maxnagazumi | 2:0be4cfbdf408 | 418 | printf("change1\r\n"); |
maxnagazumi | 1:a692014d8e41 | 419 | ticker.detach(); |
maxnagazumi | 1:a692014d8e41 | 420 | while(1) { |
maxnagazumi | 1:a692014d8e41 | 421 | canX=canx.get_xCAN(); |
maxnagazumi | 1:a692014d8e41 | 422 | calOmega_CAN(canX); |
maxnagazumi | 1:a692014d8e41 | 423 | //自己位置取得 |
maxnagazumi | 1:a692014d8e41 | 424 | x=location.getX(); |
maxnagazumi | 1:a692014d8e41 | 425 | y=location.getY(); |
maxnagazumi | 2:0be4cfbdf408 | 426 | printf("X=%06d ,Y=%06d",x,y); |
maxnagazumi | 1:a692014d8e41 | 427 | //目的地決定(syuusoku check) |
maxnagazumi | 1:a692014d8e41 | 428 | aimX = plot[n][0]; |
maxnagazumi | 1:a692014d8e41 | 429 | aimY = plot[n][1]; |
maxnagazumi | 1:a692014d8e41 | 430 | dx=aimX-x; |
maxnagazumi | 1:a692014d8e41 | 431 | dy=aimY-y; |
maxnagazumi | 1:a692014d8e41 | 432 | distance = sqrt((float)dx*dx+dy*dy); |
maxnagazumi | 2:0be4cfbdf408 | 433 | if(distance<1000) { |
maxnagazumi | 1:a692014d8e41 | 434 | n++; |
maxnagazumi | 1:a692014d8e41 | 435 | printf("reach%d\r\n",n); |
maxnagazumi | 1:a692014d8e41 | 436 | time.reset(); |
maxnagazumi | 1:a692014d8e41 | 437 | } |
maxnagazumi | 2:0be4cfbdf408 | 438 | if(canX==13) {//自動化 |
maxnagazumi | 1:a692014d8e41 | 439 | canX=20; |
maxnagazumi | 2:0be4cfbdf408 | 440 | for(int i=0; i<4; i++) { |
maxnagazumi | 2:0be4cfbdf408 | 441 | canOmega[i]=0; |
maxnagazumi | 2:0be4cfbdf408 | 442 | } |
maxnagazumi | 1:a692014d8e41 | 443 | ticker.attach(&motorOut,0.05); |
maxnagazumi | 2:0be4cfbdf408 | 444 | printf("change2\r\n"); |
maxnagazumi | 2:0be4cfbdf408 | 445 | wait(0.1); |
maxnagazumi | 1:a692014d8e41 | 446 | break; |
maxnagazumi | 1:a692014d8e41 | 447 | } |
maxnagazumi | 1:a692014d8e41 | 448 | } |
maxnagazumi | 1:a692014d8e41 | 449 | } |
maxnagazumi | 0:c0e9bbc27454 | 450 | //自己位置取得 |
maxnagazumi | 0:c0e9bbc27454 | 451 | x=location.getX(); |
maxnagazumi | 0:c0e9bbc27454 | 452 | y=location.getY(); |
maxnagazumi | 2:0be4cfbdf408 | 453 | int i=0; |
maxnagazumi | 2:0be4cfbdf408 | 454 | if(i==10) { |
maxnagazumi | 2:0be4cfbdf408 | 455 | printf("X=%d,Y=%d,theta=%5.3f ,angle=%5.3f z=%5.3f n=%d\r\n",x,y,theta,angle,z,n); |
maxnagazumi | 2:0be4cfbdf408 | 456 | for(int j=0; j<4; j++) { |
maxnagazumi | 2:0be4cfbdf408 | 457 | printf("%d : %d,",j,ec[j].getCount()); |
maxnagazumi | 2:0be4cfbdf408 | 458 | } |
maxnagazumi | 2:0be4cfbdf408 | 459 | printf("\r\n"); |
maxnagazumi | 2:0be4cfbdf408 | 460 | i=10; |
maxnagazumi | 2:0be4cfbdf408 | 461 | } else { |
maxnagazumi | 2:0be4cfbdf408 | 462 | i++; |
maxnagazumi | 2:0be4cfbdf408 | 463 | } |
maxnagazumi | 0:c0e9bbc27454 | 464 | //目的地決定(syuusoku check) |
maxnagazumi | 0:c0e9bbc27454 | 465 | aimX = plot[n][0]; |
maxnagazumi | 0:c0e9bbc27454 | 466 | aimY = plot[n][1]; |
maxnagazumi | 0:c0e9bbc27454 | 467 | //出力を計算(kitai xy); |
maxnagazumi | 0:c0e9bbc27454 | 468 | dx=aimX-x; |
maxnagazumi | 0:c0e9bbc27454 | 469 | dy=aimY-y; |
maxnagazumi | 0:c0e9bbc27454 | 470 | vx_=dx/sqrt((double)dx*dx+dy*dy); |
maxnagazumi | 0:c0e9bbc27454 | 471 | vy_=dy/sqrt((double)dx*dx+dy*dy); |
maxnagazumi | 0:c0e9bbc27454 | 472 | vx=vx_*cos(theta/180*3.14)+vy_*sin(theta/180*3.14); |
maxnagazumi | 0:c0e9bbc27454 | 473 | vy=-vx_*sin(theta/180*3.14)+vy_*cos(theta/180*3.14); |
maxnagazumi | 0:c0e9bbc27454 | 474 | //四輪の出力計算 |
maxnagazumi | 0:c0e9bbc27454 | 475 | newtime=time.read(); |
maxnagazumi | 0:c0e9bbc27454 | 476 | distance = sqrt((float)dx*dx+dy*dy); |
maxnagazumi | 0:c0e9bbc27454 | 477 | z=pControl(distance,zMin[n],newtime); |
maxnagazumi | 0:c0e9bbc27454 | 478 | omega.setOmega(z,0.05); |
maxnagazumi | 0:c0e9bbc27454 | 479 | omega.setVxy(vx,vy,aimTheta[n]); |
maxnagazumi | 0:c0e9bbc27454 | 480 | omega.calOmega(); |
maxnagazumi | 0:c0e9bbc27454 | 481 | //ゴール判定 |
maxnagazumi | 0:c0e9bbc27454 | 482 | if(distance<800) { |
maxnagazumi | 0:c0e9bbc27454 | 483 | n++; |
maxnagazumi | 0:c0e9bbc27454 | 484 | printf("reach%d\r\n",n); |
maxnagazumi | 0:c0e9bbc27454 | 485 | time.reset(); |
maxnagazumi | 0:c0e9bbc27454 | 486 | } |
maxnagazumi | 0:c0e9bbc27454 | 487 | |
maxnagazumi | 2:0be4cfbdf408 | 488 | if(n>=8) { |
maxnagazumi | 0:c0e9bbc27454 | 489 | for(int j=0; j<4; j++) { |
maxnagazumi | 1:a692014d8e41 | 490 | motor[j].stop(); |
maxnagazumi | 0:c0e9bbc27454 | 491 | } |
maxnagazumi | 0:c0e9bbc27454 | 492 | printf("fin\r\n"); |
maxnagazumi | 0:c0e9bbc27454 | 493 | ticker.detach(); |
maxnagazumi | 0:c0e9bbc27454 | 494 | } |
maxnagazumi | 0:c0e9bbc27454 | 495 | } |
maxnagazumi | 0:c0e9bbc27454 | 496 | } |