MPU6050
Dependencies: BLE_API MPU6050 mbed nRF51822
Fork of NordicDTMviaUART by
main.cpp@1:91caa6c7f077, 2015-09-22 (annotated)
- Committer:
- DarkerL
- Date:
- Tue Sep 22 04:49:00 2015 +0000
- Revision:
- 1:91caa6c7f077
- Parent:
- 0:a2cffc867df4
BLE_MPU6050
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
pvaibhav | 0:a2cffc867df4 | 1 | #include "mbed.h" |
pvaibhav | 0:a2cffc867df4 | 2 | #include <stdint.h> |
pvaibhav | 0:a2cffc867df4 | 3 | #include <stdbool.h> |
pvaibhav | 0:a2cffc867df4 | 4 | #include "nrf51.h" |
pvaibhav | 0:a2cffc867df4 | 5 | #include "nrf51_bitfields.h" |
pvaibhav | 0:a2cffc867df4 | 6 | #include "ble_dtm.h" |
pvaibhav | 0:a2cffc867df4 | 7 | #include "nrf_gpio.h" |
DarkerL | 1:91caa6c7f077 | 8 | #include <stdio.h> |
DarkerL | 1:91caa6c7f077 | 9 | #include "MPU6050.h" |
DarkerL | 1:91caa6c7f077 | 10 | #include "BLEDevice.h" |
DarkerL | 1:91caa6c7f077 | 11 | |
DarkerL | 1:91caa6c7f077 | 12 | |
DarkerL | 1:91caa6c7f077 | 13 | // DFUService is already included & automatically advertised by the mbed lib dependancies (currently) |
DarkerL | 1:91caa6c7f077 | 14 | |
DarkerL | 1:91caa6c7f077 | 15 | const static char DEVICE_NAME[] = "Hello_LinkSprite"; |
DarkerL | 1:91caa6c7f077 | 16 | |
DarkerL | 1:91caa6c7f077 | 17 | BLEDevice ble; |
DarkerL | 1:91caa6c7f077 | 18 | |
DarkerL | 1:91caa6c7f077 | 19 | DigitalOut myled(LED1); |
DarkerL | 1:91caa6c7f077 | 20 | |
DarkerL | 1:91caa6c7f077 | 21 | MPU6050 mpu(0x69); |
DarkerL | 1:91caa6c7f077 | 22 | int16_t ax=0, ay=0, az=0; |
DarkerL | 1:91caa6c7f077 | 23 | int16_t gx=0, gy=0, gz=0; |
DarkerL | 1:91caa6c7f077 | 24 | int moyZ=0; //global Z value (mean) |
DarkerL | 1:91caa6c7f077 | 25 | int16_t moy[64]; //array of different measurements |
DarkerL | 1:91caa6c7f077 | 26 | |
DarkerL | 1:91caa6c7f077 | 27 | |
DarkerL | 1:91caa6c7f077 | 28 | //DigitalOut myled(LED2); |
pvaibhav | 0:a2cffc867df4 | 29 | |
pvaibhav | 0:a2cffc867df4 | 30 | // Configuration parameters. |
DarkerL | 1:91caa6c7f077 | 31 | #define BITRATE UART_BAUDRATE_BAUDRATE_Baud9600 /**< Serial bitrate on the UART */ |
DarkerL | 1:91caa6c7f077 | 32 | #define TX_PIN_NUMBER 0 /**< Use proper value for your hardware */ |
DarkerL | 1:91caa6c7f077 | 33 | #define RX_PIN_NUMBER 1 /**< Use proper value for your hardware */ |
pvaibhav | 0:a2cffc867df4 | 34 | #define MAX_ITERATIONS_NEEDED_FOR_NEXT_BYTE 21 |
pvaibhav | 0:a2cffc867df4 | 35 | /**@brief Function for UART initialization. |
pvaibhav | 0:a2cffc867df4 | 36 | */ |
pvaibhav | 0:a2cffc867df4 | 37 | static void uart_init(void) |
pvaibhav | 0:a2cffc867df4 | 38 | { |
pvaibhav | 0:a2cffc867df4 | 39 | // Configure UART0 pins. |
pvaibhav | 0:a2cffc867df4 | 40 | nrf_gpio_cfg_output(TX_PIN_NUMBER); |
pvaibhav | 0:a2cffc867df4 | 41 | nrf_gpio_cfg_input(RX_PIN_NUMBER, NRF_GPIO_PIN_NOPULL); |
pvaibhav | 0:a2cffc867df4 | 42 | |
pvaibhav | 0:a2cffc867df4 | 43 | NRF_UART0->PSELTXD = TX_PIN_NUMBER; |
pvaibhav | 0:a2cffc867df4 | 44 | NRF_UART0->PSELRXD = RX_PIN_NUMBER; |
pvaibhav | 0:a2cffc867df4 | 45 | NRF_UART0->BAUDRATE = BITRATE; |
pvaibhav | 0:a2cffc867df4 | 46 | |
pvaibhav | 0:a2cffc867df4 | 47 | // Clean out possible events from earlier operations |
pvaibhav | 0:a2cffc867df4 | 48 | NRF_UART0->EVENTS_RXDRDY = 0; |
pvaibhav | 0:a2cffc867df4 | 49 | NRF_UART0->EVENTS_TXDRDY = 0; |
pvaibhav | 0:a2cffc867df4 | 50 | NRF_UART0->EVENTS_ERROR = 0; |
pvaibhav | 0:a2cffc867df4 | 51 | |
pvaibhav | 0:a2cffc867df4 | 52 | // Activate UART. |
pvaibhav | 0:a2cffc867df4 | 53 | NRF_UART0->ENABLE = UART_ENABLE_ENABLE_Enabled; |
pvaibhav | 0:a2cffc867df4 | 54 | NRF_UART0->INTENSET = 0; |
pvaibhav | 0:a2cffc867df4 | 55 | NRF_UART0->TASKS_STARTTX = 1; |
pvaibhav | 0:a2cffc867df4 | 56 | NRF_UART0->TASKS_STARTRX = 1; |
pvaibhav | 0:a2cffc867df4 | 57 | } |
pvaibhav | 0:a2cffc867df4 | 58 | |
pvaibhav | 0:a2cffc867df4 | 59 | |
DarkerL | 1:91caa6c7f077 | 60 | |
DarkerL | 1:91caa6c7f077 | 61 | void moyennage_Z() //calculates the mean value by going through the whole array, sum and divide by the sample size (64) |
pvaibhav | 0:a2cffc867df4 | 62 | { |
DarkerL | 1:91caa6c7f077 | 63 | for (int n=0; n<64; n++) |
DarkerL | 1:91caa6c7f077 | 64 | { |
DarkerL | 1:91caa6c7f077 | 65 | moyZ=moyZ+moy[n]; |
DarkerL | 1:91caa6c7f077 | 66 | } |
DarkerL | 1:91caa6c7f077 | 67 | moyZ=(int)moyZ/64; |
DarkerL | 1:91caa6c7f077 | 68 | } |
DarkerL | 1:91caa6c7f077 | 69 | |
DarkerL | 1:91caa6c7f077 | 70 | |
DarkerL | 1:91caa6c7f077 | 71 | const uint8_t MPU6050_service_uuid[] = { |
DarkerL | 1:91caa6c7f077 | 72 | 0x45,0x35,0x56,0x80,0x0F,0xD8,0x5F,0xB5,0x51,0x48,0x30,0x27,0x06,0x9B,0x3F,0xD9 |
DarkerL | 1:91caa6c7f077 | 73 | }; |
DarkerL | 1:91caa6c7f077 | 74 | |
DarkerL | 1:91caa6c7f077 | 75 | const uint8_t MPU6050_Accel_Characteristic_uuid[] = { |
DarkerL | 1:91caa6c7f077 | 76 | 0x45,0x35,0x56,0x81,0x0F,0xD8,0x5F,0xB5,0x51,0x48,0x30,0x27,0x06,0x9B,0x3F,0xD9 |
DarkerL | 1:91caa6c7f077 | 77 | }; |
DarkerL | 1:91caa6c7f077 | 78 | |
DarkerL | 1:91caa6c7f077 | 79 | |
DarkerL | 1:91caa6c7f077 | 80 | uint8_t accelPayload[sizeof(int16_t)*6] = {0,}; |
DarkerL | 1:91caa6c7f077 | 81 | |
DarkerL | 1:91caa6c7f077 | 82 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
DarkerL | 1:91caa6c7f077 | 83 | { |
DarkerL | 1:91caa6c7f077 | 84 | ble.startAdvertising(); // restart advertising |
DarkerL | 1:91caa6c7f077 | 85 | } |
DarkerL | 1:91caa6c7f077 | 86 | |
DarkerL | 1:91caa6c7f077 | 87 | GattCharacteristic accelChar (MPU6050_Accel_Characteristic_uuid, |
DarkerL | 1:91caa6c7f077 | 88 | accelPayload, (sizeof(int16_t) * 6), (sizeof(int16_t) * 6), |
DarkerL | 1:91caa6c7f077 | 89 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY); |
DarkerL | 1:91caa6c7f077 | 90 | |
DarkerL | 1:91caa6c7f077 | 91 | GattCharacteristic *ControllerChars[] = { &accelChar }; |
DarkerL | 1:91caa6c7f077 | 92 | GattService MPU6050Service(MPU6050_service_uuid, ControllerChars, sizeof(ControllerChars) / sizeof(GattCharacteristic *)); |
DarkerL | 1:91caa6c7f077 | 93 | |
DarkerL | 1:91caa6c7f077 | 94 | |
pvaibhav | 0:a2cffc867df4 | 95 | |
DarkerL | 1:91caa6c7f077 | 96 | int16_t exchange_position(int16_t temp) |
DarkerL | 1:91caa6c7f077 | 97 | { |
DarkerL | 1:91caa6c7f077 | 98 | int16_t i = temp ; |
DarkerL | 1:91caa6c7f077 | 99 | |
DarkerL | 1:91caa6c7f077 | 100 | temp = temp>>8; |
DarkerL | 1:91caa6c7f077 | 101 | temp = (i<<8) | temp; |
DarkerL | 1:91caa6c7f077 | 102 | |
DarkerL | 1:91caa6c7f077 | 103 | return temp; |
pvaibhav | 0:a2cffc867df4 | 104 | } |
pvaibhav | 0:a2cffc867df4 | 105 | |
DarkerL | 1:91caa6c7f077 | 106 | void updata_values() |
DarkerL | 1:91caa6c7f077 | 107 | { |
DarkerL | 1:91caa6c7f077 | 108 | //int16_t value_test = 100; |
DarkerL | 1:91caa6c7f077 | 109 | |
DarkerL | 1:91caa6c7f077 | 110 | //value_test = exchange_position(value_test); |
DarkerL | 1:91caa6c7f077 | 111 | |
DarkerL | 1:91caa6c7f077 | 112 | |
DarkerL | 1:91caa6c7f077 | 113 | mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); |
DarkerL | 1:91caa6c7f077 | 114 | |
DarkerL | 1:91caa6c7f077 | 115 | |
DarkerL | 1:91caa6c7f077 | 116 | ax = exchange_position(ax); |
DarkerL | 1:91caa6c7f077 | 117 | ay = exchange_position(ay); |
DarkerL | 1:91caa6c7f077 | 118 | az = exchange_position(az); |
DarkerL | 1:91caa6c7f077 | 119 | gx = exchange_position(gx); |
DarkerL | 1:91caa6c7f077 | 120 | gy = exchange_position(gy); |
DarkerL | 1:91caa6c7f077 | 121 | gz = exchange_position(gz); |
DarkerL | 1:91caa6c7f077 | 122 | |
DarkerL | 1:91caa6c7f077 | 123 | //memcpy(accelPayload+sizeof(int16_t)*0, &value_test, sizeof(value_test)); |
DarkerL | 1:91caa6c7f077 | 124 | |
DarkerL | 1:91caa6c7f077 | 125 | memcpy(accelPayload+sizeof(int16_t)*0, &ax, sizeof(ax)); |
DarkerL | 1:91caa6c7f077 | 126 | memcpy(accelPayload+sizeof(int16_t)*1, &ay, sizeof(ay)); |
DarkerL | 1:91caa6c7f077 | 127 | memcpy(accelPayload+sizeof(int16_t)*2, &az, sizeof(az)); |
DarkerL | 1:91caa6c7f077 | 128 | memcpy(accelPayload+sizeof(int16_t)*3, &gx, sizeof(gx)); |
DarkerL | 1:91caa6c7f077 | 129 | memcpy(accelPayload+sizeof(int16_t)*4, &gy, sizeof(gy)); |
DarkerL | 1:91caa6c7f077 | 130 | memcpy(accelPayload+sizeof(int16_t)*5, &gz, sizeof(gz)); |
DarkerL | 1:91caa6c7f077 | 131 | |
DarkerL | 1:91caa6c7f077 | 132 | ble.updateCharacteristicValue(accelChar.getValueAttribute().getHandle(), accelPayload, sizeof(accelPayload)); //Mod |
DarkerL | 1:91caa6c7f077 | 133 | |
DarkerL | 1:91caa6c7f077 | 134 | wait(0.1); |
DarkerL | 1:91caa6c7f077 | 135 | } |
DarkerL | 1:91caa6c7f077 | 136 | |
DarkerL | 1:91caa6c7f077 | 137 | |
DarkerL | 1:91caa6c7f077 | 138 | |
DarkerL | 1:91caa6c7f077 | 139 | |
DarkerL | 1:91caa6c7f077 | 140 | |
DarkerL | 1:91caa6c7f077 | 141 | |
pvaibhav | 0:a2cffc867df4 | 142 | /**@brief Function for application main entry. |
pvaibhav | 0:a2cffc867df4 | 143 | * |
pvaibhav | 0:a2cffc867df4 | 144 | * @details This function serves as an adaptation layer between a 2-wire UART interface and the |
pvaibhav | 0:a2cffc867df4 | 145 | * dtmlib. After initialization, DTM commands submitted through the UART are forwarded to |
pvaibhav | 0:a2cffc867df4 | 146 | * dtmlib and events (i.e. results from the command) is reported back through the UART. |
pvaibhav | 0:a2cffc867df4 | 147 | */ |
pvaibhav | 0:a2cffc867df4 | 148 | int main(void) |
DarkerL | 1:91caa6c7f077 | 149 | { |
DarkerL | 1:91caa6c7f077 | 150 | |
DarkerL | 1:91caa6c7f077 | 151 | int16_t test = 0x6400; |
DarkerL | 1:91caa6c7f077 | 152 | int16_t LinkSprite = 0; |
DarkerL | 1:91caa6c7f077 | 153 | LinkSprite = exchange_position(test); |
DarkerL | 1:91caa6c7f077 | 154 | |
DarkerL | 1:91caa6c7f077 | 155 | ble.init(); |
DarkerL | 1:91caa6c7f077 | 156 | ble.onDisconnection(disconnectionCallback); |
pvaibhav | 0:a2cffc867df4 | 157 | |
DarkerL | 1:91caa6c7f077 | 158 | /* Setup advertising. */ |
DarkerL | 1:91caa6c7f077 | 159 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); |
DarkerL | 1:91caa6c7f077 | 160 | // ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
DarkerL | 1:91caa6c7f077 | 161 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
DarkerL | 1:91caa6c7f077 | 162 | // ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(1000)); |
DarkerL | 1:91caa6c7f077 | 163 | // ble.startAdvertising(); |
DarkerL | 1:91caa6c7f077 | 164 | |
DarkerL | 1:91caa6c7f077 | 165 | |
DarkerL | 1:91caa6c7f077 | 166 | |
DarkerL | 1:91caa6c7f077 | 167 | /* setup advertising */ |
DarkerL | 1:91caa6c7f077 | 168 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (const uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); |
DarkerL | 1:91caa6c7f077 | 169 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
DarkerL | 1:91caa6c7f077 | 170 | (const uint8_t *)MPU6050_service_uuid, sizeof(MPU6050_service_uuid)); |
DarkerL | 1:91caa6c7f077 | 171 | //(const uint8_t *)MPU6050_adv_service_uuid, sizeof(MPU6050_adv_service_uuid)); |
pvaibhav | 0:a2cffc867df4 | 172 | |
DarkerL | 1:91caa6c7f077 | 173 | ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ |
DarkerL | 1:91caa6c7f077 | 174 | ble.startAdvertising(); |
pvaibhav | 0:a2cffc867df4 | 175 | |
DarkerL | 1:91caa6c7f077 | 176 | ble.addService(MPU6050Service); |
DarkerL | 1:91caa6c7f077 | 177 | |
DarkerL | 1:91caa6c7f077 | 178 | uart_init(); |
DarkerL | 1:91caa6c7f077 | 179 | |
DarkerL | 1:91caa6c7f077 | 180 | // Thread thread(mon_thr); |
DarkerL | 1:91caa6c7f077 | 181 | printf("MPU6050 test\n\n\r"); //procedure to test the connection to the mpu6050, if valid |
DarkerL | 1:91caa6c7f077 | 182 | printf("MPU6050 initialize \n\r"); //the code to execute is embedded in a if{} |
DarkerL | 1:91caa6c7f077 | 183 | mpu.initialize(); |
DarkerL | 1:91caa6c7f077 | 184 | printf("MPU6050 testConnection \n\r"); |
DarkerL | 1:91caa6c7f077 | 185 | bool mpu6050TestResult = mpu.testConnection(); |
DarkerL | 1:91caa6c7f077 | 186 | |
DarkerL | 1:91caa6c7f077 | 187 | if(mpu6050TestResult) |
DarkerL | 1:91caa6c7f077 | 188 | { |
DarkerL | 1:91caa6c7f077 | 189 | |
DarkerL | 1:91caa6c7f077 | 190 | printf("MPU6050 test passed \n\r"); |
DarkerL | 1:91caa6c7f077 | 191 | |
DarkerL | 1:91caa6c7f077 | 192 | while(1) |
DarkerL | 1:91caa6c7f077 | 193 | { |
DarkerL | 1:91caa6c7f077 | 194 | /* |
DarkerL | 1:91caa6c7f077 | 195 | myled = 0; |
DarkerL | 1:91caa6c7f077 | 196 | wait(0.2); |
DarkerL | 1:91caa6c7f077 | 197 | myled = 1; |
DarkerL | 1:91caa6c7f077 | 198 | wait(0.2); |
DarkerL | 1:91caa6c7f077 | 199 | |
DarkerL | 1:91caa6c7f077 | 200 | wait(1); |
DarkerL | 1:91caa6c7f077 | 201 | |
DarkerL | 1:91caa6c7f077 | 202 | */ |
DarkerL | 1:91caa6c7f077 | 203 | printf("hello LinkSprite123 \r\n"); |
DarkerL | 1:91caa6c7f077 | 204 | |
DarkerL | 1:91caa6c7f077 | 205 | printf("LinkSprite test = 0x%x \r\n\n\r", LinkSprite); |
DarkerL | 1:91caa6c7f077 | 206 | |
DarkerL | 1:91caa6c7f077 | 207 | |
DarkerL | 1:91caa6c7f077 | 208 | |
DarkerL | 1:91caa6c7f077 | 209 | |
DarkerL | 1:91caa6c7f077 | 210 | /* Uncomment below if you want to see accel and gyro data */ |
DarkerL | 1:91caa6c7f077 | 211 | /* |
DarkerL | 1:91caa6c7f077 | 212 | for (int n=0; n<64; n++) |
DarkerL | 1:91caa6c7f077 | 213 | { //refreshing the 64-int16 array |
DarkerL | 1:91caa6c7f077 | 214 | mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); |
DarkerL | 1:91caa6c7f077 | 215 | moy[n]=az; |
DarkerL | 1:91caa6c7f077 | 216 | wait(0.01); |
DarkerL | 1:91caa6c7f077 | 217 | } |
DarkerL | 1:91caa6c7f077 | 218 | |
DarkerL | 1:91caa6c7f077 | 219 | */ |
DarkerL | 1:91caa6c7f077 | 220 | |
DarkerL | 1:91caa6c7f077 | 221 | updata_values(); |
DarkerL | 1:91caa6c7f077 | 222 | wait(0.1); |
DarkerL | 1:91caa6c7f077 | 223 | |
DarkerL | 1:91caa6c7f077 | 224 | moyennage_Z(); //calculating the mean value by a simple sum and divide |
DarkerL | 1:91caa6c7f077 | 225 | printf("%i\n\r",moyZ+17000); |
DarkerL | 1:91caa6c7f077 | 226 | printf("ax = %d, ay = %d, az = %d, gx = %d, gy = %d, gz = %d\n\r", ax,ay, az, gx, gy, gz); |
DarkerL | 1:91caa6c7f077 | 227 | wait(0.1); |
DarkerL | 1:91caa6c7f077 | 228 | printf("hello LinkSprite456 \r\n"); |
DarkerL | 1:91caa6c7f077 | 229 | |
DarkerL | 1:91caa6c7f077 | 230 | } |
DarkerL | 1:91caa6c7f077 | 231 | } |
DarkerL | 1:91caa6c7f077 | 232 | |
DarkerL | 1:91caa6c7f077 | 233 | else |
DarkerL | 1:91caa6c7f077 | 234 | { |
DarkerL | 1:91caa6c7f077 | 235 | printf("MPU6050 test failed \n\r"); |
DarkerL | 1:91caa6c7f077 | 236 | } |
pvaibhav | 0:a2cffc867df4 | 237 | } |
pvaibhav | 0:a2cffc867df4 | 238 |