2022_Ateam_MOTORprogramをscrp_slaveでメインマイコンからコントローラー状況を読み取れるように改良。 また、モータに0以外のpwmが送られている場合に基盤付属のledが点灯するようにした。
Dependencies: SBDBT arrc_mbed BNO055
main.cpp@8:3d6b1f78f89c, 2022-01-29 (annotated)
- Committer:
- guesta
- Date:
- Sat Jan 29 14:47:48 2022 +0000
- Revision:
- 8:3d6b1f78f89c
- Parent:
- 7:a0375e6dc8ca
- Child:
- 9:569c0f55dd9b
add id cmd
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
kazumayamanaka | 0:a1238c4cd105 | 1 | #include "mbed.h" |
kazumayamanaka | 0:a1238c4cd105 | 2 | #include "rotary_inc.hpp" |
kazumayamanaka | 0:a1238c4cd105 | 3 | #include "PIDco.hpp" |
kazumayamanaka | 0:a1238c4cd105 | 4 | #include "TARGETco.hpp" |
kazumayamanaka | 0:a1238c4cd105 | 5 | #include "DUALSHOCKco.hpp" |
kazumayamanaka | 0:a1238c4cd105 | 6 | #include "sbdbt.hpp" |
kazumayamanaka | 0:a1238c4cd105 | 7 | #include "BNO055.h" |
guesta | 2:612efbe94f42 | 8 | #include "scrp_slave.hpp" |
guesta | 2:612efbe94f42 | 9 | #include "function.hpp" |
guesta | 4:867c2b5cf81a | 10 | #include "odometry.hpp" |
kazumayamanaka | 0:a1238c4cd105 | 11 | |
kazumayamanaka | 0:a1238c4cd105 | 12 | #define SDA D3 |
kazumayamanaka | 0:a1238c4cd105 | 13 | #define SCL D6 |
kazumayamanaka | 0:a1238c4cd105 | 14 | #define PI 3.1415926535897 |
kazumayamanaka | 0:a1238c4cd105 | 15 | |
guesta | 8:3d6b1f78f89c | 16 | ScrpSlave scrp(PC_12,PD_2,PH_1,1); |
kazumayamanaka | 0:a1238c4cd105 | 17 | |
kazumayamanaka | 0:a1238c4cd105 | 18 | RotaryInc data_1(PA_14,PA_15,0); |
kazumayamanaka | 0:a1238c4cd105 | 19 | RotaryInc data_2(PA_12,PC_5,0); |
kazumayamanaka | 0:a1238c4cd105 | 20 | RotaryInc data_3(PC_0,PC_1,0); |
kazumayamanaka | 0:a1238c4cd105 | 21 | RotaryInc data_4(PC_2,PC_3,0); |
kazumayamanaka | 0:a1238c4cd105 | 22 | |
kazumayamanaka | 0:a1238c4cd105 | 23 | PIDco pid_1; |
kazumayamanaka | 0:a1238c4cd105 | 24 | PIDco pid_2; |
kazumayamanaka | 0:a1238c4cd105 | 25 | PIDco pid_3; |
kazumayamanaka | 0:a1238c4cd105 | 26 | PIDco pid_4; |
kazumayamanaka | 0:a1238c4cd105 | 27 | |
guesta | 8:3d6b1f78f89c | 28 | PIDco pid_angle; |
guesta | 8:3d6b1f78f89c | 29 | |
kazumayamanaka | 0:a1238c4cd105 | 30 | TARGETco TG; |
kazumayamanaka | 0:a1238c4cd105 | 31 | BNO055 bno(SDA,SCL); |
kazumayamanaka | 0:a1238c4cd105 | 32 | DUALSHOCKco DS; |
kazumayamanaka | 0:a1238c4cd105 | 33 | |
guesta | 2:612efbe94f42 | 34 | //sbdbt sb(PA_0,PA_1); |
guesta | 2:612efbe94f42 | 35 | |
guesta | 2:612efbe94f42 | 36 | DigitalOut led1(PA_10); |
guesta | 2:612efbe94f42 | 37 | DigitalOut led2(PB_15); |
guesta | 2:612efbe94f42 | 38 | DigitalOut led3(PB_2); |
guesta | 2:612efbe94f42 | 39 | DigitalOut led4(PC_6); |
kazumayamanaka | 0:a1238c4cd105 | 40 | |
kazumayamanaka | 0:a1238c4cd105 | 41 | Timer Time; |
kazumayamanaka | 0:a1238c4cd105 | 42 | double timer; |
kazumayamanaka | 0:a1238c4cd105 | 43 | double theta; |
kazumayamanaka | 0:a1238c4cd105 | 44 | double X,Y; |
guesta | 7:a0375e6dc8ca | 45 | double auto_x_component; |
guesta | 7:a0375e6dc8ca | 46 | double auto_y_component; |
guesta | 8:3d6b1f78f89c | 47 | bool position_arrival = false; |
guesta | 8:3d6b1f78f89c | 48 | bool angle_arrival = true; |
kazumayamanaka | 0:a1238c4cd105 | 49 | |
guesta | 4:867c2b5cf81a | 50 | //for odometry |
guesta | 4:867c2b5cf81a | 51 | double theta2; |
guesta | 4:867c2b5cf81a | 52 | double pltheta; |
guesta | 4:867c2b5cf81a | 53 | |
guesta | 8:3d6b1f78f89c | 54 | double x_pos_target[] = {18.0}; |
guesta | 8:3d6b1f78f89c | 55 | double y_pos_target[] = {10}; |
guesta | 8:3d6b1f78f89c | 56 | double angle_target[] = {10}; |
guesta | 7:a0375e6dc8ca | 57 | |
guesta | 7:a0375e6dc8ca | 58 | double max_mini(double a){ |
guesta | 7:a0375e6dc8ca | 59 | if(a > 450){ |
guesta | 7:a0375e6dc8ca | 60 | a = 450; |
guesta | 7:a0375e6dc8ca | 61 | }else if(a < -450){ |
guesta | 7:a0375e6dc8ca | 62 | a = -450; |
guesta | 7:a0375e6dc8ca | 63 | }else if(a == 0){ |
guesta | 7:a0375e6dc8ca | 64 | a = 0; |
guesta | 7:a0375e6dc8ca | 65 | } |
guesta | 7:a0375e6dc8ca | 66 | return a; |
guesta | 7:a0375e6dc8ca | 67 | } |
guesta | 4:867c2b5cf81a | 68 | |
kazumayamanaka | 0:a1238c4cd105 | 69 | int main(){ |
guesta | 7:a0375e6dc8ca | 70 | bno.reset(); |
kazumayamanaka | 0:a1238c4cd105 | 71 | Time.start(); |
guesta | 2:612efbe94f42 | 72 | TG.pass_val(0,0,0); |
guesta | 2:612efbe94f42 | 73 | scrp.addCMD(1,getLstick_x); |
guesta | 2:612efbe94f42 | 74 | scrp.addCMD(2,getLstick_y); |
guesta | 2:612efbe94f42 | 75 | scrp.addCMD(3,getL2); |
guesta | 2:612efbe94f42 | 76 | scrp.addCMD(4,getR2); |
guesta | 2:612efbe94f42 | 77 | scrp.addCMD(5,change_mode); |
guesta | 2:612efbe94f42 | 78 | |
kazumayamanaka | 0:a1238c4cd105 | 79 | |
kazumayamanaka | 0:a1238c4cd105 | 80 | while(1){ |
kazumayamanaka | 0:a1238c4cd105 | 81 | timer = Time.read_us(); |
kazumayamanaka | 0:a1238c4cd105 | 82 | bno.setmode(OPERATION_MODE_IMUPLUS); |
kazumayamanaka | 0:a1238c4cd105 | 83 | bno.get_angles(); |
kazumayamanaka | 1:ea880e226e5a | 84 | |
kazumayamanaka | 1:ea880e226e5a | 85 | theta = bno.euler.yaw * (PI / 180); |
guesta | 6:e089fda81b74 | 86 | theta2 = (90 - bno.euler.yaw) * (PI /180); |
kazumayamanaka | 1:ea880e226e5a | 87 | |
kazumayamanaka | 0:a1238c4cd105 | 88 | if(theta > PI){ |
kazumayamanaka | 1:ea880e226e5a | 89 | theta = -(2 * PI - theta); |
guesta | 7:a0375e6dc8ca | 90 | |
guesta | 6:e089fda81b74 | 91 | }else{ |
kazumayamanaka | 0:a1238c4cd105 | 92 | } |
guesta | 6:e089fda81b74 | 93 | theta = theta - (PI / 4); |
kazumayamanaka | 0:a1238c4cd105 | 94 | |
guesta | 4:867c2b5cf81a | 95 | if(theta2 > PI){ |
guesta | 5:1a850f68a06c | 96 | pltheta = theta2 - 2 * PI; |
guesta | 4:867c2b5cf81a | 97 | }else{ |
guesta | 4:867c2b5cf81a | 98 | pltheta = theta2; |
guesta | 4:867c2b5cf81a | 99 | } |
guesta | 4:867c2b5cf81a | 100 | |
guesta | 4:867c2b5cf81a | 101 | get_position(pltheta); |
guesta | 2:612efbe94f42 | 102 | DS.pass_val(x_component,y_component,r2_num,l2_num); |
kazumayamanaka | 0:a1238c4cd105 | 103 | |
guesta | 5:1a850f68a06c | 104 | if(auto_mode == false){ |
guesta | 5:1a850f68a06c | 105 | if(DS.cal_input() == true){ |
guesta | 5:1a850f68a06c | 106 | TG.pass_val(DS.obt_X(),DS.obt_Y(),theta); |
guesta | 5:1a850f68a06c | 107 | }else{ |
guesta | 5:1a850f68a06c | 108 | TG.pass_target(DS.obt_X()); |
guesta | 5:1a850f68a06c | 109 | } |
guesta | 5:1a850f68a06c | 110 | }else{ |
guesta | 8:3d6b1f78f89c | 111 | //printf("%lf\n",bno.euler.yaw); |
guesta | 8:3d6b1f78f89c | 112 | //if(position_arrival == false){ |
guesta | 8:3d6b1f78f89c | 113 | auto_x_component = max_mini((x_pos_target[0] - x_position) * 150); |
guesta | 8:3d6b1f78f89c | 114 | auto_y_component = max_mini((y_pos_target[0] - y_position) * 150); |
guesta | 8:3d6b1f78f89c | 115 | TG.pass_val(auto_y_component,auto_x_component,theta); |
guesta | 8:3d6b1f78f89c | 116 | /*if((x_pos_target[0] - x_position) <= 0.001 || (x_pos_target[0] - x_position) >= -0.001 && (y_pos_target[0] - y_position) <= 0.001 || (y_pos_target[0] - y_position) >= -0.001){ |
guesta | 8:3d6b1f78f89c | 117 | position_arrival = true; |
guesta | 8:3d6b1f78f89c | 118 | TG.pass_val(0,0,theta); |
guesta | 8:3d6b1f78f89c | 119 | printf("arrival_position\n"); |
guesta | 8:3d6b1f78f89c | 120 | } |
guesta | 8:3d6b1f78f89c | 121 | }else{ |
guesta | 8:3d6b1f78f89c | 122 | if(angle_arrival == false){ |
guesta | 8:3d6b1f78f89c | 123 | //pid_angle.angle_ctl(bno.get_angles(),angle_target,0.004,0.0007,0); |
guesta | 8:3d6b1f78f89c | 124 | //TG.pass_target(output); |
guesta | 8:3d6b1f78f89c | 125 | if(angle_target[0] - bno.euler.yaw <= 0.1 || angle_target[0] - bno.euler.yaw >= -0.1){ |
guesta | 8:3d6b1f78f89c | 126 | angle_arrival = true; |
guesta | 8:3d6b1f78f89c | 127 | TG.pass_val(0,0,theta); |
guesta | 8:3d6b1f78f89c | 128 | printf("arrival_angle\n"); |
guesta | 8:3d6b1f78f89c | 129 | } |
guesta | 8:3d6b1f78f89c | 130 | } |
guesta | 8:3d6b1f78f89c | 131 | }*/ |
kazumayamanaka | 0:a1238c4cd105 | 132 | } |
kazumayamanaka | 0:a1238c4cd105 | 133 | |
guesta | 7:a0375e6dc8ca | 134 | pid_1.pass_val(data_1.get(),TG.obt_target1(),0.00007,0.000001,0.00000014); |
guesta | 7:a0375e6dc8ca | 135 | pid_2.pass_val(data_2.get(),TG.obt_target2(),0.00007,0.000001,0.00000014); |
guesta | 7:a0375e6dc8ca | 136 | pid_3.pass_val(data_3.get(),TG.obt_target3(),0.00007,0.000001,0.00000014); |
guesta | 7:a0375e6dc8ca | 137 | pid_4.pass_val(data_4.get(),TG.obt_target4(),0.00007,0.000001,0.00000014); |
kazumayamanaka | 0:a1238c4cd105 | 138 | |
kazumayamanaka | 1:ea880e226e5a | 139 | pid_1.wheel_ctl(PC_9,PC_8); |
kazumayamanaka | 0:a1238c4cd105 | 140 | pid_2.wheel_ctl(PB_14,PB_13); |
kazumayamanaka | 0:a1238c4cd105 | 141 | pid_3.wheel_ctl(PB_5,PB_4); |
kazumayamanaka | 0:a1238c4cd105 | 142 | pid_4.wheel_ctl(PB_7,PB_6); |
kazumayamanaka | 0:a1238c4cd105 | 143 | |
guesta | 2:612efbe94f42 | 144 | if(TG.obt_target1() != 0){ |
guesta | 2:612efbe94f42 | 145 | led1 = 1; |
guesta | 2:612efbe94f42 | 146 | }else{ |
guesta | 2:612efbe94f42 | 147 | led1 = 0; |
guesta | 2:612efbe94f42 | 148 | } |
guesta | 2:612efbe94f42 | 149 | if(TG.obt_target2() != 0){ |
guesta | 2:612efbe94f42 | 150 | led2 = 1; |
guesta | 2:612efbe94f42 | 151 | }else{ |
guesta | 2:612efbe94f42 | 152 | led2 = 0; |
guesta | 2:612efbe94f42 | 153 | } |
guesta | 2:612efbe94f42 | 154 | if(TG.obt_target3() != 0){ |
guesta | 2:612efbe94f42 | 155 | led3 = 1; |
guesta | 2:612efbe94f42 | 156 | }else{ |
guesta | 2:612efbe94f42 | 157 | led3 = 0; |
guesta | 2:612efbe94f42 | 158 | } |
guesta | 2:612efbe94f42 | 159 | if(TG.obt_target4() != 0){ |
guesta | 2:612efbe94f42 | 160 | led4 = 1; |
guesta | 2:612efbe94f42 | 161 | }else{ |
guesta | 2:612efbe94f42 | 162 | led4 = 0; |
guesta | 2:612efbe94f42 | 163 | } |
guesta | 2:612efbe94f42 | 164 | |
guesta | 8:3d6b1f78f89c | 165 | printf("%lf,%lf,%lf,%lf,%lf,%lf,%lf,%lf\n",TG.obt_target1(),TG.obt_target2(),TG.obt_target3(),TG.obt_target4(),pid_1.obt_spd(),pid_2.obt_spd(),pid_3.obt_spd(),pid_4.obt_spd()); |
guesta | 6:e089fda81b74 | 166 | printf("%lf,%lf\n",x_position,y_position); |
guesta | 6:e089fda81b74 | 167 | /*if(auto_mode == false){ |
guesta | 5:1a850f68a06c | 168 | printf("manual\n"); |
guesta | 5:1a850f68a06c | 169 | }else if(auto_mode == true){ |
guesta | 5:1a850f68a06c | 170 | printf("auto\n"); |
guesta | 6:e089fda81b74 | 171 | }*/ |
guesta | 5:1a850f68a06c | 172 | |
kazumayamanaka | 0:a1238c4cd105 | 173 | while(Time.read_us() - timer <= 50 * 1000); |
kazumayamanaka | 0:a1238c4cd105 | 174 | } |
kazumayamanaka | 0:a1238c4cd105 | 175 | } |
kazumayamanaka | 0:a1238c4cd105 | 176 | |
guesta | 7:a0375e6dc8ca | 177 | //BNOのピン(PB_3,PB_10) |