From b2ffcdd9ea8068bd7f51ba73feee1e3a078f0ce7 Mon Sep 17 00:00:00 2001 From: Mihai Tudor Panu Date: Thu, 6 Nov 2014 10:01:12 -0800 Subject: [PATCH] grove: rotary angle sensor Signed-off-by: Mihai Tudor Panu Signed-off-by: Brendan Le Foll --- docs/images/groverotary.jpeg | Bin 0 -> 20514 bytes examples/groverotary.cxx | 57 +++++++++++++++++++++++++ examples/javascript/groverotary.js | 49 ++++++++++++++++++++++ examples/python/groverotary.py | 45 ++++++++++++++++++++ src/grove/grove.cxx | 45 ++++++++++++++++++++ src/grove/grove.h | 65 +++++++++++++++++++++++++++++ 6 files changed, 261 insertions(+) create mode 100644 docs/images/groverotary.jpeg create mode 100644 examples/groverotary.cxx create mode 100644 examples/javascript/groverotary.js create mode 100644 examples/python/groverotary.py diff --git a/docs/images/groverotary.jpeg b/docs/images/groverotary.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..ef6d747dae2c8a5835018a47dc15700d4b3b06bf GIT binary patch literal 20514 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 + * 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 "grove.h" + +using namespace std; + +int main () +{ +//! [Interesting] + // Instantiate a rotary sensor on analog pin A0 + upm::GroveRotary* knob = new upm::GroveRotary(0); + + // Print sensor name to confirm it initialized properly + cout << knob->name() << endl; + + while(true) { + float abs_value = knob->abs_value(); // Absolute raw value + float abs_deg = knob->abs_deg(); // Absolute degrees + float abs_rad = knob->abs_rad(); // Absolute radians + float rel_value = knob->rel_value(); // Relative raw value + float rel_deg = knob->rel_deg(); // Relative degrees + float rel_rad = knob->rel_rad(); // Relative radians + + fprintf(stdout, "Absolute: %4d raw %5.2f deg = %3.2f rad Relative: %4d raw %5.2f deg %3.2f rad\n", + (int16_t)abs_value, abs_deg, abs_rad, (int16_t)rel_value, rel_deg, rel_rad); + + usleep(2500000); // Sleep for 2.5s + } +//! [Interesting] + delete knob; + return 0; +} diff --git a/examples/javascript/groverotary.js b/examples/javascript/groverotary.js new file mode 100644 index 00000000..591269c5 --- /dev/null +++ b/examples/javascript/groverotary.js @@ -0,0 +1,49 @@ +/* + * 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. + */ + +//setup/Initialization +var upm_grove = require('jsupm_grove'); + +//setup access analog input Analog pin #0 (A0) +var groveRotary = new upm_grove.GroveRotary(0); + +loop(); + +function loop() +{ + var abs = groveRotary.abs_value(); + var absdeg = groveRotary.abs_deg(); + var absrad = groveRotary.abs_rad(); + + var rel = groveRotary.rel_value(); + var reldeg = groveRotary.rel_deg(); + var relrad = groveRotary.rel_rad(); + + //write the knob value to the console in different formats + console.log("Abs: " + abs + " " + Math.round(parseInt(absdeg)) + " " + absrad.toFixed(3)); + console.log("Rel: " + rel + " " + Math.round(parseInt(reldeg)) + " " + relrad.toFixed(3)); + + //wait 2 s and call function again + setTimeout(loop, 2000); +} diff --git a/examples/python/groverotary.py b/examples/python/groverotary.py new file mode 100644 index 00000000..95d7965f --- /dev/null +++ b/examples/python/groverotary.py @@ -0,0 +1,45 @@ +# 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. + +from time import sleep +import pyupm_grove as grove + +# New knob on AIO pin 0 +knob = grove.GroveRotary(0) + +# Loop indefinitely +while True: + + # Read values + abs = knob.abs_value() + absdeg = knob.abs_deg() + absrad = knob.abs_rad() + + rel = knob.rel_value() + reldeg = knob.rel_deg() + relrad = knob.rel_rad() + + print "Abs values: %4d" % int(abs) , " raw %4d" % int(absdeg), "deg = %5.2f" % absrad , " rad ", + print "Rel values: %4d" % int(rel) , " raw %4d" % int(reldeg), "deg = %5.2f" % relrad , " rad" + + # Sleep for 2.5 s + sleep(2.5) diff --git a/src/grove/grove.cxx b/src/grove/grove.cxx index af761724..199aa6b6 100644 --- a/src/grove/grove.cxx +++ b/src/grove/grove.cxx @@ -1,5 +1,6 @@ /* * Author: Brendan Le Foll + * Contributions: Mihai Tudor Panu * Copyright (c) 2014 Intel Corporation. * * Permission is hereby granted, free of charge, to any person obtaining @@ -115,3 +116,47 @@ float GroveLight::raw_value() { return (float) mraa_aio_read(m_aio); } + +//// GroveRotary //// + +GroveRotary::GroveRotary(unsigned int pin) +{ + mraa_init(); + m_aio = mraa_aio_init(pin); + m_name = "Rotary Angle Sensor"; +} + +GroveRotary::~GroveRotary() +{ + mraa_aio_close(m_aio); +} + +float GroveRotary::abs_value() +{ + return (float) mraa_aio_read(m_aio); +} + +float GroveRotary::abs_deg() +{ + return GroveRotary::abs_value() * (float) m_max_angle / 1023.0; +} + +float GroveRotary::abs_rad() +{ + return GroveRotary::abs_deg() * M_PI / 180.0; +} + +float GroveRotary::rel_value() +{ + return GroveRotary::abs_value() - 512.0; +} + +float GroveRotary::rel_deg() +{ + return GroveRotary::rel_value() * (float) m_max_angle / 1023.0; +} + +float GroveRotary::rel_rad() +{ + return GroveRotary::rel_deg() * M_PI / 180.0; +} diff --git a/src/grove/grove.h b/src/grove/grove.h index 124a22c5..2996b360 100644 --- a/src/grove/grove.h +++ b/src/grove/grove.h @@ -1,5 +1,6 @@ /* * Author: Brendan Le Foll + * Contributions: Mihai Tudor Panu * Copyright (c) 2014 Intel Corporation. * * Permission is hereby granted, free of charge, to any person obtaining @@ -135,4 +136,68 @@ class GroveLight: public Grove { mraa_aio_context m_aio; }; +/** + * @brief C++ API for Grove Rotary Angle Sensor (Knob) + * + * Very basic UPM module for Grove rotary angle sensor (knob) on analog. Provides + * a set of functions to read the absolute pin value, degrees or radians and another + * to do the same relative to the center of the knob's range. + * + * @ingroup grove analog + * @snippet groverotary.cxx Interesting + * @image html groverotary.jpeg + */ +class GroveRotary: public Grove { + public: + /** + * Grove rotary angle sensor constructor + * + * @param pin number of analog pin to use + */ + GroveRotary(unsigned int pin); + /** + * GroveRotary Destructor + */ + ~GroveRotary(); + /** + * Get absolute raw value from AIO pin + * + * @return the unsigned value from the ADC + */ + float abs_value(); + /** + * Get absolute raw degrees from AIO pin + * + * @return the unsigned degrees from the ADC + */ + float abs_deg(); + /** + * Get absolute raw radians from AIO pin + * + * @return the unsigned radians from the ADC + */ + float abs_rad(); + /** + * Get the relative value from the pin + * + * @return the signed value from the ADC + */ + float rel_value(); + /** + * Get relative degrees from AIO pin + * + * @return the signed degrees from the ADC + */ + float rel_deg(); + /** + * Get relative radians from AIO pin + * + * @return the signed radians from the ADC + */ + float rel_rad(); + private: + mraa_aio_context m_aio; + static const int m_max_angle = 300; +}; + }