Sera / Mbed 2 deprecated yaw_joint_control_ver2

Dependencies:   mbed

Committer:
yukikobayashi
Date:
Thu Jun 10 06:14:49 2021 +0000
Revision:
1:a9f2d00d7a56
Parent:
0:db35d0ca1d41
20210610

Who changed what in which revision?

UserRevisionLine numberNew contents of line
serararai 0:db35d0ca1d41 1 // Nucleo_CAN_slave (AIRo-4.1)
serararai 0:db35d0ca1d41 2 // Angle control
serararai 0:db35d0ca1d41 3 // Created by Atsushi Kakogawa, 2019.09.19
serararai 0:db35d0ca1d41 4 // Edited by Yoshimichi Oka, 2020.2.5
serararai 0:db35d0ca1d41 5 // Modified by Atsushi Kakogawa, 2020.03.22
yukikobayashi 1:a9f2d00d7a56 6 // Modified by Yoshimichi Oka, 2021.06.10
serararai 0:db35d0ca1d41 7 // Department of Robotics, Ritsumeikan University, Japan
serararai 0:db35d0ca1d41 8 #include "mbed.h"
serararai 0:db35d0ca1d41 9 #include "CAN.h"
serararai 0:db35d0ca1d41 10
serararai 0:db35d0ca1d41 11 Ticker control; // timer for control
serararai 0:db35d0ca1d41 12 DigitalOut myled(PF_1); // LED for communication check
serararai 0:db35d0ca1d41 13 DigitalOut mdir1(PA_9); // D1 Motor ON/OFF (HIGH = ON, Changeable on ESCON Studio)
serararai 0:db35d0ca1d41 14 DigitalOut mdir2(PA_10); // D0 Rotational direction (Direction is changeable on ESCON Studio)
serararai 0:db35d0ca1d41 15 AnalogOut DA_vlc(PA_6); // A5 for velocity analog input to ESCON ANI1+ (0 to 1.0)
serararai 0:db35d0ca1d41 16 AnalogOut DA_crt(PA_5); // A3 for current anaglog input to ESCON ANI2+ (0 to 1.0)
serararai 0:db35d0ca1d41 17 AnalogIn potensio1(PA_0);
serararai 0:db35d0ca1d41 18 AnalogIn potensio2(PA_7); // A6 Potentiometer 2 (5V potentiometer)
serararai 0:db35d0ca1d41 19 AnalogIn AD_crt(PA_1); // Analog Signal from ESCON ANO1 (motor velocity, can be changed by ESCON) (0 to 1.0)
serararai 0:db35d0ca1d41 20 AnalogIn AD_vlc(PA_3); // Analog Signal from ESCON ANO2 (motor current, can be changed by ESCON) (0 to 1.0)
serararai 0:db35d0ca1d41 21
serararai 0:db35d0ca1d41 22 CAN can(PA_11, PA_12);
serararai 0:db35d0ca1d41 23 CANMessage msg;
serararai 0:db35d0ca1d41 24
serararai 0:db35d0ca1d41 25
serararai 0:db35d0ca1d41 26 float duty = 0;
serararai 0:db35d0ca1d41 27 int id = 13; //4,6,8,9,11,13, 8,9はAnalog2pinにALPSのPOT
serararai 0:db35d0ca1d41 28 int mode = 1;
serararai 0:db35d0ca1d41 29 int flag = 0;
serararai 0:db35d0ca1d41 30 int cal = 321; //for ID8, ID9
serararai 0:db35d0ca1d41 31 float target_ang1 = 169;//ID4は100, ID6は165, ID8は180, ID9は140, ID11・13は169
serararai 0:db35d0ca1d41 32 float ang, e = 0, pe=0, pang, de = 0;
serararai 0:db35d0ca1d41 33 float dt=0.01;
serararai 0:db35d0ca1d41 34 float kp = 0.01, kd = 0;
serararai 0:db35d0ca1d41 35 //float kp=0.01, kd = 0.1;
serararai 0:db35d0ca1d41 36
serararai 0:db35d0ca1d41 37 int i=0, j=0;
serararai 0:db35d0ca1d41 38
serararai 0:db35d0ca1d41 39 char tx_data[8];
serararai 0:db35d0ca1d41 40 char tx_data1_U, tx_data1_L, tx_data2_U, tx_data2_L, tx_data3_U, tx_data3_L;
serararai 0:db35d0ca1d41 41
serararai 0:db35d0ca1d41 42 void can_reader(){
serararai 0:db35d0ca1d41 43 if(can.read(msg)) {
serararai 0:db35d0ca1d41 44 if (msg.data[0] == id) { // ID indentify
serararai 0:db35d0ca1d41 45 if (msg.data[1] == 0) { // mode indentify (0: control)
serararai 0:db35d0ca1d41 46 target_ang1 = (msg.data[3] << 8) + msg.data[4];
serararai 0:db35d0ca1d41 47 mode = 1;
serararai 0:db35d0ca1d41 48 } else if (msg.data[1] == 2) {
serararai 0:db35d0ca1d41 49 target_ang1 = (msg.data[3] << 8) + msg.data[4];
serararai 0:db35d0ca1d41 50 mode = 2;
yukikobayashi 1:a9f2d00d7a56 51 } else if (msg.data[1] == 3) {
yukikobayashi 1:a9f2d00d7a56 52 target_ang1 = (msg.data[3] << 8) + msg.data[4];
yukikobayashi 1:a9f2d00d7a56 53 mode = 3;
serararai 0:db35d0ca1d41 54 } else if (msg.data[1] == 1) { // mode indentify (1: response)
serararai 0:db35d0ca1d41 55 int i_data1 = AD_crt.read()*1000;
serararai 0:db35d0ca1d41 56 tx_data1_U = (i_data1 >> 8) & 0xff;
serararai 0:db35d0ca1d41 57 tx_data1_L = i_data1 & 0xff;
serararai 0:db35d0ca1d41 58 int i_data2 = (-1*potensio2.read()*330+cal)*100;;//AD_vlc.read()*1000;
serararai 0:db35d0ca1d41 59 tx_data2_U = (i_data2 >> 8) & 0xff;
serararai 0:db35d0ca1d41 60 tx_data2_L = i_data2 & 0xff;
serararai 0:db35d0ca1d41 61 int i_data3 = potensio1.read()*330*100;
serararai 0:db35d0ca1d41 62 tx_data3_U = (i_data3 >> 8) & 0xff;
serararai 0:db35d0ca1d41 63 tx_data3_L = i_data3 & 0xff;
serararai 0:db35d0ca1d41 64 tx_data[0] = id; // ID
serararai 0:db35d0ca1d41 65 tx_data[1] = 1; // mode (1: response)
serararai 0:db35d0ca1d41 66 tx_data[2] = tx_data1_U; // response value1 upper 8bit
serararai 0:db35d0ca1d41 67 tx_data[3] = tx_data1_L; // response value1 lower 8bit
serararai 0:db35d0ca1d41 68 tx_data[4] = tx_data2_U; // response value2 upper 8bit
serararai 0:db35d0ca1d41 69 tx_data[5] = tx_data2_L; // response value2 lower 8bit
serararai 0:db35d0ca1d41 70 tx_data[6] = tx_data3_U; // response value3 upper 8bit
serararai 0:db35d0ca1d41 71 tx_data[7] = tx_data3_L; // response value3 lower 8bit
serararai 0:db35d0ca1d41 72 can.write(CANMessage(1300 + id, tx_data, 8));
serararai 0:db35d0ca1d41 73 }
serararai 0:db35d0ca1d41 74 }
serararai 0:db35d0ca1d41 75 myled = 1; // LED is ON
serararai 0:db35d0ca1d41 76 wait (0.01);
serararai 0:db35d0ca1d41 77 //break;
serararai 0:db35d0ca1d41 78 } else {
serararai 0:db35d0ca1d41 79 myled = 0; // LED is OFF
serararai 0:db35d0ca1d41 80 }
serararai 0:db35d0ca1d41 81 }
serararai 0:db35d0ca1d41 82
serararai 0:db35d0ca1d41 83 // PD-control timer
serararai 0:db35d0ca1d41 84 void controller() {
serararai 0:db35d0ca1d41 85 if (mode == 1){
serararai 0:db35d0ca1d41 86 if (e < 0) {
serararai 0:db35d0ca1d41 87 mdir1 = 1;
serararai 0:db35d0ca1d41 88 mdir2 = 0;
serararai 0:db35d0ca1d41 89 } else if (e > 0) {
serararai 0:db35d0ca1d41 90 mdir1 = 1;
serararai 0:db35d0ca1d41 91 mdir2 = 1;
serararai 0:db35d0ca1d41 92 } else {
serararai 0:db35d0ca1d41 93 mdir1 = 0;
serararai 0:db35d0ca1d41 94 mdir2 = 0;
serararai 0:db35d0ca1d41 95 }
serararai 0:db35d0ca1d41 96
serararai 0:db35d0ca1d41 97 ang = (potensio1.read())*330;
serararai 0:db35d0ca1d41 98 e = target_ang1 - ang;
serararai 0:db35d0ca1d41 99 de = (e - pe)/dt;
serararai 0:db35d0ca1d41 100 //de = ang - pang;
serararai 0:db35d0ca1d41 101 DA_crt = kp*abs(e) + kd*abs(de);
serararai 0:db35d0ca1d41 102 if (DA_crt > 1){
serararai 0:db35d0ca1d41 103 DA_crt = 1;
serararai 0:db35d0ca1d41 104 } else if (DA_crt <= 0){
serararai 0:db35d0ca1d41 105 DA_crt = 0;
serararai 0:db35d0ca1d41 106 }
serararai 0:db35d0ca1d41 107
serararai 0:db35d0ca1d41 108 pe = e;
serararai 0:db35d0ca1d41 109 //pang = ang;
serararai 0:db35d0ca1d41 110
yukikobayashi 1:a9f2d00d7a56 111 } else if (mode==2){ //脱力制御
serararai 0:db35d0ca1d41 112 /*
serararai 0:db35d0ca1d41 113 for (i=1; i<200; i++) {
serararai 0:db35d0ca1d41 114 can_reader();
serararai 0:db35d0ca1d41 115 if (e < 0) {
serararai 0:db35d0ca1d41 116 mdir1 = 1;
serararai 0:db35d0ca1d41 117 mdir2 = 0;
serararai 0:db35d0ca1d41 118 } else if (e > 0) {
serararai 0:db35d0ca1d41 119 mdir1 = 1;
serararai 0:db35d0ca1d41 120 mdir2 = 1;
serararai 0:db35d0ca1d41 121 } else {
serararai 0:db35d0ca1d41 122 mdir1 = 0;
serararai 0:db35d0ca1d41 123 mdir2 = 0;
serararai 0:db35d0ca1d41 124 }
serararai 0:db35d0ca1d41 125
serararai 0:db35d0ca1d41 126 ang = (potensio1.read())*330;
serararai 0:db35d0ca1d41 127 e = target_ang1 - ang;
serararai 0:db35d0ca1d41 128 de = (e - pe)/dt;
serararai 0:db35d0ca1d41 129 //de = ang - pang;
serararai 0:db35d0ca1d41 130 DA_crt = kp*abs(e) + kd*abs(de);
serararai 0:db35d0ca1d41 131 if (DA_crt > 1){
serararai 0:db35d0ca1d41 132 DA_crt = 1;
serararai 0:db35d0ca1d41 133 } else if (DA_crt <= 0){
serararai 0:db35d0ca1d41 134 DA_crt = 0;
serararai 0:db35d0ca1d41 135 }
serararai 0:db35d0ca1d41 136
serararai 0:db35d0ca1d41 137 pe = e;
serararai 0:db35d0ca1d41 138 wait(0.01);
serararai 0:db35d0ca1d41 139 if (mode == 1){
serararai 0:db35d0ca1d41 140 break;
serararai 0:db35d0ca1d41 141 }
serararai 0:db35d0ca1d41 142 }
serararai 0:db35d0ca1d41 143 */
serararai 0:db35d0ca1d41 144 //for (j=1; j<120; j++) {
serararai 0:db35d0ca1d41 145 //can_reader();
serararai 0:db35d0ca1d41 146 mdir1 = 0;
serararai 0:db35d0ca1d41 147 //wait(0.01);
serararai 0:db35d0ca1d41 148 /* if (mode == 1){
serararai 0:db35d0ca1d41 149 break;
serararai 0:db35d0ca1d41 150 }
serararai 0:db35d0ca1d41 151 }
serararai 0:db35d0ca1d41 152 */
serararai 0:db35d0ca1d41 153 //can_reader();
yukikobayashi 1:a9f2d00d7a56 154 } else if (mode==3){ //角度制御+脱力制御(T字管用)
yukikobayashi 1:a9f2d00d7a56 155 //if(id == 13){
yukikobayashi 1:a9f2d00d7a56 156 if (e < 0) {
yukikobayashi 1:a9f2d00d7a56 157 mdir1 = 1;
yukikobayashi 1:a9f2d00d7a56 158 mdir2 = 0;
yukikobayashi 1:a9f2d00d7a56 159 } else if (e > 0) {
yukikobayashi 1:a9f2d00d7a56 160 mdir1 = 1;
yukikobayashi 1:a9f2d00d7a56 161 mdir2 = 1;
yukikobayashi 1:a9f2d00d7a56 162 } else {
yukikobayashi 1:a9f2d00d7a56 163 mdir1 = 0;
yukikobayashi 1:a9f2d00d7a56 164 mdir2 = 0;
yukikobayashi 1:a9f2d00d7a56 165 }
yukikobayashi 1:a9f2d00d7a56 166
yukikobayashi 1:a9f2d00d7a56 167 ang = (potensio1.read())*330;
yukikobayashi 1:a9f2d00d7a56 168 e = target_ang1 - ang;
yukikobayashi 1:a9f2d00d7a56 169 de = (e - pe)/dt;
yukikobayashi 1:a9f2d00d7a56 170
yukikobayashi 1:a9f2d00d7a56 171 DA_crt = kp*abs(e) + kd*abs(de);
yukikobayashi 1:a9f2d00d7a56 172 if (DA_crt > 1){
yukikobayashi 1:a9f2d00d7a56 173 DA_crt = 1;
yukikobayashi 1:a9f2d00d7a56 174 } else if (DA_crt <= 0){
yukikobayashi 1:a9f2d00d7a56 175 DA_crt = 0;
yukikobayashi 1:a9f2d00d7a56 176 }
yukikobayashi 1:a9f2d00d7a56 177 pe = e;
yukikobayashi 1:a9f2d00d7a56 178 /*
yukikobayashi 1:a9f2d00d7a56 179 }else {
yukikobayashi 1:a9f2d00d7a56 180 //mdir1 = 0;
yukikobayashi 1:a9f2d00d7a56 181 if (e < 0) {
yukikobayashi 1:a9f2d00d7a56 182 mdir1 = 1;
yukikobayashi 1:a9f2d00d7a56 183 mdir2 = 0;
yukikobayashi 1:a9f2d00d7a56 184 } else if (e > 0) {
yukikobayashi 1:a9f2d00d7a56 185 mdir1 = 1;
yukikobayashi 1:a9f2d00d7a56 186 mdir2 = 1;
yukikobayashi 1:a9f2d00d7a56 187 } else {
yukikobayashi 1:a9f2d00d7a56 188 mdir1 = 0;
yukikobayashi 1:a9f2d00d7a56 189 mdir2 = 0;
yukikobayashi 1:a9f2d00d7a56 190 }
yukikobayashi 1:a9f2d00d7a56 191
yukikobayashi 1:a9f2d00d7a56 192 ang = (potensio1.read())*330;
yukikobayashi 1:a9f2d00d7a56 193 e = target_ang1 - ang;
yukikobayashi 1:a9f2d00d7a56 194 de = (e - pe)/dt;
yukikobayashi 1:a9f2d00d7a56 195 //de = ang - pang;
yukikobayashi 1:a9f2d00d7a56 196 DA_crt = kp*abs(e) + kd*abs(de);
yukikobayashi 1:a9f2d00d7a56 197 if (DA_crt > 1){
yukikobayashi 1:a9f2d00d7a56 198 DA_crt = 1;
yukikobayashi 1:a9f2d00d7a56 199 } else if (DA_crt <= 0){
yukikobayashi 1:a9f2d00d7a56 200 DA_crt = 0;
yukikobayashi 1:a9f2d00d7a56 201 }
yukikobayashi 1:a9f2d00d7a56 202
yukikobayashi 1:a9f2d00d7a56 203 pe = e;
yukikobayashi 1:a9f2d00d7a56 204
yukikobayashi 1:a9f2d00d7a56 205
yukikobayashi 1:a9f2d00d7a56 206 }
yukikobayashi 1:a9f2d00d7a56 207 */
yukikobayashi 1:a9f2d00d7a56 208 }
serararai 0:db35d0ca1d41 209 }
serararai 0:db35d0ca1d41 210
serararai 0:db35d0ca1d41 211 int main() {
serararai 0:db35d0ca1d41 212
serararai 0:db35d0ca1d41 213 control.attach(&controller, dt); // 1 ms
serararai 0:db35d0ca1d41 214
serararai 0:db35d0ca1d41 215 can.frequency(50000);
serararai 0:db35d0ca1d41 216
serararai 0:db35d0ca1d41 217 while(1) {
serararai 0:db35d0ca1d41 218 can_reader();
serararai 0:db35d0ca1d41 219 //control.attach(&controller, dt);
serararai 0:db35d0ca1d41 220 /*
serararai 0:db35d0ca1d41 221 if(can.read(msg)) {
serararai 0:db35d0ca1d41 222 if (msg.data[0] == id) { // ID indentify
serararai 0:db35d0ca1d41 223 if (msg.data[1] == 0) { // mode indentify (0: control)
serararai 0:db35d0ca1d41 224 target_ang1 = (msg.data[3] << 8) + msg.data[4];
serararai 0:db35d0ca1d41 225 mode = 1;
serararai 0:db35d0ca1d41 226 if (mode==1){
serararai 0:db35d0ca1d41 227 control.attach(&controller, dt);
serararai 0:db35d0ca1d41 228 }
serararai 0:db35d0ca1d41 229 } else if (msg.data[1] == 2) {
serararai 0:db35d0ca1d41 230 target_ang1 = (msg.data[3] << 8) + msg.data[4];
serararai 0:db35d0ca1d41 231 mode = 2;
serararai 0:db35d0ca1d41 232 controller();
serararai 0:db35d0ca1d41 233 wait(2);
serararai 0:db35d0ca1d41 234 stop_motion();
serararai 0:db35d0ca1d41 235 } else if (msg.data[1] == 1) { // mode indentify (1: response)
serararai 0:db35d0ca1d41 236 int i_data1 = AD_crt.read()*1000;
serararai 0:db35d0ca1d41 237 tx_data1_U = (i_data1 >> 8) & 0xff;
serararai 0:db35d0ca1d41 238 tx_data1_L = i_data1 & 0xff;
serararai 0:db35d0ca1d41 239 int i_data2 = AD_vlc.read()*1000;
serararai 0:db35d0ca1d41 240 tx_data2_U = (i_data2 >> 8) & 0xff;
serararai 0:db35d0ca1d41 241 tx_data2_L = i_data2 & 0xff;
serararai 0:db35d0ca1d41 242 int i_data3 = potensio1.read()*330*100;
serararai 0:db35d0ca1d41 243 tx_data3_U = (i_data3 >> 8) & 0xff;
serararai 0:db35d0ca1d41 244 tx_data3_L = i_data3 & 0xff;
serararai 0:db35d0ca1d41 245 tx_data[0] = id; // ID
serararai 0:db35d0ca1d41 246 tx_data[1] = 1; // mode (1: response)
serararai 0:db35d0ca1d41 247 tx_data[2] = tx_data1_U; // response value1 upper 8bit
serararai 0:db35d0ca1d41 248 tx_data[3] = tx_data1_L; // response value1 lower 8bit
serararai 0:db35d0ca1d41 249 tx_data[4] = tx_data2_U; // response value2 upper 8bit
serararai 0:db35d0ca1d41 250 tx_data[5] = tx_data2_L; // response value2 lower 8bit
serararai 0:db35d0ca1d41 251 tx_data[6] = tx_data3_U; // response value3 upper 8bit
serararai 0:db35d0ca1d41 252 tx_data[7] = tx_data3_L; // response value3 lower 8bit
serararai 0:db35d0ca1d41 253 can.write(CANMessage(1300 + id, tx_data, 8));
serararai 0:db35d0ca1d41 254 }
serararai 0:db35d0ca1d41 255 }
serararai 0:db35d0ca1d41 256 myled = 1; // LED is ON
serararai 0:db35d0ca1d41 257 wait (0.01);
serararai 0:db35d0ca1d41 258 //break;
serararai 0:db35d0ca1d41 259 } else {
serararai 0:db35d0ca1d41 260 myled = 0; // LED is OFF
serararai 0:db35d0ca1d41 261 }
serararai 0:db35d0ca1d41 262 */
serararai 0:db35d0ca1d41 263 } // while
serararai 0:db35d0ca1d41 264 }