Sistemi_digitali_integrati / Mbed 2 deprecated Sensor

Dependencies:   mbed

Committer:
ymerdushku
Date:
Tue Jan 31 10:31:32 2017 +0000
Revision:
5:653dac107d67
Parent:
4:420dc2851775
versione con gli interi

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ymerdushku 0:f043a4a4ec8d 1 #include "mbed.h"
ymerdushku 0:f043a4a4ec8d 2 #include <I2C.h>
ymerdushku 4:420dc2851775 3 #include <string.h>
ymerdushku 5:653dac107d67 4 #include <stdlib.h>
ymerdushku 4:420dc2851775 5
ymerdushku 2:6b07b1425f3e 6 #define LSM6DS0_ADDRESS_WRITE (0xD6) // Register_write
ymerdushku 2:6b07b1425f3e 7 #define LSM6DS0_ADDRESS_READ (0xD7) // Register_read
ymerdushku 1:68e3916ad434 8 #define POWER_ON_ACC (0x20)
ymerdushku 2:6b07b1425f3e 9 #define READ_X_L (0x28)
ymerdushku 2:6b07b1425f3e 10 #define READ_X_H (0x29)
ymerdushku 2:6b07b1425f3e 11 #define READ_Y_L (0x2A)
ymerdushku 2:6b07b1425f3e 12 #define READ_Y_H (0x2B)
ymerdushku 2:6b07b1425f3e 13 #define READ_Z_L (0x2C)
ymerdushku 2:6b07b1425f3e 14 #define READ_Z_H (0x2D)
ymerdushku 2:6b07b1425f3e 15 #define IDENTIFIER (0x0F)
ymerdushku 0:f043a4a4ec8d 16
ymerdushku 0:f043a4a4ec8d 17 I2C i2c(I2C_SDA,I2C_SCL);
ymerdushku 0:f043a4a4ec8d 18 Serial pc(SERIAL_TX, SERIAL_RX);
ymerdushku 5:653dac107d67 19 //Serial fpga(D15, D14);
ymerdushku 4:420dc2851775 20 char readREG_I2C(char REG_ADDR[1]);
ymerdushku 4:420dc2851775 21 void setREG_I2C(char REG_ADDR_DATA[2]);
ymerdushku 0:f043a4a4ec8d 22
ymerdushku 0:f043a4a4ec8d 23 int main() {
ymerdushku 4:420dc2851775 24 char X_value[2];
ymerdushku 2:6b07b1425f3e 25 char ident[1];
ymerdushku 2:6b07b1425f3e 26 char data_write[2];
ymerdushku 2:6b07b1425f3e 27 char ADDR[1];
ymerdushku 4:420dc2851775 28 char ADDR_X[1];
ymerdushku 4:420dc2851775 29 char ADDR_Y[1];
ymerdushku 4:420dc2851775 30 char ADDR_Z[1];
ymerdushku 2:6b07b1425f3e 31 char X[2];
ymerdushku 2:6b07b1425f3e 32 char Y[2];
ymerdushku 2:6b07b1425f3e 33 char Z[2];
ymerdushku 5:653dac107d67 34 int cnt=0;
ymerdushku 2:6b07b1425f3e 35
ymerdushku 2:6b07b1425f3e 36 //read WHO_AM_I
ymerdushku 4:420dc2851775 37 //ADDR[0]=0x0F;
ymerdushku 4:420dc2851775 38 //ident[0]=readREG_I2C(ADDR);
ymerdushku 4:420dc2851775 39 //pc.printf("%c",ident[0]);
ymerdushku 4:420dc2851775 40
ymerdushku 2:6b07b1425f3e 41 //power on accelerometer
ymerdushku 2:6b07b1425f3e 42 data_write[0] = POWER_ON_ACC;
ymerdushku 4:420dc2851775 43 data_write[1] = 0b01100000; //select f=982Hz
ymerdushku 2:6b07b1425f3e 44 setREG_I2C(data_write);
ymerdushku 4:420dc2851775 45
ymerdushku 1:68e3916ad434 46
ymerdushku 2:6b07b1425f3e 47 //read X
ymerdushku 4:420dc2851775 48 ADDR_X[0]=READ_X_L;
ymerdushku 4:420dc2851775 49 X[1]=readREG_I2C(ADDR_X);
ymerdushku 4:420dc2851775 50 pc.printf("%c",X[1]);
ymerdushku 4:420dc2851775 51 ADDR_X[0]=READ_X_H;
ymerdushku 4:420dc2851775 52 X[0]=readREG_I2C(ADDR_X);
ymerdushku 4:420dc2851775 53 pc.printf("%c",X[0]);
ymerdushku 4:420dc2851775 54
ymerdushku 2:6b07b1425f3e 55 //read Y
ymerdushku 4:420dc2851775 56 ADDR_Y[0]=READ_Y_L;
ymerdushku 4:420dc2851775 57 Y[1]=readREG_I2C(ADDR_Y);
ymerdushku 4:420dc2851775 58 pc.printf("%c",Y[1]);
ymerdushku 4:420dc2851775 59 ADDR_Y[0]=READ_Y_H;
ymerdushku 4:420dc2851775 60 Y[0]=readREG_I2C(ADDR_Y);
ymerdushku 4:420dc2851775 61 pc.printf("%c",Y[0]);
ymerdushku 2:6b07b1425f3e 62
ymerdushku 2:6b07b1425f3e 63 //read Z
ymerdushku 4:420dc2851775 64 ADDR_Z[0]=READ_Z_H;
ymerdushku 4:420dc2851775 65 Z[1]=readREG_I2C(ADDR_Z);
ymerdushku 4:420dc2851775 66 pc.printf("%c",Z[1]);
ymerdushku 4:420dc2851775 67 ADDR_Z[0]=READ_Z_L;
ymerdushku 4:420dc2851775 68 Z[0]=readREG_I2C(ADDR_Z);
ymerdushku 4:420dc2851775 69 pc.printf("%c",Z[0]);
ymerdushku 5:653dac107d67 70
ymerdushku 5:653dac107d67 71 //conversione da char a intero
ymerdushku 5:653dac107d67 72 int X_int[2];
ymerdushku 5:653dac107d67 73 int Y_int[2];
ymerdushku 5:653dac107d67 74 int Z_int[2];
ymerdushku 5:653dac107d67 75
ymerdushku 5:653dac107d67 76 X_int[0]=X[0]-'0';
ymerdushku 5:653dac107d67 77 X_int[1]=X[1]-'0';
ymerdushku 5:653dac107d67 78 Y_int[0]=Y[0]-'0';
ymerdushku 5:653dac107d67 79 Y_int[1]=Y[1]-'0';
ymerdushku 5:653dac107d67 80 Z_int[0]=Z[0]-'0';
ymerdushku 5:653dac107d67 81 Z_int[1]=Z[1]-'0';
ymerdushku 5:653dac107d67 82
ymerdushku 5:653dac107d67 83 //parte aggiuntiva -> i valori di accelerazione sono X[0],Y[0],Z[0] parti basse
ymerdushku 4:420dc2851775 84 //X[1],Y[1],Z[1] parti alte
ymerdushku 4:420dc2851775 85
ymerdushku 5:653dac107d67 86
ymerdushku 5:653dac107d67 87 int x_acceleration[2];
ymerdushku 5:653dac107d67 88 int y_acceleration[2];
ymerdushku 5:653dac107d67 89 int z_acceleration[2];
ymerdushku 5:653dac107d67 90 int x_velocity[2];
ymerdushku 5:653dac107d67 91 int y_velocity[2];
ymerdushku 5:653dac107d67 92 int z_velocity[2];
ymerdushku 5:653dac107d67 93 int x_position[2];
ymerdushku 5:653dac107d67 94 int y_position[2];
ymerdushku 5:653dac107d67 95 int z_position[2];
ymerdushku 5:653dac107d67 96 int x_pos[2];
ymerdushku 5:653dac107d67 97 int y_pos[2];
ymerdushku 5:653dac107d67 98 int z_pos[2];
ymerdushku 4:420dc2851775 99
ymerdushku 4:420dc2851775 100
ymerdushku 4:420dc2851775 101 if(cnt==0) //variabile int cnt da definire e settare uguale a zero ad inizio codice
ymerdushku 4:420dc2851775 102 {
ymerdushku 4:420dc2851775 103 x_acceleration[0]=0;
ymerdushku 4:420dc2851775 104 y_acceleration[0]=0;
ymerdushku 4:420dc2851775 105 z_acceleration[0]=0;
ymerdushku 4:420dc2851775 106
ymerdushku 4:420dc2851775 107 x_velocity[0]=0;
ymerdushku 4:420dc2851775 108 y_velocity[0]=0;
ymerdushku 4:420dc2851775 109 z_velocity[0]=0;
ymerdushku 4:420dc2851775 110
ymerdushku 4:420dc2851775 111 x_position[0]=0;
ymerdushku 4:420dc2851775 112 y_position[0]=0;
ymerdushku 4:420dc2851775 113 z_position[0]=0;
ymerdushku 0:f043a4a4ec8d 114 }
ymerdushku 4:420dc2851775 115 else
ymerdushku 4:420dc2851775 116 {
ymerdushku 4:420dc2851775 117 x_acceleration[0]=x_acceleration[1];
ymerdushku 4:420dc2851775 118 y_acceleration[0]=y_acceleration[1];
ymerdushku 4:420dc2851775 119 z_acceleration[0]=z_acceleration[1];
ymerdushku 4:420dc2851775 120
ymerdushku 4:420dc2851775 121 x_velocity[0]=x_velocity[1];
ymerdushku 4:420dc2851775 122 y_velocity[0]=y_velocity[1];
ymerdushku 4:420dc2851775 123 z_velocity[0]=z_velocity[1];
ymerdushku 4:420dc2851775 124
ymerdushku 4:420dc2851775 125 x_position[0]=x_position[1];
ymerdushku 4:420dc2851775 126 y_position[0]=y_position[1];
ymerdushku 4:420dc2851775 127 z_position[0]=z_position[1];
ymerdushku 4:420dc2851775 128 }
ymerdushku 0:f043a4a4ec8d 129
ymerdushku 4:420dc2851775 130 cnt++;
ymerdushku 4:420dc2851775 131 //unione delle parti da 8 bit in variabili da 16 bit
ymerdushku 5:653dac107d67 132 x_acceleration[1]=(X_int[1]<<8)|X[0];
ymerdushku 5:653dac107d67 133 y_acceleration[1]=(Y_int[1]<<8)|Y[0];
ymerdushku 5:653dac107d67 134 z_acceleration[1]=(Z_int[1]<<8)|Z[0];
ymerdushku 4:420dc2851775 135
ymerdushku 4:420dc2851775 136 //first integration
ymerdushku 4:420dc2851775 137
ymerdushku 4:420dc2851775 138 x_velocity[1] = x_velocity[0] + (x_acceleration[1] - x_acceleration[0])/2;
ymerdushku 4:420dc2851775 139 y_velocity[1] = y_velocity[0] + (y_acceleration[1] - y_acceleration[0])/2;
ymerdushku 4:420dc2851775 140 z_velocity[1] = z_velocity[0] + (z_acceleration[1] - z_acceleration[0])/2;
ymerdushku 4:420dc2851775 141
ymerdushku 4:420dc2851775 142 //second integration
ymerdushku 4:420dc2851775 143
ymerdushku 4:420dc2851775 144 x_position[1] = x_position[0] + x_velocity[0] + (x_velocity[1] - x_velocity[0])/2;
ymerdushku 4:420dc2851775 145 y_position[1] = y_position[0] + y_velocity[0] + (y_velocity[1] - y_velocity[0])/2;
ymerdushku 4:420dc2851775 146 z_position[1] = z_position[0] + z_velocity[0] + (z_velocity[1] - z_velocity[0])/2;
ymerdushku 4:420dc2851775 147
ymerdushku 4:420dc2851775 148 //divisione in parti da 8 bit rispettivamente alte e basse
ymerdushku 4:420dc2851775 149
ymerdushku 4:420dc2851775 150 x_pos[1]=x_position[1] >> 8;
ymerdushku 5:653dac107d67 151 x_pos[0]=x_position[1] & 0xFF;
ymerdushku 4:420dc2851775 152
ymerdushku 4:420dc2851775 153 y_pos[1]=y_position[1] >> 8;
ymerdushku 5:653dac107d67 154 y_pos[0]=y_position[1] & 0xFF;
ymerdushku 4:420dc2851775 155
ymerdushku 4:420dc2851775 156 z_pos[1]=z_position[1] >> 8;
ymerdushku 5:653dac107d67 157 z_pos[0]=z_position[1] & 0xFF;
ymerdushku 4:420dc2851775 158
ymerdushku 4:420dc2851775 159
ymerdushku 4:420dc2851775 160
ymerdushku 4:420dc2851775 161 //inviare sulla linea sequenza di byte di start
ymerdushku 4:420dc2851775 162 int start=0xFF;
ymerdushku 5:653dac107d67 163 fpga.printf("%d",start);
ymerdushku 5:653dac107d67 164 fpga.printf("%d",start);
ymerdushku 4:420dc2851775 165 start=0x00;
ymerdushku 5:653dac107d67 166 fpga.printf("%d",start);
ymerdushku 5:653dac107d67 167 fpga.printf("%d",start);
ymerdushku 4:420dc2851775 168
ymerdushku 5:653dac107d67 169 fpga.printf("%c",x_pos[1]);
ymerdushku 5:653dac107d67 170 fpga.printf("%c",x_pos[0]);
ymerdushku 5:653dac107d67 171 fpga.printf("%c",y_pos[1]);
ymerdushku 5:653dac107d67 172 fpga.printf("%c",y_pos[0]);
ymerdushku 5:653dac107d67 173 fpga.printf("%c",z_pos[1]);
ymerdushku 5:653dac107d67 174 fpga.printf("%c",z_pos[0]);
ymerdushku 4:420dc2851775 175
ymerdushku 4:420dc2851775 176 int stop=0x00;
ymerdushku 5:653dac107d67 177 fpg.printf("%d",stop);
ymerdushku 4:420dc2851775 178 pc.printf("%d",stop);
ymerdushku 4:420dc2851775 179 start=0xFF;
ymerdushku 4:420dc2851775 180 pc.printf("%d",stop);
ymerdushku 4:420dc2851775 181 pc.printf("%d",stop);
ymerdushku 4:420dc2851775 182 //inviare sulla linea sequenza di byte di stop
ymerdushku 4:420dc2851775 183
ymerdushku 5:653dac107d67 184
ymerdushku 0:f043a4a4ec8d 185 }
ymerdushku 5:653dac107d67 186
ymerdushku 4:420dc2851775 187
ymerdushku 5:653dac107d67 188
ymerdushku 5:653dac107d67 189 void setREG_I2C(char REG_ADDR_DATA[2]) //argument to pass : address register and data to write in
ymerdushku 5:653dac107d67 190 {
ymerdushku 5:653dac107d67 191 if ((i2c.write(LSM6DS0_ADDRESS_WRITE,REG_ADDR_DATA,2,0))!=0)//ADDR+SUB+DATA+STOP, return 0 if ack
ymerdushku 5:653dac107d67 192 {
ymerdushku 5:653dac107d67 193 pc.printf("Error, not ack\n");
ymerdushku 5:653dac107d67 194 }
ymerdushku 5:653dac107d67 195
ymerdushku 5:653dac107d67 196 }
ymerdushku 5:653dac107d67 197
ymerdushku 5:653dac107d67 198 // read register
ymerdushku 5:653dac107d67 199 char readREG_I2C(char REG_ADDR[1]) //argument to pass : address register to read
ymerdushku 5:653dac107d67 200 {
ymerdushku 5:653dac107d67 201 char data_read[1];
ymerdushku 5:653dac107d67 202
ymerdushku 5:653dac107d67 203 i2c.write(LSM6DS0_ADDRESS_WRITE,REG_ADDR,1,1); //ADDR+SUB, return 0 if ack
ymerdushku 5:653dac107d67 204 i2c.read(LSM6DS0_ADDRESS_READ,data_read,1,0); //ADDR+data+STOP, return 0 if ack
ymerdushku 5:653dac107d67 205
ymerdushku 5:653dac107d67 206 return data_read[0];
ymerdushku 5:653dac107d67 207 }