Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:5522293dc514, committed 2019-03-11
- Comitter:
- DanielPardo
- Date:
- Mon Mar 11 16:49:46 2019 +0000
- Commit message:
- Sensore color + buzzer
Changed in this revision
--- /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