Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@5:653dac107d67, 2017-01-31 (annotated)
- 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?
User | Revision | Line number | New 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 | } |