Playing around with accelerometer and magnetometer on mbed KL46Z
Dependencies: MAG3110 MMA8451Q PinDetect mbed TSI
main.cpp@9:90567e22c5e1, 2014-02-06 (annotated)
- Committer:
- mohammmo
- Date:
- Thu Feb 06 07:39:34 2014 +0000
- Revision:
- 9:90567e22c5e1
- Parent:
- 8:b87b93a62a6a
Changed printData to use puts, changed baud rate = 115200
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
oliverfang | 0:648dde0c4ef8 | 1 | #include "mbed.h" |
oliverfang | 0:648dde0c4ef8 | 2 | #include "PinDetect.h" |
oliverfang | 0:648dde0c4ef8 | 3 | #include "MMA8451Q.h" |
oliverfang | 0:648dde0c4ef8 | 4 | #include "MAG3110.h" |
mohammmo | 2:bb31f097af0f | 5 | #include "TSISensor.h" |
oliverfang | 0:648dde0c4ef8 | 6 | |
oliverfang | 0:648dde0c4ef8 | 7 | #define MMA8451_I2C_ADDRESS (0x1d<<1) |
oliverfang | 0:648dde0c4ef8 | 8 | |
oliverfang | 0:648dde0c4ef8 | 9 | // Declare output LEDs |
oliverfang | 0:648dde0c4ef8 | 10 | DigitalOut ledgreen(PTD5); |
oliverfang | 0:648dde0c4ef8 | 11 | DigitalOut ledred(PTE29); |
oliverfang | 0:648dde0c4ef8 | 12 | |
oliverfang | 0:648dde0c4ef8 | 13 | // Declare USB serial connection |
oliverfang | 0:648dde0c4ef8 | 14 | Serial pc(USBTX,USBRX); |
oliverfang | 0:648dde0c4ef8 | 15 | |
oliverfang | 0:648dde0c4ef8 | 16 | // Declare timer interrupt |
oliverfang | 0:648dde0c4ef8 | 17 | Ticker timerAcc; |
oliverfang | 0:648dde0c4ef8 | 18 | Ticker timerMag; |
mohammmo | 2:bb31f097af0f | 19 | Ticker timerLight; |
mohammmo | 2:bb31f097af0f | 20 | Ticker timerTouch; |
oliverfang | 0:648dde0c4ef8 | 21 | |
oliverfang | 0:648dde0c4ef8 | 22 | // Declare pointer variables |
oliverfang | 0:648dde0c4ef8 | 23 | float xAcc; |
oliverfang | 0:648dde0c4ef8 | 24 | float yAcc; |
oliverfang | 0:648dde0c4ef8 | 25 | float zAcc; |
oliverfang | 0:648dde0c4ef8 | 26 | int xMag; |
oliverfang | 0:648dde0c4ef8 | 27 | int yMag; |
oliverfang | 0:648dde0c4ef8 | 28 | int zMag; |
mohammmo | 2:bb31f097af0f | 29 | float xLight; |
mohammmo | 2:bb31f097af0f | 30 | float xTouch; |
oliverfang | 0:648dde0c4ef8 | 31 | |
oliverfang | 3:552b7c450b2f | 32 | // Sampling rates |
oliverfang | 4:0d2eefc2be8e | 33 | float accRate = 0.1; |
oliverfang | 4:0d2eefc2be8e | 34 | float magRate = 0.1; |
oliverfang | 3:552b7c450b2f | 35 | float lightRate = 0.1; |
oliverfang | 3:552b7c450b2f | 36 | float touchRate = 0.1; |
oliverfang | 3:552b7c450b2f | 37 | |
oliverfang | 8:b87b93a62a6a | 38 | // Receiving Data |
oliverfang | 8:b87b93a62a6a | 39 | const int bufferSize = 255; |
oliverfang | 8:b87b93a62a6a | 40 | char buffer[bufferSize]; |
oliverfang | 8:b87b93a62a6a | 41 | int index = 0; |
oliverfang | 8:b87b93a62a6a | 42 | bool received = false; |
mohammmo | 9:90567e22c5e1 | 43 | char tx_buffer[80]; |
oliverfang | 3:552b7c450b2f | 44 | |
oliverfang | 0:648dde0c4ef8 | 45 | // Declare Accelerometer pins and I2C address |
oliverfang | 0:648dde0c4ef8 | 46 | MMA8451Q acc(PTE25, PTE24, MMA8451_I2C_ADDRESS, 0, 0); |
oliverfang | 0:648dde0c4ef8 | 47 | // Declare Magnetometer pins |
oliverfang | 0:648dde0c4ef8 | 48 | MAG3110 mag(PTE25, PTE24); |
mohammmo | 2:bb31f097af0f | 49 | // Declare touch sensor pin |
mohammmo | 2:bb31f097af0f | 50 | TSISensor touch; |
mohammmo | 2:bb31f097af0f | 51 | // Declare light sensor pin |
mohammmo | 2:bb31f097af0f | 52 | AnalogIn light(PTE22); |
oliverfang | 0:648dde0c4ef8 | 53 | |
oliverfang | 0:648dde0c4ef8 | 54 | // Functions |
oliverfang | 0:648dde0c4ef8 | 55 | void init(); |
oliverfang | 4:0d2eefc2be8e | 56 | void printData(); |
oliverfang | 8:b87b93a62a6a | 57 | void receiveHandler(); |
oliverfang | 8:b87b93a62a6a | 58 | void processCommand(); |
oliverfang | 0:648dde0c4ef8 | 59 | void accTime(); |
oliverfang | 0:648dde0c4ef8 | 60 | void magTime(); |
mohammmo | 2:bb31f097af0f | 61 | void lightTime(); |
mohammmo | 2:bb31f097af0f | 62 | void touchTime(); |
oliverfang | 0:648dde0c4ef8 | 63 | |
oliverfang | 0:648dde0c4ef8 | 64 | void init() |
oliverfang | 0:648dde0c4ef8 | 65 | { |
oliverfang | 0:648dde0c4ef8 | 66 | // Attach timerAcc |
mohammmo | 9:90567e22c5e1 | 67 | pc.baud(115200); |
oliverfang | 3:552b7c450b2f | 68 | timerAcc.attach(&accTime, accRate); |
oliverfang | 3:552b7c450b2f | 69 | timerMag.attach(&magTime, magRate); |
oliverfang | 3:552b7c450b2f | 70 | timerLight.attach(&lightTime, lightRate); |
oliverfang | 3:552b7c450b2f | 71 | timerTouch.attach(&touchTime, touchRate); |
oliverfang | 8:b87b93a62a6a | 72 | pc.attach(&receiveHandler, Serial::RxIrq); |
oliverfang | 0:648dde0c4ef8 | 73 | ledred = 0; |
oliverfang | 0:648dde0c4ef8 | 74 | ledgreen = 0; |
oliverfang | 0:648dde0c4ef8 | 75 | } |
oliverfang | 0:648dde0c4ef8 | 76 | |
oliverfang | 0:648dde0c4ef8 | 77 | int main() |
oliverfang | 0:648dde0c4ef8 | 78 | { |
oliverfang | 0:648dde0c4ef8 | 79 | // Initialize |
oliverfang | 0:648dde0c4ef8 | 80 | init(); |
oliverfang | 0:648dde0c4ef8 | 81 | |
oliverfang | 0:648dde0c4ef8 | 82 | while(1) |
oliverfang | 0:648dde0c4ef8 | 83 | { |
oliverfang | 4:0d2eefc2be8e | 84 | printData(); |
oliverfang | 8:b87b93a62a6a | 85 | wait(0.05); |
oliverfang | 8:b87b93a62a6a | 86 | if(received){ |
oliverfang | 8:b87b93a62a6a | 87 | __disable_irq(); |
oliverfang | 8:b87b93a62a6a | 88 | processCommand(); |
oliverfang | 8:b87b93a62a6a | 89 | __enable_irq(); |
oliverfang | 8:b87b93a62a6a | 90 | } |
oliverfang | 8:b87b93a62a6a | 91 | //ledgreen = !ledgreen; |
oliverfang | 0:648dde0c4ef8 | 92 | } |
oliverfang | 0:648dde0c4ef8 | 93 | } |
oliverfang | 0:648dde0c4ef8 | 94 | |
oliverfang | 4:0d2eefc2be8e | 95 | void printData() |
oliverfang | 4:0d2eefc2be8e | 96 | { |
mohammmo | 9:90567e22c5e1 | 97 | sprintf(tx_buffer,"/%f/%f/%f/%d/%d/%d/%f/%f/%f/%f/%f/%f/\r\n", xAcc, yAcc, zAcc, xMag, yMag, zMag, xLight, xTouch, accRate, magRate, lightRate, touchRate); |
mohammmo | 9:90567e22c5e1 | 98 | pc.puts(tx_buffer); |
oliverfang | 8:b87b93a62a6a | 99 | } |
oliverfang | 8:b87b93a62a6a | 100 | |
oliverfang | 8:b87b93a62a6a | 101 | void receiveHandler() |
oliverfang | 8:b87b93a62a6a | 102 | { |
oliverfang | 8:b87b93a62a6a | 103 | index = 0; |
oliverfang | 8:b87b93a62a6a | 104 | while (pc.readable() && index < bufferSize){ |
oliverfang | 8:b87b93a62a6a | 105 | //ledgreen = !ledgreen; |
oliverfang | 8:b87b93a62a6a | 106 | buffer[index] = pc.getc(); |
oliverfang | 8:b87b93a62a6a | 107 | if (buffer[index] == '#'){ |
oliverfang | 8:b87b93a62a6a | 108 | index = 0; |
oliverfang | 8:b87b93a62a6a | 109 | received = true; |
oliverfang | 8:b87b93a62a6a | 110 | //ledred = !ledred; |
oliverfang | 8:b87b93a62a6a | 111 | break; |
oliverfang | 8:b87b93a62a6a | 112 | } |
oliverfang | 8:b87b93a62a6a | 113 | index++; |
oliverfang | 8:b87b93a62a6a | 114 | } |
oliverfang | 8:b87b93a62a6a | 115 | return; |
oliverfang | 8:b87b93a62a6a | 116 | } |
oliverfang | 8:b87b93a62a6a | 117 | |
oliverfang | 8:b87b93a62a6a | 118 | void processCommand() |
oliverfang | 8:b87b93a62a6a | 119 | { |
oliverfang | 8:b87b93a62a6a | 120 | //pc.printf("%s\r\n", buffer); |
oliverfang | 8:b87b93a62a6a | 121 | char* commands; |
oliverfang | 8:b87b93a62a6a | 122 | commands = strtok(buffer, "x"); |
oliverfang | 8:b87b93a62a6a | 123 | //pc.printf("%s\r\n", commands); |
oliverfang | 8:b87b93a62a6a | 124 | switch(*commands) |
oliverfang | 8:b87b93a62a6a | 125 | { |
oliverfang | 8:b87b93a62a6a | 126 | case '0': |
oliverfang | 8:b87b93a62a6a | 127 | commands = strtok(NULL, "x"); |
oliverfang | 8:b87b93a62a6a | 128 | //pc.printf("%s\r\n", commands); |
oliverfang | 8:b87b93a62a6a | 129 | accRate = strtod(commands, NULL)/1000; |
oliverfang | 8:b87b93a62a6a | 130 | timerAcc.detach(); |
oliverfang | 8:b87b93a62a6a | 131 | timerAcc.attach(&accTime, accRate); |
oliverfang | 8:b87b93a62a6a | 132 | break; |
oliverfang | 8:b87b93a62a6a | 133 | case '1': |
oliverfang | 8:b87b93a62a6a | 134 | commands = strtok(NULL, "x"); |
oliverfang | 8:b87b93a62a6a | 135 | //pc.printf("%s\r\n", commands); |
oliverfang | 8:b87b93a62a6a | 136 | magRate = strtod(commands, NULL)/1000; |
oliverfang | 8:b87b93a62a6a | 137 | timerMag.detach(); |
oliverfang | 8:b87b93a62a6a | 138 | timerMag.attach(&magTime, magRate); |
oliverfang | 8:b87b93a62a6a | 139 | break; |
oliverfang | 8:b87b93a62a6a | 140 | case '2': |
oliverfang | 8:b87b93a62a6a | 141 | commands = strtok(NULL, "x"); |
oliverfang | 8:b87b93a62a6a | 142 | //pc.printf("%s\r\n", commands); |
oliverfang | 8:b87b93a62a6a | 143 | lightRate = strtod(commands, NULL)/1000; |
oliverfang | 8:b87b93a62a6a | 144 | timerLight.detach(); |
oliverfang | 8:b87b93a62a6a | 145 | timerLight.attach(&lightTime, lightRate); |
oliverfang | 8:b87b93a62a6a | 146 | break; |
oliverfang | 8:b87b93a62a6a | 147 | case '3': |
oliverfang | 8:b87b93a62a6a | 148 | commands = strtok(NULL, "x"); |
oliverfang | 8:b87b93a62a6a | 149 | //pc.printf("%s\r\n", commands); |
oliverfang | 8:b87b93a62a6a | 150 | touchRate = strtod(commands, NULL)/1000; |
oliverfang | 8:b87b93a62a6a | 151 | timerTouch.detach(); |
oliverfang | 8:b87b93a62a6a | 152 | timerTouch.attach(&touchTime, touchRate); |
oliverfang | 8:b87b93a62a6a | 153 | break; |
oliverfang | 8:b87b93a62a6a | 154 | default: |
oliverfang | 8:b87b93a62a6a | 155 | //pc.printf("incorrect input\r\n"); |
oliverfang | 8:b87b93a62a6a | 156 | break; |
oliverfang | 8:b87b93a62a6a | 157 | } |
oliverfang | 8:b87b93a62a6a | 158 | received = false; |
oliverfang | 8:b87b93a62a6a | 159 | memset(buffer, 0, bufferSize); |
oliverfang | 8:b87b93a62a6a | 160 | //pc.printf("%s\r\n", buffer); |
oliverfang | 8:b87b93a62a6a | 161 | } |
oliverfang | 8:b87b93a62a6a | 162 | |
oliverfang | 0:648dde0c4ef8 | 163 | void accTime() |
oliverfang | 0:648dde0c4ef8 | 164 | { |
oliverfang | 0:648dde0c4ef8 | 165 | xAcc = abs(acc.getAccX()); |
oliverfang | 0:648dde0c4ef8 | 166 | yAcc = abs(acc.getAccY()); |
oliverfang | 0:648dde0c4ef8 | 167 | zAcc = abs(acc.getAccZ()); |
oliverfang | 8:b87b93a62a6a | 168 | //ledred = !ledred; |
oliverfang | 0:648dde0c4ef8 | 169 | } |
oliverfang | 0:648dde0c4ef8 | 170 | |
oliverfang | 0:648dde0c4ef8 | 171 | void magTime() |
oliverfang | 0:648dde0c4ef8 | 172 | { |
oliverfang | 0:648dde0c4ef8 | 173 | xMag = mag.getXVal(); |
oliverfang | 0:648dde0c4ef8 | 174 | yMag = mag.getYVal(); |
oliverfang | 0:648dde0c4ef8 | 175 | zMag = mag.getZVal(); |
oliverfang | 8:b87b93a62a6a | 176 | //ledred = !ledred; |
mohammmo | 2:bb31f097af0f | 177 | } |
mohammmo | 2:bb31f097af0f | 178 | |
mohammmo | 2:bb31f097af0f | 179 | void lightTime() |
mohammmo | 2:bb31f097af0f | 180 | { |
mohammmo | 2:bb31f097af0f | 181 | xLight = 1 - light.read(); |
mohammmo | 2:bb31f097af0f | 182 | } |
mohammmo | 2:bb31f097af0f | 183 | |
mohammmo | 2:bb31f097af0f | 184 | void touchTime() |
mohammmo | 2:bb31f097af0f | 185 | { |
mohammmo | 2:bb31f097af0f | 186 | xTouch = 1 - touch.readPercentage(); |
oliverfang | 8:b87b93a62a6a | 187 | } |