From ed6d61d12e7014d6cea18869a64131de038eab74 Mon Sep 17 00:00:00 2001 From: Noel Eck Date: Wed, 14 Sep 2016 11:51:17 -0700 Subject: [PATCH] ultrasonic: Created ultrasonic from groveultrasonic. * Added C++ and javascript example. * Added jpg. Signed-off-by: Noel Eck --- docs/images/ultrasonic.jpg | Bin 0 -> 33605 bytes examples/c++/CMakeLists.txt | 1 + examples/c++/ultrasonic.cxx | 60 ++++++++++++++ examples/javascript/ultrasonic.js | 45 +++++++++++ src/ultrasonic/CMakeLists.txt | 5 ++ src/ultrasonic/javaupm_ultrasonic.i | 21 +++++ src/ultrasonic/jsupm_ultrasonic.i | 8 ++ src/ultrasonic/pyupm_ultrasonic.i | 11 +++ src/ultrasonic/ultrasonic.cxx | 104 ++++++++++++++++++++++++ src/ultrasonic/ultrasonic.hpp | 121 ++++++++++++++++++++++++++++ 10 files changed, 376 insertions(+) create mode 100644 docs/images/ultrasonic.jpg create mode 100644 examples/c++/ultrasonic.cxx create mode 100644 examples/javascript/ultrasonic.js create mode 100644 src/ultrasonic/CMakeLists.txt create mode 100644 src/ultrasonic/javaupm_ultrasonic.i create mode 100644 src/ultrasonic/jsupm_ultrasonic.i create mode 100644 src/ultrasonic/pyupm_ultrasonic.i create mode 100644 src/ultrasonic/ultrasonic.cxx create mode 100644 src/ultrasonic/ultrasonic.hpp diff --git a/docs/images/ultrasonic.jpg b/docs/images/ultrasonic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e6e39d3403a4ccf468210a1babe5bdf53a5e0b3 GIT binary patch literal 33605 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 aH4XQnmh}FgfaCw|9r*w8`)B@}`F{Y7LK5Qu literal 0 HcmV?d00001 diff --git a/examples/c++/CMakeLists.txt b/examples/c++/CMakeLists.txt index 85b40b85..76774c33 100644 --- a/examples/c++/CMakeLists.txt +++ b/examples/c++/CMakeLists.txt @@ -245,6 +245,7 @@ add_example (bma220) add_example (dfrph) add_example (mcp9808) add_example (groveultrasonic) +add_example (ultrasonic) add_example (sx1276-lora) add_example (sx1276-fsk) add_example (ili9341) diff --git a/examples/c++/ultrasonic.cxx b/examples/c++/ultrasonic.cxx new file mode 100644 index 00000000..7bdecd65 --- /dev/null +++ b/examples/c++/ultrasonic.cxx @@ -0,0 +1,60 @@ +/* + * Author: Jun Kato + * Copyright (c) 2015 Jun Kato. + * + * Thanks to Seeed Studio for a working arduino sketch + * + * 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 "ultrasonic.hpp" +#include +#include +#include + +upm::UltraSonic *sonar = NULL; +bool running = true; + +void sig_handler(int signo) +{ + if (signo == SIGINT) + running = false; +} + +int main(int argc, char **argv) +{ + signal(SIGINT, sig_handler); + //! [Interesting] + // upm::UltraSonic *sonar = NULL; + sonar = new upm::UltraSonic(2); + while(running) + { + int width = sonar->getDistance(); + printf("Echo width = %d\n", width); + printf("Distance inches = %f.2\n\n", width/148.0); + sleep(3); + } + //! [Interesting] + printf("exiting application\n"); + delete sonar; + return 0; +} diff --git a/examples/javascript/ultrasonic.js b/examples/javascript/ultrasonic.js new file mode 100644 index 00000000..49b63af3 --- /dev/null +++ b/examples/javascript/ultrasonic.js @@ -0,0 +1,45 @@ +/* + * Author: Jun Kato + * Copyright (c) 2015 Jun Kato. + * + * Thanks to Seeed Studio for a working arduino sketch + * + * 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 ultrasonic = require("jsupm_ultrasonic"); +var sensor = new ultrasonic.UltraSonic(2); + +var myInterval = setInterval(function() +{ + var travelTime = sensor.getDistance(); + if (travelTime > 0) { + var distance = (travelTime / 29 / 2).toFixed(3); + console.log("distance: " + distance + " [cm]"); + } +}, 200); + +// When exiting: clear interval and print message +process.on('SIGINT', function() +{ + clearInterval(myInterval); + console.log("Exiting..."); + process.exit(0); +}); diff --git a/src/ultrasonic/CMakeLists.txt b/src/ultrasonic/CMakeLists.txt new file mode 100644 index 00000000..2614a5f9 --- /dev/null +++ b/src/ultrasonic/CMakeLists.txt @@ -0,0 +1,5 @@ +set (libname "ultrasonic") +set (libdescription "upm grove ultrasonic proximity sensor") +set (module_src ${libname}.cxx) +set (module_hpp ${libname}.hpp) +upm_module_init() diff --git a/src/ultrasonic/javaupm_ultrasonic.i b/src/ultrasonic/javaupm_ultrasonic.i new file mode 100644 index 00000000..bece5af0 --- /dev/null +++ b/src/ultrasonic/javaupm_ultrasonic.i @@ -0,0 +1,21 @@ +%module javaupm_ultrasonic +%include "../upm.i" + +%ignore signalISR; + +%{ + #include "ultrasonic.hpp" +%} + +%include "ultrasonic.hpp" + +%pragma(java) jniclasscode=%{ + static { + try { + System.loadLibrary("javaupm_ultrasonic"); + } catch (UnsatisfiedLinkError e) { + System.err.println("Native code library failed to load. \n" + e); + System.exit(1); + } + } +%} diff --git a/src/ultrasonic/jsupm_ultrasonic.i b/src/ultrasonic/jsupm_ultrasonic.i new file mode 100644 index 00000000..f2a87a5d --- /dev/null +++ b/src/ultrasonic/jsupm_ultrasonic.i @@ -0,0 +1,8 @@ +%module jsupm_ultrasonic +%include "../upm.i" + +%{ + #include "ultrasonic.hpp" +%} + +%include "ultrasonic.hpp" diff --git a/src/ultrasonic/pyupm_ultrasonic.i b/src/ultrasonic/pyupm_ultrasonic.i new file mode 100644 index 00000000..613fb380 --- /dev/null +++ b/src/ultrasonic/pyupm_ultrasonic.i @@ -0,0 +1,11 @@ +// Include doxygen-generated documentation +%include "pyupm_doxy2swig.i" +%module pyupm_ultrasonic +%include "../upm.i" + +%feature("autodoc", "3"); + +%include "ultrasonic.hpp" +%{ + #include "ultrasonic.hpp" +%} diff --git a/src/ultrasonic/ultrasonic.cxx b/src/ultrasonic/ultrasonic.cxx new file mode 100644 index 00000000..9af925b0 --- /dev/null +++ b/src/ultrasonic/ultrasonic.cxx @@ -0,0 +1,104 @@ +/* + * Author: Jun Kato + * Copyright (c) 2015 Jun Kato. + * + * Thanks to Seeed Studio for a working arduino sketch + * + * 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 + +#include "ultrasonic.hpp" + +using namespace upm; + +UltraSonic::UltraSonic (uint8_t pin) { + mraa_result_t error = MRAA_SUCCESS; + m_name = "UltraSonic"; + + mraa_init(); + + // setup pin + m_pinCtx = mraa_gpio_init(pin); + if (m_pinCtx == NULL) { + fprintf (stderr, "Are you sure that pin%d you requested is valid on your platform?", pin); + exit (1); + } + mraa_gpio_use_mmaped(m_pinCtx, 1); + mraa_gpio_isr (m_pinCtx, MRAA_GPIO_EDGE_BOTH, + &signalISR, this); +} + +UltraSonic::~UltraSonic () { + + // close pin + mraa_gpio_isr_exit(m_pinCtx); + mraa_gpio_close (m_pinCtx); +} + +int +UltraSonic::getDistance () { + + // output trigger signal + mraa_gpio_dir(m_pinCtx, MRAA_GPIO_OUT); + mraa_gpio_write(m_pinCtx, LOW); + usleep(2); + mraa_gpio_write(m_pinCtx, HIGH); + usleep(5); + mraa_gpio_write(m_pinCtx, LOW); + + // wait for the pulse, + m_doWork = true; + m_InterruptCounter = 0; + mraa_gpio_dir(m_pinCtx, MRAA_GPIO_IN); + + // though do not wait over 25 [ms]. + int timer = 0; + while (m_doWork && timer++ < 5) { + // in 25 [ms], sound travels 25000 / 29 / 2 = 431 [cm], + // which is more than 400 [cm], the max distance measurable with this sensor. + usleep(5 * 1000); // 5 [ms] + } + + // calc diff + long diff = m_FallingTimeStamp.tv_usec - m_RisingTimeStamp.tv_usec; + diff += (m_FallingTimeStamp.tv_sec - m_RisingTimeStamp.tv_sec) * 1000000; + return timer >= 5 ? 0 : diff; +} + +void +UltraSonic::signalISR(void *ctx) { + upm::UltraSonic *This = (upm::UltraSonic *)ctx; + This->ackEdgeDetected(); +} + +void +UltraSonic::ackEdgeDetected () { + if (++m_InterruptCounter % 2 == 0) { + gettimeofday(&m_FallingTimeStamp, NULL); + m_doWork = false; + } else { + gettimeofday(&m_RisingTimeStamp, NULL); + } +} diff --git a/src/ultrasonic/ultrasonic.hpp b/src/ultrasonic/ultrasonic.hpp new file mode 100644 index 00000000..bd703313 --- /dev/null +++ b/src/ultrasonic/ultrasonic.hpp @@ -0,0 +1,121 @@ +/* + * Author: Jun Kato + * Copyright (c) 2015 Jun Kato. + * + * Thanks to Seeed Studio for a working arduino sketch + * + * 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 + +#define HIGH 1 +#define LOW 0 + +namespace upm { + +/** + * @brief Grove ultrasonic sensor library + * @defgroup ultrasonic libupm-ultrasonic + * @ingroup seeed gpio sound + */ + +/** + * @library ultrasonic + * @sensor ultrasonic + * @comname Grove Ultrasonic Ranger + * @type sound + * @man seeed + * @con gpio + * + * @brief API for Grove Ultrasonic Ranger + * + * This Grove Ultrasonic sensor is a non-contact distance measurement module + * which is compatible with the Grove system. It is designed for easy modular + * project usage with industrial performance. Detection ranges from 3 cm (1.2") + * to 4 m (13'1.5") and works best when the object is within a 30 degree angle + * relative to the sensor. + * + * @image html ultrasonic.jpg + * @snippet ultrasonic.cxx Interesting + */ +class UltraSonic { + public: + /** + * Instantiates a UltraSonic object + * + * @param pin pin for triggering the sensor for distance and for receiving pulse response + */ + UltraSonic (uint8_t pin); + + /** + * UltraSonic object destructor. + */ + ~UltraSonic (); + + /** + * Returns the echo's pulse width from the sensor in microseconds. + * Divide by 58 to convert distance to centimetres. + * Divide by 148 to convert distance to inches. + */ + int getDistance (); + + /** + * Return name of the component + */ + std::string name() + { + return m_name; + } + + /** + * Returns true while the sensor is busy waiting for the echo pulse + */ + bool working() + { + return m_doWork; + } + + private: + bool m_doWork; /* Flag to control blocking function while waiting for falling edge interrupt */ + mraa_gpio_context m_pinCtx; + uint8_t m_InterruptCounter; + struct timeval m_RisingTimeStamp; + struct timeval m_FallingTimeStamp; + std::string m_name; + + /** + * ISR for the pulse signal + */ + static void signalISR(void *ctx); + + /** + * On each interrupt this function will detect if the interrupt + * was falling edge or rising. + * Should be called from the interrupt handler. + */ + void ackEdgeDetected (); +}; + +}