From 4333869b7ba24434ddf1210b867c89151536620a Mon Sep 17 00:00:00 2001 From: Jon Trulson Date: Fri, 19 Dec 2014 17:04:26 -0700 Subject: [PATCH] ta12200: Initial implementation; Grove Electricity uses this sensor [renamed from] groveelectricity: Initial implementation This module adds support for the Grove Electricity sensor. Signed-off-by: Jon Trulson Signed-off-by: Zion Orent Signed-off-by: Sarah Knepper --- examples/CMakeLists.txt | 3 + examples/javascript/ta12200.js | 47 ++++++++++++++ examples/ta12200.cxx | 65 +++++++++++++++++++ src/ta12200/CMakeLists.txt | 5 ++ src/ta12200/jsupm_ta12200.i | 8 +++ src/ta12200/pyupm_ta12200.i | 9 +++ src/ta12200/ta12200.cxx | 112 +++++++++++++++++++++++++++++++++ src/ta12200/ta12200.h | 99 +++++++++++++++++++++++++++++ 8 files changed, 348 insertions(+) create mode 100644 examples/javascript/ta12200.js create mode 100644 examples/ta12200.cxx create mode 100644 src/ta12200/CMakeLists.txt create mode 100644 src/ta12200/jsupm_ta12200.i create mode 100644 src/ta12200/pyupm_ta12200.i create mode 100644 src/ta12200/ta12200.cxx create mode 100644 src/ta12200/ta12200.h diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index d2137ec8..cb3224a7 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -59,6 +59,7 @@ add_executable (a110x-example a110x.cxx) add_executable (gp2y0a21yk-example gp2y0a21yk.cxx) add_executable (grovemoisture-example grovemoisture.cxx) add_executable (groveehr-example groveehr.cxx) +add_executable (ta12200-example ta12200.cxx) include_directories (${PROJECT_SOURCE_DIR}/src/hmc5883l) include_directories (${PROJECT_SOURCE_DIR}/src/grove) @@ -105,6 +106,7 @@ include_directories (${PROJECT_SOURCE_DIR}/src/a110x) include_directories (${PROJECT_SOURCE_DIR}/src/gp2y0a21yk) include_directories (${PROJECT_SOURCE_DIR}/src/grovemoisture) include_directories (${PROJECT_SOURCE_DIR}/src/groveehr) +include_directories (${PROJECT_SOURCE_DIR}/src/ta12200) target_link_libraries (hmc5883l-example hmc5883l ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (groveled-example grove ${CMAKE_THREAD_LIBS_INIT}) @@ -167,3 +169,4 @@ target_link_libraries (a110x-example a110x ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (gp2y0a21yk-example gp2y0a21yk ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (grovemoisture-example grovemoisture ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries (groveehr-example groveehr ${CMAKE_THREAD_LIBS_INIT}) +target_link_libraries (ta12200-example ta12200 ${CMAKE_THREAD_LIBS_INIT}) diff --git a/examples/javascript/ta12200.js b/examples/javascript/ta12200.js new file mode 100644 index 00000000..11bb69c9 --- /dev/null +++ b/examples/javascript/ta12200.js @@ -0,0 +1,47 @@ +/*jslint node:true, vars:true, bitwise:true, unparam:true */ +/*jshint unused:true */ +/*global */ +/* +* Author: Zion Orent +* 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. +*/ + +var electricitySensor = require('jsupm_ta12200'); +// Instantiate a TA12-200 sensor on analog pin A0 +var myElectricitySensor = new electricitySensor.TA12200(0); + +function getElectricityInfo() +{ + var maxVal = myElectricitySensor.highestValue(); + var current = myElectricitySensor.milliAmps(maxVal); + + console.log("Max ADC Value: " + maxVal + ", current: " + current + "mA"); +} + +setInterval(getElectricityInfo, 100); + +// Print message when exiting +process.on('SIGINT', function() +{ + console.log("Exiting..."); + process.exit(0); +}); diff --git a/examples/ta12200.cxx b/examples/ta12200.cxx new file mode 100644 index 00000000..5f949a13 --- /dev/null +++ b/examples/ta12200.cxx @@ -0,0 +1,65 @@ +/* + * Author: Jon Trulson + * 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 "ta12200.h" + +using namespace std; + +int shouldRun = true; + +void sig_handler(int signo) +{ + if (signo == SIGINT) + shouldRun = false; +} + + +int main() +{ + signal(SIGINT, sig_handler); + +//! [Interesting] + // Instantiate a TA12-200 sensor on analog pin A0 + upm::TA12200* electricity = new upm::TA12200(0); + + while (shouldRun) + { + unsigned int maxVal = electricity->highestValue(); + float current = electricity->milliAmps(maxVal); + + cout << "Max ADC Value: " << maxVal << ", current: " << current + << "mA" << endl; + usleep(100000); + } + +//! [Interesting] + + cout << "Exiting..." << endl; + + delete electricity; + return 0; +} diff --git a/src/ta12200/CMakeLists.txt b/src/ta12200/CMakeLists.txt new file mode 100644 index 00000000..0f3f0ba5 --- /dev/null +++ b/src/ta12200/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "ta12200") +set (libdescription "upm ta12200 current transformer module") +set (module_src ${libname}.cxx) +set (module_h ${libname}.h) +upm_module_init() diff --git a/src/ta12200/jsupm_ta12200.i b/src/ta12200/jsupm_ta12200.i new file mode 100644 index 00000000..519f1ec3 --- /dev/null +++ b/src/ta12200/jsupm_ta12200.i @@ -0,0 +1,8 @@ +%module jsupm_ta12200 +%include "../upm.i" + +%{ + #include "ta12200.h" +%} + +%include "ta12200.h" diff --git a/src/ta12200/pyupm_ta12200.i b/src/ta12200/pyupm_ta12200.i new file mode 100644 index 00000000..bf121208 --- /dev/null +++ b/src/ta12200/pyupm_ta12200.i @@ -0,0 +1,9 @@ +%module pyupm_ta12200 +%include "../upm.i" + +%feature("autodoc", "3"); + +%include "ta12200.h" +%{ + #include "ta12200.h" +%} diff --git a/src/ta12200/ta12200.cxx b/src/ta12200/ta12200.cxx new file mode 100644 index 00000000..136b3001 --- /dev/null +++ b/src/ta12200/ta12200.cxx @@ -0,0 +1,112 @@ +/* + * Author: Jon Trulson + * 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 "ta12200.h" + +using namespace upm; +using namespace std; + +TA12200::TA12200(int pin) +{ + initClock(); + + if ( !(m_aio = mraa_aio_init(pin)) ) + { + cerr << __FUNCTION__ << ": mraa_aio_init() failed" << endl; + return; + } +} + +TA12200::~TA12200() +{ + mraa_aio_close(m_aio); +} + +void TA12200::initClock() +{ + gettimeofday(&m_startTime, NULL); +} + +uint32_t TA12200::getMillis() +{ + struct timeval elapsed, now; + uint32_t elapse; + + // get current time + gettimeofday(&now, NULL); + + // compute the delta since m_startTime + if( (elapsed.tv_usec = now.tv_usec - m_startTime.tv_usec) < 0 ) + { + elapsed.tv_usec += 1000000; + elapsed.tv_sec = now.tv_sec - m_startTime.tv_sec - 1; + } + else + { + elapsed.tv_sec = now.tv_sec - m_startTime.tv_sec; + } + + elapse = (uint32_t)((elapsed.tv_sec * 1000) + (elapsed.tv_usec / 1000)); + + // never return 0 + if (elapse == 0) + elapse = 1; + + return elapse; +} + + +unsigned int TA12200::highestValue() +{ + unsigned int hiVal = 0; + unsigned int val; + uint32_t start = getMillis(); + + // 1 second + while (getMillis() < (start + 1000)) + { + val = mraa_aio_read(m_aio); + if (val > hiVal) + hiVal = val; + } + + return hiVal; +} + +float TA12200::milliAmps(unsigned int val, int res) +{ + float ampCurrent; + float effectiveVal; + + // From grove wiki page: + // minimum_current=1/1024*5/800*2000000/1.414=8.6(mA) + // Only for sinusoidal alternating current + //ampCurrent = float(val) / float(res) * 5.0 / 800.0 * 2000000.0; + ampCurrent = float(val) / float(res) * 12500.0; + effectiveVal = ampCurrent/1.414; + return (effectiveVal); +} + diff --git a/src/ta12200/ta12200.h b/src/ta12200/ta12200.h new file mode 100644 index 00000000..2cf39ca3 --- /dev/null +++ b/src/ta12200/ta12200.h @@ -0,0 +1,99 @@ +/* + * Author: Jon Trulson + * 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 +#include +#include +#include + +// default ADC resolution. +#define TA12200_ADC_RES 1024 + +namespace upm { + + /** + * @brief C++ API for the TA12-200 current transformer + * + * UPM module for the TA12-200 current transformer, which is found, + * for instance, in the Grove Electricity Sensor. + * This module can measure AC current moving through a wire at up + * to 5A. + * + * @ingroup analog + * @snippet ta12200.cxx Interesting + */ + class TA12200 { + public: + /** + * TA12200 sensor constructor + * + * @param pin analog pin to use + */ + TA12200(int pin); + + /** + * TA12200 Destructor + */ + ~TA12200(); + + /** + * Return the number of milliseconds elapsed since initClock() + * was last called. + * + * @return elapsed milliseconds + */ + uint32_t getMillis(); + + /** + * Reset the Clock + * + */ + void initClock(); + + /** + * Get the conversion value from the sensor + * + * @return the highest value obtained over 1 second of measuring + */ + unsigned int highestValue(); + + /** + * Compute the measured voltage + * + * @param val value measured by highestValue() + * @param res ADC resolution + * + * @return the measured current in milliamps + */ + float milliAmps(unsigned int val, int res=TA12200_ADC_RES); + + private: + struct timeval m_startTime; + mraa_aio_context m_aio; + }; +} + +