summaryrefslogtreecommitdiff
path: root/peripheral/libupm/src/adxrs610/adxrs610.h
diff options
context:
space:
mode:
Diffstat (limited to 'peripheral/libupm/src/adxrs610/adxrs610.h')
-rw-r--r--peripheral/libupm/src/adxrs610/adxrs610.h175
1 files changed, 175 insertions, 0 deletions
diff --git a/peripheral/libupm/src/adxrs610/adxrs610.h b/peripheral/libupm/src/adxrs610/adxrs610.h
new file mode 100644
index 0000000..07bc389
--- /dev/null
+++ b/peripheral/libupm/src/adxrs610/adxrs610.h
@@ -0,0 +1,175 @@
+/*
+ * Author: Jon Trulson <jtrulson@ics.com>
+ * Copyright (c) 2015 Intel Corporation.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#pragma once
+
+#include <iostream>
+#include <string>
+#include <mraa/aio.hpp>
+
+// volts per degree / second (typ)
+#define m_degreeCoeff 0.006
+
+// volts per degree C (typ)
+#define m_temperatureCoeff 0.009
+
+// nominal temperature at m_centerVolts
+#define m_temperatureNom 25.0
+
+namespace upm {
+ /**
+ * @brief DFRobot ADXRS610 Gyro Breakout Board
+ * @defgroup adxrs610 libupm-adxrs610
+ * @ingroup dfrobot analog compass
+ */
+
+ /**
+ * @library adxrs610
+ * @sensor adxrs610
+ * @comname DFRobot ADXRS610 Gyro Breakout Board
+ * @altname ADXRS610
+ * @type compass
+ * @man dfrobot
+ * @web http://www.dfrobot.com/index.php?route=product/product&product_id=642
+ * @con analog
+ *
+ * @brief DFRobot ADXRS610 Gyro Beakout board
+ *
+ * The ADXRS610 is a MEMS based single axis gyroscope with a range
+ * of +/- 300 degrees/sec. It also incorporates a temperature
+ * sensing unit that can be used for advanced calibration.
+ *
+ * This sensor returns an analog voltage proportional to the
+ * rotation about the Z-axis in degrees/sec. The temperature
+ * component returns a proportional analog values in degrees C.
+ *
+ * This driver was developed using the DFRobot ADXRS610 Gyro Beakout board.
+ *
+ * @image html adxrs610.jpg
+ * @snippet adxrs610.cxx Interesting
+ */
+
+ class ADXRS610 {
+ public:
+
+ /**
+ * ADXRS610 constructor
+ *
+ * @param dPin Analog pin to use for DATAOUT
+ * @param tPin Analog pin to use for temperature measurement
+ * @param aref Analog reference voltage; default is 5.0 V
+ */
+ ADXRS610(int dPin, int tPin, float aref=5.0);
+
+ /**
+ * ADXRS610 destructor
+ */
+ ~ADXRS610();
+
+ /**
+ * Returns the voltage detected on the DATA analog pin
+ *
+ * @return The detected voltage
+ */
+ float getDataVolts();
+
+ /**
+ * Returns the voltage detected on the TEMP analog pin
+ *
+ * @return The detected voltage
+ */
+ float getTemperatureVolts();
+
+ /**
+ * This method allows you to specify a deadband region around the
+ * zero point of the gyro (at rest). This can be used as a
+ * primitive filter to ignore movment around the zero point.
+ *
+ * @param deadband The voltage around the zero point which will be
+ * ignored
+ */
+ void setDeadband(float deadband) { m_deadband = deadband; };
+
+ /**
+ * Set the zero point. This is the point measured and averaged
+ * when the sensor is not moving. It is set at construction time
+ * (averaged over a number of samples), but can be overriden here.
+ *
+ * @param zeroPoint The averaged zero point of the sensor at rest
+ */
+ void setZeroPoint(float zeroPoint) { m_zeroPoint = zeroPoint; };
+
+ /**
+ * This method samples the data pin samples times to produce an
+ * average. This value can then be used as the zero point
+ * (setZeroPoint()).
+ *
+ * @param samples the number of samples to take an average over.
+ * The default is 50.
+ * @return the average of the reading over samples times.
+ */
+ float calibrateZeroPoint(unsigned int samples=50);
+
+ /**
+ * Return the zero point value.
+ *
+ * @return the current zero point value
+ */
+ float getZeroPoint() { return m_zeroPoint; };
+
+ /**
+ * Return the measured temperature in Celcius. Note, the
+ * datasheet says that this value is very repeatable, but is not
+ * an accurate absolute temperature.
+ *
+ * @return the current temperature in C
+ */
+ float getTemperature();
+
+ /**
+ * Return the measured angular velocity in degrees/sec.
+ *
+ * @return the current angular velocity in degrees/sec
+ */
+ float getAngularVelocity();
+
+ protected:
+ mraa::Aio m_aioData;
+ mraa::Aio m_aioTemp;
+
+ private:
+ float m_aref;
+ // ADC resolution
+ int m_aRes;
+
+ // measured or set zero point value
+ float m_zeroPoint;
+ // desired deadband, default is 0.0
+ float m_deadband;
+
+ // aref / 2
+ float m_centerVolts;
+ };
+}
+
+