From be8336d0e8a06ded1d2ce8d15ef6abf98d572095 Mon Sep 17 00:00:00 2001 From: Mihai Tudor Panu Date: Mon, 15 Dec 2014 13:49:58 -0800 Subject: [PATCH] itg3200: Grove 3-axis Gyroscope Signed-off-by: Mihai Tudor Panu Signed-off-by: Brendan Le Foll --- docs/images/itg3200.jpeg | Bin 0 -> 37383 bytes examples/CMakeLists.txt | 3 + examples/itg3200.cxx | 51 ++++++++++++ src/itg3200/CMakeLists.txt | 5 ++ src/itg3200/itg3200.cxx | 155 ++++++++++++++++++++++++++++++++++++ src/itg3200/itg3200.h | 115 ++++++++++++++++++++++++++ src/itg3200/jsupm_itg3200.i | 10 +++ src/itg3200/pyupm_itg3200.i | 13 +++ 8 files changed, 352 insertions(+) create mode 100644 docs/images/itg3200.jpeg create mode 100644 examples/itg3200.cxx create mode 100644 src/itg3200/CMakeLists.txt create mode 100644 src/itg3200/itg3200.cxx create mode 100644 src/itg3200/itg3200.h create mode 100644 src/itg3200/jsupm_itg3200.i create mode 100644 src/itg3200/pyupm_itg3200.i diff --git a/docs/images/itg3200.jpeg b/docs/images/itg3200.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ed5a435f02564c18fa1d1fd4e92d5a069cad1bea GIT binary patch literal 37383 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 D#1sc0 literal 0 HcmV?d00001 diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index 6d0aa2f0..74f2cc1b 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -48,6 +48,7 @@ add_executable (htu21d-example htu21d.cxx) add_executable (mpl3115a2-example mpl3115a2.cxx) add_executable (ldt0028-example ldt0028.cxx) add_executable (am2315-example am2315.cxx) +add_executable (itg3200-example itg3200.cxx) include_directories (${PROJECT_SOURCE_DIR}/src/hmc5883l) include_directories (${PROJECT_SOURCE_DIR}/src/grove) @@ -85,6 +86,7 @@ include_directories (${PROJECT_SOURCE_DIR}/src/htu21d) include_directories (${PROJECT_SOURCE_DIR}/src/mpl3115a2) include_directories (${PROJECT_SOURCE_DIR}/src/ldt0028) include_directories (${PROJECT_SOURCE_DIR}/src/am2315) +include_directories (${PROJECT_SOURCE_DIR}/src/itg3200) target_link_libraries (hmc5883l-example hmc5883l ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (groveled-example grove ${CMAKE_THREAD_LIBS_INIT}) @@ -136,3 +138,4 @@ target_link_libraries (htu21d-example htu21d ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (mpl3115a2-example mpl3115a2 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (ldt0028-example ldt0028 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (am2315-example am2315 ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries (itg3200-example itg3200 ${CMAKE_THREAD_LIBS_INIT}) diff --git a/examples/itg3200.cxx b/examples/itg3200.cxx new file mode 100644 index 00000000..7a70e094 --- /dev/null +++ b/examples/itg3200.cxx @@ -0,0 +1,51 @@ +/* + * Author: Mihai Tudor Panu + * Copyright (c) 2014 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. + */ + +#include +#include "itg3200.h" + +int +main(int argc, char **argv) +{ +//! [Interesting] + int16_t *rot; + float *ang; + + // Note: Sensor not supported on Intel Edison with Arduino breakout + upm::Itg3200* gyro = new upm::Itg3200(0); + + while(true){ + gyro->update(); // Update the data + rot = gyro->getRawValues(); // Read raw sensor data + ang = gyro->getRotation(); // Read rotational speed (deg/sec) + fprintf(stdout, "Raw: %6d %6d %6d\n", rot[0], rot[1], rot[2]); + fprintf(stdout, "AngX: %5.2f\n", ang[0]); + fprintf(stdout, "AngY: %5.2f\n", ang[1]); + fprintf(stdout, "AngZ: %5.2f\n", ang[2]); + fprintf(stdout, "Temp: %5.2f Raw: %6d\n", gyro->getTemperature(), gyro->getRawTemp()); + sleep(1); + } +//! [Interesting] + return 0; +} diff --git a/src/itg3200/CMakeLists.txt b/src/itg3200/CMakeLists.txt new file mode 100644 index 00000000..5be008b8 --- /dev/null +++ b/src/itg3200/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "itg3200") +set (libdescription "libupm Digital Gyro") +set (module_src ${libname}.cxx) +set (module_h ${libname}.h) +upm_module_init() diff --git a/src/itg3200/itg3200.cxx b/src/itg3200/itg3200.cxx new file mode 100644 index 00000000..b60789ae --- /dev/null +++ b/src/itg3200/itg3200.cxx @@ -0,0 +1,155 @@ +/* + * Author: Mihai Tudor Panu + * Copyright (c) 2014 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. + */ + +#include +#include +#include "math.h" +#include "itg3200.h" + +#define READ_BUFFER_LENGTH 8 + +//address and id +#define ITG3200_I2C_ADDR 0x68 +#define ITG3200_ID 0x00 + +//configuration registers +#define ITG3200_SMPLRT_DIV 0x15 +#define ITG3200_DLPF_FS 0x16 + +//interrupt registers +#define ITG3200_INT_CFG 0x17 +#define ITG3200_INT_STATUS 0x1A + +//data registers (read only) +#define ITG3200_TEMP_H 0x1B +#define ITG3200_TEMP_L 0x1C +#define ITG3200_XOUT_H 0x1D +#define ITG3200_XOUT_L 0x1E +#define ITG3200_YOUT_H 0x1F +#define ITG3200_YOUT_L 0x20 +#define ITG3200_ZOUT_H 0x21 +#define ITG3200_ZOUT_L 0x22 +#define DATA_REG_SIZE 8 + +//power management +#define ITG3200_PWR_MGM 0x3E + +//useful values +#define ITG3200_RESET 0x80 +#define ITG3200_SLEEP 0x40 +#define ITG3200_WAKEUP 0x00 + +using namespace upm; + +Itg3200::Itg3200(int bus) +{ + //init bus and reset chip + m_i2c = mraa_i2c_init(bus); + + mraa_i2c_address(m_i2c, ITG3200_I2C_ADDR); + m_buffer[0] = ITG3200_PWR_MGM; + m_buffer[1] = ITG3200_RESET; + mraa_i2c_write(m_i2c, m_buffer, 2); + + Itg3200::calibrate(); + Itg3200::update(); +} + +Itg3200::~Itg3200() +{ + mraa_i2c_stop(m_i2c); +} + +mraa_result_t +Itg3200::calibrate(void) +{ + int reads = 600; + int delay = 4000; // 4 milliseconds + int skip = 5; // initial samples to skip + int temp[3] = {0}; + + for(int i = 0; i < reads; i++){ + + Itg3200::update(); + if (i > skip){ + for (int j = 0; j < 3; j++){ + temp[j] += m_rotation[j]; + } + } + usleep(delay); + } + + for(int i = 0; i < 3; i++){ + m_offsets[i] = (-1) * temp[i] / (reads - skip); + } +} + +float +Itg3200::getTemperature() +{ + return 35.0 + (m_temperature + 13200.0) / 280.0; +} + +float* +Itg3200::getRotation() +{ + for(int i = 0; i < 3; i++){ + m_angle[i] = m_rotation[i]/14.375; + } + return &m_angle[0]; +} + +int16_t* +Itg3200::getRawValues() +{ + return &m_rotation[0]; +} + +int16_t +Itg3200::getRawTemp() +{ + return m_temperature; +} + +mraa_result_t +Itg3200::update(void) +{ + mraa_i2c_address(m_i2c, ITG3200_I2C_ADDR); + mraa_i2c_write_byte(m_i2c, ITG3200_TEMP_H); + + mraa_i2c_address(m_i2c, ITG3200_I2C_ADDR); + mraa_i2c_read(m_i2c, m_buffer, DATA_REG_SIZE); + + //temp + // + m_temperature = (m_buffer[0] << 8 ) | m_buffer[1]; + // x + m_rotation[0] = ((m_buffer[2] << 8 ) | m_buffer[3]) + m_offsets[0]; + // y + m_rotation[1] = ((m_buffer[4] << 8 ) | m_buffer[5]) + m_offsets[1]; + // z + m_rotation[2] = ((m_buffer[6] << 8 ) | m_buffer[7]) + m_offsets[2]; + + return MRAA_SUCCESS; +} diff --git a/src/itg3200/itg3200.h b/src/itg3200/itg3200.h new file mode 100644 index 00000000..c6cf641c --- /dev/null +++ b/src/itg3200/itg3200.h @@ -0,0 +1,115 @@ +/* + * Author: Mihai Tudor Panu + * Copyright (c) 2014 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 + +#define READ_BUFFER_LENGTH 8 + +namespace upm { + +/** + * @brief Itg3200 gyroscope library + * @defgroup itg3200 libupm-itg3200 + */ + +/** + * @brief C++ API for Itg3200 (3-axis digital gyroscope) + * + * The InvenSense Itg3200 is a 3-axis digital gyroscope. + * (https://www.sparkfun.com/datasheets/Sensors/Gyro/PS-ITG-3200-00-01.4.pdf) + * This sensor has been tested and can run at either 3V3 or 5V on the Intel Galileo.
+ * However, it is incompatible and will not be detected on the I2C bus + * by the Intel Edison using the Arduino breakout board. + * + * @ingroup itg3200 i2c + * @snippet itg3200.cxx Interesting + * @image html itg3200.jpeg + */ +class Itg3200 { +public: + /** + * Creates an Itg3200 object + * + * @param bus number of used i2c bus + */ + Itg3200(int bus); + + /** + * Itg3200 object destructor + */ + ~Itg3200(); + + /** + * Calibrates the sensor to 0 on all axes. Sensor needs to be resting for accurate calibration. + * Takes about 3 seconds and is also called by constructor on object creation. + * + * @return 0 for successful calibration + */ + mraa_result_t calibrate(); + + /** + * Returns the temperature reading from the integrated temperature sensor in Celsius degrees + * + * @return float temperature in Celsius degrees + */ + float getTemperature(); + + /** + * Returns a pointer to an float[3] that contains computed rotational speeds (angular velocities) + * + * @return float* to an float[3] + */ + float* getRotation(); + + /** + * Returns a pointer to an int[3] that contains the raw register values for X, Y and Z + * + * @return int* to an int[3] + */ + int16_t* getRawValues(); + + /** + * Returns an int that contains the raw register value for the temperature + * + * @return int raw temperature + */ + int16_t getRawTemp(); + + /** + * Updates the rotational values and temperature by reading from i2c bus + * + * @return 0 for success + */ + mraa_result_t update(); +private: + float m_angle[3]; + int16_t m_rotation[3]; + int16_t m_offsets[3]; + int16_t m_temperature; + uint8_t m_buffer[READ_BUFFER_LENGTH]; + mraa_i2c_context m_i2c; +}; + +} diff --git a/src/itg3200/jsupm_itg3200.i b/src/itg3200/jsupm_itg3200.i new file mode 100644 index 00000000..528c4dca --- /dev/null +++ b/src/itg3200/jsupm_itg3200.i @@ -0,0 +1,10 @@ +%module jsupm_itg3200 +%include "../upm.i" + +%{ + #include "itg3200.h" +%} + +%include "itg3200.h" + +%include diff --git a/src/itg3200/pyupm_itg3200.i b/src/itg3200/pyupm_itg3200.i new file mode 100644 index 00000000..08aff43c --- /dev/null +++ b/src/itg3200/pyupm_itg3200.i @@ -0,0 +1,13 @@ +%module pyupm_itg3200 +%include "../upm.i" + +%feature("autodoc", "3"); + +#ifdef DOXYGEN +%include "itg3200_doc.i" +#endif + +%include "itg3200.h" +%{ + #include "itg3200.h" +%}