Sistemi_digitali_integrati / Mbed 2 deprecated Sensor

Dependencies:   mbed

main.cpp

Committer:
ymerdushku
Date:
2017-01-31
Revision:
5:653dac107d67
Parent:
4:420dc2851775

File content as of revision 5:653dac107d67:

#include "mbed.h"
#include <I2C.h>
#include <string.h>
#include <stdlib.h>

#define LSM6DS0_ADDRESS_WRITE (0xD6) //  Register_write
#define LSM6DS0_ADDRESS_READ (0xD7) //  Register_read
#define POWER_ON_ACC (0x20)
#define READ_X_L (0x28)
#define READ_X_H (0x29)
#define READ_Y_L (0x2A)
#define READ_Y_H (0x2B)
#define READ_Z_L (0x2C)
#define READ_Z_H (0x2D)
#define IDENTIFIER (0x0F)

I2C i2c(I2C_SDA,I2C_SCL);
Serial pc(SERIAL_TX, SERIAL_RX);
//Serial fpga(D15, D14);
char readREG_I2C(char REG_ADDR[1]);
void setREG_I2C(char REG_ADDR_DATA[2]);

int main() {
    char X_value[2];
    char ident[1];
    char data_write[2];
    char ADDR[1];
    char ADDR_X[1];
    char ADDR_Y[1];
    char ADDR_Z[1];
    char X[2];
    char Y[2];
    char Z[2];
    int cnt=0;
        
    //read WHO_AM_I
    //ADDR[0]=0x0F;
    //ident[0]=readREG_I2C(ADDR);
    //pc.printf("%c",ident[0]);
 
    //power on accelerometer
    data_write[0] = POWER_ON_ACC;
    data_write[1] = 0b01100000; //select f=982Hz
    setREG_I2C(data_write);

    
    //read X
    ADDR_X[0]=READ_X_L;
    X[1]=readREG_I2C(ADDR_X);
    pc.printf("%c",X[1]);
    ADDR_X[0]=READ_X_H;
    X[0]=readREG_I2C(ADDR_X);
    pc.printf("%c",X[0]);
 
    //read Y
    ADDR_Y[0]=READ_Y_L;
    Y[1]=readREG_I2C(ADDR_Y);
    pc.printf("%c",Y[1]);
    ADDR_Y[0]=READ_Y_H;
    Y[0]=readREG_I2C(ADDR_Y);
    pc.printf("%c",Y[0]);
    
    //read Z
    ADDR_Z[0]=READ_Z_H;
    Z[1]=readREG_I2C(ADDR_Z);
    pc.printf("%c",Z[1]);
    ADDR_Z[0]=READ_Z_L;
    Z[0]=readREG_I2C(ADDR_Z);
    pc.printf("%c",Z[0]);
    
    //conversione da char a intero
    int X_int[2];
    int Y_int[2];
    int Z_int[2];
    
    X_int[0]=X[0]-'0';
    X_int[1]=X[1]-'0';
    Y_int[0]=Y[0]-'0';
    Y_int[1]=Y[1]-'0';
    Z_int[0]=Z[0]-'0';
    Z_int[1]=Z[1]-'0';
    
    //parte aggiuntiva -> i valori di accelerazione sono X[0],Y[0],Z[0] parti basse
//X[1],Y[1],Z[1] parti alte


    int x_acceleration[2];
    int y_acceleration[2];
    int z_acceleration[2];
    int x_velocity[2];
    int y_velocity[2];
    int z_velocity[2];
    int x_position[2];
    int y_position[2];
    int z_position[2];
    int x_pos[2];
    int y_pos[2];
    int z_pos[2];


if(cnt==0)         //variabile int cnt da definire e settare uguale a zero ad inizio codice
{
x_acceleration[0]=0;
y_acceleration[0]=0;
z_acceleration[0]=0;

x_velocity[0]=0;
y_velocity[0]=0;
z_velocity[0]=0;

x_position[0]=0;
y_position[0]=0;
z_position[0]=0;
}
else
{
x_acceleration[0]=x_acceleration[1];
y_acceleration[0]=y_acceleration[1];
z_acceleration[0]=z_acceleration[1];

x_velocity[0]=x_velocity[1];
y_velocity[0]=y_velocity[1];
z_velocity[0]=z_velocity[1];

x_position[0]=x_position[1];
y_position[0]=y_position[1];
z_position[0]=z_position[1];
}

cnt++;
                    //unione delle parti da 8 bit in variabili da 16 bit
x_acceleration[1]=(X_int[1]<<8)|X[0];
y_acceleration[1]=(Y_int[1]<<8)|Y[0];
z_acceleration[1]=(Z_int[1]<<8)|Z[0];

//first integration

x_velocity[1]  = x_velocity[0]  +  (x_acceleration[1] -  x_acceleration[0])/2;
y_velocity[1]  = y_velocity[0]  +  (y_acceleration[1] -  y_acceleration[0])/2; 
z_velocity[1]  = z_velocity[0]  +  (z_acceleration[1] -  z_acceleration[0])/2;  

//second integration

x_position[1] = x_position[0] + x_velocity[0] + (x_velocity[1] - x_velocity[0])/2;
y_position[1] = y_position[0] + y_velocity[0] + (y_velocity[1] - y_velocity[0])/2;
z_position[1] = z_position[0] + z_velocity[0] + (z_velocity[1] - z_velocity[0])/2;

//divisione in parti da 8 bit rispettivamente alte e basse

x_pos[1]=x_position[1] >> 8;
x_pos[0]=x_position[1] & 0xFF;

y_pos[1]=y_position[1] >> 8;
y_pos[0]=y_position[1] & 0xFF;

z_pos[1]=z_position[1] >> 8;
z_pos[0]=z_position[1] & 0xFF;



//inviare sulla linea sequenza di byte di start
int start=0xFF;
fpga.printf("%d",start);
fpga.printf("%d",start);
start=0x00;
fpga.printf("%d",start);
fpga.printf("%d",start);

fpga.printf("%c",x_pos[1]);
fpga.printf("%c",x_pos[0]);
fpga.printf("%c",y_pos[1]);
fpga.printf("%c",y_pos[0]);
fpga.printf("%c",z_pos[1]);
fpga.printf("%c",z_pos[0]);

int stop=0x00;
fpg.printf("%d",stop);
pc.printf("%d",stop);
start=0xFF;
pc.printf("%d",stop);
pc.printf("%d",stop);
//inviare sulla linea sequenza di byte di stop
      
     
}
 

 
void setREG_I2C(char REG_ADDR_DATA[2]) //argument to pass : address register and data to write in
{
 if ((i2c.write(LSM6DS0_ADDRESS_WRITE,REG_ADDR_DATA,2,0))!=0)//ADDR+SUB+DATA+STOP, return 0 if ack
    { 
        pc.printf("Error, not ack\n");      
    } 
   
}
 
// read register
char readREG_I2C(char REG_ADDR[1]) //argument to pass : address register to read
{ 
    char data_read[1];
    
        i2c.write(LSM6DS0_ADDRESS_WRITE,REG_ADDR,1,1);  //ADDR+SUB, return 0 if ack
        i2c.read(LSM6DS0_ADDRESS_READ,data_read,1,0); //ADDR+data+STOP, return 0 if ack
   
    return data_read[0];
}