Rong Syuan Lin
/
zerotorque_final
20181123
main.cpp@6:f1c0b9476c88, 2018-11-23 (annotated)
- Committer:
- nylon0212
- Date:
- Fri Nov 23 04:43:52 2018 +0000
- Revision:
- 6:f1c0b9476c88
- Parent:
- 5:131450b16ce3
20181123
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nylon0212 | 6:f1c0b9476c88 | 1 | #include "mbed.h" //不用gyro的data,只要輸出兩個imu的acce的xyz資料即可 |
JJting | 0:c23e915f255b | 2 | #include "encoder.h" |
JJting | 0:c23e915f255b | 3 | #include "Mx28.h" |
JJting | 0:c23e915f255b | 4 | #include "PID.h" |
nylon0212 | 6:f1c0b9476c88 | 5 | #include "LSM9DS1.h" |
JJting | 0:c23e915f255b | 6 | |
JJting | 0:c23e915f255b | 7 | //********************* Dynamxiel ****************************** |
JJting | 0:c23e915f255b | 8 | #define SERVO_ID 0x01 // ID of which we will set Dynamixel too |
JJting | 0:c23e915f255b | 9 | #define SERVO_ControlPin A2 // Control pin of buffer chip, NOTE: this does not matter becasue we are not using a half to full contorl buffer. |
JJting | 0:c23e915f255b | 10 | #define SERVO_SET_Baudrate 1000000 // Baud rate speed which the Dynamixel will be set too (1Mbps) |
JJting | 0:c23e915f255b | 11 | #define TxPin A0 |
JJting | 0:c23e915f255b | 12 | #define RxPin A1 |
JJting | 0:c23e915f255b | 13 | #define CW_LIMIT_ANGLE 1 // lowest clockwise angle is 1, as when set to 0 it set servo to wheel mode |
JJting | 0:c23e915f255b | 14 | #define CCW_LIMIT_ANGLE 4095 // Highest anit-clockwise angle is 0XFFF, as when set to 0 it set servo to wheel mode |
JJting | 0:c23e915f255b | 15 | #define PI 3.14159265f |
JJting | 0:c23e915f255b | 16 | |
JJting | 0:c23e915f255b | 17 | // Dynamixel |
JJting | 0:c23e915f255b | 18 | DynamixelClass dynamixelClass(SERVO_SET_Baudrate,SERVO_ControlPin,TxPin,RxPin); |
JJting | 0:c23e915f255b | 19 | int servo_cmd; |
JJting | 1:2823a39f70a9 | 20 | int row_cmd; |
JJting | 0:c23e915f255b | 21 | int D_angle = 0; |
JJting | 0:c23e915f255b | 22 | int D_angle_dif = 0; |
JJting | 0:c23e915f255b | 23 | int D_Angle; |
JJting | 0:c23e915f255b | 24 | int D_angle_old; |
JJting | 0:c23e915f255b | 25 | unsigned short d = 0; |
JJting | 0:c23e915f255b | 26 | // Find Torque |
JJting | 0:c23e915f255b | 27 | double angle_difference = 0.0; |
JJting | 0:c23e915f255b | 28 | float torque_measured = 0.0; |
JJting | 0:c23e915f255b | 29 | float ks = 2.6393*2; //spring constant |
JJting | 0:c23e915f255b | 30 | //int angle_dif = 0; |
nylon0212 | 6:f1c0b9476c88 | 31 | float torque_ref = 0.0; //可不令為0,而是以范僑芯的學習結果為input。令為0可使馬達扭力輸出為0,抵抗減速機摩擦力,使穿戴者感到跟沒有戴一樣。 |
JJting | 1:2823a39f70a9 | 32 | //float friction = 0.0f; |
JJting | 0:c23e915f255b | 33 | float friction = 0.18f; |
JJting | 1:2823a39f70a9 | 34 | float rate = 0.5; |
JJting | 0:c23e915f255b | 35 | //float friction = 0.0f; |
JJting | 0:c23e915f255b | 36 | //float check = 0.0f; |
JJting | 1:2823a39f70a9 | 37 | float Angle_Dif; |
JJting | 4:a59512fe0f9a | 38 | short rotation_; |
nylon0212 | 6:f1c0b9476c88 | 39 | //*************************************************************** |
nylon0212 | 6:f1c0b9476c88 | 40 | |
nylon0212 | 6:f1c0b9476c88 | 41 | Serial uart(USBTX, USBRX); |
nylon0212 | 6:f1c0b9476c88 | 42 | //Serial uart(D10,D2); // TX : D10 RX : D2 // bluetooth |
nylon0212 | 6:f1c0b9476c88 | 43 | AnalogIn EMG(PC_4); // |
nylon0212 | 6:f1c0b9476c88 | 44 | DigitalOut LED(A4); // check if the code is running |
nylon0212 | 6:f1c0b9476c88 | 45 | DigitalOut led2(A5); // check if the code is running interrupt |
nylon0212 | 6:f1c0b9476c88 | 46 | uint8_t led2f; |
nylon0212 | 6:f1c0b9476c88 | 47 | /*IMU*******************************************************************/ |
nylon0212 | 6:f1c0b9476c88 | 48 | LSM9DS1 imu(D14, D15); //SDA SCL |
nylon0212 | 6:f1c0b9476c88 | 49 | LSM9DS1 imu2(PC_9,PA_8); //SDA SCL |
nylon0212 | 6:f1c0b9476c88 | 50 | void init_IMU(); |
nylon0212 | 6:f1c0b9476c88 | 51 | int16_t Gyro_axis_data[6] = {0}; // X, Y, Z axis |
nylon0212 | 6:f1c0b9476c88 | 52 | int16_t Acce_axis_data[6] = {0}; // X, Y, Z axis |
nylon0212 | 6:f1c0b9476c88 | 53 | float Acce_axis_data_f[6] = {0}; //_f代表經過低通濾波的資料 |
nylon0212 | 6:f1c0b9476c88 | 54 | float Acce_axis_data_f_old[6] = {0}; |
nylon0212 | 6:f1c0b9476c88 | 55 | float Gyro_axis_data_f[6] = {0}; |
nylon0212 | 6:f1c0b9476c88 | 56 | float Gyro_axis_data_f_old[6] = {0}; |
nylon0212 | 6:f1c0b9476c88 | 57 | |
nylon0212 | 6:f1c0b9476c88 | 58 | // Timer |
nylon0212 | 6:f1c0b9476c88 | 59 | Ticker timer1; |
nylon0212 | 6:f1c0b9476c88 | 60 | float ITR_time1 = 4000.0; //timer interrupt unit:us 多少us計時一次 4毫秒 |
nylon0212 | 6:f1c0b9476c88 | 61 | float Ts = ITR_time1/1000000; //控馬達的某個時間參數 不用理他 |
nylon0212 | 6:f1c0b9476c88 | 62 | |
nylon0212 | 6:f1c0b9476c88 | 63 | // PID |
nylon0212 | 6:f1c0b9476c88 | 64 | PID motor_pid(1500, 0, 40, Ts);// 6.4 0.13 7.2 0.13 8.4 6.5, 0, 0.19 |
nylon0212 | 6:f1c0b9476c88 | 65 | float PIDout = 0.0f; |
nylon0212 | 6:f1c0b9476c88 | 66 | |
nylon0212 | 6:f1c0b9476c88 | 67 | // EMG |
nylon0212 | 6:f1c0b9476c88 | 68 | float lpf(float input, float output_old, float frequency); //low pass filter |
nylon0212 | 6:f1c0b9476c88 | 69 | float emg_value; |
nylon0212 | 6:f1c0b9476c88 | 70 | float emg_value_f; |
nylon0212 | 6:f1c0b9476c88 | 71 | float emg_value_f_old; |
nylon0212 | 6:f1c0b9476c88 | 72 | float Tf = ITR_time1/1000000; // 低通濾波的採樣週期 |
nylon0212 | 6:f1c0b9476c88 | 73 | |
nylon0212 | 6:f1c0b9476c88 | 74 | // uart_tx |
nylon0212 | 6:f1c0b9476c88 | 75 | union splitter { //將data切割為兩個byte |
nylon0212 | 6:f1c0b9476c88 | 76 | short j; |
nylon0212 | 6:f1c0b9476c88 | 77 | char C[2]; |
nylon0212 | 6:f1c0b9476c88 | 78 | // C[0] is lowbyte of j, C[1] is highbyte of j |
nylon0212 | 6:f1c0b9476c88 | 79 | }; |
nylon0212 | 6:f1c0b9476c88 | 80 | uint8_t T[40] = {255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; |
nylon0212 | 6:f1c0b9476c88 | 81 | // T[16]中的16是2+14,2為start btye 255 255,14為要傳7個參數到電腦,拆成high byte和low byte,所以是7*2=14 |
nylon0212 | 6:f1c0b9476c88 | 82 | // 若要更改傳到電腦的參數個數,則改x*2=y,x為要傳的參數個數,y為char T[]裡面要有多少個0 |
nylon0212 | 6:f1c0b9476c88 | 83 | int i = 0; |
JJting | 0:c23e915f255b | 84 | |
JJting | 0:c23e915f255b | 85 | // function |
JJting | 0:c23e915f255b | 86 | void init_UART(); |
nylon0212 | 6:f1c0b9476c88 | 87 | void uart_tx(); // 傳data到電腦 |
JJting | 0:c23e915f255b | 88 | void init_TIMER(); |
JJting | 0:c23e915f255b | 89 | void timer1_ITR(); |
JJting | 0:c23e915f255b | 90 | void init_DYNAMIXEL(); |
JJting | 0:c23e915f255b | 91 | void D_angle_measure(); |
JJting | 0:c23e915f255b | 92 | void find_torque(); |
nylon0212 | 6:f1c0b9476c88 | 93 | /**************************************************************************/ |
JJting | 0:c23e915f255b | 94 | int main() |
JJting | 0:c23e915f255b | 95 | { |
JJting | 0:c23e915f255b | 96 | LED = 1; // darken |
JJting | 0:c23e915f255b | 97 | wait_ms(500); |
JJting | 0:c23e915f255b | 98 | // initial sensor |
JJting | 0:c23e915f255b | 99 | init_SPI_encoder(); |
JJting | 0:c23e915f255b | 100 | init_encoder(); |
nylon0212 | 6:f1c0b9476c88 | 101 | init_UART(); |
JJting | 0:c23e915f255b | 102 | init_DYNAMIXEL(); |
nylon0212 | 6:f1c0b9476c88 | 103 | init_IMU(); |
JJting | 0:c23e915f255b | 104 | init_TIMER(); |
JJting | 0:c23e915f255b | 105 | |
JJting | 0:c23e915f255b | 106 | while(1) { |
nylon0212 | 6:f1c0b9476c88 | 107 | // EMG |
nylon0212 | 6:f1c0b9476c88 | 108 | //emg_value = EMG.read(); |
nylon0212 | 6:f1c0b9476c88 | 109 | // emg_value_f = lpf(emg_value,emg_value_f_old,15); |
nylon0212 | 6:f1c0b9476c88 | 110 | // emg_value_f_old = emg_value_f; |
JJting | 0:c23e915f255b | 111 | |
nylon0212 | 6:f1c0b9476c88 | 112 | // IMU |
nylon0212 | 6:f1c0b9476c88 | 113 | imu.readAccel(); |
nylon0212 | 6:f1c0b9476c88 | 114 | imu.readGyro(); |
nylon0212 | 6:f1c0b9476c88 | 115 | imu2.readAccel(); |
nylon0212 | 6:f1c0b9476c88 | 116 | imu2.readGyro(); |
nylon0212 | 6:f1c0b9476c88 | 117 | |
nylon0212 | 6:f1c0b9476c88 | 118 | Acce_axis_data[0] = imu.ax*Acce_gain_x; |
nylon0212 | 6:f1c0b9476c88 | 119 | Acce_axis_data[1] = imu.ay*Acce_gain_y; |
nylon0212 | 6:f1c0b9476c88 | 120 | Acce_axis_data[2] = imu.az*Acce_gain_z; |
nylon0212 | 6:f1c0b9476c88 | 121 | Acce_axis_data[3] = -imu2.ax*Acce_gain_x_2; |
nylon0212 | 6:f1c0b9476c88 | 122 | Acce_axis_data[4] = imu2.az*Acce_gain_y_2; |
nylon0212 | 6:f1c0b9476c88 | 123 | Acce_axis_data[5] = imu2.ay*Acce_gain_z_2; |
nylon0212 | 6:f1c0b9476c88 | 124 | |
nylon0212 | 6:f1c0b9476c88 | 125 | Gyro_axis_data[0] = imu.gx*Gyro_gain_x; |
nylon0212 | 6:f1c0b9476c88 | 126 | Gyro_axis_data[1] = imu.gy*Gyro_gain_y; |
nylon0212 | 6:f1c0b9476c88 | 127 | Gyro_axis_data[2] = imu.gz*Gyro_gain_z; |
nylon0212 | 6:f1c0b9476c88 | 128 | Gyro_axis_data[3] = -imu2.gx*Gyro_gain_x_2; |
nylon0212 | 6:f1c0b9476c88 | 129 | Gyro_axis_data[4] = imu2.gz*Gyro_gain_y_2; |
nylon0212 | 6:f1c0b9476c88 | 130 | Gyro_axis_data[5] = imu2.gy*Gyro_gain_z_2; |
nylon0212 | 6:f1c0b9476c88 | 131 | |
nylon0212 | 6:f1c0b9476c88 | 132 | for(i=0; i<6; i++) { |
nylon0212 | 6:f1c0b9476c88 | 133 | Acce_axis_data_f[i] = lpf(Acce_axis_data[i],Acce_axis_data_f_old[i],15); |
nylon0212 | 6:f1c0b9476c88 | 134 | Acce_axis_data_f_old[i] = Acce_axis_data_f[i]; |
nylon0212 | 6:f1c0b9476c88 | 135 | Gyro_axis_data_f[i] = lpf(Gyro_axis_data[i],Gyro_axis_data_f_old[i],15); |
nylon0212 | 6:f1c0b9476c88 | 136 | Gyro_axis_data_f_old[i] = Gyro_axis_data_f[i]; |
JJting | 0:c23e915f255b | 137 | } |
nylon0212 | 6:f1c0b9476c88 | 138 | // int16_t shit2 = imu.ax_raw; |
nylon0212 | 6:f1c0b9476c88 | 139 | // uart.printf("%d\n\r", shit2); |
nylon0212 | 6:f1c0b9476c88 | 140 | // uart.printf("x: %.4f, y: %.4f, z: %.4f\n\r", imu.ax, imu.ay, imu.az); |
nylon0212 | 6:f1c0b9476c88 | 141 | uart_tx(); |
nylon0212 | 6:f1c0b9476c88 | 142 | init_TIMER(); |
nylon0212 | 6:f1c0b9476c88 | 143 | while(1) {} |
nylon0212 | 6:f1c0b9476c88 | 144 | |
nylon0212 | 6:f1c0b9476c88 | 145 | // wait_ms(500); |
nylon0212 | 6:f1c0b9476c88 | 146 | } |
nylon0212 | 6:f1c0b9476c88 | 147 | } |
nylon0212 | 6:f1c0b9476c88 | 148 | |
nylon0212 | 6:f1c0b9476c88 | 149 | void init_IMU() |
nylon0212 | 6:f1c0b9476c88 | 150 | { |
nylon0212 | 6:f1c0b9476c88 | 151 | uint16_t shit; |
nylon0212 | 6:f1c0b9476c88 | 152 | shit = imu.begin(imu.G_SCALE_245DPS,imu.A_SCALE_2G,imu.M_SCALE_4GS,imu.G_ODR_238_BW_14,imu.A_ODR_119,imu.M_ODR_0625); //imu.G_SCALE_245DPS,imu.A_SCALE_2G,imu.M_SCALE_4GS,imu.G_ODR_238_BW_14,imu.A_ODR_119,imu.M_ODR_0625 |
nylon0212 | 6:f1c0b9476c88 | 153 | // imu2.begin(imu.G_SCALE_500DPS,imu.A_SCALE_2G,imu.M_SCALE_4GS,imu.G_ODR_476_BW_21,imu.A_ODR_476,imu.M_ODR_0625); |
nylon0212 | 6:f1c0b9476c88 | 154 | if(shit != 0x683D) { |
nylon0212 | 6:f1c0b9476c88 | 155 | while(1) { |
nylon0212 | 6:f1c0b9476c88 | 156 | uart.printf("IMU error\n\r"); |
nylon0212 | 6:f1c0b9476c88 | 157 | } |
nylon0212 | 6:f1c0b9476c88 | 158 | } |
nylon0212 | 6:f1c0b9476c88 | 159 | uart.printf("IMU init success\n\r"); |
nylon0212 | 6:f1c0b9476c88 | 160 | |
nylon0212 | 6:f1c0b9476c88 | 161 | // uart.printf("%d\n\r", shit); |
JJting | 0:c23e915f255b | 162 | } |
JJting | 0:c23e915f255b | 163 | |
JJting | 0:c23e915f255b | 164 | void init_DYNAMIXEL() |
JJting | 0:c23e915f255b | 165 | { |
JJting | 5:131450b16ce3 | 166 | // dynamixelClass.torqueMode(SERVO_ID, 1); |
nylon0212 | 6:f1c0b9476c88 | 167 | dynamixelClass.setMode(SERVO_ID, WHEEL, 0, 0); //Wheel:= continuously rotating; others: torque, position |
JJting | 0:c23e915f255b | 168 | wait_ms(1); |
JJting | 0:c23e915f255b | 169 | } |
JJting | 0:c23e915f255b | 170 | |
JJting | 0:c23e915f255b | 171 | void init_UART() |
JJting | 0:c23e915f255b | 172 | { |
JJting | 0:c23e915f255b | 173 | uart.baud(115200); |
JJting | 0:c23e915f255b | 174 | } |
JJting | 0:c23e915f255b | 175 | |
JJting | 0:c23e915f255b | 176 | void init_TIMER() |
JJting | 0:c23e915f255b | 177 | { |
JJting | 0:c23e915f255b | 178 | timer1.attach_us(&timer1_ITR, ITR_time1); |
JJting | 0:c23e915f255b | 179 | } |
JJting | 0:c23e915f255b | 180 | |
nylon0212 | 6:f1c0b9476c88 | 181 | void timer1_ITR() //開始讀取資料 |
JJting | 0:c23e915f255b | 182 | { |
JJting | 3:c05acc05c3bd | 183 | led2 = !led2; |
JJting | 3:c05acc05c3bd | 184 | angle_measure(); |
JJting | 3:c05acc05c3bd | 185 | D_angle_measure(); |
JJting | 3:c05acc05c3bd | 186 | find_torque(); |
JJting | 3:c05acc05c3bd | 187 | motor_pid.Compute(torque_ref, torque_measured); |
JJting | 3:c05acc05c3bd | 188 | PIDout = motor_pid.output; |
nylon0212 | 6:f1c0b9476c88 | 189 | servo_cmd = -PIDout; // 1023/8.4Nm = 121.7857 可視情況調整負號 |
JJting | 4:a59512fe0f9a | 190 | // 速度控制 |
JJting | 4:a59512fe0f9a | 191 | if (servo_cmd > 0) { |
JJting | 4:a59512fe0f9a | 192 | row_cmd = servo_cmd; |
JJting | 5:131450b16ce3 | 193 | // servo_cmd = servo_cmd + friction; |
JJting | 4:a59512fe0f9a | 194 | servo_cmd = servo_cmd; |
JJting | 4:a59512fe0f9a | 195 | rotation_ = 0; // 0:Move Left |
JJting | 4:a59512fe0f9a | 196 | if (servo_cmd >= 1023) { |
JJting | 4:a59512fe0f9a | 197 | servo_cmd = 1023; |
JJting | 4:a59512fe0f9a | 198 | row_cmd = servo_cmd; |
JJting | 4:a59512fe0f9a | 199 | } |
JJting | 4:a59512fe0f9a | 200 | } else { |
JJting | 4:a59512fe0f9a | 201 | row_cmd = servo_cmd; |
JJting | 5:131450b16ce3 | 202 | // servo_cmd = -servo_cmd - friction; |
JJting | 4:a59512fe0f9a | 203 | servo_cmd = -servo_cmd; |
JJting | 4:a59512fe0f9a | 204 | rotation_ = 1; // 1:Move Right |
JJting | 4:a59512fe0f9a | 205 | if (servo_cmd >= 1023) { |
JJting | 4:a59512fe0f9a | 206 | servo_cmd = 1023; |
JJting | 4:a59512fe0f9a | 207 | row_cmd = -servo_cmd; |
JJting | 4:a59512fe0f9a | 208 | } |
JJting | 4:a59512fe0f9a | 209 | } |
JJting | 5:131450b16ce3 | 210 | |
JJting | 5:131450b16ce3 | 211 | // dynamixelClass.torque(SERVO_ID, servo_cmd); |
nylon0212 | 6:f1c0b9476c88 | 212 | dynamixelClass.wheel(SERVO_ID, rotation_, servo_cmd); //0~1023 (rotation) 12V之下的最高轉速為45rpm,切割為等分 |
JJting | 3:c05acc05c3bd | 213 | // dynamixelClass.wheel(SERVO_ID, 0, 150); //0~1023 (rotation) |
JJting | 3:c05acc05c3bd | 214 | uart_tx(); |
JJting | 0:c23e915f255b | 215 | } |
JJting | 0:c23e915f255b | 216 | |
nylon0212 | 6:f1c0b9476c88 | 217 | void uart_tx() //分割資料 |
JJting | 0:c23e915f255b | 218 | { |
JJting | 0:c23e915f255b | 219 | splitter s1; |
JJting | 0:c23e915f255b | 220 | splitter s2; |
JJting | 0:c23e915f255b | 221 | splitter s3; |
JJting | 0:c23e915f255b | 222 | splitter s4; |
JJting | 0:c23e915f255b | 223 | splitter s5; |
JJting | 0:c23e915f255b | 224 | splitter s6; |
JJting | 0:c23e915f255b | 225 | splitter s7; |
nylon0212 | 6:f1c0b9476c88 | 226 | splitter s8; |
nylon0212 | 6:f1c0b9476c88 | 227 | splitter s9; |
nylon0212 | 6:f1c0b9476c88 | 228 | splitter s10; |
nylon0212 | 6:f1c0b9476c88 | 229 | splitter s11; |
nylon0212 | 6:f1c0b9476c88 | 230 | splitter s12; |
nylon0212 | 6:f1c0b9476c88 | 231 | splitter s13; |
nylon0212 | 6:f1c0b9476c88 | 232 | splitter s14; |
nylon0212 | 6:f1c0b9476c88 | 233 | splitter s15; |
nylon0212 | 6:f1c0b9476c88 | 234 | splitter s16; |
nylon0212 | 6:f1c0b9476c88 | 235 | splitter s17; |
nylon0212 | 6:f1c0b9476c88 | 236 | splitter s18; |
nylon0212 | 6:f1c0b9476c88 | 237 | splitter s19; |
JJting | 0:c23e915f255b | 238 | |
nylon0212 | 6:f1c0b9476c88 | 239 | s1.j = Acce_axis_data_f[0]; // 0x6161;// |
nylon0212 | 6:f1c0b9476c88 | 240 | s2.j = Acce_axis_data_f[1]; |
nylon0212 | 6:f1c0b9476c88 | 241 | s3.j = Acce_axis_data_f[2]; |
nylon0212 | 6:f1c0b9476c88 | 242 | s4.j = Acce_axis_data_f[3]; |
nylon0212 | 6:f1c0b9476c88 | 243 | s5.j = Acce_axis_data_f[4]; |
nylon0212 | 6:f1c0b9476c88 | 244 | s6.j = Acce_axis_data_f[5]; |
nylon0212 | 6:f1c0b9476c88 | 245 | s7.j = Gyro_axis_data_f[0]; |
nylon0212 | 6:f1c0b9476c88 | 246 | s8.j = Gyro_axis_data_f[1]; |
nylon0212 | 6:f1c0b9476c88 | 247 | s9.j = Gyro_axis_data_f[2]; |
nylon0212 | 6:f1c0b9476c88 | 248 | s10.j = Gyro_axis_data_f[3]; |
nylon0212 | 6:f1c0b9476c88 | 249 | s11.j = Gyro_axis_data_f[4]; |
nylon0212 | 6:f1c0b9476c88 | 250 | s12.j = Gyro_axis_data_f[5]; |
nylon0212 | 6:f1c0b9476c88 | 251 | s13.j = emg_value_f; |
nylon0212 | 6:f1c0b9476c88 | 252 | s14.j = torque_ref*1000; //即reference input指令 |
nylon0212 | 6:f1c0b9476c88 | 253 | s15.j = torque_measured*1000; //由angle_difference*ks而來 |
nylon0212 | 6:f1c0b9476c88 | 254 | s16.j = Angle_Dif/4096*3600; |
nylon0212 | 6:f1c0b9476c88 | 255 | s17.j = D_Angle; |
nylon0212 | 6:f1c0b9476c88 | 256 | s18.j = Angle*3; //經過減速比 |
nylon0212 | 6:f1c0b9476c88 | 257 | s19.j = row_cmd; |
JJting | 0:c23e915f255b | 258 | |
JJting | 0:c23e915f255b | 259 | T[2] = s1.C[0]; |
JJting | 0:c23e915f255b | 260 | T[3] = s1.C[1]; |
JJting | 0:c23e915f255b | 261 | T[4] = s2.C[0]; |
JJting | 0:c23e915f255b | 262 | T[5] = s2.C[1]; |
JJting | 0:c23e915f255b | 263 | T[6] = s3.C[0]; |
JJting | 0:c23e915f255b | 264 | T[7] = s3.C[1]; |
JJting | 0:c23e915f255b | 265 | T[8] = s4.C[0]; |
JJting | 0:c23e915f255b | 266 | T[9] = s4.C[1]; |
JJting | 0:c23e915f255b | 267 | T[10] = s5.C[0]; |
JJting | 0:c23e915f255b | 268 | T[11] = s5.C[1]; |
JJting | 0:c23e915f255b | 269 | T[12] = s6.C[0]; |
JJting | 0:c23e915f255b | 270 | T[13] = s6.C[1]; |
JJting | 0:c23e915f255b | 271 | T[14] = s7.C[0]; |
JJting | 0:c23e915f255b | 272 | T[15] = s7.C[1]; |
nylon0212 | 6:f1c0b9476c88 | 273 | T[16] = s8.C[0]; |
nylon0212 | 6:f1c0b9476c88 | 274 | T[17] = s8.C[1]; |
nylon0212 | 6:f1c0b9476c88 | 275 | T[18] = s9.C[0]; |
nylon0212 | 6:f1c0b9476c88 | 276 | T[19] = s9.C[1]; |
nylon0212 | 6:f1c0b9476c88 | 277 | T[20] = s10.C[0]; |
nylon0212 | 6:f1c0b9476c88 | 278 | T[21] = s10.C[1]; |
nylon0212 | 6:f1c0b9476c88 | 279 | T[22] = s11.C[0]; |
nylon0212 | 6:f1c0b9476c88 | 280 | T[23] = s11.C[1]; |
nylon0212 | 6:f1c0b9476c88 | 281 | T[24] = s12.C[0]; |
nylon0212 | 6:f1c0b9476c88 | 282 | T[25] = s12.C[1]; |
nylon0212 | 6:f1c0b9476c88 | 283 | T[26] = s13.C[0]; |
nylon0212 | 6:f1c0b9476c88 | 284 | T[27] = s13.C[1]; |
nylon0212 | 6:f1c0b9476c88 | 285 | T[28] = s14.C[0]; |
nylon0212 | 6:f1c0b9476c88 | 286 | T[29] = s14.C[1]; |
nylon0212 | 6:f1c0b9476c88 | 287 | T[30] = s15.C[0]; |
nylon0212 | 6:f1c0b9476c88 | 288 | T[31] = s15.C[1]; |
nylon0212 | 6:f1c0b9476c88 | 289 | T[32] = s16.C[0]; |
nylon0212 | 6:f1c0b9476c88 | 290 | T[33] = s16.C[1]; |
nylon0212 | 6:f1c0b9476c88 | 291 | T[34] = s17.C[0]; |
nylon0212 | 6:f1c0b9476c88 | 292 | T[35] = s17.C[1]; |
nylon0212 | 6:f1c0b9476c88 | 293 | T[36] = s18.C[0]; |
nylon0212 | 6:f1c0b9476c88 | 294 | T[37] = s18.C[1]; |
nylon0212 | 6:f1c0b9476c88 | 295 | T[38] = s19.C[0]; |
nylon0212 | 6:f1c0b9476c88 | 296 | T[39] = s19.C[1]; |
JJting | 0:c23e915f255b | 297 | |
nylon0212 | 6:f1c0b9476c88 | 298 | for(int k=0;k<40;k++) |
nylon0212 | 6:f1c0b9476c88 | 299 | { |
nylon0212 | 6:f1c0b9476c88 | 300 | uart.putc(T[k]); |
JJting | 0:c23e915f255b | 301 | } |
JJting | 0:c23e915f255b | 302 | } |
JJting | 0:c23e915f255b | 303 | |
nylon0212 | 6:f1c0b9476c88 | 304 | float lpf(float input, float output_old, float frequency) |
nylon0212 | 6:f1c0b9476c88 | 305 | { |
nylon0212 | 6:f1c0b9476c88 | 306 | float output = 0; |
nylon0212 | 6:f1c0b9476c88 | 307 | |
nylon0212 | 6:f1c0b9476c88 | 308 | output = (output_old + frequency*Tf*input) / (1 + frequency*Tf); |
nylon0212 | 6:f1c0b9476c88 | 309 | |
nylon0212 | 6:f1c0b9476c88 | 310 | return output; |
nylon0212 | 6:f1c0b9476c88 | 311 | } |
nylon0212 | 6:f1c0b9476c88 | 312 | |
JJting | 0:c23e915f255b | 313 | void D_angle_measure() |
JJting | 0:c23e915f255b | 314 | { |
JJting | 0:c23e915f255b | 315 | D_angle = dynamixelClass.readPosition(SERVO_ID); |
JJting | 0:c23e915f255b | 316 | |
JJting | 0:c23e915f255b | 317 | if (d == 0) { |
JJting | 0:c23e915f255b | 318 | D_Angle = 0; |
JJting | 0:c23e915f255b | 319 | D_angle_old = D_angle; |
JJting | 0:c23e915f255b | 320 | d++; |
JJting | 0:c23e915f255b | 321 | } else { |
JJting | 0:c23e915f255b | 322 | D_angle_dif = D_angle - D_angle_old; |
JJting | 3:c05acc05c3bd | 323 | |
JJting | 3:c05acc05c3bd | 324 | if (D_angle_dif > 4096/2) { |
JJting | 3:c05acc05c3bd | 325 | D_angle_dif = -(4096-(D_angle_dif)); |
JJting | 3:c05acc05c3bd | 326 | } else if (D_angle_dif < -4096/2) { |
JJting | 3:c05acc05c3bd | 327 | D_angle_dif = -(-4096-(D_angle_dif)); |
JJting | 3:c05acc05c3bd | 328 | } else { |
JJting | 3:c05acc05c3bd | 329 | D_angle_dif = D_angle_dif; |
JJting | 3:c05acc05c3bd | 330 | } |
JJting | 3:c05acc05c3bd | 331 | |
JJting | 0:c23e915f255b | 332 | D_Angle = D_Angle + D_angle_dif; |
JJting | 0:c23e915f255b | 333 | D_angle_old = D_angle; |
JJting | 0:c23e915f255b | 334 | } |
JJting | 0:c23e915f255b | 335 | } |
JJting | 0:c23e915f255b | 336 | |
JJting | 0:c23e915f255b | 337 | void find_torque() |
JJting | 0:c23e915f255b | 338 | { |
JJting | 1:2823a39f70a9 | 339 | |
JJting | 3:c05acc05c3bd | 340 | Angle_Dif = Angle*3-D_Angle; |
JJting | 3:c05acc05c3bd | 341 | angle_difference = Angle_Dif/4096.0f*2*PI; |
JJting | 1:2823a39f70a9 | 342 | // angle_difference = Angle_Dif/4096.0f*2*PI; |
JJting | 1:2823a39f70a9 | 343 | |
JJting | 0:c23e915f255b | 344 | torque_measured = angle_difference*ks; |
JJting | 1:2823a39f70a9 | 345 | } |
nylon0212 | 6:f1c0b9476c88 | 346 |