Modified to run on Renesas GR Peach board
Dependencies: EthernetInterface HTTP-Server Webpage mbed-rpc mbed-src
Fork of HTTPServer_echoback by
Adafruit_10DOF/Adafruit_LSM303_U.cpp@16:5d102be2566c, 2015-10-07 (annotated)
- Committer:
- webOnBoard
- Date:
- Wed Oct 07 20:42:51 2015 +0000
- Revision:
- 16:5d102be2566c
web based AHRS demo Renesas GR Peach board; Using HTTP Server/RPC Adafruit 10DOF
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
webOnBoard | 16:5d102be2566c | 1 | /*************************************************************************** |
webOnBoard | 16:5d102be2566c | 2 | This is a library for the LSM303 Accelerometer and magnentometer/compass |
webOnBoard | 16:5d102be2566c | 3 | |
webOnBoard | 16:5d102be2566c | 4 | Designed specifically to work with the Adafruit LSM303DLHC Breakout |
webOnBoard | 16:5d102be2566c | 5 | |
webOnBoard | 16:5d102be2566c | 6 | These displays use I2C to communicate, 2 pins are required to interface. |
webOnBoard | 16:5d102be2566c | 7 | |
webOnBoard | 16:5d102be2566c | 8 | Adafruit invests time and resources providing this open source code, |
webOnBoard | 16:5d102be2566c | 9 | please support Adafruit andopen-source hardware by purchasing products |
webOnBoard | 16:5d102be2566c | 10 | from Adafruit! |
webOnBoard | 16:5d102be2566c | 11 | |
webOnBoard | 16:5d102be2566c | 12 | Written by Kevin Townsend for Adafruit Industries. |
webOnBoard | 16:5d102be2566c | 13 | BSD license, all text above must be included in any redistribution |
webOnBoard | 16:5d102be2566c | 14 | ***************************************************************************/ |
webOnBoard | 16:5d102be2566c | 15 | |
webOnBoard | 16:5d102be2566c | 16 | #include "Adafruit_LSM303_U.h" |
webOnBoard | 16:5d102be2566c | 17 | |
webOnBoard | 16:5d102be2566c | 18 | //extern I2C i2c(I2C_SDA, I2C_SCL); // sda, scl |
webOnBoard | 16:5d102be2566c | 19 | |
webOnBoard | 16:5d102be2566c | 20 | /* enabling this #define will enable the debug print blocks |
webOnBoard | 16:5d102be2566c | 21 | #define LSM303_DEBUG |
webOnBoard | 16:5d102be2566c | 22 | */ |
webOnBoard | 16:5d102be2566c | 23 | typedef uint8_t byte; |
webOnBoard | 16:5d102be2566c | 24 | |
webOnBoard | 16:5d102be2566c | 25 | static float _lsm303Accel_MG_LSB = 0.001F; // 1, 2, 4 or 12 mg per lsb |
webOnBoard | 16:5d102be2566c | 26 | static float _lsm303Mag_Gauss_LSB_XY = 1100.0F; // Varies with gain |
webOnBoard | 16:5d102be2566c | 27 | static float _lsm303Mag_Gauss_LSB_Z = 980.0F; // Varies with gain |
webOnBoard | 16:5d102be2566c | 28 | |
webOnBoard | 16:5d102be2566c | 29 | /*************************************************************************** |
webOnBoard | 16:5d102be2566c | 30 | ACCELEROMETER |
webOnBoard | 16:5d102be2566c | 31 | ***************************************************************************/ |
webOnBoard | 16:5d102be2566c | 32 | /*************************************************************************** |
webOnBoard | 16:5d102be2566c | 33 | PRIVATE FUNCTIONS |
webOnBoard | 16:5d102be2566c | 34 | ***************************************************************************/ |
webOnBoard | 16:5d102be2566c | 35 | |
webOnBoard | 16:5d102be2566c | 36 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 37 | /*! |
webOnBoard | 16:5d102be2566c | 38 | @brief Abstract away platform differences in Arduino wire library |
webOnBoard | 16:5d102be2566c | 39 | */ |
webOnBoard | 16:5d102be2566c | 40 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 41 | void Adafruit_LSM303_Accel_Unified::write8(byte address, byte reg, byte value) |
webOnBoard | 16:5d102be2566c | 42 | { |
webOnBoard | 16:5d102be2566c | 43 | char data_write[2]; |
webOnBoard | 16:5d102be2566c | 44 | |
webOnBoard | 16:5d102be2566c | 45 | data_write[0] = reg; |
webOnBoard | 16:5d102be2566c | 46 | data_write[1] = value; |
webOnBoard | 16:5d102be2566c | 47 | int status = i2c->write(address, data_write, 2, 0); |
webOnBoard | 16:5d102be2566c | 48 | |
webOnBoard | 16:5d102be2566c | 49 | } |
webOnBoard | 16:5d102be2566c | 50 | |
webOnBoard | 16:5d102be2566c | 51 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 52 | /*! |
webOnBoard | 16:5d102be2566c | 53 | @brief Abstract away platform differences in Arduino wire library |
webOnBoard | 16:5d102be2566c | 54 | */ |
webOnBoard | 16:5d102be2566c | 55 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 56 | byte Adafruit_LSM303_Accel_Unified::read8(byte address, byte reg) |
webOnBoard | 16:5d102be2566c | 57 | { |
webOnBoard | 16:5d102be2566c | 58 | byte value; |
webOnBoard | 16:5d102be2566c | 59 | |
webOnBoard | 16:5d102be2566c | 60 | |
webOnBoard | 16:5d102be2566c | 61 | char data_write[2]; |
webOnBoard | 16:5d102be2566c | 62 | char data_read[2]; |
webOnBoard | 16:5d102be2566c | 63 | |
webOnBoard | 16:5d102be2566c | 64 | |
webOnBoard | 16:5d102be2566c | 65 | // Read register |
webOnBoard | 16:5d102be2566c | 66 | data_write[0] = reg; |
webOnBoard | 16:5d102be2566c | 67 | i2c->write(address, data_write, 1, 1); // no stop |
webOnBoard | 16:5d102be2566c | 68 | i2c->read(address, data_read, 2, 0); |
webOnBoard | 16:5d102be2566c | 69 | value = data_read[0]; |
webOnBoard | 16:5d102be2566c | 70 | |
webOnBoard | 16:5d102be2566c | 71 | return value; |
webOnBoard | 16:5d102be2566c | 72 | } |
webOnBoard | 16:5d102be2566c | 73 | |
webOnBoard | 16:5d102be2566c | 74 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 75 | /*! |
webOnBoard | 16:5d102be2566c | 76 | @brief Reads the raw data from the sensor |
webOnBoard | 16:5d102be2566c | 77 | */ |
webOnBoard | 16:5d102be2566c | 78 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 79 | void Adafruit_LSM303_Accel_Unified::read() |
webOnBoard | 16:5d102be2566c | 80 | { |
webOnBoard | 16:5d102be2566c | 81 | char data_write[2]; |
webOnBoard | 16:5d102be2566c | 82 | char data_read[6]; |
webOnBoard | 16:5d102be2566c | 83 | uint32_t status; |
webOnBoard | 16:5d102be2566c | 84 | uint8_t xlo; |
webOnBoard | 16:5d102be2566c | 85 | uint8_t xhi; |
webOnBoard | 16:5d102be2566c | 86 | uint8_t ylo; |
webOnBoard | 16:5d102be2566c | 87 | uint8_t yhi; |
webOnBoard | 16:5d102be2566c | 88 | uint8_t zlo; |
webOnBoard | 16:5d102be2566c | 89 | uint8_t zhi; |
webOnBoard | 16:5d102be2566c | 90 | |
webOnBoard | 16:5d102be2566c | 91 | data_write[0] = LSM303_REGISTER_ACCEL_OUT_X_L_A | 0x80 ; |
webOnBoard | 16:5d102be2566c | 92 | |
webOnBoard | 16:5d102be2566c | 93 | i2c->write(LSM303_ADDRESS_ACCEL, data_write, 1, 1);// non stop i2c |
webOnBoard | 16:5d102be2566c | 94 | |
webOnBoard | 16:5d102be2566c | 95 | // Read the accelerometer |
webOnBoard | 16:5d102be2566c | 96 | // Read 6 byte data |
webOnBoard | 16:5d102be2566c | 97 | status = i2c->read(LSM303_ADDRESS_ACCEL, data_read, 6, 0); |
webOnBoard | 16:5d102be2566c | 98 | // Read the accelerometer |
webOnBoard | 16:5d102be2566c | 99 | |
webOnBoard | 16:5d102be2566c | 100 | // Wait around until enough data is available |
webOnBoard | 16:5d102be2566c | 101 | |
webOnBoard | 16:5d102be2566c | 102 | if ( status == 0 ) |
webOnBoard | 16:5d102be2566c | 103 | { |
webOnBoard | 16:5d102be2566c | 104 | xlo = data_read[0]; |
webOnBoard | 16:5d102be2566c | 105 | xhi = data_read[1]; |
webOnBoard | 16:5d102be2566c | 106 | ylo = data_read[2]; |
webOnBoard | 16:5d102be2566c | 107 | yhi = data_read[3]; |
webOnBoard | 16:5d102be2566c | 108 | zlo = data_read[4]; |
webOnBoard | 16:5d102be2566c | 109 | zhi = data_read[5]; |
webOnBoard | 16:5d102be2566c | 110 | |
webOnBoard | 16:5d102be2566c | 111 | |
webOnBoard | 16:5d102be2566c | 112 | // Shift values to create properly formed integer (low byte first) |
webOnBoard | 16:5d102be2566c | 113 | _accelData.x = (int16_t)(xlo | (xhi << 8)) >> 4; |
webOnBoard | 16:5d102be2566c | 114 | _accelData.y = (int16_t)(ylo | (yhi << 8)) >> 4; |
webOnBoard | 16:5d102be2566c | 115 | _accelData.z = (int16_t)(zlo | (zhi << 8)) >> 4; |
webOnBoard | 16:5d102be2566c | 116 | } |
webOnBoard | 16:5d102be2566c | 117 | |
webOnBoard | 16:5d102be2566c | 118 | } |
webOnBoard | 16:5d102be2566c | 119 | |
webOnBoard | 16:5d102be2566c | 120 | /*************************************************************************** |
webOnBoard | 16:5d102be2566c | 121 | CONSTRUCTOR |
webOnBoard | 16:5d102be2566c | 122 | ***************************************************************************/ |
webOnBoard | 16:5d102be2566c | 123 | |
webOnBoard | 16:5d102be2566c | 124 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 125 | /*! |
webOnBoard | 16:5d102be2566c | 126 | @brief Instantiates a new Adafruit_LSM303 class |
webOnBoard | 16:5d102be2566c | 127 | */ |
webOnBoard | 16:5d102be2566c | 128 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 129 | Adafruit_LSM303_Accel_Unified::Adafruit_LSM303_Accel_Unified(int32_t sensorID) { |
webOnBoard | 16:5d102be2566c | 130 | _sensorID = sensorID; |
webOnBoard | 16:5d102be2566c | 131 | } |
webOnBoard | 16:5d102be2566c | 132 | |
webOnBoard | 16:5d102be2566c | 133 | /*************************************************************************** |
webOnBoard | 16:5d102be2566c | 134 | PUBLIC FUNCTIONS |
webOnBoard | 16:5d102be2566c | 135 | ***************************************************************************/ |
webOnBoard | 16:5d102be2566c | 136 | |
webOnBoard | 16:5d102be2566c | 137 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 138 | /*! |
webOnBoard | 16:5d102be2566c | 139 | @brief Setups the HW |
webOnBoard | 16:5d102be2566c | 140 | */ |
webOnBoard | 16:5d102be2566c | 141 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 142 | bool Adafruit_LSM303_Accel_Unified::begin() |
webOnBoard | 16:5d102be2566c | 143 | { |
webOnBoard | 16:5d102be2566c | 144 | |
webOnBoard | 16:5d102be2566c | 145 | // Enable the accelerometer (100Hz) |
webOnBoard | 16:5d102be2566c | 146 | write8(LSM303_ADDRESS_ACCEL, LSM303_REGISTER_ACCEL_CTRL_REG1_A, 0x57); |
webOnBoard | 16:5d102be2566c | 147 | |
webOnBoard | 16:5d102be2566c | 148 | // LSM303DLHC has no WHOAMI register so read CTRL_REG1_A back to check |
webOnBoard | 16:5d102be2566c | 149 | // if we are connected or not |
webOnBoard | 16:5d102be2566c | 150 | uint8_t reg1_a = read8(LSM303_ADDRESS_ACCEL, LSM303_REGISTER_ACCEL_CTRL_REG1_A); |
webOnBoard | 16:5d102be2566c | 151 | if (reg1_a != 0x57) |
webOnBoard | 16:5d102be2566c | 152 | { |
webOnBoard | 16:5d102be2566c | 153 | return false; |
webOnBoard | 16:5d102be2566c | 154 | } |
webOnBoard | 16:5d102be2566c | 155 | |
webOnBoard | 16:5d102be2566c | 156 | return true; |
webOnBoard | 16:5d102be2566c | 157 | } |
webOnBoard | 16:5d102be2566c | 158 | |
webOnBoard | 16:5d102be2566c | 159 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 160 | /*! |
webOnBoard | 16:5d102be2566c | 161 | @brief Gets the most recent sensor event |
webOnBoard | 16:5d102be2566c | 162 | */ |
webOnBoard | 16:5d102be2566c | 163 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 164 | bool Adafruit_LSM303_Accel_Unified::getEvent(sensors_event_t *event) { |
webOnBoard | 16:5d102be2566c | 165 | /* Clear the event */ |
webOnBoard | 16:5d102be2566c | 166 | memset(event, 0, sizeof(sensors_event_t)); |
webOnBoard | 16:5d102be2566c | 167 | |
webOnBoard | 16:5d102be2566c | 168 | /* Read new data */ |
webOnBoard | 16:5d102be2566c | 169 | read(); |
webOnBoard | 16:5d102be2566c | 170 | |
webOnBoard | 16:5d102be2566c | 171 | event->version = sizeof(sensors_event_t); |
webOnBoard | 16:5d102be2566c | 172 | event->sensor_id = _sensorID; |
webOnBoard | 16:5d102be2566c | 173 | event->type = SENSOR_TYPE_ACCELEROMETER; |
webOnBoard | 16:5d102be2566c | 174 | event->timestamp = timer.read_ms();//millis(); |
webOnBoard | 16:5d102be2566c | 175 | event->acceleration.x = _accelData.x * _lsm303Accel_MG_LSB * SENSORS_GRAVITY_STANDARD; |
webOnBoard | 16:5d102be2566c | 176 | event->acceleration.y = _accelData.y * _lsm303Accel_MG_LSB * SENSORS_GRAVITY_STANDARD; |
webOnBoard | 16:5d102be2566c | 177 | event->acceleration.z = _accelData.z * _lsm303Accel_MG_LSB * SENSORS_GRAVITY_STANDARD; |
webOnBoard | 16:5d102be2566c | 178 | |
webOnBoard | 16:5d102be2566c | 179 | return true; |
webOnBoard | 16:5d102be2566c | 180 | } |
webOnBoard | 16:5d102be2566c | 181 | |
webOnBoard | 16:5d102be2566c | 182 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 183 | /*! |
webOnBoard | 16:5d102be2566c | 184 | @brief Gets the sensor_t data |
webOnBoard | 16:5d102be2566c | 185 | */ |
webOnBoard | 16:5d102be2566c | 186 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 187 | void Adafruit_LSM303_Accel_Unified::getSensor(sensor_t *sensor) { |
webOnBoard | 16:5d102be2566c | 188 | /* Clear the sensor_t object */ |
webOnBoard | 16:5d102be2566c | 189 | memset(sensor, 0, sizeof(sensor_t)); |
webOnBoard | 16:5d102be2566c | 190 | |
webOnBoard | 16:5d102be2566c | 191 | /* Insert the sensor name in the fixed length char array */ |
webOnBoard | 16:5d102be2566c | 192 | strncpy (sensor->name, "LSM303", sizeof(sensor->name) - 1); |
webOnBoard | 16:5d102be2566c | 193 | sensor->name[sizeof(sensor->name)- 1] = 0; |
webOnBoard | 16:5d102be2566c | 194 | sensor->version = 1; |
webOnBoard | 16:5d102be2566c | 195 | sensor->sensor_id = _sensorID; |
webOnBoard | 16:5d102be2566c | 196 | sensor->type = SENSOR_TYPE_ACCELEROMETER; |
webOnBoard | 16:5d102be2566c | 197 | sensor->min_delay = 0; |
webOnBoard | 16:5d102be2566c | 198 | sensor->max_value = 0.0F; // TBD |
webOnBoard | 16:5d102be2566c | 199 | sensor->min_value = 0.0F; // TBD |
webOnBoard | 16:5d102be2566c | 200 | sensor->resolution = 0.0F; // TBD |
webOnBoard | 16:5d102be2566c | 201 | } |
webOnBoard | 16:5d102be2566c | 202 | |
webOnBoard | 16:5d102be2566c | 203 | /*************************************************************************** |
webOnBoard | 16:5d102be2566c | 204 | MAGNETOMETER |
webOnBoard | 16:5d102be2566c | 205 | ***************************************************************************/ |
webOnBoard | 16:5d102be2566c | 206 | /*************************************************************************** |
webOnBoard | 16:5d102be2566c | 207 | PRIVATE FUNCTIONS |
webOnBoard | 16:5d102be2566c | 208 | ***************************************************************************/ |
webOnBoard | 16:5d102be2566c | 209 | |
webOnBoard | 16:5d102be2566c | 210 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 211 | /*! |
webOnBoard | 16:5d102be2566c | 212 | @brief Abstract away platform differences in Arduino wire library |
webOnBoard | 16:5d102be2566c | 213 | */ |
webOnBoard | 16:5d102be2566c | 214 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 215 | void Adafruit_LSM303_Mag_Unified::write8(byte address, byte reg, byte value) |
webOnBoard | 16:5d102be2566c | 216 | { |
webOnBoard | 16:5d102be2566c | 217 | char data_write[2]; |
webOnBoard | 16:5d102be2566c | 218 | |
webOnBoard | 16:5d102be2566c | 219 | data_write[0] = reg; |
webOnBoard | 16:5d102be2566c | 220 | data_write[1] = value; |
webOnBoard | 16:5d102be2566c | 221 | int status = i2c->write(address, data_write, 2, 0); |
webOnBoard | 16:5d102be2566c | 222 | |
webOnBoard | 16:5d102be2566c | 223 | } |
webOnBoard | 16:5d102be2566c | 224 | |
webOnBoard | 16:5d102be2566c | 225 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 226 | /*! |
webOnBoard | 16:5d102be2566c | 227 | @brief Abstract away platform differences in Arduino wire library |
webOnBoard | 16:5d102be2566c | 228 | */ |
webOnBoard | 16:5d102be2566c | 229 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 230 | byte Adafruit_LSM303_Mag_Unified::read8(byte address, byte reg) |
webOnBoard | 16:5d102be2566c | 231 | { |
webOnBoard | 16:5d102be2566c | 232 | byte value; |
webOnBoard | 16:5d102be2566c | 233 | |
webOnBoard | 16:5d102be2566c | 234 | char data_write[2]; |
webOnBoard | 16:5d102be2566c | 235 | char data_read[2]; |
webOnBoard | 16:5d102be2566c | 236 | |
webOnBoard | 16:5d102be2566c | 237 | // Read register |
webOnBoard | 16:5d102be2566c | 238 | data_write[0] = reg; |
webOnBoard | 16:5d102be2566c | 239 | i2c->write(address, data_write, 1, 1); // no stop |
webOnBoard | 16:5d102be2566c | 240 | i2c->read(address, data_read, 2, 0); |
webOnBoard | 16:5d102be2566c | 241 | value = data_read[0]; |
webOnBoard | 16:5d102be2566c | 242 | |
webOnBoard | 16:5d102be2566c | 243 | return value; |
webOnBoard | 16:5d102be2566c | 244 | } |
webOnBoard | 16:5d102be2566c | 245 | |
webOnBoard | 16:5d102be2566c | 246 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 247 | /*! |
webOnBoard | 16:5d102be2566c | 248 | @brief Reads the raw data from the sensor |
webOnBoard | 16:5d102be2566c | 249 | */ |
webOnBoard | 16:5d102be2566c | 250 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 251 | void Adafruit_LSM303_Mag_Unified::read() |
webOnBoard | 16:5d102be2566c | 252 | { |
webOnBoard | 16:5d102be2566c | 253 | |
webOnBoard | 16:5d102be2566c | 254 | char data_write[2]; |
webOnBoard | 16:5d102be2566c | 255 | char data_read[6]; |
webOnBoard | 16:5d102be2566c | 256 | uint32_t status; |
webOnBoard | 16:5d102be2566c | 257 | uint8_t xhi; |
webOnBoard | 16:5d102be2566c | 258 | uint8_t xlo; |
webOnBoard | 16:5d102be2566c | 259 | uint8_t zhi; |
webOnBoard | 16:5d102be2566c | 260 | uint8_t zlo; |
webOnBoard | 16:5d102be2566c | 261 | uint8_t yhi; |
webOnBoard | 16:5d102be2566c | 262 | uint8_t ylo; |
webOnBoard | 16:5d102be2566c | 263 | // Read the magnetometer |
webOnBoard | 16:5d102be2566c | 264 | data_write[0] = LSM303_REGISTER_MAG_OUT_X_H_M ; |
webOnBoard | 16:5d102be2566c | 265 | |
webOnBoard | 16:5d102be2566c | 266 | i2c->write(LSM303_ADDRESS_MAG, data_write, 1, 1);// non stop i2c |
webOnBoard | 16:5d102be2566c | 267 | |
webOnBoard | 16:5d102be2566c | 268 | // Read the accelerometer |
webOnBoard | 16:5d102be2566c | 269 | // Read 6 byte data |
webOnBoard | 16:5d102be2566c | 270 | status = i2c->read(LSM303_ADDRESS_MAG, data_read, 6, 0); |
webOnBoard | 16:5d102be2566c | 271 | // Read the accelerometer |
webOnBoard | 16:5d102be2566c | 272 | |
webOnBoard | 16:5d102be2566c | 273 | // Wait around until enough data is available |
webOnBoard | 16:5d102be2566c | 274 | |
webOnBoard | 16:5d102be2566c | 275 | if ( status == 0 ) |
webOnBoard | 16:5d102be2566c | 276 | { |
webOnBoard | 16:5d102be2566c | 277 | xlo = data_read[0]; |
webOnBoard | 16:5d102be2566c | 278 | xhi = data_read[1]; |
webOnBoard | 16:5d102be2566c | 279 | ylo = data_read[2]; |
webOnBoard | 16:5d102be2566c | 280 | yhi = data_read[3]; |
webOnBoard | 16:5d102be2566c | 281 | zlo = data_read[4]; |
webOnBoard | 16:5d102be2566c | 282 | zhi = data_read[5]; |
webOnBoard | 16:5d102be2566c | 283 | |
webOnBoard | 16:5d102be2566c | 284 | |
webOnBoard | 16:5d102be2566c | 285 | // Shift values to create properly formed integer (low byte first) |
webOnBoard | 16:5d102be2566c | 286 | _magData.x = (int16_t)(xlo | ((int16_t)xhi << 8)); |
webOnBoard | 16:5d102be2566c | 287 | _magData.y = (int16_t)(ylo | ((int16_t)yhi << 8)); |
webOnBoard | 16:5d102be2566c | 288 | _magData.z = (int16_t)(zlo | ((int16_t)zhi << 8)); |
webOnBoard | 16:5d102be2566c | 289 | } |
webOnBoard | 16:5d102be2566c | 290 | // ToDo: Calculate orientation |
webOnBoard | 16:5d102be2566c | 291 | // _magData.orientation = 0.0; |
webOnBoard | 16:5d102be2566c | 292 | } |
webOnBoard | 16:5d102be2566c | 293 | |
webOnBoard | 16:5d102be2566c | 294 | /*************************************************************************** |
webOnBoard | 16:5d102be2566c | 295 | CONSTRUCTOR |
webOnBoard | 16:5d102be2566c | 296 | ***************************************************************************/ |
webOnBoard | 16:5d102be2566c | 297 | |
webOnBoard | 16:5d102be2566c | 298 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 299 | /*! |
webOnBoard | 16:5d102be2566c | 300 | @brief Instantiates a new Adafruit_LSM303 class |
webOnBoard | 16:5d102be2566c | 301 | */ |
webOnBoard | 16:5d102be2566c | 302 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 303 | Adafruit_LSM303_Mag_Unified::Adafruit_LSM303_Mag_Unified(int32_t sensorID) { |
webOnBoard | 16:5d102be2566c | 304 | _sensorID = sensorID; |
webOnBoard | 16:5d102be2566c | 305 | _autoRangeEnabled = false; |
webOnBoard | 16:5d102be2566c | 306 | } |
webOnBoard | 16:5d102be2566c | 307 | |
webOnBoard | 16:5d102be2566c | 308 | /*************************************************************************** |
webOnBoard | 16:5d102be2566c | 309 | PUBLIC FUNCTIONS |
webOnBoard | 16:5d102be2566c | 310 | ***************************************************************************/ |
webOnBoard | 16:5d102be2566c | 311 | |
webOnBoard | 16:5d102be2566c | 312 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 313 | /*! |
webOnBoard | 16:5d102be2566c | 314 | @brief Setups the HW |
webOnBoard | 16:5d102be2566c | 315 | */ |
webOnBoard | 16:5d102be2566c | 316 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 317 | bool Adafruit_LSM303_Mag_Unified::begin() |
webOnBoard | 16:5d102be2566c | 318 | { |
webOnBoard | 16:5d102be2566c | 319 | |
webOnBoard | 16:5d102be2566c | 320 | // Enable the magnetometer |
webOnBoard | 16:5d102be2566c | 321 | write8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_MR_REG_M, 0x00); |
webOnBoard | 16:5d102be2566c | 322 | |
webOnBoard | 16:5d102be2566c | 323 | // LSM303DLHC has no WHOAMI register so read CRA_REG_M to check |
webOnBoard | 16:5d102be2566c | 324 | // the default value (0b00010000/0x10) |
webOnBoard | 16:5d102be2566c | 325 | uint8_t reg1_a = read8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_CRA_REG_M); |
webOnBoard | 16:5d102be2566c | 326 | if (reg1_a != 0x10) |
webOnBoard | 16:5d102be2566c | 327 | { |
webOnBoard | 16:5d102be2566c | 328 | return false; |
webOnBoard | 16:5d102be2566c | 329 | } |
webOnBoard | 16:5d102be2566c | 330 | |
webOnBoard | 16:5d102be2566c | 331 | // Set the gain to a known level |
webOnBoard | 16:5d102be2566c | 332 | setMagGain(LSM303_MAGGAIN_1_3); |
webOnBoard | 16:5d102be2566c | 333 | |
webOnBoard | 16:5d102be2566c | 334 | return true; |
webOnBoard | 16:5d102be2566c | 335 | } |
webOnBoard | 16:5d102be2566c | 336 | |
webOnBoard | 16:5d102be2566c | 337 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 338 | /*! |
webOnBoard | 16:5d102be2566c | 339 | @brief Enables or disables auto-ranging |
webOnBoard | 16:5d102be2566c | 340 | */ |
webOnBoard | 16:5d102be2566c | 341 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 342 | void Adafruit_LSM303_Mag_Unified::enableAutoRange(bool enabled) |
webOnBoard | 16:5d102be2566c | 343 | { |
webOnBoard | 16:5d102be2566c | 344 | _autoRangeEnabled = enabled; |
webOnBoard | 16:5d102be2566c | 345 | } |
webOnBoard | 16:5d102be2566c | 346 | |
webOnBoard | 16:5d102be2566c | 347 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 348 | /*! |
webOnBoard | 16:5d102be2566c | 349 | @brief Sets the magnetometer's gain |
webOnBoard | 16:5d102be2566c | 350 | */ |
webOnBoard | 16:5d102be2566c | 351 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 352 | void Adafruit_LSM303_Mag_Unified::setMagGain(lsm303MagGain gain) |
webOnBoard | 16:5d102be2566c | 353 | { |
webOnBoard | 16:5d102be2566c | 354 | write8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_CRB_REG_M, (byte)gain); |
webOnBoard | 16:5d102be2566c | 355 | |
webOnBoard | 16:5d102be2566c | 356 | _magGain = gain; |
webOnBoard | 16:5d102be2566c | 357 | |
webOnBoard | 16:5d102be2566c | 358 | switch(gain) |
webOnBoard | 16:5d102be2566c | 359 | { |
webOnBoard | 16:5d102be2566c | 360 | case LSM303_MAGGAIN_1_3: |
webOnBoard | 16:5d102be2566c | 361 | _lsm303Mag_Gauss_LSB_XY = 1100; |
webOnBoard | 16:5d102be2566c | 362 | _lsm303Mag_Gauss_LSB_Z = 980; |
webOnBoard | 16:5d102be2566c | 363 | break; |
webOnBoard | 16:5d102be2566c | 364 | case LSM303_MAGGAIN_1_9: |
webOnBoard | 16:5d102be2566c | 365 | _lsm303Mag_Gauss_LSB_XY = 855; |
webOnBoard | 16:5d102be2566c | 366 | _lsm303Mag_Gauss_LSB_Z = 760; |
webOnBoard | 16:5d102be2566c | 367 | break; |
webOnBoard | 16:5d102be2566c | 368 | case LSM303_MAGGAIN_2_5: |
webOnBoard | 16:5d102be2566c | 369 | _lsm303Mag_Gauss_LSB_XY = 670; |
webOnBoard | 16:5d102be2566c | 370 | _lsm303Mag_Gauss_LSB_Z = 600; |
webOnBoard | 16:5d102be2566c | 371 | break; |
webOnBoard | 16:5d102be2566c | 372 | case LSM303_MAGGAIN_4_0: |
webOnBoard | 16:5d102be2566c | 373 | _lsm303Mag_Gauss_LSB_XY = 450; |
webOnBoard | 16:5d102be2566c | 374 | _lsm303Mag_Gauss_LSB_Z = 400; |
webOnBoard | 16:5d102be2566c | 375 | break; |
webOnBoard | 16:5d102be2566c | 376 | case LSM303_MAGGAIN_4_7: |
webOnBoard | 16:5d102be2566c | 377 | _lsm303Mag_Gauss_LSB_XY = 400; |
webOnBoard | 16:5d102be2566c | 378 | _lsm303Mag_Gauss_LSB_Z = 355; |
webOnBoard | 16:5d102be2566c | 379 | break; |
webOnBoard | 16:5d102be2566c | 380 | case LSM303_MAGGAIN_5_6: |
webOnBoard | 16:5d102be2566c | 381 | _lsm303Mag_Gauss_LSB_XY = 330; |
webOnBoard | 16:5d102be2566c | 382 | _lsm303Mag_Gauss_LSB_Z = 295; |
webOnBoard | 16:5d102be2566c | 383 | break; |
webOnBoard | 16:5d102be2566c | 384 | case LSM303_MAGGAIN_8_1: |
webOnBoard | 16:5d102be2566c | 385 | _lsm303Mag_Gauss_LSB_XY = 230; |
webOnBoard | 16:5d102be2566c | 386 | _lsm303Mag_Gauss_LSB_Z = 205; |
webOnBoard | 16:5d102be2566c | 387 | break; |
webOnBoard | 16:5d102be2566c | 388 | } |
webOnBoard | 16:5d102be2566c | 389 | } |
webOnBoard | 16:5d102be2566c | 390 | |
webOnBoard | 16:5d102be2566c | 391 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 392 | /*! |
webOnBoard | 16:5d102be2566c | 393 | @brief Sets the magnetometer's update rate |
webOnBoard | 16:5d102be2566c | 394 | */ |
webOnBoard | 16:5d102be2566c | 395 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 396 | void Adafruit_LSM303_Mag_Unified::setMagRate(lsm303MagRate rate) |
webOnBoard | 16:5d102be2566c | 397 | { |
webOnBoard | 16:5d102be2566c | 398 | byte reg_m = ((byte)rate & 0x07) << 2; |
webOnBoard | 16:5d102be2566c | 399 | write8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_CRA_REG_M, reg_m); |
webOnBoard | 16:5d102be2566c | 400 | } |
webOnBoard | 16:5d102be2566c | 401 | |
webOnBoard | 16:5d102be2566c | 402 | |
webOnBoard | 16:5d102be2566c | 403 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 404 | /*! |
webOnBoard | 16:5d102be2566c | 405 | @brief Gets the most recent sensor event |
webOnBoard | 16:5d102be2566c | 406 | */ |
webOnBoard | 16:5d102be2566c | 407 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 408 | bool Adafruit_LSM303_Mag_Unified::getEvent(sensors_event_t *event) { |
webOnBoard | 16:5d102be2566c | 409 | bool readingValid = false; |
webOnBoard | 16:5d102be2566c | 410 | |
webOnBoard | 16:5d102be2566c | 411 | /* Clear the event */ |
webOnBoard | 16:5d102be2566c | 412 | memset(event, 0, sizeof(sensors_event_t)); |
webOnBoard | 16:5d102be2566c | 413 | |
webOnBoard | 16:5d102be2566c | 414 | while(!readingValid) |
webOnBoard | 16:5d102be2566c | 415 | { |
webOnBoard | 16:5d102be2566c | 416 | |
webOnBoard | 16:5d102be2566c | 417 | uint8_t reg_mg = read8(LSM303_ADDRESS_MAG, LSM303_REGISTER_MAG_SR_REG_Mg); |
webOnBoard | 16:5d102be2566c | 418 | if (!(reg_mg & 0x1)) { |
webOnBoard | 16:5d102be2566c | 419 | return false; |
webOnBoard | 16:5d102be2566c | 420 | } |
webOnBoard | 16:5d102be2566c | 421 | |
webOnBoard | 16:5d102be2566c | 422 | /* Read new data */ |
webOnBoard | 16:5d102be2566c | 423 | read(); |
webOnBoard | 16:5d102be2566c | 424 | |
webOnBoard | 16:5d102be2566c | 425 | /* Make sure the sensor isn't saturating if auto-ranging is enabled */ |
webOnBoard | 16:5d102be2566c | 426 | if (!_autoRangeEnabled) |
webOnBoard | 16:5d102be2566c | 427 | { |
webOnBoard | 16:5d102be2566c | 428 | readingValid = true; |
webOnBoard | 16:5d102be2566c | 429 | } |
webOnBoard | 16:5d102be2566c | 430 | else |
webOnBoard | 16:5d102be2566c | 431 | { |
webOnBoard | 16:5d102be2566c | 432 | #ifdef LSM303_DEBUG |
webOnBoard | 16:5d102be2566c | 433 | Serial.print(_magData.x); Serial.print(" "); |
webOnBoard | 16:5d102be2566c | 434 | Serial.print(_magData.y); Serial.print(" "); |
webOnBoard | 16:5d102be2566c | 435 | Serial.print(_magData.z); Serial.println(" "); |
webOnBoard | 16:5d102be2566c | 436 | #endif |
webOnBoard | 16:5d102be2566c | 437 | /* Check if the sensor is saturating or not */ |
webOnBoard | 16:5d102be2566c | 438 | if ( (_magData.x >= 2040) | (_magData.x <= -2040) | |
webOnBoard | 16:5d102be2566c | 439 | (_magData.y >= 2040) | (_magData.y <= -2040) | |
webOnBoard | 16:5d102be2566c | 440 | (_magData.z >= 2040) | (_magData.z <= -2040) ) |
webOnBoard | 16:5d102be2566c | 441 | { |
webOnBoard | 16:5d102be2566c | 442 | /* Saturating .... increase the range if we can */ |
webOnBoard | 16:5d102be2566c | 443 | switch(_magGain) |
webOnBoard | 16:5d102be2566c | 444 | { |
webOnBoard | 16:5d102be2566c | 445 | case LSM303_MAGGAIN_5_6: |
webOnBoard | 16:5d102be2566c | 446 | setMagGain(LSM303_MAGGAIN_8_1); |
webOnBoard | 16:5d102be2566c | 447 | readingValid = false; |
webOnBoard | 16:5d102be2566c | 448 | #ifdef LSM303_DEBUG |
webOnBoard | 16:5d102be2566c | 449 | Serial.println("Changing range to +/- 8.1"); |
webOnBoard | 16:5d102be2566c | 450 | #endif |
webOnBoard | 16:5d102be2566c | 451 | break; |
webOnBoard | 16:5d102be2566c | 452 | case LSM303_MAGGAIN_4_7: |
webOnBoard | 16:5d102be2566c | 453 | setMagGain(LSM303_MAGGAIN_5_6); |
webOnBoard | 16:5d102be2566c | 454 | readingValid = false; |
webOnBoard | 16:5d102be2566c | 455 | #ifdef LSM303_DEBUG |
webOnBoard | 16:5d102be2566c | 456 | Serial.println("Changing range to +/- 5.6"); |
webOnBoard | 16:5d102be2566c | 457 | #endif |
webOnBoard | 16:5d102be2566c | 458 | break; |
webOnBoard | 16:5d102be2566c | 459 | case LSM303_MAGGAIN_4_0: |
webOnBoard | 16:5d102be2566c | 460 | setMagGain(LSM303_MAGGAIN_4_7); |
webOnBoard | 16:5d102be2566c | 461 | readingValid = false; |
webOnBoard | 16:5d102be2566c | 462 | #ifdef LSM303_DEBUG |
webOnBoard | 16:5d102be2566c | 463 | Serial.println("Changing range to +/- 4.7"); |
webOnBoard | 16:5d102be2566c | 464 | #endif |
webOnBoard | 16:5d102be2566c | 465 | break; |
webOnBoard | 16:5d102be2566c | 466 | case LSM303_MAGGAIN_2_5: |
webOnBoard | 16:5d102be2566c | 467 | setMagGain(LSM303_MAGGAIN_4_0); |
webOnBoard | 16:5d102be2566c | 468 | readingValid = false; |
webOnBoard | 16:5d102be2566c | 469 | #ifdef LSM303_DEBUG |
webOnBoard | 16:5d102be2566c | 470 | Serial.println("Changing range to +/- 4.0"); |
webOnBoard | 16:5d102be2566c | 471 | #endif |
webOnBoard | 16:5d102be2566c | 472 | break; |
webOnBoard | 16:5d102be2566c | 473 | case LSM303_MAGGAIN_1_9: |
webOnBoard | 16:5d102be2566c | 474 | setMagGain(LSM303_MAGGAIN_2_5); |
webOnBoard | 16:5d102be2566c | 475 | readingValid = false; |
webOnBoard | 16:5d102be2566c | 476 | #ifdef LSM303_DEBUG |
webOnBoard | 16:5d102be2566c | 477 | Serial.println("Changing range to +/- 2.5"); |
webOnBoard | 16:5d102be2566c | 478 | #endif |
webOnBoard | 16:5d102be2566c | 479 | break; |
webOnBoard | 16:5d102be2566c | 480 | case LSM303_MAGGAIN_1_3: |
webOnBoard | 16:5d102be2566c | 481 | setMagGain(LSM303_MAGGAIN_1_9); |
webOnBoard | 16:5d102be2566c | 482 | readingValid = false; |
webOnBoard | 16:5d102be2566c | 483 | #ifdef LSM303_DEBUG |
webOnBoard | 16:5d102be2566c | 484 | Serial.println("Changing range to +/- 1.9"); |
webOnBoard | 16:5d102be2566c | 485 | #endif |
webOnBoard | 16:5d102be2566c | 486 | break; |
webOnBoard | 16:5d102be2566c | 487 | default: |
webOnBoard | 16:5d102be2566c | 488 | readingValid = true; |
webOnBoard | 16:5d102be2566c | 489 | break; |
webOnBoard | 16:5d102be2566c | 490 | } |
webOnBoard | 16:5d102be2566c | 491 | } |
webOnBoard | 16:5d102be2566c | 492 | else |
webOnBoard | 16:5d102be2566c | 493 | { |
webOnBoard | 16:5d102be2566c | 494 | /* All values are withing range */ |
webOnBoard | 16:5d102be2566c | 495 | readingValid = true; |
webOnBoard | 16:5d102be2566c | 496 | } |
webOnBoard | 16:5d102be2566c | 497 | } |
webOnBoard | 16:5d102be2566c | 498 | } |
webOnBoard | 16:5d102be2566c | 499 | |
webOnBoard | 16:5d102be2566c | 500 | event->version = sizeof(sensors_event_t); |
webOnBoard | 16:5d102be2566c | 501 | event->sensor_id = _sensorID; |
webOnBoard | 16:5d102be2566c | 502 | event->type = SENSOR_TYPE_MAGNETIC_FIELD; |
webOnBoard | 16:5d102be2566c | 503 | event->timestamp = timer.read_ms();//millis(); |
webOnBoard | 16:5d102be2566c | 504 | event->magnetic.x = _magData.x / _lsm303Mag_Gauss_LSB_XY * SENSORS_GAUSS_TO_MICROTESLA; |
webOnBoard | 16:5d102be2566c | 505 | event->magnetic.y = _magData.y / _lsm303Mag_Gauss_LSB_XY * SENSORS_GAUSS_TO_MICROTESLA; |
webOnBoard | 16:5d102be2566c | 506 | event->magnetic.z = _magData.z / _lsm303Mag_Gauss_LSB_Z * SENSORS_GAUSS_TO_MICROTESLA; |
webOnBoard | 16:5d102be2566c | 507 | |
webOnBoard | 16:5d102be2566c | 508 | return true; |
webOnBoard | 16:5d102be2566c | 509 | } |
webOnBoard | 16:5d102be2566c | 510 | |
webOnBoard | 16:5d102be2566c | 511 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 512 | /*! |
webOnBoard | 16:5d102be2566c | 513 | @brief Gets the sensor_t data |
webOnBoard | 16:5d102be2566c | 514 | */ |
webOnBoard | 16:5d102be2566c | 515 | /**************************************************************************/ |
webOnBoard | 16:5d102be2566c | 516 | void Adafruit_LSM303_Mag_Unified::getSensor(sensor_t *sensor) { |
webOnBoard | 16:5d102be2566c | 517 | /* Clear the sensor_t object */ |
webOnBoard | 16:5d102be2566c | 518 | memset(sensor, 0, sizeof(sensor_t)); |
webOnBoard | 16:5d102be2566c | 519 | |
webOnBoard | 16:5d102be2566c | 520 | /* Insert the sensor name in the fixed length char array */ |
webOnBoard | 16:5d102be2566c | 521 | strncpy (sensor->name, "LSM303", sizeof(sensor->name) - 1); |
webOnBoard | 16:5d102be2566c | 522 | sensor->name[sizeof(sensor->name)- 1] = 0; |
webOnBoard | 16:5d102be2566c | 523 | sensor->version = 1; |
webOnBoard | 16:5d102be2566c | 524 | sensor->sensor_id = _sensorID; |
webOnBoard | 16:5d102be2566c | 525 | sensor->type = SENSOR_TYPE_MAGNETIC_FIELD; |
webOnBoard | 16:5d102be2566c | 526 | sensor->min_delay = 0; |
webOnBoard | 16:5d102be2566c | 527 | sensor->max_value = 0.0F; // TBD |
webOnBoard | 16:5d102be2566c | 528 | sensor->min_value = 0.0F; // TBD |
webOnBoard | 16:5d102be2566c | 529 | sensor->resolution = 0.0F; // TBD |
webOnBoard | 16:5d102be2566c | 530 | } |