NM500 NeuroShield and MPU6050 IMU Test Example
Dependencies: mbed NeuroShield
main.cpp@2:28290f9caf51, 2020-02-11 (annotated)
- Committer:
- nepes_ai
- Date:
- Tue Feb 11 00:57:21 2020 +0000
- Revision:
- 2:28290f9caf51
- Parent:
- 1:fb672eb52bd6
Release version 1.1.5
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
nepes_ai | 0:123b50ed3ad9 | 1 | /****************************************************************************** |
nepes_ai | 1:fb672eb52bd6 | 2 | * NM500 NeuroShield Board and mpu6050 imu Test example |
nepes_ai | 2:28290f9caf51 | 3 | * revision 1.1.5, 2020/02/11 |
nepes_ai | 0:123b50ed3ad9 | 4 | * Copyright (c) 2017 nepes inc. |
nepes_ai | 1:fb672eb52bd6 | 5 | * |
nepes_ai | 2:28290f9caf51 | 6 | * Please use the NeuroShield library v1.1.4 or later |
nepes_ai | 0:123b50ed3ad9 | 7 | ******************************************************************************/ |
nepes_ai | 0:123b50ed3ad9 | 8 | |
nepes_ai | 0:123b50ed3ad9 | 9 | #include "mbed.h" |
nepes_ai | 0:123b50ed3ad9 | 10 | #include <NeuroShield.h> |
nepes_ai | 0:123b50ed3ad9 | 11 | #include <NeuroShieldSPI.h> |
nepes_ai | 0:123b50ed3ad9 | 12 | #include <mpu6050.h> |
nepes_ai | 0:123b50ed3ad9 | 13 | |
nepes_ai | 0:123b50ed3ad9 | 14 | // for NM500 |
nepes_ai | 0:123b50ed3ad9 | 15 | #define MOTION_REPEAT_COUNT 3 // number of samples to assemble a vector |
nepes_ai | 0:123b50ed3ad9 | 16 | #define MOTION_SIGNAL_COUNT 8 // d_ax, d_ay, d_az, d_gx, d_gy, d_gz, da, dg |
nepes_ai | 0:123b50ed3ad9 | 17 | #define MOTION_CAPTURE_COUNT 20 |
nepes_ai | 0:123b50ed3ad9 | 18 | |
nepes_ai | 0:123b50ed3ad9 | 19 | #define DEFAULT_MAXIF 500 |
nepes_ai | 0:123b50ed3ad9 | 20 | |
nepes_ai | 0:123b50ed3ad9 | 21 | NeuroShield hnn; |
nepes_ai | 0:123b50ed3ad9 | 22 | MPU6050 mpu(0x68, PB_9, PB_8); // SDA:(D14=PB_9) SCL(D15=PB_8) <= SB143/SB138 must close for I2C on A4/A5 and SB147/SB157 must open!!! |
nepes_ai | 0:123b50ed3ad9 | 23 | Serial pc(USBTX, USBRX); |
nepes_ai | 0:123b50ed3ad9 | 24 | |
nepes_ai | 0:123b50ed3ad9 | 25 | DigitalOut sdcard_ss(D6); // SDCARD_SSn |
nepes_ai | 0:123b50ed3ad9 | 26 | DigitalOut arduino_con(D5); // SPI_SEL |
nepes_ai | 0:123b50ed3ad9 | 27 | |
nepes_ai | 0:123b50ed3ad9 | 28 | int16_t ax, ay, az, gx, gy, gz; |
nepes_ai | 0:123b50ed3ad9 | 29 | |
nepes_ai | 0:123b50ed3ad9 | 30 | uint8_t learn_cat = 0; // category to learn |
nepes_ai | 0:123b50ed3ad9 | 31 | uint8_t prev_cat = 0; // previously recognized category |
nepes_ai | 0:123b50ed3ad9 | 32 | uint16_t dist, cat, nid, nsr, ncount; // response from the neurons |
nepes_ai | 0:123b50ed3ad9 | 33 | uint16_t prev_ncount = 0; |
nepes_ai | 1:fb672eb52bd6 | 34 | uint16_t fpga_version; |
nepes_ai | 0:123b50ed3ad9 | 35 | |
nepes_ai | 0:123b50ed3ad9 | 36 | int16_t min_a = 0xFFFF, max_a = 0, min_g = 0xFFFF, max_g = 0, da = 0, dg = 0; // reset, or not, at each feature extraction |
nepes_ai | 0:123b50ed3ad9 | 37 | |
nepes_ai | 0:123b50ed3ad9 | 38 | uint8_t vector[MOTION_REPEAT_COUNT * MOTION_SIGNAL_COUNT]; // vector holding the pattern to learn or recognize |
nepes_ai | 0:123b50ed3ad9 | 39 | |
nepes_ai | 0:123b50ed3ad9 | 40 | void mpu6050Calibration() |
nepes_ai | 0:123b50ed3ad9 | 41 | { |
nepes_ai | 0:123b50ed3ad9 | 42 | int i, j; |
nepes_ai | 0:123b50ed3ad9 | 43 | long sum_ax = 0, sum_ay = 0, sum_az = 0, sum_gx = 0, sum_gy = 0, sum_gz = 0; |
nepes_ai | 0:123b50ed3ad9 | 44 | int mean_ax, mean_ay, mean_az, mean_gx, mean_gy, mean_gz; |
nepes_ai | 0:123b50ed3ad9 | 45 | int ax_offset, ay_offset, az_offset, gx_offset, gy_offset, gz_offset; |
nepes_ai | 0:123b50ed3ad9 | 46 | |
nepes_ai | 0:123b50ed3ad9 | 47 | for (i = 0; i < 100; i++) { |
nepes_ai | 0:123b50ed3ad9 | 48 | mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); |
nepes_ai | 0:123b50ed3ad9 | 49 | } |
nepes_ai | 0:123b50ed3ad9 | 50 | |
nepes_ai | 0:123b50ed3ad9 | 51 | for (j = 0; j < 5; j++) { |
nepes_ai | 0:123b50ed3ad9 | 52 | for (i = 0; i < 100; i++) { |
nepes_ai | 0:123b50ed3ad9 | 53 | mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); |
nepes_ai | 0:123b50ed3ad9 | 54 | sum_ax += ax; |
nepes_ai | 0:123b50ed3ad9 | 55 | sum_ay += ay; |
nepes_ai | 0:123b50ed3ad9 | 56 | sum_az += az; |
nepes_ai | 0:123b50ed3ad9 | 57 | sum_gx += gx; |
nepes_ai | 0:123b50ed3ad9 | 58 | sum_gy += gy; |
nepes_ai | 0:123b50ed3ad9 | 59 | sum_gz += gz; |
nepes_ai | 0:123b50ed3ad9 | 60 | } |
nepes_ai | 0:123b50ed3ad9 | 61 | |
nepes_ai | 0:123b50ed3ad9 | 62 | mean_ax = sum_ax / 100; |
nepes_ai | 0:123b50ed3ad9 | 63 | mean_ay = sum_ay / 100; |
nepes_ai | 0:123b50ed3ad9 | 64 | mean_az = sum_az / 100; |
nepes_ai | 0:123b50ed3ad9 | 65 | mean_gx = sum_gx / 100; |
nepes_ai | 0:123b50ed3ad9 | 66 | mean_gy = sum_gy / 100; |
nepes_ai | 0:123b50ed3ad9 | 67 | mean_gz = sum_gz / 100; |
nepes_ai | 0:123b50ed3ad9 | 68 | |
nepes_ai | 0:123b50ed3ad9 | 69 | // MPU6050_GYRO_FS_1000 : offset = (-1) * mean_g |
nepes_ai | 0:123b50ed3ad9 | 70 | // MPU6050_ACCEL_FS_8 : offset = (-0.5) * mean_a |
nepes_ai | 0:123b50ed3ad9 | 71 | ax_offset = (-mean_ax) / 2; |
nepes_ai | 0:123b50ed3ad9 | 72 | ay_offset = (-mean_ay) / 2; |
nepes_ai | 0:123b50ed3ad9 | 73 | az_offset = (-mean_az) / 2; |
nepes_ai | 0:123b50ed3ad9 | 74 | gx_offset = -mean_gx; |
nepes_ai | 0:123b50ed3ad9 | 75 | gy_offset = -mean_gy; |
nepes_ai | 0:123b50ed3ad9 | 76 | gz_offset = -mean_gz; |
nepes_ai | 0:123b50ed3ad9 | 77 | |
nepes_ai | 0:123b50ed3ad9 | 78 | // set |
nepes_ai | 0:123b50ed3ad9 | 79 | mpu.setXAccelOffset(ax_offset); |
nepes_ai | 0:123b50ed3ad9 | 80 | mpu.setYAccelOffset(ay_offset); |
nepes_ai | 0:123b50ed3ad9 | 81 | mpu.setZAccelOffset(az_offset); |
nepes_ai | 0:123b50ed3ad9 | 82 | mpu.setXGyroOffset(gx_offset); |
nepes_ai | 0:123b50ed3ad9 | 83 | mpu.setYGyroOffset(gy_offset); |
nepes_ai | 0:123b50ed3ad9 | 84 | mpu.setZGyroOffset(gz_offset); |
nepes_ai | 0:123b50ed3ad9 | 85 | } |
nepes_ai | 0:123b50ed3ad9 | 86 | } |
nepes_ai | 0:123b50ed3ad9 | 87 | |
nepes_ai | 0:123b50ed3ad9 | 88 | void extractFeatureVector() |
nepes_ai | 0:123b50ed3ad9 | 89 | { |
nepes_ai | 0:123b50ed3ad9 | 90 | int i; |
nepes_ai | 0:123b50ed3ad9 | 91 | int16_t min_ax, min_ay, min_az, max_ax, max_ay, max_az; |
nepes_ai | 0:123b50ed3ad9 | 92 | int16_t min_gx, min_gy, min_gz, max_gx, max_gy, max_gz; |
nepes_ai | 0:123b50ed3ad9 | 93 | uint32_t norm_ax, norm_ay, norm_az, norm_gx, norm_gy, norm_gz; |
nepes_ai | 0:123b50ed3ad9 | 94 | int32_t d_ax, d_ay, d_az, d_gx, d_gy, d_gz; |
nepes_ai | 0:123b50ed3ad9 | 95 | int32_t da_local, dg_local; |
nepes_ai | 0:123b50ed3ad9 | 96 | |
nepes_ai | 0:123b50ed3ad9 | 97 | mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); |
nepes_ai | 0:123b50ed3ad9 | 98 | |
nepes_ai | 0:123b50ed3ad9 | 99 | max_ax = min_ax = ax; |
nepes_ai | 0:123b50ed3ad9 | 100 | max_ay = min_ay = ay; |
nepes_ai | 0:123b50ed3ad9 | 101 | max_az = min_az = az; |
nepes_ai | 0:123b50ed3ad9 | 102 | max_gx = min_gx = gx; |
nepes_ai | 0:123b50ed3ad9 | 103 | max_gy = min_gy = gy; |
nepes_ai | 0:123b50ed3ad9 | 104 | max_gz = min_gz = gz; |
nepes_ai | 0:123b50ed3ad9 | 105 | |
nepes_ai | 0:123b50ed3ad9 | 106 | for (i = 0; i < MOTION_CAPTURE_COUNT; i++) { |
nepes_ai | 0:123b50ed3ad9 | 107 | mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); |
nepes_ai | 0:123b50ed3ad9 | 108 | |
nepes_ai | 0:123b50ed3ad9 | 109 | if (ax < min_ax) |
nepes_ai | 0:123b50ed3ad9 | 110 | min_ax = ax; |
nepes_ai | 0:123b50ed3ad9 | 111 | else if (ax > max_ax) |
nepes_ai | 0:123b50ed3ad9 | 112 | max_ax = ax; |
nepes_ai | 0:123b50ed3ad9 | 113 | |
nepes_ai | 0:123b50ed3ad9 | 114 | if (ay < min_ay) |
nepes_ai | 0:123b50ed3ad9 | 115 | min_ay = ay; |
nepes_ai | 0:123b50ed3ad9 | 116 | else if(ay > max_ay) |
nepes_ai | 0:123b50ed3ad9 | 117 | max_ay = ay; |
nepes_ai | 0:123b50ed3ad9 | 118 | |
nepes_ai | 0:123b50ed3ad9 | 119 | if (az < min_az) |
nepes_ai | 0:123b50ed3ad9 | 120 | min_az = az; |
nepes_ai | 0:123b50ed3ad9 | 121 | else if (az > max_az) |
nepes_ai | 0:123b50ed3ad9 | 122 | max_az = az; |
nepes_ai | 0:123b50ed3ad9 | 123 | |
nepes_ai | 0:123b50ed3ad9 | 124 | if (gx < min_gx) |
nepes_ai | 0:123b50ed3ad9 | 125 | min_gx = gx; |
nepes_ai | 0:123b50ed3ad9 | 126 | else if (gx > max_gx) |
nepes_ai | 0:123b50ed3ad9 | 127 | max_gx = gx; |
nepes_ai | 0:123b50ed3ad9 | 128 | |
nepes_ai | 0:123b50ed3ad9 | 129 | if (gy < min_gy) |
nepes_ai | 0:123b50ed3ad9 | 130 | min_gy = gy; |
nepes_ai | 0:123b50ed3ad9 | 131 | else if (gy > max_gy) |
nepes_ai | 0:123b50ed3ad9 | 132 | max_gy = gy; |
nepes_ai | 0:123b50ed3ad9 | 133 | |
nepes_ai | 0:123b50ed3ad9 | 134 | if (gz < min_gz) |
nepes_ai | 0:123b50ed3ad9 | 135 | min_gz = gz; |
nepes_ai | 0:123b50ed3ad9 | 136 | else if (gz > max_gz) |
nepes_ai | 0:123b50ed3ad9 | 137 | max_gz = gz; |
nepes_ai | 0:123b50ed3ad9 | 138 | } |
nepes_ai | 0:123b50ed3ad9 | 139 | |
nepes_ai | 0:123b50ed3ad9 | 140 | d_ax = max_ax - min_ax; |
nepes_ai | 0:123b50ed3ad9 | 141 | d_ay = max_ay - min_ay; |
nepes_ai | 0:123b50ed3ad9 | 142 | d_az = max_az - min_az; |
nepes_ai | 0:123b50ed3ad9 | 143 | |
nepes_ai | 0:123b50ed3ad9 | 144 | d_gx = max_gx - min_gx; |
nepes_ai | 0:123b50ed3ad9 | 145 | d_gy = max_gy - min_gy; |
nepes_ai | 0:123b50ed3ad9 | 146 | d_gz = max_gz - min_gz; |
nepes_ai | 0:123b50ed3ad9 | 147 | |
nepes_ai | 0:123b50ed3ad9 | 148 | da_local = d_ax; |
nepes_ai | 0:123b50ed3ad9 | 149 | if (d_ay > da_local) |
nepes_ai | 0:123b50ed3ad9 | 150 | da_local = d_ay; |
nepes_ai | 0:123b50ed3ad9 | 151 | if (d_az > da_local) |
nepes_ai | 0:123b50ed3ad9 | 152 | da_local = d_az; |
nepes_ai | 0:123b50ed3ad9 | 153 | |
nepes_ai | 0:123b50ed3ad9 | 154 | dg_local = d_gx; |
nepes_ai | 0:123b50ed3ad9 | 155 | if (d_gy > dg_local) |
nepes_ai | 0:123b50ed3ad9 | 156 | dg_local = d_gy; |
nepes_ai | 0:123b50ed3ad9 | 157 | if (d_gz > dg_local) |
nepes_ai | 0:123b50ed3ad9 | 158 | dg_local = d_gz; |
nepes_ai | 0:123b50ed3ad9 | 159 | |
nepes_ai | 0:123b50ed3ad9 | 160 | norm_ax = d_ax; norm_ax = norm_ax * 255 / da_local; |
nepes_ai | 0:123b50ed3ad9 | 161 | norm_ay = d_ay; norm_ay = norm_ay * 255 / da_local; |
nepes_ai | 0:123b50ed3ad9 | 162 | norm_az = d_az; norm_az = norm_az * 255 / da_local; |
nepes_ai | 0:123b50ed3ad9 | 163 | |
nepes_ai | 0:123b50ed3ad9 | 164 | norm_gx = d_gx; norm_gx = norm_gx * 255 / dg_local; |
nepes_ai | 0:123b50ed3ad9 | 165 | norm_gy = d_gy; norm_gy = norm_gy * 255 / dg_local; |
nepes_ai | 0:123b50ed3ad9 | 166 | norm_gz = d_gz; norm_gz = norm_gz * 255 / dg_local; |
nepes_ai | 0:123b50ed3ad9 | 167 | |
nepes_ai | 0:123b50ed3ad9 | 168 | for (i = 0; i < MOTION_REPEAT_COUNT; i++) { |
nepes_ai | 0:123b50ed3ad9 | 169 | vector[i * MOTION_SIGNAL_COUNT] = norm_ax & 0x00ff; |
nepes_ai | 0:123b50ed3ad9 | 170 | vector[(i * MOTION_SIGNAL_COUNT) + 1] = norm_ay & 0x00ff; |
nepes_ai | 0:123b50ed3ad9 | 171 | vector[(i * MOTION_SIGNAL_COUNT) + 2] = norm_az & 0x00ff; |
nepes_ai | 0:123b50ed3ad9 | 172 | vector[(i * MOTION_SIGNAL_COUNT) + 3] = norm_gx & 0x00ff; |
nepes_ai | 0:123b50ed3ad9 | 173 | vector[(i * MOTION_SIGNAL_COUNT) + 4] = norm_gy & 0x00ff; |
nepes_ai | 0:123b50ed3ad9 | 174 | vector[(i * MOTION_SIGNAL_COUNT) + 5] = norm_gz & 0x00ff; |
nepes_ai | 0:123b50ed3ad9 | 175 | if (da_local >= 4096) |
nepes_ai | 0:123b50ed3ad9 | 176 | vector[(i * MOTION_SIGNAL_COUNT) + 6] = 0xff; |
nepes_ai | 0:123b50ed3ad9 | 177 | else |
nepes_ai | 0:123b50ed3ad9 | 178 | vector[(i * MOTION_SIGNAL_COUNT) + 6] = ((da_local >> 4) & 0x00ff); |
nepes_ai | 0:123b50ed3ad9 | 179 | if (dg_local >= 4096) |
nepes_ai | 0:123b50ed3ad9 | 180 | vector[(i * MOTION_SIGNAL_COUNT) + 7] = 0xff; |
nepes_ai | 0:123b50ed3ad9 | 181 | else |
nepes_ai | 0:123b50ed3ad9 | 182 | vector[(i * MOTION_SIGNAL_COUNT) + 7] = ((dg_local >> 4) & 0x00ff); |
nepes_ai | 0:123b50ed3ad9 | 183 | } |
nepes_ai | 0:123b50ed3ad9 | 184 | } |
nepes_ai | 0:123b50ed3ad9 | 185 | |
nepes_ai | 0:123b50ed3ad9 | 186 | int main() |
nepes_ai | 0:123b50ed3ad9 | 187 | { |
nepes_ai | 2:28290f9caf51 | 188 | int input_key[2]; |
nepes_ai | 0:123b50ed3ad9 | 189 | |
nepes_ai | 0:123b50ed3ad9 | 190 | arduino_con = LOW; |
nepes_ai | 0:123b50ed3ad9 | 191 | sdcard_ss = HIGH; |
nepes_ai | 0:123b50ed3ad9 | 192 | wait(0.5); |
nepes_ai | 0:123b50ed3ad9 | 193 | |
nepes_ai | 0:123b50ed3ad9 | 194 | if (hnn.begin() != 0) { |
nepes_ai | 1:fb672eb52bd6 | 195 | fpga_version = hnn.fpgaVersion(); |
nepes_ai | 1:fb672eb52bd6 | 196 | if ((fpga_version & 0xFF00) == 0x0000) { |
nepes_ai | 1:fb672eb52bd6 | 197 | printf("\n\n#### NeuroShield Board (Board v%d.0 / FPGA v%d.0) ####\n", ((fpga_version >> 4) & 0x000F), (fpga_version & 0x000F)); |
nepes_ai | 1:fb672eb52bd6 | 198 | } |
nepes_ai | 1:fb672eb52bd6 | 199 | else if ((fpga_version & 0xFF00) == 0x0100) { |
nepes_ai | 1:fb672eb52bd6 | 200 | printf("\n\n#### Prodigy Board (Board v%d.0 / FPGA v%d.0) ####\n", ((fpga_version >> 4) & 0x000F), (fpga_version & 0x000F)); |
nepes_ai | 1:fb672eb52bd6 | 201 | } |
nepes_ai | 1:fb672eb52bd6 | 202 | else { |
nepes_ai | 1:fb672eb52bd6 | 203 | printf("\n\n#### Unknown Board (Board v%d.0 / FPGA v%d.0) ####\n", ((fpga_version >> 4) & 0x000F), (fpga_version & 0x000F)); |
nepes_ai | 1:fb672eb52bd6 | 204 | } |
nepes_ai | 2:28290f9caf51 | 205 | printf("\nStart NM500 initialzation...\n"); |
nepes_ai | 2:28290f9caf51 | 206 | printf(" NM500 is initialized!\n"); |
nepes_ai | 2:28290f9caf51 | 207 | printf(" There are %d neurons\n", hnn.total_neurons); |
nepes_ai | 0:123b50ed3ad9 | 208 | } |
nepes_ai | 0:123b50ed3ad9 | 209 | else { |
nepes_ai | 2:28290f9caf51 | 210 | printf("\n\nStart NM500 initialzation...\n"); |
nepes_ai | 2:28290f9caf51 | 211 | printf(" NM500 is not connected properly!!\n"); |
nepes_ai | 2:28290f9caf51 | 212 | printf(" Please check the connection and reboot!\n"); |
nepes_ai | 0:123b50ed3ad9 | 213 | while (1); |
nepes_ai | 0:123b50ed3ad9 | 214 | } |
nepes_ai | 0:123b50ed3ad9 | 215 | |
nepes_ai | 0:123b50ed3ad9 | 216 | // initialize mpu6050 |
nepes_ai | 0:123b50ed3ad9 | 217 | printf("\nStart MPU-6050 initialization...\n"); |
nepes_ai | 0:123b50ed3ad9 | 218 | mpu.initialize(); |
nepes_ai | 0:123b50ed3ad9 | 219 | // set gyro & accel range |
nepes_ai | 0:123b50ed3ad9 | 220 | mpu.setFullScaleGyroRange(MPU6050_GYRO_FS_1000); |
nepes_ai | 0:123b50ed3ad9 | 221 | mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_8); |
nepes_ai | 0:123b50ed3ad9 | 222 | |
nepes_ai | 0:123b50ed3ad9 | 223 | // verify connection |
nepes_ai | 2:28290f9caf51 | 224 | for (int i = 0; i < 10; i++) { |
nepes_ai | 0:123b50ed3ad9 | 225 | if (mpu.testConnection()) { |
nepes_ai | 2:28290f9caf51 | 226 | printf(" MPU-6050 is connected successfully\n"); |
nepes_ai | 0:123b50ed3ad9 | 227 | break; |
nepes_ai | 0:123b50ed3ad9 | 228 | } |
nepes_ai | 0:123b50ed3ad9 | 229 | else if (i == 9) { |
nepes_ai | 0:123b50ed3ad9 | 230 | printf(" MPU-6050 connection failed\n"); |
nepes_ai | 2:28290f9caf51 | 231 | printf(" Please check the connection and reboot!\n"); |
nepes_ai | 0:123b50ed3ad9 | 232 | while (1); |
nepes_ai | 0:123b50ed3ad9 | 233 | } |
nepes_ai | 0:123b50ed3ad9 | 234 | wait(0.1); |
nepes_ai | 0:123b50ed3ad9 | 235 | } |
nepes_ai | 0:123b50ed3ad9 | 236 | |
nepes_ai | 0:123b50ed3ad9 | 237 | // wait for ready |
nepes_ai | 2:28290f9caf51 | 238 | printf(" Trying to calibrate. Make sure the board is stable and upright\n"); |
nepes_ai | 0:123b50ed3ad9 | 239 | // reset offsets |
nepes_ai | 0:123b50ed3ad9 | 240 | mpu.setXAccelOffset(0); |
nepes_ai | 0:123b50ed3ad9 | 241 | mpu.setYAccelOffset(0); |
nepes_ai | 0:123b50ed3ad9 | 242 | mpu.setZAccelOffset(0); |
nepes_ai | 0:123b50ed3ad9 | 243 | mpu.setXGyroOffset(0); |
nepes_ai | 0:123b50ed3ad9 | 244 | mpu.setYGyroOffset(0); |
nepes_ai | 0:123b50ed3ad9 | 245 | mpu.setZGyroOffset(0); |
nepes_ai | 0:123b50ed3ad9 | 246 | mpu6050Calibration(); |
nepes_ai | 0:123b50ed3ad9 | 247 | // end message |
nepes_ai | 2:28290f9caf51 | 248 | printf(" MPU-6050 calibration is complete!!\n\n"); |
nepes_ai | 0:123b50ed3ad9 | 249 | |
nepes_ai | 2:28290f9caf51 | 250 | printf("Move the board horizontally or vertically...\n"); |
nepes_ai | 2:28290f9caf51 | 251 | printf("Type '1' and enter, to learn up <-> down motion\n"); |
nepes_ai | 2:28290f9caf51 | 252 | printf("Type '2' and enter, to learn left <-> right motion\n"); |
nepes_ai | 2:28290f9caf51 | 253 | printf("Type '0' and enter, to learn by category 0\n"); |
nepes_ai | 0:123b50ed3ad9 | 254 | |
nepes_ai | 0:123b50ed3ad9 | 255 | // main loop |
nepes_ai | 0:123b50ed3ad9 | 256 | while (1) { |
nepes_ai | 0:123b50ed3ad9 | 257 | if (pc.readable()) { |
nepes_ai | 0:123b50ed3ad9 | 258 | input_key[0] = input_key[1]; |
nepes_ai | 0:123b50ed3ad9 | 259 | input_key[1] = pc.getc(); |
nepes_ai | 0:123b50ed3ad9 | 260 | if (input_key[1] == 0x0D) { // enter key |
nepes_ai | 0:123b50ed3ad9 | 261 | learn_cat = input_key[0] - '0'; |
nepes_ai | 2:28290f9caf51 | 262 | if (learn_cat < 3) { |
nepes_ai | 0:123b50ed3ad9 | 263 | printf("Learning motion category %d\n", learn_cat); |
nepes_ai | 0:123b50ed3ad9 | 264 | for (int i = 0; i < 5; i++) { |
nepes_ai | 0:123b50ed3ad9 | 265 | extractFeatureVector(); |
nepes_ai | 0:123b50ed3ad9 | 266 | ncount = hnn.learn(vector, MOTION_REPEAT_COUNT * MOTION_SIGNAL_COUNT, learn_cat); |
nepes_ai | 0:123b50ed3ad9 | 267 | if (ncount != prev_ncount) { |
nepes_ai | 0:123b50ed3ad9 | 268 | prev_cat = learn_cat; |
nepes_ai | 0:123b50ed3ad9 | 269 | prev_ncount = ncount; |
nepes_ai | 0:123b50ed3ad9 | 270 | } |
nepes_ai | 0:123b50ed3ad9 | 271 | } |
nepes_ai | 0:123b50ed3ad9 | 272 | printf("Neurons=%d\n", ncount); |
nepes_ai | 0:123b50ed3ad9 | 273 | } |
nepes_ai | 0:123b50ed3ad9 | 274 | } |
nepes_ai | 0:123b50ed3ad9 | 275 | } |
nepes_ai | 0:123b50ed3ad9 | 276 | else { // recognize |
nepes_ai | 0:123b50ed3ad9 | 277 | extractFeatureVector(); |
nepes_ai | 0:123b50ed3ad9 | 278 | hnn.classify(vector, MOTION_REPEAT_COUNT * MOTION_SIGNAL_COUNT, &dist, &cat, &nid); |
nepes_ai | 0:123b50ed3ad9 | 279 | if (cat != 0xFFFF) { |
nepes_ai | 0:123b50ed3ad9 | 280 | prev_cat = cat; |
nepes_ai | 0:123b50ed3ad9 | 281 | if (cat & 0x8000) |
nepes_ai | 0:123b50ed3ad9 | 282 | printf("Motion #%d (degenerated)\n", (cat & 0x7FFF)); |
nepes_ai | 0:123b50ed3ad9 | 283 | else |
nepes_ai | 0:123b50ed3ad9 | 284 | printf("Motion #%d \n", cat); |
nepes_ai | 0:123b50ed3ad9 | 285 | } |
nepes_ai | 0:123b50ed3ad9 | 286 | else if (prev_cat != 0xFFFF) { |
nepes_ai | 0:123b50ed3ad9 | 287 | prev_cat = cat; |
nepes_ai | 0:123b50ed3ad9 | 288 | } |
nepes_ai | 0:123b50ed3ad9 | 289 | } |
nepes_ai | 0:123b50ed3ad9 | 290 | } |
nepes_ai | 0:123b50ed3ad9 | 291 | } |