MPU6050

Dependencies:   BLE_API MPU6050 mbed nRF51822

Fork of NordicDTMviaUART by TobyRich GmbH

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?

UserRevisionLine numberNew 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