diff --git a/include/interfaces/iEmg.hpp b/include/interfaces/iEmg.hpp index e0ed3f1c..3b2895fb 100644 --- a/include/interfaces/iEmg.hpp +++ b/include/interfaces/iEmg.hpp @@ -45,5 +45,12 @@ namespace upm * @return Muscle output as analog voltage */ virtual int value() = 0; + + /** + * Read scaled/offset voltage from the sensor + * + * @return Measured volts + */ + virtual float getVolts() = 0; }; } diff --git a/src/emg/emg.cxx b/src/emg/emg.cxx index d33f56f3..3007d65d 100644 --- a/src/emg/emg.cxx +++ b/src/emg/emg.cxx @@ -67,3 +67,21 @@ int EMG::value() int val = mraa_aio_read(m_aio); return val; } + +float EMG::getVolts() +{ + float val = mraa_aio_read_float(m_aio); + if (val < 0) + return val; + + /* Apply raw scale */ + val *= this->m_scale; + + /* Scale to aRef */ + val *= this->m_aRef; + + /* Apply the offset in volts */ + val += this->m_offset; + + return val; +} diff --git a/src/emg/emg.hpp b/src/emg/emg.hpp index 7582e7ef..53635f32 100644 --- a/src/emg/emg.hpp +++ b/src/emg/emg.hpp @@ -76,7 +76,15 @@ namespace upm { */ virtual int value(); + virtual float getVolts(); + private: mraa_aio_context m_aio; + /* Analog voltage reference */ + float m_aRef = 5.0; + /* Scale */ + float m_scale = 1.0; + /* Offset in sensor units */ + float m_offset = 0.0; }; } diff --git a/src/groveemg/groveemg.cxx b/src/groveemg/groveemg.cxx index 538c6b50..8f0e7c08 100644 --- a/src/groveemg/groveemg.cxx +++ b/src/groveemg/groveemg.cxx @@ -67,3 +67,21 @@ int GroveEMG::value() int val = mraa_aio_read(m_aio); return val; } + +float GroveEMG::getVolts() +{ + float val = mraa_aio_read_float(m_aio); + if (val < 0) + return val; + + /* Apply raw scale */ + val *= this->m_scale; + + /* Scale to aRef */ + val *= this->m_aRef; + + /* Apply the offset in volts */ + val += this->m_offset; + + return val; +} \ No newline at end of file diff --git a/src/groveemg/groveemg.hpp b/src/groveemg/groveemg.hpp index 3585d9b1..1111b114 100644 --- a/src/groveemg/groveemg.hpp +++ b/src/groveemg/groveemg.hpp @@ -77,7 +77,15 @@ namespace upm { */ virtual int value(); + virtual float getVolts(); + private: mraa_aio_context m_aio; + /* Analog voltage reference */ + float m_aRef = 5.0; + /* Scale */ + float m_scale = 1.0; + /* Offset in sensor units */ + float m_offset = 0.0; }; }