A multifunctional and modular Firmware for Multitech's mDot based on ARM mBed provides a widerange of functionality for several Sensors such as MAX44009, BME280, MPU9250, SI1143 and uBlox. It allows you to quickly build a Sensornode that measures specific data with its sensors and sends it via LoRaWAN.

Dependencies:   mDot_LoRa_Sensornode_Flowmeter_impl mbed-rtos mbed

LoRa-Sensornode Firmware for Multitech mDot

A multifunctional and modular Firmware for Multitech's mDot which provides a widerange of functionality for several Sensors. It allows you to quickly build a Sensornode that measures specific data with its sensors and sends it via LoRaWAN.

/media/uploads/mitea1/logo-lora-600x370.png /media/uploads/mitea1/mt_mdot_family_642px.png

Supported Sensors

Idea

The Firmware has some predefined Application Modes running different Tasks(Measurements). Each mode can be used in a different Scenario. Application_Modes define which sensors are used, how often they aquire data and how often the data has to be sent via LoRa. Lets say you just want to measure the Light then you choose an Application_Mode (or define one) that only runs TaskLight for light measurement. As a standard all measurements are taken every second and sent via LoRa but you can change that interval depending on your usage Scenario

Committer:
mitea1
Date:
Fri Nov 02 17:01:02 2018 +0000
Revision:
10:4051c38bf73f
Parent:
0:f2815503561f
wtf

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mitea1 0:f2815503561f 1 /*
mitea1 0:f2815503561f 2 * MPU9250.cpp
mitea1 0:f2815503561f 3 *
mitea1 0:f2815503561f 4 * Created on: 19.05.2016
mitea1 0:f2815503561f 5 * Author: Adrian
mitea1 0:f2815503561f 6 */
mitea1 0:f2815503561f 7
mitea1 0:f2815503561f 8 #include "MPU9250.h"
mitea1 0:f2815503561f 9
mitea1 0:f2815503561f 10 MPU9250::MPU9250(I2C_RT* i2c){
mitea1 0:f2815503561f 11 setI2c(i2c);
mitea1 0:f2815503561f 12 this->config = new MPU9250Config();
mitea1 0:f2815503561f 13 }
mitea1 0:f2815503561f 14
mitea1 0:f2815503561f 15 MPU9250::~MPU9250() {
mitea1 0:f2815503561f 16 // TODO Auto-generated destructor stub
mitea1 0:f2815503561f 17 }
mitea1 0:f2815503561f 18
mitea1 0:f2815503561f 19 void MPU9250::setI2c(I2C_RT* i2c){
mitea1 0:f2815503561f 20 this->i2c = i2c;
mitea1 0:f2815503561f 21 }
mitea1 0:f2815503561f 22
mitea1 0:f2815503561f 23 void MPU9250::init(MPU9250_MODE desiredMode){
mitea1 0:f2815503561f 24 config->build(desiredMode);
mitea1 0:f2815503561f 25 enableAxisAccelerationMeasurement();
mitea1 0:f2815503561f 26 enableAxisGyroscopeMeasurement();
mitea1 0:f2815503561f 27 enableAxisTeslaMeasurement();
mitea1 0:f2815503561f 28 configureInterrupts();
mitea1 0:f2815503561f 29 setWakeOnReceiveThreshold();
mitea1 0:f2815503561f 30 }
mitea1 0:f2815503561f 31
mitea1 0:f2815503561f 32 float MPU9250::getXAxisAcceleration(){
mitea1 0:f2815503561f 33 uint8_t xAccelarationHighByte;
mitea1 0:f2815503561f 34 uint8_t xAccelarationLowByte;
mitea1 0:f2815503561f 35
mitea1 0:f2815503561f 36 i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_XOUT_H,false,
mitea1 0:f2815503561f 37 &xAccelarationHighByte,1);
mitea1 0:f2815503561f 38 i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_XOUT_L,false,
mitea1 0:f2815503561f 39 &xAccelarationLowByte,1);
mitea1 0:f2815503561f 40
mitea1 0:f2815503561f 41 int16_t acceleration = ((int16_t)xAccelarationHighByte<<8)|((int16_t)xAccelarationLowByte);
mitea1 0:f2815503561f 42
mitea1 0:f2815503561f 43 return ((float) acceleration)/config->getAccelerationDivider();
mitea1 0:f2815503561f 44
mitea1 0:f2815503561f 45 }
mitea1 0:f2815503561f 46
mitea1 0:f2815503561f 47 float MPU9250::getYAxisAcceleration(){
mitea1 0:f2815503561f 48 uint8_t yAccelarationHighByte;
mitea1 0:f2815503561f 49 uint8_t yAccelarationLowByte;
mitea1 0:f2815503561f 50
mitea1 0:f2815503561f 51 i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_YOUT_H,false,
mitea1 0:f2815503561f 52 &yAccelarationHighByte,1);
mitea1 0:f2815503561f 53 i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_YOUT_L,false,
mitea1 0:f2815503561f 54 &yAccelarationLowByte,1);
mitea1 0:f2815503561f 55
mitea1 0:f2815503561f 56 int16_t acceleration = yAccelarationHighByte<<8|yAccelarationLowByte;
mitea1 0:f2815503561f 57
mitea1 0:f2815503561f 58 return ((float) acceleration)/config->getAccelerationDivider();
mitea1 0:f2815503561f 59
mitea1 0:f2815503561f 60 }
mitea1 0:f2815503561f 61
mitea1 0:f2815503561f 62 float MPU9250::getZAxisAcceleration(){
mitea1 0:f2815503561f 63 uint8_t zAccelarationHighByte;
mitea1 0:f2815503561f 64 uint8_t zAccelarationLowByte;
mitea1 0:f2815503561f 65
mitea1 0:f2815503561f 66 i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_ZOUT_H,false,
mitea1 0:f2815503561f 67 &zAccelarationHighByte,1);
mitea1 0:f2815503561f 68 i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_ZOUT_L,false,
mitea1 0:f2815503561f 69 &zAccelarationLowByte,1);
mitea1 0:f2815503561f 70
mitea1 0:f2815503561f 71 int16_t acceleration = zAccelarationHighByte<<8|zAccelarationLowByte;
mitea1 0:f2815503561f 72
mitea1 0:f2815503561f 73 return ((float) acceleration)/config->getAccelerationDivider();
mitea1 0:f2815503561f 74
mitea1 0:f2815503561f 75 }
mitea1 0:f2815503561f 76
mitea1 0:f2815503561f 77 float MPU9250::getXAxisGyro(){
mitea1 0:f2815503561f 78 uint8_t xGyroscopeHighByte;
mitea1 0:f2815503561f 79 uint8_t xGyroscopeLowByte;
mitea1 0:f2815503561f 80
mitea1 0:f2815503561f 81 i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_XOUT_H,false,
mitea1 0:f2815503561f 82 &xGyroscopeHighByte,1);
mitea1 0:f2815503561f 83 i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_XOUT_L,false,
mitea1 0:f2815503561f 84 &xGyroscopeLowByte,1);
mitea1 0:f2815503561f 85
mitea1 0:f2815503561f 86 int16_t gyroscope = xGyroscopeHighByte<<8|xGyroscopeLowByte;
mitea1 0:f2815503561f 87
mitea1 0:f2815503561f 88 return ((float) gyroscope)/config->getGyroDivider();
mitea1 0:f2815503561f 89 }
mitea1 0:f2815503561f 90
mitea1 0:f2815503561f 91 float MPU9250::getYAxisGyro(){
mitea1 0:f2815503561f 92 uint8_t yGyroscopeHighByte;
mitea1 0:f2815503561f 93 uint8_t yGyroscopeLowByte;
mitea1 0:f2815503561f 94
mitea1 0:f2815503561f 95 i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_YOUT_H,false,
mitea1 0:f2815503561f 96 &yGyroscopeHighByte,1);
mitea1 0:f2815503561f 97 i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_YOUT_L,false,
mitea1 0:f2815503561f 98 &yGyroscopeLowByte,1);
mitea1 0:f2815503561f 99
mitea1 0:f2815503561f 100 int16_t gyroscope = yGyroscopeHighByte<<8|yGyroscopeLowByte;
mitea1 0:f2815503561f 101
mitea1 0:f2815503561f 102 return ((float) gyroscope)/config->getGyroDivider();
mitea1 0:f2815503561f 103 }
mitea1 0:f2815503561f 104
mitea1 0:f2815503561f 105 float MPU9250::getZAxisGyro(){
mitea1 0:f2815503561f 106 uint8_t zGyroscopeHighByte;
mitea1 0:f2815503561f 107 uint8_t zGyroscopeLowByte;
mitea1 0:f2815503561f 108
mitea1 0:f2815503561f 109 i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_ZOUT_H,0,
mitea1 0:f2815503561f 110 &zGyroscopeHighByte,1);
mitea1 0:f2815503561f 111 i2c->read_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_ZOUT_L,0,
mitea1 0:f2815503561f 112 &zGyroscopeLowByte,1);
mitea1 0:f2815503561f 113
mitea1 0:f2815503561f 114 int16_t gyroscope = zGyroscopeHighByte<<8|zGyroscopeLowByte;
mitea1 0:f2815503561f 115
mitea1 0:f2815503561f 116 return ((float) gyroscope)/config->getGyroDivider();
mitea1 0:f2815503561f 117 }
mitea1 0:f2815503561f 118
mitea1 0:f2815503561f 119 float MPU9250::getXAxisTesla(){
mitea1 0:f2815503561f 120 uint8_t xTelsaHighByte;
mitea1 0:f2815503561f 121 uint8_t xTelsaLowByte;
mitea1 0:f2815503561f 122
mitea1 0:f2815503561f 123 i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_XOUT_H,false,
mitea1 0:f2815503561f 124 &xTelsaHighByte,1);
mitea1 0:f2815503561f 125 i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_XOUT_L,false,
mitea1 0:f2815503561f 126 &xTelsaLowByte,1);
mitea1 0:f2815503561f 127
mitea1 0:f2815503561f 128 uint8_t status;
mitea1 0:f2815503561f 129
mitea1 0:f2815503561f 130 i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_ST2,false,
mitea1 0:f2815503561f 131 &status,1);
mitea1 0:f2815503561f 132
mitea1 0:f2815503561f 133 int16_t tesla = xTelsaHighByte<<8|xTelsaLowByte;
mitea1 0:f2815503561f 134
mitea1 0:f2815503561f 135 return (float) (tesla) / config->getTeslaDivider();
mitea1 0:f2815503561f 136 }
mitea1 0:f2815503561f 137
mitea1 0:f2815503561f 138 float MPU9250::getYAxisTesla(){
mitea1 0:f2815503561f 139 uint8_t yTelsaHighByte;
mitea1 0:f2815503561f 140 uint8_t yTelsaLowByte;
mitea1 0:f2815503561f 141
mitea1 0:f2815503561f 142 i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_YOUT_H,false,
mitea1 0:f2815503561f 143 &yTelsaHighByte,1);
mitea1 0:f2815503561f 144 i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_YOUT_L,false,
mitea1 0:f2815503561f 145 &yTelsaLowByte,1);
mitea1 0:f2815503561f 146
mitea1 0:f2815503561f 147 uint8_t status;
mitea1 0:f2815503561f 148
mitea1 0:f2815503561f 149 i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_ST2,false,
mitea1 0:f2815503561f 150 &status,1);
mitea1 0:f2815503561f 151
mitea1 0:f2815503561f 152 int16_t tesla = yTelsaHighByte<<8|yTelsaLowByte;
mitea1 0:f2815503561f 153
mitea1 0:f2815503561f 154 return (float) (tesla) / config->getTeslaDivider();
mitea1 0:f2815503561f 155 }
mitea1 0:f2815503561f 156
mitea1 0:f2815503561f 157 float MPU9250::getZAxisTesla(){
mitea1 0:f2815503561f 158 uint8_t zTelsaHighByte;
mitea1 0:f2815503561f 159 uint8_t zTelsaLowByte;
mitea1 0:f2815503561f 160
mitea1 0:f2815503561f 161 i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_ZOUT_H,false,
mitea1 0:f2815503561f 162 &zTelsaHighByte,1);
mitea1 0:f2815503561f 163 i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_ZOUT_L,false,
mitea1 0:f2815503561f 164 &zTelsaLowByte,1);
mitea1 0:f2815503561f 165
mitea1 0:f2815503561f 166 uint8_t status;
mitea1 0:f2815503561f 167
mitea1 0:f2815503561f 168 i2c->read_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_ST2,false,
mitea1 0:f2815503561f 169 &status,1);
mitea1 0:f2815503561f 170
mitea1 0:f2815503561f 171 int16_t tesla = zTelsaHighByte<<8|zTelsaLowByte;
mitea1 0:f2815503561f 172
mitea1 0:f2815503561f 173 return (float) (tesla) / config->getTeslaDivider();
mitea1 0:f2815503561f 174 }
mitea1 0:f2815503561f 175
mitea1 0:f2815503561f 176 void MPU9250::enableAxisAccelerationMeasurement(){
mitea1 0:f2815503561f 177 uint8_t configValueAcceleration=config->getAccelerometerScale()<<3;
mitea1 0:f2815503561f 178
mitea1 0:f2815503561f 179 i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_ACCEL_CONFIG,false,
mitea1 0:f2815503561f 180 &configValueAcceleration,1);
mitea1 0:f2815503561f 181 }
mitea1 0:f2815503561f 182
mitea1 0:f2815503561f 183 void MPU9250::enableAxisGyroscopeMeasurement(){
mitea1 0:f2815503561f 184 uint8_t configValueGyroscope = config->getGyroscopeScale()<<3;
mitea1 0:f2815503561f 185
mitea1 0:f2815503561f 186 i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_GYRO_CONFIG,false,
mitea1 0:f2815503561f 187 &configValueGyroscope,1);
mitea1 0:f2815503561f 188 }
mitea1 0:f2815503561f 189
mitea1 0:f2815503561f 190 void MPU9250::enableAxisTeslaMeasurement(){
mitea1 0:f2815503561f 191 uint8_t configValueMagnetometer = 0x02;
mitea1 0:f2815503561f 192
mitea1 0:f2815503561f 193 i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_INT_PIN_CFG,false,
mitea1 0:f2815503561f 194 &configValueMagnetometer,1);
mitea1 0:f2815503561f 195
mitea1 0:f2815503561f 196 configValueMagnetometer = 0;
mitea1 0:f2815503561f 197 i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_USER_CTRL,false,
mitea1 0:f2815503561f 198 &configValueMagnetometer,1);
mitea1 0:f2815503561f 199
mitea1 0:f2815503561f 200 configValueMagnetometer = 0;
mitea1 0:f2815503561f 201 i2c->write_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_CNTL1,false,
mitea1 0:f2815503561f 202 &configValueMagnetometer,1);
mitea1 0:f2815503561f 203
mitea1 0:f2815503561f 204 configValueMagnetometer = config->getMagnetometerBitResolution()<<4|
mitea1 0:f2815503561f 205 config->getMagnetometerMeasureMode();
mitea1 0:f2815503561f 206 i2c->write_RT(MPU9250_MAG_ADDRESS,MPU9250_MAG_CNTL1,false,
mitea1 0:f2815503561f 207 &configValueMagnetometer,1);
mitea1 0:f2815503561f 208
mitea1 0:f2815503561f 209 }
mitea1 0:f2815503561f 210
mitea1 0:f2815503561f 211 void MPU9250::configureInterrupts(){
mitea1 0:f2815503561f 212 uint8_t configValueInterruptPin = config->getInterruptPinConfiguration()|0x02;
mitea1 0:f2815503561f 213
mitea1 0:f2815503561f 214 i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_INT_PIN_CFG,false,
mitea1 0:f2815503561f 215 &configValueInterruptPin,1);
mitea1 0:f2815503561f 216
mitea1 0:f2815503561f 217 uint8_t configValueInterruptEnable = config->getInterruptEnableConfiguration();
mitea1 0:f2815503561f 218
mitea1 0:f2815503561f 219 i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_INT_ENABLE,false,
mitea1 0:f2815503561f 220 &configValueInterruptEnable,1);
mitea1 0:f2815503561f 221 }
mitea1 0:f2815503561f 222
mitea1 0:f2815503561f 223 void MPU9250::setWakeOnReceiveThreshold(){
mitea1 0:f2815503561f 224 uint8_t wakeOnReceiveThreshold = config->getWakeOnMotionThreshold();
mitea1 0:f2815503561f 225
mitea1 0:f2815503561f 226 i2c->write_RT(MPU9250_DEFAULT_ADDRESS,MPU9250_WOM_THR,false,
mitea1 0:f2815503561f 227 &wakeOnReceiveThreshold,1);
mitea1 0:f2815503561f 228 }
mitea1 0:f2815503561f 229
mitea1 0:f2815503561f 230