20181116

Dependencies:   MX28 mbed

Committer:
nylon0212
Date:
Fri Nov 16 02:09:00 2018 +0000
Revision:
11:cd28cb84fd81
Parent:
10:6a9de32601b1
20181116

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nylon0212 9:07de3af99031 1 #include "mbed.h" //不用gyro的data,只要輸出兩個imu的acce的xyz資料即可
JJting 0:c23e915f255b 2 #include "encoder.h"
nylon0212 9:07de3af99031 3 //#include "Mx28.h"
nylon0212 9:07de3af99031 4 //#include "PID.h"
JJting 4:f19e7669d1b5 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 4:f19e7669d1b5 15 #define _PI 3.14159265f
JJting 0:c23e915f255b 16 //***************************************************************
JJting 0:c23e915f255b 17
JJting 0:c23e915f255b 18 Serial uart(USBTX, USBRX);
nylon0212 9:07de3af99031 19 //Serial uart(D10,D2); // TX : D10 RX : D2 // bluetooth
open4416 10:6a9de32601b1 20 AnalogIn EMG(PC_4); //
open4416 10:6a9de32601b1 21
nylon0212 9:07de3af99031 22 /*IMU*******************************************************************/
JJting 4:f19e7669d1b5 23 LSM9DS1 imu(D14, D15); //SDA SCL
nylon0212 9:07de3af99031 24 //LSM9DS1 imu2(PC_9,PA_8); //SDA SCL
JJting 4:f19e7669d1b5 25 void init_IMU();
JJting 4:f19e7669d1b5 26 int16_t Gyro_axis_data[6] = {0}; // X, Y, Z axis
JJting 4:f19e7669d1b5 27 int16_t Acce_axis_data[6] = {0}; // X, Y, Z axis
nylon0212 9:07de3af99031 28 float Acce_axis_data_f[6] = {0}; //_f代表經過低通濾波的資料
JJting 4:f19e7669d1b5 29 float Acce_axis_data_f_old[6] = {0};
JJting 4:f19e7669d1b5 30 float Gyro_axis_data_f[6] = {0};
JJting 4:f19e7669d1b5 31 float Gyro_axis_data_f_old[6] = {0};
JJting 4:f19e7669d1b5 32
JJting 0:c23e915f255b 33
JJting 0:c23e915f255b 34 // Timer
JJting 0:c23e915f255b 35 Ticker timer1;
nylon0212 11:cd28cb84fd81 36 float ITR_time1 = 4000.0; //timer interrupt unit:us 多少us計時一次 4毫秒
nylon0212 9:07de3af99031 37 float Ts = ITR_time1/1000000; //控馬達的某個時間參數 不用理他
JJting 0:c23e915f255b 38
JJting 3:98cdee5d9b63 39 // EMG
nylon0212 9:07de3af99031 40 float lpf(float input, float output_old, float frequency); //low pass filter
JJting 3:98cdee5d9b63 41 float emg_value;
JJting 3:98cdee5d9b63 42 float emg_value_f;
JJting 3:98cdee5d9b63 43 float emg_value_f_old;
nylon0212 9:07de3af99031 44 float Tf = ITR_time1/1000000; // 低通濾波的採樣週期
JJting 3:98cdee5d9b63 45
JJting 0:c23e915f255b 46 // uart_tx
nylon0212 9:07de3af99031 47 union splitter { //將data切割為兩個byte
JJting 0:c23e915f255b 48 short j;
JJting 0:c23e915f255b 49 char C[2];
JJting 0:c23e915f255b 50 // C[0] is lowbyte of j, C[1] is highbyte of j
JJting 0:c23e915f255b 51 };
nylon0212 9:07de3af99031 52 uint8_t T[16] = {255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
nylon0212 9:07de3af99031 53 // T[16]中的16是2+14,2為start btye 255 255,14為要傳7個參數到電腦,拆成high byte和low byte,所以是7*2=14
nylon0212 9:07de3af99031 54 // 若要更改傳到電腦的參數個數,則改x*2=y,x為要傳的參數個數,y為char T[]裡面要有多少個0
JJting 0:c23e915f255b 55 int i = 0;
JJting 0:c23e915f255b 56
JJting 0:c23e915f255b 57 // function
JJting 0:c23e915f255b 58 void init_UART();
nylon0212 11:cd28cb84fd81 59 //void init_TIMER();
nylon0212 11:cd28cb84fd81 60 //void timer1_ITR();
nylon0212 9:07de3af99031 61 void uart_tx(); // 傳data到電腦
nylon0212 9:07de3af99031 62 /**************************************************************************/
JJting 0:c23e915f255b 63 int main()
JJting 0:c23e915f255b 64 {
nylon0212 9:07de3af99031 65 // wait_ms(500);
JJting 0:c23e915f255b 66 // initial sensor
nylon0212 11:cd28cb84fd81 67 init_SPI_encoder();
nylon0212 11:cd28cb84fd81 68 init_encoder();
open4416 10:6a9de32601b1 69 init_UART();
open4416 10:6a9de32601b1 70
JJting 4:f19e7669d1b5 71 init_IMU();
JJting 0:c23e915f255b 72
open4416 10:6a9de32601b1 73 // init_TIMER();
open4416 10:6a9de32601b1 74
open4416 10:6a9de32601b1 75 while(1) {
open4416 10:6a9de32601b1 76 // EMG
open4416 10:6a9de32601b1 77 //emg_value = EMG.read();
open4416 10:6a9de32601b1 78 // emg_value_f = lpf(emg_value,emg_value_f_old,15);
open4416 10:6a9de32601b1 79 // emg_value_f_old = emg_value_f;
open4416 10:6a9de32601b1 80
open4416 10:6a9de32601b1 81 // IMU
nylon0212 11:cd28cb84fd81 82 imu.readAccel();
nylon0212 11:cd28cb84fd81 83 imu.readGyro();
open4416 10:6a9de32601b1 84 // imu2.readAccel();
open4416 10:6a9de32601b1 85 // imu2.readGyro();
open4416 10:6a9de32601b1 86
open4416 10:6a9de32601b1 87 Acce_axis_data[0] = imu.ax*Acce_gain_x;
open4416 10:6a9de32601b1 88 Acce_axis_data[1] = imu.ay*Acce_gain_y;
open4416 10:6a9de32601b1 89 Acce_axis_data[2] = imu.az*Acce_gain_z;
open4416 10:6a9de32601b1 90 // Acce_axis_data[3] = -imu2.ax*Acce_gain_x_2;
open4416 10:6a9de32601b1 91 // Acce_axis_data[4] = imu2.az*Acce_gain_y_2;
open4416 10:6a9de32601b1 92 // Acce_axis_data[5] = imu2.ay*Acce_gain_z_2;
JJting 0:c23e915f255b 93
open4416 10:6a9de32601b1 94 Gyro_axis_data[0] = imu.gx*Gyro_gain_x;
open4416 10:6a9de32601b1 95 Gyro_axis_data[1] = imu.gy*Gyro_gain_y;
open4416 10:6a9de32601b1 96 Gyro_axis_data[2] = imu.gz*Gyro_gain_z;
open4416 10:6a9de32601b1 97 // Gyro_axis_data[3] = -imu2.gx*Gyro_gain_x_2;
open4416 10:6a9de32601b1 98 // Gyro_axis_data[4] = imu2.gz*Gyro_gain_y_2;
open4416 10:6a9de32601b1 99 // Gyro_axis_data[5] = imu2.gy*Gyro_gain_z_2;
open4416 10:6a9de32601b1 100
nylon0212 11:cd28cb84fd81 101 for(i=0; i<6; i++) {
nylon0212 11:cd28cb84fd81 102 Acce_axis_data_f[i] = lpf(Acce_axis_data[i],Acce_axis_data_f_old[i],15);
nylon0212 11:cd28cb84fd81 103 Acce_axis_data_f_old[i] = Acce_axis_data_f[i];
nylon0212 11:cd28cb84fd81 104 Gyro_axis_data_f[i] = lpf(Gyro_axis_data[i],Gyro_axis_data_f_old[i],15);
nylon0212 11:cd28cb84fd81 105 Gyro_axis_data_f_old[i] = Gyro_axis_data_f[i];
nylon0212 11:cd28cb84fd81 106 }
open4416 10:6a9de32601b1 107 // int16_t shit2 = imu.ax_raw;
open4416 10:6a9de32601b1 108 // uart.printf("%d\n\r", shit2);
nylon0212 11:cd28cb84fd81 109 // uart.printf("x: %.4f, y: %.4f, z: %.4f\n\r", imu.ax, imu.ay, imu.az);
nylon0212 11:cd28cb84fd81 110 uart_tx();
open4416 10:6a9de32601b1 111
nylon0212 11:cd28cb84fd81 112 // wait_ms(500);
open4416 10:6a9de32601b1 113 }
JJting 0:c23e915f255b 114 }
JJting 0:c23e915f255b 115
JJting 4:f19e7669d1b5 116 void init_IMU()
JJting 4:f19e7669d1b5 117 {
open4416 10:6a9de32601b1 118 uint16_t shit;
open4416 10:6a9de32601b1 119 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 9:07de3af99031 120 // 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);
open4416 10:6a9de32601b1 121 if(shit != 0x683D) {
open4416 10:6a9de32601b1 122 while(1) {
open4416 10:6a9de32601b1 123 uart.printf("IMU error\n\r");
open4416 10:6a9de32601b1 124 }
open4416 10:6a9de32601b1 125 }
open4416 10:6a9de32601b1 126 uart.printf("IMU init success\n\r");
open4416 10:6a9de32601b1 127
open4416 10:6a9de32601b1 128 // uart.printf("%d\n\r", shit);
JJting 0:c23e915f255b 129 }
JJting 0:c23e915f255b 130
JJting 0:c23e915f255b 131 void init_UART()
JJting 0:c23e915f255b 132 {
JJting 0:c23e915f255b 133 uart.baud(115200);
JJting 0:c23e915f255b 134 }
JJting 0:c23e915f255b 135
nylon0212 11:cd28cb84fd81 136 //void init_TIMER()
nylon0212 11:cd28cb84fd81 137 //{
nylon0212 11:cd28cb84fd81 138 // timer1.attach_us(&timer1_ITR, ITR_time1);
nylon0212 11:cd28cb84fd81 139 //}
JJting 0:c23e915f255b 140
nylon0212 11:cd28cb84fd81 141 //void timer1_ITR() //開始讀取資料
nylon0212 11:cd28cb84fd81 142 //{
JJting 5:4dbed091ec5a 143 // EMG
nylon0212 9:07de3af99031 144 //emg_value = EMG.read();
nylon0212 9:07de3af99031 145 // emg_value_f = lpf(emg_value,emg_value_f_old,15);
nylon0212 9:07de3af99031 146 // emg_value_f_old = emg_value_f;
JJting 5:4dbed091ec5a 147
JJting 5:4dbed091ec5a 148 // IMU
nylon0212 11:cd28cb84fd81 149 // imu.readAccel();
nylon0212 11:cd28cb84fd81 150
nylon0212 9:07de3af99031 151 // imu.readGyro();
nylon0212 9:07de3af99031 152 // imu2.readAccel();
nylon0212 9:07de3af99031 153 // imu2.readGyro();
nylon0212 9:07de3af99031 154
nylon0212 9:07de3af99031 155 //Acce_axis_data[0] = imu.ax*Acce_gain_x;
nylon0212 9:07de3af99031 156 // Acce_axis_data[1] = imu.ay*Acce_gain_y;
nylon0212 9:07de3af99031 157 // Acce_axis_data[2] = imu.az*Acce_gain_z;
nylon0212 9:07de3af99031 158 // Acce_axis_data[3] = -imu2.ax*Acce_gain_x_2;
nylon0212 9:07de3af99031 159 // Acce_axis_data[4] = imu2.az*Acce_gain_y_2;
nylon0212 9:07de3af99031 160 // Acce_axis_data[5] = imu2.ay*Acce_gain_z_2;
JJting 5:4dbed091ec5a 161
nylon0212 9:07de3af99031 162 //Gyro_axis_data[0] = imu.gx*Gyro_gain_x;
nylon0212 9:07de3af99031 163 // Gyro_axis_data[1] = imu.gy*Gyro_gain_y;
nylon0212 9:07de3af99031 164 // Gyro_axis_data[2] = imu.gz*Gyro_gain_z;
nylon0212 9:07de3af99031 165 // Gyro_axis_data[3] = -imu2.gx*Gyro_gain_x_2;
nylon0212 9:07de3af99031 166 // Gyro_axis_data[4] = imu2.gz*Gyro_gain_y_2;
nylon0212 9:07de3af99031 167 // Gyro_axis_data[5] = imu2.gy*Gyro_gain_z_2;
JJting 5:4dbed091ec5a 168
nylon0212 9:07de3af99031 169 //for(i=0; i<6; i++) {
nylon0212 9:07de3af99031 170 // Acce_axis_data_f[i] = lpf(Acce_axis_data[i],Acce_axis_data_f_old[i],15);
nylon0212 9:07de3af99031 171 // Acce_axis_data_f_old[i] = Acce_axis_data_f[i];
nylon0212 9:07de3af99031 172 // Gyro_axis_data_f[i] = lpf(Gyro_axis_data[i],Gyro_axis_data_f_old[i],15);
nylon0212 9:07de3af99031 173 // Gyro_axis_data_f_old[i] = Gyro_axis_data_f[i];
nylon0212 9:07de3af99031 174 // }
open4416 10:6a9de32601b1 175 // uart.printf("x: %7.4f, y: %7.4f, z: %7.4f\n\r",imu.ax, imu.ay, imu.az);
nylon0212 9:07de3af99031 176 //uart_tx();
JJting 5:4dbed091ec5a 177
JJting 7:5cb292622961 178 // wait_ms(1);
nylon0212 11:cd28cb84fd81 179 //}
JJting 0:c23e915f255b 180
nylon0212 9:07de3af99031 181 void uart_tx() //分割資料
JJting 0:c23e915f255b 182 {
JJting 0:c23e915f255b 183 splitter s1;
JJting 0:c23e915f255b 184 splitter s2;
JJting 0:c23e915f255b 185 splitter s3;
JJting 0:c23e915f255b 186 splitter s4;
JJting 0:c23e915f255b 187 splitter s5;
JJting 0:c23e915f255b 188 splitter s6;
JJting 0:c23e915f255b 189 splitter s7;
nylon0212 9:07de3af99031 190 // splitter s8;
JJting 0:c23e915f255b 191
nylon0212 9:07de3af99031 192 s1.j = Acce_axis_data_f[0]; // 0x6161;//
nylon0212 9:07de3af99031 193 s2.j = Acce_axis_data_f[1];
nylon0212 9:07de3af99031 194 s3.j = Acce_axis_data_f[2];
nylon0212 9:07de3af99031 195 s4.j = Acce_axis_data_f[3];
nylon0212 9:07de3af99031 196 s5.j = Acce_axis_data_f[4];
nylon0212 9:07de3af99031 197 s6.j = Acce_axis_data_f[5];
nylon0212 9:07de3af99031 198 s7.j = emg_value_f;
nylon0212 9:07de3af99031 199 // s8.j = 1; // 若要傳的參數不足8個,則隨意打一個常數即可
JJting 0:c23e915f255b 200
nylon0212 11:cd28cb84fd81 201 T[2] = s1.C[0];
nylon0212 11:cd28cb84fd81 202 T[3] = s1.C[1];
JJting 0:c23e915f255b 203 T[4] = s2.C[0];
JJting 0:c23e915f255b 204 T[5] = s2.C[1];
JJting 0:c23e915f255b 205 T[6] = s3.C[0];
JJting 0:c23e915f255b 206 T[7] = s3.C[1];
JJting 0:c23e915f255b 207 T[8] = s4.C[0];
JJting 0:c23e915f255b 208 T[9] = s4.C[1];
JJting 0:c23e915f255b 209 T[10] = s5.C[0];
JJting 0:c23e915f255b 210 T[11] = s5.C[1];
JJting 0:c23e915f255b 211 T[12] = s6.C[0];
JJting 0:c23e915f255b 212 T[13] = s6.C[1];
JJting 0:c23e915f255b 213 T[14] = s7.C[0];
JJting 0:c23e915f255b 214 T[15] = s7.C[1];
open4416 10:6a9de32601b1 215
open4416 10:6a9de32601b1 216
open4416 10:6a9de32601b1 217
open4416 10:6a9de32601b1 218
JJting 7:5cb292622961 219
nylon0212 11:cd28cb84fd81 220 uart.putc(T[0]);
nylon0212 11:cd28cb84fd81 221 uart.putc(T[1]);
nylon0212 11:cd28cb84fd81 222 uart.putc(T[2]);
nylon0212 11:cd28cb84fd81 223 uart.putc(T[3]);
nylon0212 11:cd28cb84fd81 224 uart.putc(T[4]);
nylon0212 11:cd28cb84fd81 225 uart.putc(T[5]);
nylon0212 11:cd28cb84fd81 226 uart.putc(T[6]);
nylon0212 11:cd28cb84fd81 227 uart.putc(T[7]);
nylon0212 11:cd28cb84fd81 228 uart.putc(T[8]);
nylon0212 11:cd28cb84fd81 229 uart.putc(T[9]);
nylon0212 11:cd28cb84fd81 230 uart.putc(T[10]);
nylon0212 11:cd28cb84fd81 231 uart.putc(T[11]);
nylon0212 11:cd28cb84fd81 232 uart.putc(T[12]);
nylon0212 11:cd28cb84fd81 233 uart.putc(T[13]);
nylon0212 11:cd28cb84fd81 234 uart.putc(T[14]);
nylon0212 11:cd28cb84fd81 235 uart.putc(T[15]);
JJting 1:2823a39f70a9 236
nylon0212 9:07de3af99031 237 // while(1) { //開始傳到USB
nylon0212 9:07de3af99031 238 // if (uart.writeable() == 1) {
nylon0212 9:07de3af99031 239 // uart.putc(T[i]);
nylon0212 9:07de3af99031 240 // i++;
nylon0212 9:07de3af99031 241 // }
nylon0212 9:07de3af99031 242 // if (i >= sizeof(T)) {
nylon0212 9:07de3af99031 243 // i = 0;
nylon0212 9:07de3af99031 244 // break;
nylon0212 9:07de3af99031 245 // }
JJting 6:f48c51662e27 246 // }
JJting 1:2823a39f70a9 247 }
JJting 3:98cdee5d9b63 248
JJting 3:98cdee5d9b63 249 float lpf(float input, float output_old, float frequency)
JJting 3:98cdee5d9b63 250 {
JJting 3:98cdee5d9b63 251 float output = 0;
JJting 3:98cdee5d9b63 252
JJting 3:98cdee5d9b63 253 output = (output_old + frequency*Tf*input) / (1 + frequency*Tf);
JJting 3:98cdee5d9b63 254
JJting 3:98cdee5d9b63 255 return output;
nylon0212 9:07de3af99031 256 }
nylon0212 9:07de3af99031 257
nylon0212 9:07de3af99031 258 //有估測器有delay,丟資料給機器學習時就不是及時動作,所以之後決定直接丟資料