Dependencies:   mbed

main.cpp

Committer:
alex89
Date:
2009-12-06
Revision:
0:05ddd3ecad81

File content as of revision 0:05ddd3ecad81:

#include "mbed.h"

Serial pc(USBTX, USBRX);    // debugging

DigitalOut enable(p26);    // enable pin
I2C i2c(p28, p27);         // accelerometer

const int address = 0x30;

const int CTRL_REGB = 0x0D;
const int CTRL_REGC = 0x0C;

const int XOUT_H = 0x00;    //x
const int XOUT_L = 0x01;

const int YOUT_H = 0x02;    //y
const int YOUT_L = 0x03;

const int ZOUT_H = 0x04;    //z
const int ZOUT_L = 0x05;


//--------------- IC2 helper functions ---------------

// write value into register regno, return success
bool write_reg(int regno, int value) {

    char data[2] = {regno, value}; 
    
    return i2c.write(address, data, 2) == 0;
    
}

// read value from register regno, return success
bool read_reg(int regno, int *value) {

    char data = regno; 
    
    if (i2c.write(address, &data, 1) == 0 && i2c.read(address, &data, 1) == 0){
        *value = data;
        return true;
    }
    return false;
    
}

// read complete value of X axis, return it or -1 on failure
int read_x() {

    int low, high;
    
    if ( read_reg(XOUT_H, &high) && read_reg(XOUT_L, &low) )
        return high<<8 | low;
    else
        return -1;
}

// read complete value of Y axis, return it or -1 on failure
int read_y() {

    int low, high;
    
    if ( read_reg(YOUT_H, &high) && read_reg(YOUT_L, &low) )
        return high<<8 | low;
    else
        return -1;
}

// read complete value of Z axis, return it or -1 on failure
int read_z() {

    int low, high;
    
    if ( read_reg(ZOUT_H, &high) && read_reg(ZOUT_L, &low) )
        return high<<8 | low;
    else
        return -1;
}

void accData(){

    enable = 1;
    
    write_reg(CTRL_REGB, 0xC2);
    write_reg(CTRL_REGC, 0x00);
    
    for (int i = 0; i < 1000; i++){
    
        printf("%d,%d,%d \n", read_x(), read_y(), read_z());

        wait(0.05);

    }
    
    enable = 0;

}

void accLEDs(){

    DigitalOut x0(p20);    //red
    DigitalOut x1(p19);    //green
    DigitalOut x2(p16);    //green
    DigitalOut x3(p15);    //green
    DigitalOut x4(p13);    //green
    DigitalOut x5(p11);    //red
    
    enable = 1;
    
    write_reg(CTRL_REGB, 0xC2); //start
    write_reg(CTRL_REGC, 0x00);
    
    for (int i = 0; i < 1000; i++){
    
        double x = double (read_x() - 32768)/9000; //normalise to around 0g/1g
        double y = double (read_y() - 32768)/9000;
        double z = double (read_z() - 32768)/9000;
        
        //pc.printf("%.2f, %.2f, %.2f \n", x, y, z);
        //pc.printf("%.2f \n", x);
        
        x0 = 0; x1 = 0; x2 = 0; x3 = 0; x4 = 0; x5 = 0;
        
        int intx = (x+0.1)*5; //scale to an integer from 0 to 5
        
        pc.printf("%d \n", intx);
        
        switch (intx) {
        
            case 0:
                x0 = 1;
                break;
            case 1:
                x1 = 1;
                break;  
            case 2:
                x2 = 1;
                break;  
            case 3:
                x3 = 1;
                break;  
            case 4:
                x4 = 1;
                break;  
            case 5:
                x5 = 1;
                break;      
                
            default: 
                break;
        }
        
        wait(0.1);
        
    }
    
    x0 = 0; x1 = 0; x2 = 0; x3 = 0; x4 = 0; x5 = 0;
    
    enable = 0;

}


//-------------------- Main -------------------

int main() {
    
    pc.printf("Program started\n");
    
    //accData();
    
    accLEDs();
    
    pc.printf("Program complete\n\n");
}