Justin B / Mbed 2 deprecated TinyBLE_motion_sensorBufferTemplate

Dependencies:   BLE_API MPU6050 mbed nRF51822

Committer:
pietermaljaars
Date:
Tue Sep 18 19:44:58 2018 +0000
Revision:
3:7875f062a4ea
Parent:
2:bf1a19d489eb
Child:
4:aea4ff8e52ef
Other library, gets temperature + accelero

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pietermaljaars 0:7c12d0922052 1
pietermaljaars 0:7c12d0922052 2 #include "mbed.h"
pietermaljaars 0:7c12d0922052 3 #include "nrf51.h"
pietermaljaars 0:7c12d0922052 4 #include "nrf51_bitfields.h"
pietermaljaars 3:7875f062a4ea 5 #include "MPU6050.h"
pietermaljaars 0:7c12d0922052 6
pietermaljaars 0:7c12d0922052 7 #include "BLE.h"
pietermaljaars 0:7c12d0922052 8 #include "DFUService.h"
pietermaljaars 0:7c12d0922052 9 #include "UARTService.h"
pietermaljaars 2:bf1a19d489eb 10 #include "BatteryService.h"
pietermaljaars 2:bf1a19d489eb 11 #include "DeviceInformationService.h"
pietermaljaars 0:7c12d0922052 12
pietermaljaars 0:7c12d0922052 13
pietermaljaars 0:7c12d0922052 14 #define LOG(...) { pc.printf(__VA_ARGS__); }
pietermaljaars 0:7c12d0922052 15
pietermaljaars 0:7c12d0922052 16 #define LED_GREEN p21
pietermaljaars 0:7c12d0922052 17 #define LED_RED p22
pietermaljaars 0:7c12d0922052 18 #define LED_BLUE p23
pietermaljaars 0:7c12d0922052 19 #define BUTTON_PIN p17
pietermaljaars 0:7c12d0922052 20 #define BATTERY_PIN p1
pietermaljaars 0:7c12d0922052 21
pietermaljaars 0:7c12d0922052 22 #define MPU6050_SDA p12
pietermaljaars 0:7c12d0922052 23 #define MPU6050_SCL p13
pietermaljaars 0:7c12d0922052 24
pietermaljaars 0:7c12d0922052 25 #define UART_TX p9
pietermaljaars 0:7c12d0922052 26 #define UART_RX p11
pietermaljaars 0:7c12d0922052 27 #define UART_CTS p8
pietermaljaars 0:7c12d0922052 28 #define UART_RTS p10
pietermaljaars 0:7c12d0922052 29
pietermaljaars 0:7c12d0922052 30 /* Starting sampling rate. */
pietermaljaars 0:7c12d0922052 31 #define DEFAULT_MPU_HZ (100)
pietermaljaars 0:7c12d0922052 32
pietermaljaars 2:bf1a19d489eb 33
pietermaljaars 2:bf1a19d489eb 34 #define MANUFACTURER "ALTEN"
pietermaljaars 2:bf1a19d489eb 35 #define MODELNUMBER "IoT BLE (PM)"
pietermaljaars 2:bf1a19d489eb 36 #define SERIALNUMBER "serialnumber"
pietermaljaars 2:bf1a19d489eb 37 #define HARDWAREREVISION "demo1"
pietermaljaars 2:bf1a19d489eb 38 #define FIRMWAREREVISION "1.0"
pietermaljaars 2:bf1a19d489eb 39 #define SOFTWAREREVISION "1.0"
pietermaljaars 2:bf1a19d489eb 40
pietermaljaars 0:7c12d0922052 41 DigitalOut blue(LED_BLUE);
pietermaljaars 0:7c12d0922052 42 DigitalOut green(LED_GREEN);
pietermaljaars 0:7c12d0922052 43 DigitalOut red(LED_RED);
pietermaljaars 0:7c12d0922052 44
pietermaljaars 0:7c12d0922052 45 InterruptIn button(BUTTON_PIN);
pietermaljaars 0:7c12d0922052 46 AnalogIn battery(BATTERY_PIN);
pietermaljaars 0:7c12d0922052 47 Serial pc(UART_TX, UART_RX);
pietermaljaars 3:7875f062a4ea 48 MPU6050 mpu(MPU6050_SDA, MPU6050_SCL);
pietermaljaars 0:7c12d0922052 49
pietermaljaars 0:7c12d0922052 50 InterruptIn motion_probe(p14);
pietermaljaars 0:7c12d0922052 51
pietermaljaars 0:7c12d0922052 52 int read_none_count = 0;
pietermaljaars 0:7c12d0922052 53
pietermaljaars 0:7c12d0922052 54 BLEDevice ble;
pietermaljaars 0:7c12d0922052 55 UARTService *uartServicePtr;
pietermaljaars 0:7c12d0922052 56
pietermaljaars 2:bf1a19d489eb 57 // variables to monitor the battery voltage
pietermaljaars 3:7875f062a4ea 58 volatile float batteryVoltage = 100.0f;
pietermaljaars 3:7875f062a4ea 59 volatile bool batteryVoltageChanged = false;
pietermaljaars 3:7875f062a4ea 60
pietermaljaars 3:7875f062a4ea 61 volatile bool startMeasure = false;
pietermaljaars 2:bf1a19d489eb 62
pietermaljaars 0:7c12d0922052 63 volatile bool bleIsConnected = false;
pietermaljaars 0:7c12d0922052 64 volatile uint8_t tick_event = 0;
pietermaljaars 3:7875f062a4ea 65
pietermaljaars 3:7875f062a4ea 66 int16_t ax, ay, az;
pietermaljaars 3:7875f062a4ea 67 int16_t gx, gy, gz;
pietermaljaars 0:7c12d0922052 68
pietermaljaars 0:7c12d0922052 69
pietermaljaars 0:7c12d0922052 70 void check_i2c_bus(void);
pietermaljaars 0:7c12d0922052 71 unsigned short inv_orientation_matrix_to_scalar( const signed char *mtx);
pietermaljaars 0:7c12d0922052 72
pietermaljaars 0:7c12d0922052 73
pietermaljaars 0:7c12d0922052 74 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
pietermaljaars 0:7c12d0922052 75 {
pietermaljaars 0:7c12d0922052 76 LOG("Connected!\n");
pietermaljaars 0:7c12d0922052 77 bleIsConnected = true;
pietermaljaars 0:7c12d0922052 78 }
pietermaljaars 0:7c12d0922052 79
pietermaljaars 0:7c12d0922052 80 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *cbParams)
pietermaljaars 0:7c12d0922052 81 {
pietermaljaars 0:7c12d0922052 82 LOG("Disconnected!\n");
pietermaljaars 0:7c12d0922052 83 LOG("Restarting the advertising process\n");
pietermaljaars 0:7c12d0922052 84 ble.startAdvertising();
pietermaljaars 0:7c12d0922052 85 bleIsConnected = false;
pietermaljaars 0:7c12d0922052 86 }
pietermaljaars 0:7c12d0922052 87
pietermaljaars 0:7c12d0922052 88 void tick(void)
pietermaljaars 0:7c12d0922052 89 {
pietermaljaars 0:7c12d0922052 90 green = !green;
pietermaljaars 3:7875f062a4ea 91 startMeasure = true; // notify the main-loop to start measuring the MPU6050
pietermaljaars 0:7c12d0922052 92 }
pietermaljaars 0:7c12d0922052 93
pietermaljaars 2:bf1a19d489eb 94 // timer callback function to measure the ADC battery level
pietermaljaars 2:bf1a19d489eb 95 void batteryMonitorCallback(void)
pietermaljaars 2:bf1a19d489eb 96 {
pietermaljaars 2:bf1a19d489eb 97 float sample;
pietermaljaars 2:bf1a19d489eb 98
pietermaljaars 2:bf1a19d489eb 99 sample = battery.read();
pietermaljaars 2:bf1a19d489eb 100 /* cannot use (uart.)printf() in a ISR like this. */
pietermaljaars 2:bf1a19d489eb 101 batteryVoltage = sample;
pietermaljaars 2:bf1a19d489eb 102 batteryVoltageChanged = true;
pietermaljaars 2:bf1a19d489eb 103 }
pietermaljaars 2:bf1a19d489eb 104
pietermaljaars 0:7c12d0922052 105 void detect(void)
pietermaljaars 0:7c12d0922052 106 {
pietermaljaars 0:7c12d0922052 107 LOG("Button pressed\n");
pietermaljaars 0:7c12d0922052 108 blue = !blue;
pietermaljaars 0:7c12d0922052 109 }
pietermaljaars 0:7c12d0922052 110
pietermaljaars 0:7c12d0922052 111 void tap_cb(unsigned char direction, unsigned char count)
pietermaljaars 0:7c12d0922052 112 {
pietermaljaars 0:7c12d0922052 113 LOG("Tap motion detected\n");
pietermaljaars 0:7c12d0922052 114 }
pietermaljaars 0:7c12d0922052 115
pietermaljaars 0:7c12d0922052 116 void android_orient_cb(unsigned char orientation)
pietermaljaars 0:7c12d0922052 117 {
pietermaljaars 0:7c12d0922052 118 LOG("Oriention changed\n");
pietermaljaars 0:7c12d0922052 119 }
pietermaljaars 0:7c12d0922052 120
pietermaljaars 0:7c12d0922052 121
pietermaljaars 0:7c12d0922052 122 int main(void)
pietermaljaars 0:7c12d0922052 123 {
pietermaljaars 0:7c12d0922052 124 blue = 1;
pietermaljaars 0:7c12d0922052 125 green = 1;
pietermaljaars 0:7c12d0922052 126 red = 1;
pietermaljaars 0:7c12d0922052 127
pietermaljaars 0:7c12d0922052 128 pc.baud(115200);
pietermaljaars 0:7c12d0922052 129
pietermaljaars 0:7c12d0922052 130 wait(1);
pietermaljaars 0:7c12d0922052 131
pietermaljaars 0:7c12d0922052 132 LOG("---- Seeed Tiny BLE ----\n");
pietermaljaars 0:7c12d0922052 133
pietermaljaars 0:7c12d0922052 134
pietermaljaars 3:7875f062a4ea 135 LOG("MPU6050 testConnection \n");
pietermaljaars 3:7875f062a4ea 136 bool mpu6050TestResult = mpu.testConnection();
pietermaljaars 3:7875f062a4ea 137 if(mpu6050TestResult) {
pietermaljaars 3:7875f062a4ea 138 LOG("MPU6050 test passed \n");
pietermaljaars 3:7875f062a4ea 139 } else {
pietermaljaars 3:7875f062a4ea 140 LOG("MPU6050 test failed \n");
pietermaljaars 0:7c12d0922052 141 }
pietermaljaars 0:7c12d0922052 142
pietermaljaars 0:7c12d0922052 143 Ticker ticker;
pietermaljaars 3:7875f062a4ea 144 ticker.attach(tick, 5);
pietermaljaars 2:bf1a19d489eb 145
pietermaljaars 2:bf1a19d489eb 146 Ticker batteryMonitorTicker;
pietermaljaars 2:bf1a19d489eb 147 batteryMonitorTicker.attach(batteryMonitorCallback, 60.0f);
pietermaljaars 0:7c12d0922052 148
pietermaljaars 0:7c12d0922052 149 button.fall(detect);
pietermaljaars 0:7c12d0922052 150
pietermaljaars 0:7c12d0922052 151 LOG("Initialising the nRF51822\n");
pietermaljaars 0:7c12d0922052 152 ble.init();
pietermaljaars 0:7c12d0922052 153 ble.gap().onDisconnection(disconnectionCallback);
pietermaljaars 0:7c12d0922052 154 ble.gap().onConnection(connectionCallback);
pietermaljaars 1:b529e733ab71 155
pietermaljaars 1:b529e733ab71 156 uint8_t name[] = "iot aabbccddeeff";
pietermaljaars 1:b529e733ab71 157
pietermaljaars 1:b529e733ab71 158 Gap::AddressType_t addr_type;
pietermaljaars 1:b529e733ab71 159 Gap::Address_t address;
pietermaljaars 1:b529e733ab71 160 ble_error_t error = ble.gap().getAddress(&addr_type, address);
pietermaljaars 1:b529e733ab71 161 if (error == BLE_ERROR_NONE) {
pietermaljaars 1:b529e733ab71 162 for (int i = 5; i >= 0; i--){
pietermaljaars 1:b529e733ab71 163 char buffer[3];
pietermaljaars 1:b529e733ab71 164 sprintf(buffer, "%02x", address[i]);
pietermaljaars 1:b529e733ab71 165 name[4 + ((5-i)*2)] = buffer[0];
pietermaljaars 1:b529e733ab71 166 name[4 + ((5-i)*2) + 1] = buffer[1];
pietermaljaars 1:b529e733ab71 167 }
pietermaljaars 1:b529e733ab71 168 }
pietermaljaars 1:b529e733ab71 169 LOG("name = %s\n", name);
pietermaljaars 1:b529e733ab71 170
pietermaljaars 0:7c12d0922052 171 /* setup advertising */
pietermaljaars 0:7c12d0922052 172 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED);
pietermaljaars 0:7c12d0922052 173 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
pietermaljaars 0:7c12d0922052 174 ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME,
pietermaljaars 1:b529e733ab71 175 name, sizeof(name));
pietermaljaars 0:7c12d0922052 176 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS,
pietermaljaars 0:7c12d0922052 177 (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed));
pietermaljaars 0:7c12d0922052 178 DFUService dfu(ble);
pietermaljaars 0:7c12d0922052 179 UARTService uartService(ble);
pietermaljaars 0:7c12d0922052 180 uartServicePtr = &uartService;
pietermaljaars 0:7c12d0922052 181 //uartService.retargetStdout();
pietermaljaars 2:bf1a19d489eb 182 BatteryService battery(ble);
pietermaljaars 2:bf1a19d489eb 183 DeviceInformationService deviceInfo(ble, MANUFACTURER, MODELNUMBER, SERIALNUMBER, HARDWAREREVISION, FIRMWAREREVISION, SOFTWAREREVISION);
pietermaljaars 0:7c12d0922052 184
pietermaljaars 0:7c12d0922052 185 ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
pietermaljaars 0:7c12d0922052 186 ble.gap().startAdvertising();
pietermaljaars 0:7c12d0922052 187
pietermaljaars 0:7c12d0922052 188 while (true) {
pietermaljaars 3:7875f062a4ea 189 ble.waitForEvent();
pietermaljaars 3:7875f062a4ea 190
pietermaljaars 3:7875f062a4ea 191 // update battery level after the level is measured
pietermaljaars 3:7875f062a4ea 192 if (batteryVoltageChanged == true) {
pietermaljaars 3:7875f062a4ea 193 LOG("VBat: %4.3f, ADC: %4.3f, Vadc: %4.3f\n", batteryVoltage*2.0f, batteryVoltage, batteryVoltage*3.3f);
pietermaljaars 3:7875f062a4ea 194 battery.updateBatteryLevel((uint8_t)(batteryVoltage*100.0f)); // input is 0-1.0 of 3.3V -> *100 = percentage of 3.3V
pietermaljaars 3:7875f062a4ea 195 batteryVoltageChanged = false;
pietermaljaars 3:7875f062a4ea 196 }
pietermaljaars 3:7875f062a4ea 197 else if (startMeasure == true) {
pietermaljaars 3:7875f062a4ea 198 LOG("Start measuring the acceleration\n");
pietermaljaars 0:7c12d0922052 199
pietermaljaars 3:7875f062a4ea 200 float a[3];
pietermaljaars 3:7875f062a4ea 201 mpu.getAccelero(a);
pietermaljaars 3:7875f062a4ea 202 //writing current accelerometer and gyro position
pietermaljaars 3:7875f062a4ea 203 LOG("%.2f;%.2f;%.2f\n", a[0], a[1], a[2]);
pietermaljaars 3:7875f062a4ea 204 startMeasure = false;
pietermaljaars 0:7c12d0922052 205
pietermaljaars 3:7875f062a4ea 206 float temp = mpu.getTemp();
pietermaljaars 3:7875f062a4ea 207 LOG("Temp = %f\n", temp);
pietermaljaars 0:7c12d0922052 208 }
pietermaljaars 0:7c12d0922052 209 }
pietermaljaars 0:7c12d0922052 210 }
pietermaljaars 0:7c12d0922052 211
pietermaljaars 0:7c12d0922052 212 /* These next two functions converts the orientation matrix (see
pietermaljaars 0:7c12d0922052 213 * gyro_orientation) to a scalar representation for use by the DMP.
pietermaljaars 0:7c12d0922052 214 * NOTE: These functions are borrowed from Invensense's MPL.
pietermaljaars 0:7c12d0922052 215 */
pietermaljaars 0:7c12d0922052 216 static inline unsigned short inv_row_2_scale(const signed char *row)
pietermaljaars 0:7c12d0922052 217 {
pietermaljaars 0:7c12d0922052 218 unsigned short b;
pietermaljaars 0:7c12d0922052 219
pietermaljaars 0:7c12d0922052 220 if (row[0] > 0)
pietermaljaars 0:7c12d0922052 221 b = 0;
pietermaljaars 0:7c12d0922052 222 else if (row[0] < 0)
pietermaljaars 0:7c12d0922052 223 b = 4;
pietermaljaars 0:7c12d0922052 224 else if (row[1] > 0)
pietermaljaars 0:7c12d0922052 225 b = 1;
pietermaljaars 0:7c12d0922052 226 else if (row[1] < 0)
pietermaljaars 0:7c12d0922052 227 b = 5;
pietermaljaars 0:7c12d0922052 228 else if (row[2] > 0)
pietermaljaars 0:7c12d0922052 229 b = 2;
pietermaljaars 0:7c12d0922052 230 else if (row[2] < 0)
pietermaljaars 0:7c12d0922052 231 b = 6;
pietermaljaars 0:7c12d0922052 232 else
pietermaljaars 0:7c12d0922052 233 b = 7; // error
pietermaljaars 0:7c12d0922052 234 return b;
pietermaljaars 0:7c12d0922052 235 }
pietermaljaars 0:7c12d0922052 236
pietermaljaars 0:7c12d0922052 237 unsigned short inv_orientation_matrix_to_scalar(
pietermaljaars 0:7c12d0922052 238 const signed char *mtx)
pietermaljaars 0:7c12d0922052 239 {
pietermaljaars 0:7c12d0922052 240 unsigned short scalar;
pietermaljaars 0:7c12d0922052 241
pietermaljaars 0:7c12d0922052 242 /*
pietermaljaars 0:7c12d0922052 243 XYZ 010_001_000 Identity Matrix
pietermaljaars 0:7c12d0922052 244 XZY 001_010_000
pietermaljaars 0:7c12d0922052 245 YXZ 010_000_001
pietermaljaars 0:7c12d0922052 246 YZX 000_010_001
pietermaljaars 0:7c12d0922052 247 ZXY 001_000_010
pietermaljaars 0:7c12d0922052 248 ZYX 000_001_010
pietermaljaars 0:7c12d0922052 249 */
pietermaljaars 0:7c12d0922052 250
pietermaljaars 0:7c12d0922052 251 scalar = inv_row_2_scale(mtx);
pietermaljaars 0:7c12d0922052 252 scalar |= inv_row_2_scale(mtx + 3) << 3;
pietermaljaars 0:7c12d0922052 253 scalar |= inv_row_2_scale(mtx + 6) << 6;
pietermaljaars 0:7c12d0922052 254
pietermaljaars 0:7c12d0922052 255
pietermaljaars 0:7c12d0922052 256 return scalar;
pietermaljaars 0:7c12d0922052 257 }
pietermaljaars 0:7c12d0922052 258