Daniel Pardo / Mbed 2 deprecated SensorColorBuzzer

Dependencies:   mbed

Files at this revision

API Documentation at this revision

Comitter:
DanielPardo
Date:
Mon Mar 11 16:49:46 2019 +0000
Commit message:
Sensore color + buzzer

Changed in this revision

color.h Show annotated file Show diff for this revision Revisions of this file
colorsensor.cpp Show annotated file Show diff for this revision Revisions of this file
colorsensor.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
sc.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/color.h	Mon Mar 11 16:49:46 2019 +0000
@@ -0,0 +1,11 @@
+#pragma Color
+
+namespace icolor {
+
+template<typename T>
+struct Color {
+    T red, green, blue;
+    Color(T red, T green, T blue): red(red), green(green), blue(blue) {}
+};
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/colorsensor.cpp	Mon Mar 11 16:49:46 2019 +0000
@@ -0,0 +1,101 @@
+#include "colorsensor.h"
+#include <unordered_map>//Es una secuencia de (clave, valor) par, donde solo un único valor está asociado con cada clave única.
+
+using namespace icolor;
+
+namespace {
+    const std::unordered_map<size_t, ColorSensor::Filter> stateFilter{
+            {0u, ColorSensor::Filter::RED},
+            {1u, ColorSensor::Filter::GREEN},
+            {2u, ColorSensor::Filter::BLUE}
+    };
+//clamp compara valores entre  bajos y altos 
+    template<typename T>
+    T clamp(T value, T low, T high) {
+        if (value < low) {
+            return low;
+        } else if (value > high) {
+            return high;
+        } else {
+            return value;
+        }
+    }
+}
+
+ColorSensor::ColorSensor(
+        PinName s0, PinName s1, PinName s2, PinName s3, PinName out) noexcept
+        : s0{s0}, s1{s1}, s2{s2}, s3{s3}, out{out} {
+    // Establece valores predeterminados
+    setFrequency(ColorSensor::Frequency::SCALE_100);
+    // Comienzo medicion
+    state = 0;
+    setFilter(stateFilter.at(state));
+    this->out.mode(PullUp);
+    this->out.rise([&]{ counter++; });
+    ticker.attach([&]{ readCounter(); }, .01);
+}
+//Frecuencia
+void ColorSensor::setFrequency(ColorSensor::Frequency frequency) noexcept {
+    auto f = static_cast<uint8_t>(frequency);
+    s0.write(f & 0b10);
+    s1.write(f & 0b01);
+}
+//Filtro Color
+void ColorSensor::setFilter(ColorSensor::Filter filter) noexcept {
+    auto f = static_cast<uint8_t>(filter);
+    s2.write(f & 0b10);
+    s3.write(f & 0b01);
+}
+//Calibracion negros
+void ColorSensor::calibrateBlack(ColorData colorData) noexcept {
+    calibrationBlack = colorData;
+}
+//Calibracion Blancos
+void ColorSensor::calibrateWhite(ColorData colorData) noexcept {
+    calibrationWhite = colorData;
+}
+
+ColorRGB ColorSensor::getRGB() const noexcept {
+    ColorRGB colorRGB(0, 0, 0);
+    convertRGB(&colorRGB);
+    return colorRGB;
+}
+//Datos del color
+ColorData ColorSensor::getData() const {
+    return colorData;
+}
+
+void ColorSensor::readCounter() noexcept {
+    switch (state) {
+        case 0:
+            colorData.red = counter;
+            setFilter(Filter::GREEN);
+            break;
+        case 1:
+            colorData.green = counter;
+            setFilter(Filter::BLUE);
+            break;
+        case 2:
+            colorData.blue = counter;
+            setFilter(Filter::RED);
+            break;
+    }
+    state = (state + 1) % 3;
+    counter = 0;
+}
+
+void ColorSensor::convertRGB(ColorRGB *colorRGB) const noexcept {
+    int32_t value;
+
+    value = (colorData.red - calibrationBlack.red) * 256;
+    value /= calibrationWhite.red - calibrationBlack.red;
+    colorRGB->red = static_cast<uint8_t>(clamp(value, 0L, 255L));
+
+    value = (colorData.green - calibrationBlack.green) * 256;
+    value /= calibrationWhite.green - calibrationBlack.green;
+    colorRGB->green = static_cast<uint8_t>(clamp(value, 0L, 255L));
+
+    value = (colorData.blue - calibrationBlack.blue) * 256;
+    value /= calibrationWhite.blue - calibrationBlack.blue;
+    colorRGB->blue = static_cast<uint8_t>(clamp(value, 0L, 255L));
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/colorsensor.h	Mon Mar 11 16:49:46 2019 +0000
@@ -0,0 +1,92 @@
+#pragma color
+
+#include <cstdint>
+#include <cstddef>
+#include "mbed.h"
+#include "color.h"
+
+namespace icolor {
+
+    using ColorRGB = Color<uint8_t>;
+    using ColorData = Color<int32_t>;
+
+    class ColorSensor {
+    public:
+        enum class Frequency {
+            DOWN = 0,
+            SCALE_2 = 1,
+            SCALE_20 = 2,
+            SCALE_100 = 3
+        };
+
+        enum class Filter {
+            RED = 0,
+            BLUE = 1,
+            CLEAR = 2,
+            GREEN = 3
+        };
+
+        ColorSensor(
+                PinName s0, PinName s1, PinName s2, PinName s3, PinName out) noexcept;
+
+        /**
+         * Se establece la frecuencia.
+         * Por defecto la frecuencia::SCALE_100
+         **/
+        void setFrequency(Frequency frequency) noexcept;
+
+        /**
+         * Establece los pines del filtro fotodiodo..
+         **/
+        void setFilter(Filter filter) noexcept;
+
+        /**
+         * Establece los datos de calibración para el color negro.
+         **/
+        void calibrateBlack(ColorData colorData) noexcept;
+
+        /**
+         * Establece los datos de calibración para el color blanco.
+         **/
+        void calibrateWhite(ColorData colorData) noexcept;
+
+        /**
+         * Lee el  sensor de datos en la fprma estandar del RGB.
+         * @Regresa RGB color.
+         **/
+        ColorRGB getRGB() const noexcept;
+
+        /**
+         * Leer datos del sensor en forma BASICA.
+         * @Regresa los datos del  color basico.
+         **/
+        ColorData getData() const noexcept;
+
+    protected:
+        /// Pines utilizados para escalador de frecuencia
+        DigitalOut s0, s1;
+        /// Pines utilizados para el filtro fotodiodo.
+        DigitalOut s2, s3;
+        /// Output pin
+        InterruptIn out;
+        /// Datos sin procesar del sensor en lectura actual
+        ColorData colorData{0, 0, 0};
+        /// Datos de calibracion del sensor
+        ColorData calibrationBlack{6000L, 6000L, 6000L};
+        ColorData calibrationWhite{55000L, 55000L, 55000L};
+
+    private:
+        /**
+         * Lee el valor del contador y lo guarda en el estado actual.
+         **/
+        void readCounter() noexcept;
+
+        /// Estado actual del contador
+        size_t state;
+        Ticker ticker;
+        int32_t counter;
+
+        void convertRGB(ColorRGB *colorRGB) const noexcept;
+    };
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Mar 11 16:49:46 2019 +0000
@@ -0,0 +1,79 @@
+#include "mbed.h"
+#include "scolor_TCS3200.h"
+#include "colorsensor.h"
+
+/* *****************************************************************************
+Programa que solicita telemetria al sistema embebido, por medio del comando  0xFe
+para preguntar por el color  que detecta el sensor TCS3200
+
+el sistema embebido recibe  el inicio de trama FE  y el número de comado: 01
+   
+|   INITELE  |  CMD       |   
+|     0xfe   | 0x01       | 
+
+
+para enviar los comandos usar el programa Coolterm http://freeware.the-meiers.org/
+
+
+@fabeltranm 2019
+fbeltranm@ecci.edu.co
+
+********************************************************************************
+   datasheet https://www.mouser.com/catalog/specsheets/TCS3200-E11.pdf
+
+
+    S0      Frequency scaling 
+    S1      Frequency scaling 
+    S2      Photo diode selection 
+    S3      Photo diode selection 
+    OutFreq Frequency
+
+       -----------------------------------
+      |   ____________     ____________   |
+----> |  |            |   |            |  |                ___     ___ 
+Light |  | Photodiode |   |   Current  |--|---OUTPUT_FREQ |   |___|   |___
+----> |  |   Array    |---|     to     |  |
+      |  |            |   |  Frequency |  |
+      |  |____________|   |____________|  |
+      |       ^  ^             ^  ^       |
+       -------|--|-------------|--|-------
+              |  |             |  |
+             S2 S3            S0  S1
+             
+SO | S1 | OUTPUT FREQUENCY SCALING |        | S2 | S3 |   PHOTODIODE TYPE   |
+ 0 | 0  |        power down        |        |  0 | 0  |         Red         |
+ 0 | 1  |           2%             |        |  0 | 1  |         Blue        |
+ 1 | 0  |           20%            |        |  1 | 0  |  Clear (no filter)  |
+ 1 | 1  |           100%           |        |  1 | 1  |         Green       | 
+             
+******************************************************************************/
+#define INITCMD 0xFF // comando de sonido ff 01 3
+#define INITELE 0xFE // comando de sensor de colores fe 01
+#define CMD  0x01 // 
+
+#define DO  104 
+#define RE  153
+#define MI  166
+#define FA  184
+#define SO  205
+
+
+
+Serial command(USBTX, USBRX);
+//                              S0, S1, S2, S3, OUT
+Serial serial(USBTX, USBRX);
+iotea::ColorSensor color_sensor(D6, D5, D4, D3, D2);
+DigitalIn button(D12);
+
+// definición de las funciones
+
+int main() {
+    serial.baud(115200);
+    while (true) {
+        if (!button) {
+            iotea::ColorData color = color_sensor.getData();
+            serial.printf("#%d %d %d\r\n", color.red, color.green, color.blue);
+        }
+    }
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Mon Mar 11 16:49:46 2019 +0000
@@ -0,0 +1,1 @@
+https://os.mbed.com/users/mbed_official/code/mbed/builds/65be27845400
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sc.cpp	Mon Mar 11 16:49:46 2019 +0000
@@ -0,0 +1,36 @@
+#include "mbed.h"
+#include "scolor_TCS3200.h"
+
+
+scolor_TCS3200::scolor_TCS3200(PinName s0, PinName s1, PinName s2, PinName s3, PinName s_in) : 
+_s0(s0), _s1(s1), _s2(s2), _s3(s3), _s_in(s_in) 
+{
+    SetMode(SCALE_100);
+
+};
+ 
+
+long scolor_TCS3200::ReadRed()   { _s2=0;  _s3=0; return pulsewidth();}
+long scolor_TCS3200::ReadBlue()  { _s2=0;  _s3=1; return pulsewidth();}
+long scolor_TCS3200::ReadClear() { _s2=1;  _s3=0; return pulsewidth();}
+long scolor_TCS3200::ReadGreen() { _s2=1;  _s3=1; return pulsewidth();}
+
+void scolor_TCS3200::SetMode(uint8_t mode) {
+    switch (mode){
+        case SCALE_100:  _s0= 1; _s1=1; break;
+        case SCALE_20:   _s0=1 ; _s1=0; break;
+        case SCALE_2:    _s0=0 ; _s1=1; break;
+        case POWER_DOWN: _s0=0 ; _s1=0; break;
+    } 
+};
+ 
+long  scolor_TCS3200::pulsewidth() {
+    while(!_s_in);
+    timer.start();
+    while(_s_in);
+    timer.stop();
+    float pulsewidth_v = timer.read_us();
+    timer.reset();
+    return pulsewidth_v;
+};
+            
\ No newline at end of file