Dependencies:   mbed

Committer:
alex89
Date:
Sun Dec 06 12:56:50 2009 +0000
Revision:
0:05ddd3ecad81

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alex89 0:05ddd3ecad81 1 #include "mbed.h"
alex89 0:05ddd3ecad81 2
alex89 0:05ddd3ecad81 3 Serial pc(USBTX, USBRX); // debugging
alex89 0:05ddd3ecad81 4
alex89 0:05ddd3ecad81 5 DigitalOut enable(p26); // enable pin
alex89 0:05ddd3ecad81 6 I2C i2c(p28, p27); // accelerometer
alex89 0:05ddd3ecad81 7
alex89 0:05ddd3ecad81 8 const int address = 0x30;
alex89 0:05ddd3ecad81 9
alex89 0:05ddd3ecad81 10 const int CTRL_REGB = 0x0D;
alex89 0:05ddd3ecad81 11 const int CTRL_REGC = 0x0C;
alex89 0:05ddd3ecad81 12
alex89 0:05ddd3ecad81 13 const int XOUT_H = 0x00; //x
alex89 0:05ddd3ecad81 14 const int XOUT_L = 0x01;
alex89 0:05ddd3ecad81 15
alex89 0:05ddd3ecad81 16 const int YOUT_H = 0x02; //y
alex89 0:05ddd3ecad81 17 const int YOUT_L = 0x03;
alex89 0:05ddd3ecad81 18
alex89 0:05ddd3ecad81 19 const int ZOUT_H = 0x04; //z
alex89 0:05ddd3ecad81 20 const int ZOUT_L = 0x05;
alex89 0:05ddd3ecad81 21
alex89 0:05ddd3ecad81 22
alex89 0:05ddd3ecad81 23 //--------------- IC2 helper functions ---------------
alex89 0:05ddd3ecad81 24
alex89 0:05ddd3ecad81 25 // write value into register regno, return success
alex89 0:05ddd3ecad81 26 bool write_reg(int regno, int value) {
alex89 0:05ddd3ecad81 27
alex89 0:05ddd3ecad81 28 char data[2] = {regno, value};
alex89 0:05ddd3ecad81 29
alex89 0:05ddd3ecad81 30 return i2c.write(address, data, 2) == 0;
alex89 0:05ddd3ecad81 31
alex89 0:05ddd3ecad81 32 }
alex89 0:05ddd3ecad81 33
alex89 0:05ddd3ecad81 34 // read value from register regno, return success
alex89 0:05ddd3ecad81 35 bool read_reg(int regno, int *value) {
alex89 0:05ddd3ecad81 36
alex89 0:05ddd3ecad81 37 char data = regno;
alex89 0:05ddd3ecad81 38
alex89 0:05ddd3ecad81 39 if (i2c.write(address, &data, 1) == 0 && i2c.read(address, &data, 1) == 0){
alex89 0:05ddd3ecad81 40 *value = data;
alex89 0:05ddd3ecad81 41 return true;
alex89 0:05ddd3ecad81 42 }
alex89 0:05ddd3ecad81 43 return false;
alex89 0:05ddd3ecad81 44
alex89 0:05ddd3ecad81 45 }
alex89 0:05ddd3ecad81 46
alex89 0:05ddd3ecad81 47 // read complete value of X axis, return it or -1 on failure
alex89 0:05ddd3ecad81 48 int read_x() {
alex89 0:05ddd3ecad81 49
alex89 0:05ddd3ecad81 50 int low, high;
alex89 0:05ddd3ecad81 51
alex89 0:05ddd3ecad81 52 if ( read_reg(XOUT_H, &high) && read_reg(XOUT_L, &low) )
alex89 0:05ddd3ecad81 53 return high<<8 | low;
alex89 0:05ddd3ecad81 54 else
alex89 0:05ddd3ecad81 55 return -1;
alex89 0:05ddd3ecad81 56 }
alex89 0:05ddd3ecad81 57
alex89 0:05ddd3ecad81 58 // read complete value of Y axis, return it or -1 on failure
alex89 0:05ddd3ecad81 59 int read_y() {
alex89 0:05ddd3ecad81 60
alex89 0:05ddd3ecad81 61 int low, high;
alex89 0:05ddd3ecad81 62
alex89 0:05ddd3ecad81 63 if ( read_reg(YOUT_H, &high) && read_reg(YOUT_L, &low) )
alex89 0:05ddd3ecad81 64 return high<<8 | low;
alex89 0:05ddd3ecad81 65 else
alex89 0:05ddd3ecad81 66 return -1;
alex89 0:05ddd3ecad81 67 }
alex89 0:05ddd3ecad81 68
alex89 0:05ddd3ecad81 69 // read complete value of Z axis, return it or -1 on failure
alex89 0:05ddd3ecad81 70 int read_z() {
alex89 0:05ddd3ecad81 71
alex89 0:05ddd3ecad81 72 int low, high;
alex89 0:05ddd3ecad81 73
alex89 0:05ddd3ecad81 74 if ( read_reg(ZOUT_H, &high) && read_reg(ZOUT_L, &low) )
alex89 0:05ddd3ecad81 75 return high<<8 | low;
alex89 0:05ddd3ecad81 76 else
alex89 0:05ddd3ecad81 77 return -1;
alex89 0:05ddd3ecad81 78 }
alex89 0:05ddd3ecad81 79
alex89 0:05ddd3ecad81 80 void accData(){
alex89 0:05ddd3ecad81 81
alex89 0:05ddd3ecad81 82 enable = 1;
alex89 0:05ddd3ecad81 83
alex89 0:05ddd3ecad81 84 write_reg(CTRL_REGB, 0xC2);
alex89 0:05ddd3ecad81 85 write_reg(CTRL_REGC, 0x00);
alex89 0:05ddd3ecad81 86
alex89 0:05ddd3ecad81 87 for (int i = 0; i < 1000; i++){
alex89 0:05ddd3ecad81 88
alex89 0:05ddd3ecad81 89 printf("%d,%d,%d \n", read_x(), read_y(), read_z());
alex89 0:05ddd3ecad81 90
alex89 0:05ddd3ecad81 91 wait(0.05);
alex89 0:05ddd3ecad81 92
alex89 0:05ddd3ecad81 93 }
alex89 0:05ddd3ecad81 94
alex89 0:05ddd3ecad81 95 enable = 0;
alex89 0:05ddd3ecad81 96
alex89 0:05ddd3ecad81 97 }
alex89 0:05ddd3ecad81 98
alex89 0:05ddd3ecad81 99 void accLEDs(){
alex89 0:05ddd3ecad81 100
alex89 0:05ddd3ecad81 101 DigitalOut x0(p20); //red
alex89 0:05ddd3ecad81 102 DigitalOut x1(p19); //green
alex89 0:05ddd3ecad81 103 DigitalOut x2(p16); //green
alex89 0:05ddd3ecad81 104 DigitalOut x3(p15); //green
alex89 0:05ddd3ecad81 105 DigitalOut x4(p13); //green
alex89 0:05ddd3ecad81 106 DigitalOut x5(p11); //red
alex89 0:05ddd3ecad81 107
alex89 0:05ddd3ecad81 108 enable = 1;
alex89 0:05ddd3ecad81 109
alex89 0:05ddd3ecad81 110 write_reg(CTRL_REGB, 0xC2); //start
alex89 0:05ddd3ecad81 111 write_reg(CTRL_REGC, 0x00);
alex89 0:05ddd3ecad81 112
alex89 0:05ddd3ecad81 113 for (int i = 0; i < 1000; i++){
alex89 0:05ddd3ecad81 114
alex89 0:05ddd3ecad81 115 double x = double (read_x() - 32768)/9000; //normalise to around 0g/1g
alex89 0:05ddd3ecad81 116 double y = double (read_y() - 32768)/9000;
alex89 0:05ddd3ecad81 117 double z = double (read_z() - 32768)/9000;
alex89 0:05ddd3ecad81 118
alex89 0:05ddd3ecad81 119 //pc.printf("%.2f, %.2f, %.2f \n", x, y, z);
alex89 0:05ddd3ecad81 120 //pc.printf("%.2f \n", x);
alex89 0:05ddd3ecad81 121
alex89 0:05ddd3ecad81 122 x0 = 0; x1 = 0; x2 = 0; x3 = 0; x4 = 0; x5 = 0;
alex89 0:05ddd3ecad81 123
alex89 0:05ddd3ecad81 124 int intx = (x+0.1)*5; //scale to an integer from 0 to 5
alex89 0:05ddd3ecad81 125
alex89 0:05ddd3ecad81 126 pc.printf("%d \n", intx);
alex89 0:05ddd3ecad81 127
alex89 0:05ddd3ecad81 128 switch (intx) {
alex89 0:05ddd3ecad81 129
alex89 0:05ddd3ecad81 130 case 0:
alex89 0:05ddd3ecad81 131 x0 = 1;
alex89 0:05ddd3ecad81 132 break;
alex89 0:05ddd3ecad81 133 case 1:
alex89 0:05ddd3ecad81 134 x1 = 1;
alex89 0:05ddd3ecad81 135 break;
alex89 0:05ddd3ecad81 136 case 2:
alex89 0:05ddd3ecad81 137 x2 = 1;
alex89 0:05ddd3ecad81 138 break;
alex89 0:05ddd3ecad81 139 case 3:
alex89 0:05ddd3ecad81 140 x3 = 1;
alex89 0:05ddd3ecad81 141 break;
alex89 0:05ddd3ecad81 142 case 4:
alex89 0:05ddd3ecad81 143 x4 = 1;
alex89 0:05ddd3ecad81 144 break;
alex89 0:05ddd3ecad81 145 case 5:
alex89 0:05ddd3ecad81 146 x5 = 1;
alex89 0:05ddd3ecad81 147 break;
alex89 0:05ddd3ecad81 148
alex89 0:05ddd3ecad81 149 default:
alex89 0:05ddd3ecad81 150 break;
alex89 0:05ddd3ecad81 151 }
alex89 0:05ddd3ecad81 152
alex89 0:05ddd3ecad81 153 wait(0.1);
alex89 0:05ddd3ecad81 154
alex89 0:05ddd3ecad81 155 }
alex89 0:05ddd3ecad81 156
alex89 0:05ddd3ecad81 157 x0 = 0; x1 = 0; x2 = 0; x3 = 0; x4 = 0; x5 = 0;
alex89 0:05ddd3ecad81 158
alex89 0:05ddd3ecad81 159 enable = 0;
alex89 0:05ddd3ecad81 160
alex89 0:05ddd3ecad81 161 }
alex89 0:05ddd3ecad81 162
alex89 0:05ddd3ecad81 163
alex89 0:05ddd3ecad81 164 //-------------------- Main -------------------
alex89 0:05ddd3ecad81 165
alex89 0:05ddd3ecad81 166 int main() {
alex89 0:05ddd3ecad81 167
alex89 0:05ddd3ecad81 168 pc.printf("Program started\n");
alex89 0:05ddd3ecad81 169
alex89 0:05ddd3ecad81 170 //accData();
alex89 0:05ddd3ecad81 171
alex89 0:05ddd3ecad81 172 accLEDs();
alex89 0:05ddd3ecad81 173
alex89 0:05ddd3ecad81 174 pc.printf("Program complete\n\n");
alex89 0:05ddd3ecad81 175 }