Code for Technion Formula car sensors reader
Dependencies: mbed Buffer FATFileSystem
Fork of SX1272PingPong by
This is code is part of a Technion course project in advanced IoT, implementing a device to read and transmit sensors data from a Formula racing car built by students at Technion - Israel Institute of Technology.
How to install
- Create an account on Mbed: https://os.mbed.com/account/signup/
- Import project into Compiler
- In the Program Workspace select "Formula_Nucleo_Reader"
- Select a Platform like so:
- Click button at top-left
- Add Board
- Search "NUCLEO F103RB" and then "Add to your Mbed Compiler"
- Finally click "Compile", if the build was successful, the binary would download automatically
- To install it on device simply plug it in to a PC, open device drive and drag then drop binary file in it
LSM303DLHC/LSM303DLHC.cpp@15:2e0d977dbb31, 2018-05-17 (annotated)
- Committer:
- wardm
- Date:
- Thu May 17 20:37:41 2018 +0000
- Revision:
- 15:2e0d977dbb31
V1.0.0
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
wardm | 15:2e0d977dbb31 | 1 | #include "mbed.h" |
wardm | 15:2e0d977dbb31 | 2 | #include "LSM303DLHC.h" |
wardm | 15:2e0d977dbb31 | 3 | |
wardm | 15:2e0d977dbb31 | 4 | LSM303DLHC::LSM303DLHC(PinName sda, PinName scl) : i2c(sda, scl){ |
wardm | 15:2e0d977dbb31 | 5 | i2c.frequency(400000); |
wardm | 15:2e0d977dbb31 | 6 | |
wardm | 15:2e0d977dbb31 | 7 | // HERE GIVES DEVICE DEFAULT |
wardm | 15:2e0d977dbb31 | 8 | ACtrl(LP_OFF); // ACC Normal Power Mode |
wardm | 15:2e0d977dbb31 | 9 | ACtrl(ADR3); // ACC ON and Date Rate 25Hz |
wardm | 15:2e0d977dbb31 | 10 | ACtrl(XYZ); // ACC XYZ Axis Enable |
wardm | 15:2e0d977dbb31 | 11 | ACtrl(HPF_ON); // ACC internal HPF IN USE |
wardm | 15:2e0d977dbb31 | 12 | ACtrl(HPF_CF0); // ACC HPF Cutoff Freq = option 0 |
wardm | 15:2e0d977dbb31 | 13 | ACtrl(HPF_NORM_R); // ACC HPF Model = Normal |
wardm | 15:2e0d977dbb31 | 14 | ACtrl(BDU_CONT); // ACC data continuous |
wardm | 15:2e0d977dbb31 | 15 | ACtrl(G4); // ACC Range +/-4g |
wardm | 15:2e0d977dbb31 | 16 | ACtrl(HIGH_R); // ACC in High Prec |
wardm | 15:2e0d977dbb31 | 17 | MCtrl(MDR4); // MAG DR 15Hz |
wardm | 15:2e0d977dbb31 | 18 | MCtrl(GN4); // MAG GN 4.0Gauss |
wardm | 15:2e0d977dbb31 | 19 | MCtrl(MD_CONT); // MAG ON and MD Continuous |
wardm | 15:2e0d977dbb31 | 20 | TCtrl(TEMP_ON); // TEMP ON |
wardm | 15:2e0d977dbb31 | 21 | |
wardm | 15:2e0d977dbb31 | 22 | // DEFAULT CALIBRATION PARAMETER |
wardm | 15:2e0d977dbb31 | 23 | acc_offset[0] = 0; |
wardm | 15:2e0d977dbb31 | 24 | acc_offset[1] = 0; |
wardm | 15:2e0d977dbb31 | 25 | acc_offset[2] = 0; |
wardm | 15:2e0d977dbb31 | 26 | acc_scale[0] = 1; |
wardm | 15:2e0d977dbb31 | 27 | acc_scale[1] = 1; |
wardm | 15:2e0d977dbb31 | 28 | acc_scale[2] = 1; |
wardm | 15:2e0d977dbb31 | 29 | |
wardm | 15:2e0d977dbb31 | 30 | mag_offset[0] = 0; |
wardm | 15:2e0d977dbb31 | 31 | mag_offset[1] = 0; |
wardm | 15:2e0d977dbb31 | 32 | mag_offset[2] = 0; |
wardm | 15:2e0d977dbb31 | 33 | mag_scale[0] = 1; |
wardm | 15:2e0d977dbb31 | 34 | mag_scale[1] = 1; |
wardm | 15:2e0d977dbb31 | 35 | mag_scale[2] = 1; |
wardm | 15:2e0d977dbb31 | 36 | |
wardm | 15:2e0d977dbb31 | 37 | temp_offset[0] = 0; |
wardm | 15:2e0d977dbb31 | 38 | temp_scale[0] = 1; |
wardm | 15:2e0d977dbb31 | 39 | } |
wardm | 15:2e0d977dbb31 | 40 | |
wardm | 15:2e0d977dbb31 | 41 | void LSM303DLHC::GetAcc(float arr[3]){ |
wardm | 15:2e0d977dbb31 | 42 | data[0] = OUT_X_L_A | (1 << 7); // MSB=1 to read multiple bytes |
wardm | 15:2e0d977dbb31 | 43 | i2c.write(ACC_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 44 | i2c.read(ACC_ADDRESS, data, 6); |
wardm | 15:2e0d977dbb31 | 45 | |
wardm | 15:2e0d977dbb31 | 46 | arr[0] = acc_scale[0]*(acc_offset[0]+((short)(data[1]<<8 | data[0])>>4)); |
wardm | 15:2e0d977dbb31 | 47 | arr[1] = acc_scale[1]*(acc_offset[1]+((short)(data[3]<<8 | data[2])>>4)); |
wardm | 15:2e0d977dbb31 | 48 | arr[2] = acc_scale[2]*(acc_offset[2]+((short)(data[5]<<8 | data[4])>>4)); |
wardm | 15:2e0d977dbb31 | 49 | } |
wardm | 15:2e0d977dbb31 | 50 | |
wardm | 15:2e0d977dbb31 | 51 | void LSM303DLHC::GetMag(float arr[3]){ |
wardm | 15:2e0d977dbb31 | 52 | data[0] = OUT_X_H_M; |
wardm | 15:2e0d977dbb31 | 53 | i2c.write(MAG_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 54 | i2c.read(MAG_ADDRESS, data, 6); |
wardm | 15:2e0d977dbb31 | 55 | arr[0] = mag_scale[0]*(mag_offset[0]+(short)(data[0]<<8 | data[1])); |
wardm | 15:2e0d977dbb31 | 56 | arr[1] = mag_scale[1]*(mag_offset[1]+(short)(data[4]<<8 | data[5])); |
wardm | 15:2e0d977dbb31 | 57 | arr[2] = mag_scale[2]*(mag_offset[2]+(short)(data[2]<<8 | data[3])); |
wardm | 15:2e0d977dbb31 | 58 | } |
wardm | 15:2e0d977dbb31 | 59 | |
wardm | 15:2e0d977dbb31 | 60 | void LSM303DLHC::GetTemp(float arr[1]){ |
wardm | 15:2e0d977dbb31 | 61 | data[0] = TEMP_OUT_H_M; |
wardm | 15:2e0d977dbb31 | 62 | i2c.write(MAG_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 63 | i2c.read(MAG_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 64 | arr[0] = temp_scale[0]*(temp_offset[0]+((short)(data[0]<<8 | data[1])>>4)); |
wardm | 15:2e0d977dbb31 | 65 | } |
wardm | 15:2e0d977dbb31 | 66 | |
wardm | 15:2e0d977dbb31 | 67 | void LSM303DLHC::ACtrl(ACC_ODR cmd){ |
wardm | 15:2e0d977dbb31 | 68 | data[0] = CTRL_REG1_A; |
wardm | 15:2e0d977dbb31 | 69 | i2c.write(ACC_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 70 | i2c.read(ACC_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 71 | data[1] = data[1] & (0b00001111) | (cmd<<4); |
wardm | 15:2e0d977dbb31 | 72 | i2c.write(ACC_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 73 | } |
wardm | 15:2e0d977dbb31 | 74 | |
wardm | 15:2e0d977dbb31 | 75 | void LSM303DLHC::ACtrl(ACC_LPen cmd){ |
wardm | 15:2e0d977dbb31 | 76 | data[0] = CTRL_REG1_A; |
wardm | 15:2e0d977dbb31 | 77 | i2c.write(ACC_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 78 | i2c.read(ACC_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 79 | data[1] = data[1] & (0b11110111) | (cmd<<3); |
wardm | 15:2e0d977dbb31 | 80 | i2c.write(ACC_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 81 | } |
wardm | 15:2e0d977dbb31 | 82 | |
wardm | 15:2e0d977dbb31 | 83 | void LSM303DLHC::ACtrl(ACC_AXIS cmd){ |
wardm | 15:2e0d977dbb31 | 84 | data[0] = CTRL_REG1_A; |
wardm | 15:2e0d977dbb31 | 85 | i2c.write(ACC_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 86 | i2c.read(ACC_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 87 | data[1] = data[1] & (0b11111000) | (cmd<<0); |
wardm | 15:2e0d977dbb31 | 88 | i2c.write(ACC_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 89 | } |
wardm | 15:2e0d977dbb31 | 90 | |
wardm | 15:2e0d977dbb31 | 91 | void LSM303DLHC::ACtrl(ACC_HPM cmd){ |
wardm | 15:2e0d977dbb31 | 92 | data[0] = CTRL_REG2_A; |
wardm | 15:2e0d977dbb31 | 93 | i2c.write(ACC_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 94 | i2c.read(ACC_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 95 | data[1] = data[1] & (0b00111111) | (cmd<<6); |
wardm | 15:2e0d977dbb31 | 96 | i2c.write(ACC_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 97 | } |
wardm | 15:2e0d977dbb31 | 98 | |
wardm | 15:2e0d977dbb31 | 99 | void LSM303DLHC::ACtrl(ACC_HPCF cmd){ |
wardm | 15:2e0d977dbb31 | 100 | data[0] = CTRL_REG2_A; |
wardm | 15:2e0d977dbb31 | 101 | i2c.write(ACC_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 102 | i2c.read(ACC_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 103 | data[1] = data[1] & (0b11001111) | (cmd<<4); |
wardm | 15:2e0d977dbb31 | 104 | i2c.write(ACC_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 105 | } |
wardm | 15:2e0d977dbb31 | 106 | |
wardm | 15:2e0d977dbb31 | 107 | void LSM303DLHC::ACtrl(ACC_FDS cmd){ |
wardm | 15:2e0d977dbb31 | 108 | data[0] = CTRL_REG2_A; |
wardm | 15:2e0d977dbb31 | 109 | i2c.write(ACC_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 110 | i2c.read(ACC_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 111 | data[1] = data[1] & (0b11110111) | (cmd<<3); |
wardm | 15:2e0d977dbb31 | 112 | i2c.write(ACC_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 113 | } |
wardm | 15:2e0d977dbb31 | 114 | |
wardm | 15:2e0d977dbb31 | 115 | void LSM303DLHC::ACtrl(ACC_BDU cmd){ |
wardm | 15:2e0d977dbb31 | 116 | data[0] = CTRL_REG4_A; |
wardm | 15:2e0d977dbb31 | 117 | i2c.write(ACC_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 118 | i2c.read(ACC_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 119 | data[1] = data[1] & (0b01111111) | (cmd<<7); |
wardm | 15:2e0d977dbb31 | 120 | i2c.write(ACC_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 121 | } |
wardm | 15:2e0d977dbb31 | 122 | |
wardm | 15:2e0d977dbb31 | 123 | void LSM303DLHC::ACtrl(ACC_FS cmd){ |
wardm | 15:2e0d977dbb31 | 124 | data[0] = CTRL_REG4_A; |
wardm | 15:2e0d977dbb31 | 125 | i2c.write(ACC_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 126 | i2c.read(ACC_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 127 | data[1] = data[1] & (0b11001111) | (cmd<<4); |
wardm | 15:2e0d977dbb31 | 128 | i2c.write(ACC_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 129 | } |
wardm | 15:2e0d977dbb31 | 130 | |
wardm | 15:2e0d977dbb31 | 131 | void LSM303DLHC::ACtrl(ACC_HR cmd){ |
wardm | 15:2e0d977dbb31 | 132 | data[0] = CTRL_REG4_A; |
wardm | 15:2e0d977dbb31 | 133 | i2c.write(ACC_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 134 | i2c.read(ACC_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 135 | data[1] = data[1] & (0b11110111) | (cmd<<3); |
wardm | 15:2e0d977dbb31 | 136 | i2c.write(ACC_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 137 | } |
wardm | 15:2e0d977dbb31 | 138 | |
wardm | 15:2e0d977dbb31 | 139 | void LSM303DLHC::TCtrl(TEMP_EN cmd){ |
wardm | 15:2e0d977dbb31 | 140 | data[0] = CRA_REG_M; |
wardm | 15:2e0d977dbb31 | 141 | i2c.write(MAG_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 142 | i2c.read(MAG_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 143 | data[1] = data[1] & (0b01111111) | (cmd<<7); |
wardm | 15:2e0d977dbb31 | 144 | i2c.write(MAG_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 145 | } |
wardm | 15:2e0d977dbb31 | 146 | |
wardm | 15:2e0d977dbb31 | 147 | void LSM303DLHC::MCtrl(MAG_DR cmd){ |
wardm | 15:2e0d977dbb31 | 148 | data[0] = CRA_REG_M; |
wardm | 15:2e0d977dbb31 | 149 | i2c.write(MAG_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 150 | i2c.read(MAG_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 151 | data[1] = data[1] & (0b11100011) | (cmd<<2); |
wardm | 15:2e0d977dbb31 | 152 | i2c.write(MAG_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 153 | } |
wardm | 15:2e0d977dbb31 | 154 | |
wardm | 15:2e0d977dbb31 | 155 | void LSM303DLHC::MCtrl(MAG_GN cmd){ |
wardm | 15:2e0d977dbb31 | 156 | data[0] = CRB_REG_M; |
wardm | 15:2e0d977dbb31 | 157 | i2c.write(MAG_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 158 | i2c.read(MAG_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 159 | data[1] = data[1] & (0b00011111) | (cmd<<5); |
wardm | 15:2e0d977dbb31 | 160 | i2c.write(MAG_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 161 | } |
wardm | 15:2e0d977dbb31 | 162 | |
wardm | 15:2e0d977dbb31 | 163 | void LSM303DLHC::MCtrl(MAG_MD cmd){ |
wardm | 15:2e0d977dbb31 | 164 | data[0] = MR_REG_M; |
wardm | 15:2e0d977dbb31 | 165 | i2c.write(MAG_ADDRESS, data, 1); |
wardm | 15:2e0d977dbb31 | 166 | i2c.read(MAG_ADDRESS, &data[1], 1); |
wardm | 15:2e0d977dbb31 | 167 | data[1] = data[1] & (0b11111100) | (cmd<<0); |
wardm | 15:2e0d977dbb31 | 168 | i2c.write(MAG_ADDRESS, data, 2); |
wardm | 15:2e0d977dbb31 | 169 | } |
wardm | 15:2e0d977dbb31 | 170 | |
wardm | 15:2e0d977dbb31 | 171 | void LSM303DLHC::WriteReg(int sad, char d[2]){ |
wardm | 15:2e0d977dbb31 | 172 | i2c.write(sad, d, 2); |
wardm | 15:2e0d977dbb31 | 173 | } |
wardm | 15:2e0d977dbb31 | 174 | |
wardm | 15:2e0d977dbb31 | 175 | void LSM303DLHC::ACal(float offset[3], float scale[3]){ |
wardm | 15:2e0d977dbb31 | 176 | acc_offset[0] = offset[0]; |
wardm | 15:2e0d977dbb31 | 177 | acc_offset[1] = offset[1]; |
wardm | 15:2e0d977dbb31 | 178 | acc_offset[2] = offset[2]; |
wardm | 15:2e0d977dbb31 | 179 | acc_scale[0] = scale[0]; |
wardm | 15:2e0d977dbb31 | 180 | acc_scale[1] = scale[1]; |
wardm | 15:2e0d977dbb31 | 181 | acc_scale[2] = scale[2]; |
wardm | 15:2e0d977dbb31 | 182 | } |
wardm | 15:2e0d977dbb31 | 183 | |
wardm | 15:2e0d977dbb31 | 184 | void LSM303DLHC::MCal(float offset[3], float scale[3]){ |
wardm | 15:2e0d977dbb31 | 185 | mag_offset[0] = offset[0]; |
wardm | 15:2e0d977dbb31 | 186 | mag_offset[1] = offset[1]; |
wardm | 15:2e0d977dbb31 | 187 | mag_offset[2] = offset[2]; |
wardm | 15:2e0d977dbb31 | 188 | mag_scale[0] = scale[0]; |
wardm | 15:2e0d977dbb31 | 189 | mag_scale[1] = scale[1]; |
wardm | 15:2e0d977dbb31 | 190 | mag_scale[2] = scale[2]; |
wardm | 15:2e0d977dbb31 | 191 | } |
wardm | 15:2e0d977dbb31 | 192 | |
wardm | 15:2e0d977dbb31 | 193 | void LSM303DLHC::TCal(float offset[1], float scale[1]){ |
wardm | 15:2e0d977dbb31 | 194 | temp_offset[0] = offset[0]; |
wardm | 15:2e0d977dbb31 | 195 | temp_scale[0] = scale[0]; |
wardm | 15:2e0d977dbb31 | 196 | } |