Code for Technion Formula car sensors reader

Dependencies:   mbed Buffer FATFileSystem

Fork of SX1272PingPong by Semtech

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:
  1. Click button at top-left
  2. Add Board
  3. 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
Committer:
wardm
Date:
Thu May 17 20:37:41 2018 +0000
Revision:
15:2e0d977dbb31
V1.0.0

Who changed what in which revision?

UserRevisionLine numberNew 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 }