APP 1 S5.

Dependencies:   mbed

Committer:
vinbel93
Date:
Tue Jan 12 15:17:21 2016 +0000
Revision:
13:08ef55cd14c6
Parent:
12:4961ec71bc8f
Child:
14:d48d869ed365
UART without mbed.h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vinbel93 11:eafa5c07f060 1 // APP.cpp
vinbel93 11:eafa5c07f060 2 // Vincent Belanger - belv1802
vinbel93 11:eafa5c07f060 3 // Jeremy Pare - parj2713
vinbel93 11:eafa5c07f060 4
vinbel93 7:b00843da0530 5 #include <math.h>
vinbel93 7:b00843da0530 6 #include <stdint.h>
vinbel93 7:b00843da0530 7
vinbel93 7:b00843da0530 8 #include "mbed.h"
vinbel93 13:08ef55cd14c6 9 #include "UART.h"
vinbel93 7:b00843da0530 10 #include "APP.h"
vinbel93 13:08ef55cd14c6 11 #include "LPC17xx.h"
vinbel93 7:b00843da0530 12
vinbel93 7:b00843da0530 13
vinbel93 13:08ef55cd14c6 14 static I2C i2c(p28, p27);
vinbel93 7:b00843da0530 15
vinbel93 7:b00843da0530 16 void setup()
vinbel93 7:b00843da0530 17 {
vinbel93 13:08ef55cd14c6 18 SystemCoreClockUpdate();
vinbel93 13:08ef55cd14c6 19
vinbel93 7:b00843da0530 20 // Setup UART and I2C.
vinbel93 13:08ef55cd14c6 21 UARTInit(9600);
vinbel93 7:b00843da0530 22 i2c.frequency(100000);
vinbel93 13:08ef55cd14c6 23
vinbel93 7:b00843da0530 24 // Clear display
vinbel93 13:08ef55cd14c6 25 UARTSend(0x76);
vinbel93 13:08ef55cd14c6 26
vinbel93 7:b00843da0530 27 // Decimal point for display
vinbel93 13:08ef55cd14c6 28 UARTSend(0x77);
vinbel93 13:08ef55cd14c6 29 UARTSend(0x02);
vinbel93 7:b00843da0530 30
vinbel93 7:b00843da0530 31 // Maximum brightness
vinbel93 13:08ef55cd14c6 32 UARTSend(0x7A);
vinbel93 13:08ef55cd14c6 33 UARTSend(0xFF);
vinbel93 7:b00843da0530 34 }
vinbel93 13:08ef55cd14c6 35
vinbel93 7:b00843da0530 36 void activateAccelerometer()
vinbel93 7:b00843da0530 37 {
vinbel93 7:b00843da0530 38 uint8_t data[2] = {CTRL_REG, 0x01};
vinbel93 7:b00843da0530 39 i2c.write(ACC_ADDRESS, (char*) data, 2);
vinbel93 7:b00843da0530 40 }
vinbel93 13:08ef55cd14c6 41
vinbel93 7:b00843da0530 42 uint8_t readStatus()
vinbel93 7:b00843da0530 43 {
vinbel93 7:b00843da0530 44 uint8_t result[1];
vinbel93 7:b00843da0530 45 uint8_t reg[1] = {STATUS_REG};
vinbel93 7:b00843da0530 46 i2c.write(ACC_ADDRESS, (char*) reg, 1, true);
vinbel93 7:b00843da0530 47 i2c.read(ACC_ADDRESS, (char*) result, 1);
vinbel93 7:b00843da0530 48
vinbel93 7:b00843da0530 49 return result[0];
vinbel93 7:b00843da0530 50 }
vinbel93 13:08ef55cd14c6 51
vinbel93 7:b00843da0530 52 int16_t convertToAcceleration(uint8_t hi, uint8_t lo)
vinbel93 7:b00843da0530 53 {
vinbel93 7:b00843da0530 54 int16_t value = (lo >> 2) | (hi << 6);
vinbel93 7:b00843da0530 55 if (value > UINT14_MAX/2)
vinbel93 7:b00843da0530 56 {
vinbel93 7:b00843da0530 57 value -= UINT14_MAX;
vinbel93 7:b00843da0530 58 }
vinbel93 7:b00843da0530 59
vinbel93 7:b00843da0530 60 return value;
vinbel93 7:b00843da0530 61 }
vinbel93 13:08ef55cd14c6 62
vinbel93 7:b00843da0530 63 int16_t readAndComputeAngle()
vinbel93 7:b00843da0530 64 {
vinbel93 7:b00843da0530 65 uint8_t result[6];
vinbel93 7:b00843da0530 66 uint8_t reg[1] = {ACC_X_REG};
vinbel93 7:b00843da0530 67 i2c.write(ACC_ADDRESS, (char*) reg, 1, true);
vinbel93 7:b00843da0530 68 i2c.read(ACC_ADDRESS, (char*) result, 6);
vinbel93 7:b00843da0530 69 int16_t accX = convertToAcceleration(result[0], result[1]);
vinbel93 7:b00843da0530 70 int16_t accY = convertToAcceleration(result[2], result[3]);
vinbel93 7:b00843da0530 71 int16_t accZ = convertToAcceleration(result[4], result[5]);
vinbel93 12:4961ec71bc8f 72
vinbel93 12:4961ec71bc8f 73 float angle = acos((float) accZ / sqrt((float) accX*accX + accY*accY + accZ*accZ)) * 180.0 / PI;
vinbel93 7:b00843da0530 74
vinbel93 7:b00843da0530 75 // To use integer operations instead of floating-point arithmetic, the angle is multiplied by 100.
vinbel93 7:b00843da0530 76 // This allows for two decimals of precision on the display.
vinbel93 7:b00843da0530 77 int16_t angleHundreds = angle * 100;
vinbel93 7:b00843da0530 78 if (angleHundreds > 9000)
vinbel93 7:b00843da0530 79 {
vinbel93 7:b00843da0530 80 angleHundreds = 18000 - angleHundreds;
vinbel93 7:b00843da0530 81 }
vinbel93 7:b00843da0530 82
vinbel93 7:b00843da0530 83 return angleHundreds;
vinbel93 7:b00843da0530 84 }
vinbel93 7:b00843da0530 85
vinbel93 7:b00843da0530 86 void updateDisplay(int16_t angle)
vinbel93 7:b00843da0530 87 {
vinbel93 7:b00843da0530 88 uint8_t digits[4];
vinbel93 7:b00843da0530 89 sprintf((char*) digits, "%d", angle);
vinbel93 13:08ef55cd14c6 90
vinbel93 12:4961ec71bc8f 91 if (angle < 100)
vinbel93 12:4961ec71bc8f 92 {
vinbel93 13:08ef55cd14c6 93 UARTSend('0');
vinbel93 13:08ef55cd14c6 94 UARTSend('0');
vinbel93 13:08ef55cd14c6 95 UARTSend(digits, 2);
vinbel93 12:4961ec71bc8f 96 }
vinbel93 12:4961ec71bc8f 97 else if (angle < 1000)
vinbel93 7:b00843da0530 98 {
vinbel93 13:08ef55cd14c6 99 UARTSend('0');
vinbel93 13:08ef55cd14c6 100 UARTSend(digits, 3);
vinbel93 7:b00843da0530 101 }
vinbel93 7:b00843da0530 102 else
vinbel93 7:b00843da0530 103 {
vinbel93 13:08ef55cd14c6 104 UARTSend(digits, 4);
vinbel93 7:b00843da0530 105 }
vinbel93 7:b00843da0530 106 }
vinbel93 7:b00843da0530 107
vinbel93 7:b00843da0530 108 int32_t main()
vinbel93 7:b00843da0530 109 {
vinbel93 7:b00843da0530 110 setup();
vinbel93 7:b00843da0530 111 activateAccelerometer();
vinbel93 7:b00843da0530 112
vinbel93 7:b00843da0530 113 while (true)
vinbel93 7:b00843da0530 114 {
vinbel93 7:b00843da0530 115 // Read bit 3 from the status register
vinbel93 7:b00843da0530 116 int8_t status = (readStatus() >> 3) & 0x01;
vinbel93 7:b00843da0530 117
vinbel93 7:b00843da0530 118 if (status == 1)
vinbel93 7:b00843da0530 119 {
vinbel93 7:b00843da0530 120 // Get accelerations, compute angle
vinbel93 7:b00843da0530 121 uint16_t angle = readAndComputeAngle();
vinbel93 13:08ef55cd14c6 122
vinbel93 7:b00843da0530 123 // Update 7 segment display
vinbel93 7:b00843da0530 124 updateDisplay(angle);
vinbel93 7:b00843da0530 125 }
vinbel93 13:08ef55cd14c6 126
vinbel93 7:b00843da0530 127 wait(0.4);
vinbel93 7:b00843da0530 128 }
vinbel93 7:b00843da0530 129 }