mlx90614: added new sensor (ir temperature), there is an issue with repeated start...
authorKiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
Wed, 20 Aug 2014 11:09:31 +0000 (11:09 +0000)
committerKiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
Wed, 20 Aug 2014 11:09:31 +0000 (11:09 +0000)
Signed-off-by: Kiveisha Yevgeniy <yevgeniy.kiveisha@intel.com>
examples/CMakeLists.txt
examples/mlx90614-example.cxx [new file with mode: 0644]
src/mlx90614/.DS_Store [new file with mode: 0644]
src/mlx90614/._.DS_Store [new file with mode: 0644]
src/mlx90614/CMakeLists.txt [new file with mode: 0644]
src/mlx90614/jsupm_mlx90614.i [new file with mode: 0644]
src/mlx90614/mlx90614.cxx [new file with mode: 0644]
src/mlx90614/mlx90614.h [new file with mode: 0644]
src/mlx90614/pyupm_mlx90614.i [new file with mode: 0644]

index b2d3096..e33f668 100644 (file)
@@ -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 (file)
index 0000000..dbd00f4
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
+ * 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 <unistd.h>
+#include <iostream>
+#include "mlx90614.h"
+#include <signal.h>
+
+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 (file)
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 (file)
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 (file)
index 0000000..ca02e69
--- /dev/null
@@ -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 (file)
index 0000000..a73650e
--- /dev/null
@@ -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 (file)
index 0000000..ad3e645
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
+ * 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 <iostream>
+#include <unistd.h>
+#include <stdlib.h>
+
+#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 (file)
index 0000000..403e209
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Author: Yevgeniy Kiveisha <yevgeniy.kiveisha@intel.com>
+ * 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 <string>
+#include <mraa/i2c.h>
+
+#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 (file)
index 0000000..f7050ef
--- /dev/null
@@ -0,0 +1,9 @@
+%module pyupm_mlx90614
+%include "../upm.i"
+
+%feature("autodoc", "3");
+
+%include "mlx90614.h"
+%{
+    #include "mlx90614.h"
+%}