From: Kiveisha Yevgeniy Date: Wed, 20 Aug 2014 11:09:31 +0000 (+0000) Subject: mlx90614: added new sensor (ir temperature), there is an issue with repeated start... X-Git-Url: http://review.tizen.org/git/?p=contrib%2Fupm.git;a=commitdiff_plain;h=59a66b41bb58dc44a3079e9440ab660a20fa33a0 mlx90614: added new sensor (ir temperature), there is an issue with repeated start bit in i2c thus the sensor return incorrect data Signed-off-by: Kiveisha Yevgeniy --- diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index b2d3096..e33f668 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -27,6 +27,7 @@ add_executable (max5487-example max5487.cxx) add_executable (nrf8001-broadcast-example nrf8001_broadcast.cxx) add_executable (nrf8001-helloworld-example nrf8001_helloworld.cxx) add_executable (lpd8806-example lpd8806-example.cxx) +add_executable (mlx90614-example mlx90614-example.cxx) include_directories (${PROJECT_SOURCE_DIR}/src/hmc5883l) include_directories (${PROJECT_SOURCE_DIR}/src/grove) @@ -51,6 +52,7 @@ include_directories (${PROJECT_SOURCE_DIR}/src/max31723) include_directories (${PROJECT_SOURCE_DIR}/src/max5487) include_directories (${PROJECT_SOURCE_DIR}/src/nrf8001) include_directories (${PROJECT_SOURCE_DIR}/src/lpd8806) +include_directories (${PROJECT_SOURCE_DIR}/src/mlx90614) target_link_libraries (compass hmc5883l ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (groveled grove ${CMAKE_THREAD_LIBS_INIT}) @@ -81,3 +83,4 @@ target_link_libraries (max5487-example max5487 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (nrf8001-broadcast-example nrf8001 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (nrf8001-helloworld-example nrf8001 ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (lpd8806-example lpd8806 ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries (mlx90614-example mlx90614 ${CMAKE_THREAD_LIBS_INIT}) diff --git a/examples/mlx90614-example.cxx b/examples/mlx90614-example.cxx new file mode 100644 index 0000000..dbd00f4 --- /dev/null +++ b/examples/mlx90614-example.cxx @@ -0,0 +1,60 @@ +/* + * Author: Yevgeniy Kiveisha + * 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 "mlx90614.h" +#include + +int doWork = 0; +upm::MLX90614 *sensor = NULL; + +void +sig_handler(int signo) +{ + printf("got signal\n"); + if (signo == SIGINT) { + printf("exiting application\n"); + doWork = 1; + } +} + +int +main(int argc, char **argv) +{ + //! [Interesting] + sensor = new upm::MLX90614(0, DEVICE_ADDR); + + while (!doWork) { + std::cout << "Object Temperature (" << sensor->readObjectTempC() << ") Ambient Temperature (" << sensor->readAmbientTempC() << ")" << std::endl; + usleep (1000000); + } + //! [Interesting] + + std::cout << "exiting application" << std::endl; + + delete sensor; + + return 0; +} diff --git a/src/mlx90614/.DS_Store b/src/mlx90614/.DS_Store new file mode 100644 index 0000000..ac74c15 Binary files /dev/null and b/src/mlx90614/.DS_Store differ diff --git a/src/mlx90614/._.DS_Store b/src/mlx90614/._.DS_Store new file mode 100644 index 0000000..d83d264 Binary files /dev/null and b/src/mlx90614/._.DS_Store differ diff --git a/src/mlx90614/CMakeLists.txt b/src/mlx90614/CMakeLists.txt new file mode 100644 index 0000000..ca02e69 --- /dev/null +++ b/src/mlx90614/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "mlx90614") +set (libdescription "Infrared thermometer designed for non-contact emperature sensing") +set (module_src ${libname}.cxx) +set (module_h ${libname}.h) +upm_module_init() diff --git a/src/mlx90614/jsupm_mlx90614.i b/src/mlx90614/jsupm_mlx90614.i new file mode 100644 index 0000000..a73650e --- /dev/null +++ b/src/mlx90614/jsupm_mlx90614.i @@ -0,0 +1,8 @@ +%module jsupm_mlx90614 +%include "../upm.i" + +%{ + #include "mlx90614.h" +%} + +%include "mlx90614.h" diff --git a/src/mlx90614/mlx90614.cxx b/src/mlx90614/mlx90614.cxx new file mode 100644 index 0000000..ad3e645 --- /dev/null +++ b/src/mlx90614/mlx90614.cxx @@ -0,0 +1,129 @@ +/* + * Author: Yevgeniy Kiveisha + * 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 + +#include "mlx90614.h" + +using namespace upm; + +struct MLX90614Exception : public std::exception { + std::string message; + MLX90614Exception (std::string msg) : message (msg) { } + ~MLX90614Exception () throw () { } + const char* what() const throw () { return message.c_str(); } +}; + +MLX90614::MLX90614 (int bus, int devAddr) { + m_name = "MLX90614"; + + m_i2cAddr = devAddr; + m_bus = bus; + + m_i2Ctx = mraa_i2c_init(m_bus); + + mraa_result_t ret = mraa_i2c_address(m_i2Ctx, m_i2cAddr); + if (ret != MRAA_SUCCESS) { + throw MLX90614Exception ("Couldn't initilize I2C."); + } +} + +MLX90614::~MLX90614() { + mraa_i2c_stop(m_i2Ctx); +} + +float +MLX90614::readObjectTempF(void) { + return (readTemperature (MLX90614_TOBJ1) * 9 / 5) + 32; +} + +float +MLX90614::readAmbientTempF(void) { + return (readTemperature (MLX90614_TA) * 9 / 5) + 32; +} + +float +MLX90614::readObjectTempC(void) { + return readTemperature (MLX90614_TOBJ1); +} + +float +MLX90614::readAmbientTempC(void) { + return readTemperature (MLX90614_TA); +} + +/* + * ************** + * private area + * ************** + */ +uint16_t +MLX90614::i2cReadReg_N (int reg, unsigned int len, uint8_t * buffer) { + int readByte = 0; + + if (m_i2Ctx == NULL) { + throw MLX90614Exception ("Couldn't find initilized I2C."); + } + + mraa_i2c_address(m_i2Ctx, m_i2cAddr); + mraa_i2c_write_byte(m_i2Ctx, reg); + + readByte = mraa_i2c_read(m_i2Ctx, buffer, len); + return readByte; +} + +mraa_result_t +MLX90614::i2cWriteReg_N (uint8_t reg, unsigned int len, uint8_t * buffer) { + mraa_result_t error = MRAA_SUCCESS; + + if (m_i2Ctx == NULL) { + throw MLX90614Exception ("Couldn't find initilized I2C."); + } + + error = mraa_i2c_address (m_i2Ctx, m_i2cAddr); + error = mraa_i2c_write (m_i2Ctx, buffer, len); + + return error; +} + +float +MLX90614::readTemperature (uint8_t address) { + uint8_t buffer[3]; + float temperature = 0; + + /* Reading temperature from sensor. + Answer contained of 3 bytes (TEMP_LSB | TEMP_MSB | PEC) + */ + if (i2cReadReg_N (address, 3, buffer) > 2) { + temperature = buffer[0]; + temperature = buffer[1] << 8; + + temperature *= .02; + temperature -= 273.15; + } + + return temperature; +} diff --git a/src/mlx90614/mlx90614.h b/src/mlx90614/mlx90614.h new file mode 100644 index 0000000..403e209 --- /dev/null +++ b/src/mlx90614/mlx90614.h @@ -0,0 +1,115 @@ +/* + * Author: Yevgeniy Kiveisha + * 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 +#include + +#define DEVICE_ADDR 0x5A // device address + +// RAM +#define MLX90614_RAWIR1 0x04 +#define MLX90614_RAWIR2 0x05 +#define MLX90614_TA 0x06 +#define MLX90614_TOBJ1 0x07 +#define MLX90614_TOBJ2 0x08 +// EEPROM +#define MLX90614_TOMAX 0x20 +#define MLX90614_TOMIN 0x21 +#define MLX90614_PWMCTRL 0x22 +#define MLX90614_TARANGE 0x23 +#define MLX90614_EMISS 0x24 +#define MLX90614_CONFIG 0x25 +#define MLX90614_ADDR 0x0E +#define MLX90614_ID1 0x3C +#define MLX90614_ID2 0x3D +#define MLX90614_ID3 0x3E +#define MLX90614_ID4 0x3F + +#define HIGH 1 +#define LOW 0 + +namespace upm { + +/** + * @brief C++ API for MLX90614 + * + * This file defines the MLX90614 C++ interface for libmlx90614 + * + */ +class MLX90614 { + public: + + /** + * Instanciates a MLX90614 object + * + * @param bus number of used bus + * @param devAddr addres of used i2c device + */ + MLX90614 (int bus, int devAddr); + + /** + * MLX90614 object destructor, basicaly it close i2c connection. + */ + ~MLX90614 (); + + /** + * Read object temperature in Fahrenheit + */ + float readObjectTempF(void); + + /** + * Read ambient temperature in Fahrenheit + */ + float readAmbientTempF(void); + /** + * Read object temperature in Celsius + */ + float readObjectTempC(void); + + /** + * Read ambient temperature in Celsius + */ + float readAmbientTempC(void); + + /** + * Return name of the component + */ + std::string name() + { + return m_name; + } + private: + std::string m_name; + + int m_i2cAddr; + int m_bus; + mraa_i2c_context m_i2Ctx; + + uint16_t i2cReadReg_N (int reg, unsigned int len, uint8_t * buffer); + mraa_result_t i2cWriteReg_N (uint8_t reg, unsigned int len, uint8_t * buffer); + float readTemperature (uint8_t address); +}; + +} diff --git a/src/mlx90614/pyupm_mlx90614.i b/src/mlx90614/pyupm_mlx90614.i new file mode 100644 index 0000000..f7050ef --- /dev/null +++ b/src/mlx90614/pyupm_mlx90614.i @@ -0,0 +1,9 @@ +%module pyupm_mlx90614 +%include "../upm.i" + +%feature("autodoc", "3"); + +%include "mlx90614.h" +%{ + #include "mlx90614.h" +%}