Code for autonomous ground vehicle, Data Bus, 3rd place winner in 2012 Sparkfun AVC.

Dependencies:   Watchdog mbed Schedule SimpleFilter LSM303DLM PinDetect DebounceIn Servo

Sensors/Sensors.h

Committer:
shimniok
Date:
2012-06-20
Revision:
0:826c6171fc1b

File content as of revision 0:826c6171fc1b:

/*

MinIMU-9-Arduino-AHRS
Pololu MinIMU-9 + Arduino AHRS (Attitude and Heading Reference System)

Copyright (c) 2011 Pololu Corporation.
http://www.pololu.com/

MinIMU-9-Arduino-AHRS is based on sf9domahrs by Doug Weibel and Jose Julio:
http://code.google.com/p/sf9domahrs/

sf9domahrs is based on ArduIMU v1.5 by Jordi Munoz and William Premerlani, Jose
Julio and Doug Weibel:
http://code.google.com/p/ardu-imu/

MinIMU-9-Arduino-AHRS is free software: you can redistribute it and/or modify it
under the terms of the GNU Lesser General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your option)
any later version.

MinIMU-9-Arduino-AHRS is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
more details.

You should have received a copy of the GNU Lesser General Public License along
with MinIMU-9-Arduino-AHRS. If not, see <http://www.gnu.org/licenses/>.

*/
#ifndef __SENSORS_H
#define __SENSORS_H

/** Sensor interface library abstracts sensor drivers, next step to a pluggable architecture */

#include "L3G4200D.h"
#include "LSM303DLM.h"
//#include "HMC5843.h"
#include "IncrementalEncoder.h"
#include "Matrix.h"

// Sensor axes
#define _x_ 0
#define _y_ 1
#define _z_ 2

// Magnetometer calibration constants
//#define M_OFFSET_X -20.4416 // calibrated 02/13/2012 mes
//#define M_OFFSET_Y -67.2318
//#define M_OFFSET_Z 6.0950
//#define M_OFFSET_X 12.8922 // calibrated 12/31/2012 mes
//#define M_OFFSET_Y -7.3453
//#define M_OFFSET_Z -147.8652
//#define M_SCALE_X 570.06
//#define M_SCALE_Y 532.83
//#define M_SCALE_Z 480.95

//#define M_X_MIN -654 // calibrated 12/8/2011 mes
//#define M_X_MAX 457
//#define M_Y_MIN -744 
//#define M_Y_MAX 369
//#define M_Z_MIN -573
//#define M_Z_MAX 464

// Chassis specific parameters
#define WHEEL_STRIPES 32
#define WHEEL_CIRC    0.321537 // m; calibrated with 4 12.236m runs. Wheel circumference measured 13.125" or 0.333375m
#define WHEELBASE     0.290
#define TRACK         0.280

class Sensors {
public:
    Sensors(void);
    void Compass_Calibrate(float offset[3], float scale[3]);
    void Read_Encoders(void);
    void Read_Gyro(void);
    void Read_Accel(void);
    void Read_Compass(void);
    void Calculate_Offsets(void);
    void Compass_Heading(void);
    void getRawMag(int mag[3]);
    float getVoltage(void);
    float getCurrent(void);
    void Read_Power(void);
    void Read_Rangers();
    void Read_Camera();
    int g[3];                               // raw gyro value
    int gTemp;                              // raw gyro temperature
    int a[3];                               // raw accelerometer value
    int m[3];                               // raw magnetometer value
    int g_offset[3];                        // raw gyro offset
    int a_offset[3];                        // raw accel offset
    float m_offset[3];                      // magnetometer offset
    float g_scale[3];                       // gyro scaling factor
    float m_scale[3];                       // magnetometer scale
    int g_sign[3];                          // correct sensor signs
    int a_sign[3];
    int m_sign[3]; 
    float gyro[3];                          // corrected gyro value
    float accel[3];                         // corrected accelerometer value
    float mag[3];                           // corrected magnetometer value
    int ranger[3];                          // ranger values
    float leftRanger;
    float rightRanger;
    float centerRanger;
    float voltage;                          // battery voltage in volts
    float current;                          // system current draw in amps
    unsigned int leftTotal;                 // total number of ticks
    unsigned int rightTotal;                // total number of ticks
    unsigned int leftCount;                 // left rear encoder count
    unsigned int rightCount;                // right rear encoder count
    float lrEncDistance;                    // left rear encoder distance
    float rrEncDistance;                    // right rear encoder distance
    float lrEncSpeed;                       // left rear encoder speed
    float rrEncSpeed;                       // right rear encoder speed
    float encDistance;                      // encoder distance since last check
    float encSpeed;                         // encoder calculated speed

    AnalogIn _voltage;                      // Voltage from sensor board
    AnalogIn _current;                      // Current from sensor board
    IncrementalEncoder _left;               // Left wheel encoder
    IncrementalEncoder _right;              // Right wheel encoder
    L3G4200D _gyro;                         // MinIMU-9 gyro
    LSM303DLM _compass;                     // MinIMU-9 compass/accelerometer
    I2C _rangers;                           // Arduino ranger board
    I2C _cam;                               // Propeller camer aboard
    //HMC5843 compass;

private:
    void BubbleSort(float *num, int numLength);
};

#endif