Proyecto Colorímetro

Saludos, estoy en fase de generar un proyecto para leer el color y mostrarlo en diferentes modelos y espacios de color.

Lo voy a ir colocando en este lugar, según va avanzando y así pregunto sobre el mismo todo unificado.

Hasta la fecha ya está solucionada la alimentación de la unidad:

https://forum.arduino.cc/index.php?topic=714845.msg4802343#msg4802343

Y también cómo multiplexar la necesidad de varios sensores en una sola unidad.

https://forum.arduino.cc/index.php?topic=715982.msg4810158#msg4810158

Iré añadiendo preguntas y soluciones.

Gracias a todos los que me habéis ayudado; especialmente @gatul y @surbyte

Saludos y empiezo con sensores

Voy a usar un sensor que me permite leer color de muestras físicas y de pantallas. Para leer muestras físicas es necesario encender un led acoplado al lado del sensor, lo cual se hace conectando a tierra el pin adecuado del sensor

Mi pregunta es filosófica, dudo si resolverlo con un octoacoplador por software o resolverlo con un interruptor manual y que el usuario lo active o desactive

El octo me parece más guay pero más complicado y el interruptor es sencillo de implementar, reparar aunque traslada la responsabilidad del buen manejo al usuario

¿Qué solución os parece más adecuada?

Gracias

Siempre es mejor que lo controle el soft, creo.
Por lo que veo la entrada "LED" del módulo ataca a un transistor que maneja el LED, la entrada tiene una resistencia pullup, lo único que tienes que hacer es mandar LOW desde un puerto del arduino. No veo la necesidad del optoacoplador.

¡¡ TU SI QUE SABES CONDEAO !! JEJEJEJEJ

No se me había ocurrido, siendo así y como lo manejaré desde un ESP32 y una PI4 (son dos versiones del proyecto) me convence completamente. Además no necesito ni resistencia ¿cierto?

Nop

Genial, muchas gracias, a probar se ha dicho

Necesito preguntar esto, porque la curiosidad en mi caso es más fuerte que la inercia (que se fastidie Staling) y ya no deseo inerciarme si no comprender más profundamente....

  • Cuando declaro una puerta de entrada la declaro tierra
  • eso significa que debe ser low además de entrada
  • En ese caso la puerta es un receptor que analiza la información, siempre
  • Si la declaro de salida la conecto a vnc (¿o es vcn? jejeje) fase vamos, es para un actuador, el cual puede estar en 1 si el actuador debe hacer algo
  • Cuando está en 0 sigue en fase pero sin actuar, ni tierra ni fase

¿Es correcto?

La curiosidad ya no me permite seguir haciendo sólo lo que dicen los datashets y las librerías, necesito entenderlo, perdonar que os pregunte algo que puede ser básico para vosotros.

Todavia no me he metido con el esp32 así que, en principio, no podría ayudarte, de todos modos, con una mano en el corazón, no te entendí nada, pero nada. :grin:

Me explicaré sin pensar en el ESP32, una placa controladora cualquiera

¿Si el puerto o pin está en input es como definir que está conectada a tierra cierto?

Si esto es cierto, debe estar en low siempre ¿correcto?

Es decir, en imput recibe, debe ser tierra

Ahora, si está en output, salida, emite energía, está en fase ¿correcto?

Y sólo en fase la debería tener en LOW para no emitir o en Hight para emitir

Es decir, lo que hago al cambiar la puerta es conectala a energía o a tierra, sólo eso ¿correcto?

Hasta la fecha sólo sigo las inidcaciones de las documentaciones de los sensores, ahora la curiosidad me mata y necesito comprender la electricidad que se produce

¿Si el puerto o pin está en input es como definir que está conectada a tierra cierto?

No, por lo general una entrada es de alta impedancia (HiZ, en el idioma de los bárbaros. 8) ) y no está ni en ALTO ni en BAJO, ni a fuente ni a tierra, está "en el aire" (por decirlo de alguna manera). Obviamente cuando no está conectada a nada.

Aclaración: una entrada definida como INPUT_PULLUP o con una resistencia pullup externa (o sea conectada a la tensión de alimentación) solo tiene predefinido un estado, en este caso ALTO, entonces sería "sensible" a un estado BAJO que es el que no está fijo. Pero bien podría tener una resistencia pulldown (conectada a masa), estado predefinido en BAJO, por lo que sería sensible al estado ALTO.

Imagina un botón conectado a masa en el primer caso, generaría un estado BAJO al ser pulsado porque cerraría circuito a masa y al liberarlo generaría el ALTO que fija la resistencia pullup.
En el segundo caso (pulldown) el botón se conectaría a 5V y los estados serían inversos a los anteriores.
Pero si no hubiese resistencia a 5V o a masa, solo Dios sabría qué leería el micro al soltar el botón porque sería un estado indefinido (ni ALTO ni BAJO).

Nota: Los niveles de tensión de los estados BAJO y ALTO se definen en la hoja de datos del micro o periférico, típicamente es < 0.7V para el primero y > 0.6 * Vcc para el segundo (siendo Vcc la tensión de alimentación).
En un Arduino trabajando a 5V estamos hablando de entre 0V y 0.7V para BAJO y entre 3V y 5V para ALTO. El estado indefinido se da en el rango de 1.3V que hay entre 0.7V y 3V.

Si esto es cierto, debe estar en low siempre ¿correcto?

No, es falso, y no, puede estar en LOW (BAJO, masa, tierra, GND, 0) o en ALTO (HIGH, Vcc, +V, 1).

Es una entrada y no tiene un estado definido, como dije antes y teniendo en cuenta las aclaraciones hechas

Es decir, en imput recibe, debe ser tierra

No, por lo expuesto arriba.

Ahora, si está en output, salida, emite energía, está en fase ¿correcto?

No, la salida "emite energía" si está en ALTO pero también puede estar en BAJO y la corriente drenada es nula o despreciable.

No entiendo a que te refieres con "fase".

Y sólo en fase la debería tener en LOW para no emitir o en Hight para emitir

No, "emite" LOW o "emite" HIGH; 0 ó 1; 0V ó 5V; 0V ó 3.3V.

Aunque no se a que te refieres con "fase" igual aquí contradices lo que dijiste antes, porque si cuando emite energía está en "fase" no podrías tener LOW para que no emita y estar en "fase" al mismo tiempo. (Y me perdí... :o )

Es decir, lo que hago al cambiar la puerta es conectala a energía o a tierra, sólo eso ¿correcto?

Si te refieres a cambiar de salida a entrada, rotundamente NO.
Lo que haces es cambiar la configuración de varios circuitos internos, lo que finalmente conduce a que la corriente circule hacia un lado o hacia el otro. La entrada "recibirá" corriente, la salida la drenará o no, según el estado ALTO o BAJO, respectivamente.

Si queres decir pasar de ALTO a BAJO, entonces si, más o menos eso y en ese orden.

Espero no haberte complicado más todavía... :grin:

Fase es vcc, es decir, carga, pero gracias por tu aclaración, aunque he de leerla varias veces, creo que ya voy entendiendo el comportamiento de los electrones, que es lo que me generaba más duda, ya moletaré un poco más.

Ahora conectando con la idea de usar un pin para encender el LED del sensor, porque este sólo requiere ir a tierra ¿Debo entonces colocar la puerta en input y LOW?

¿Y si quiero apagar el led sólo ponerlo en alto?

Pero no sería imput, ¿cierto? es justo donde me estoy perdiendo, junto con el echo de que un me cuesta mucho entender el concepto de pullup

Me baso en este artículo y a ver si de una vez por todas lo entiendo
https://programarfacil.com/blog/arduino-blog/resistencia-pull-up-y-pull-down/

¿si estoy en pullup mi puerta de arduino se "chupa" los electrones y al pasarla a low es como si los dejo que vayan a tierra?

Vamos de nuevo...
No te compliques con querer entender o imaginar como circulan las corrientes, para ir tan profundo puedes consultar la hoja de datos del micro que te da lujo de detalles al respecto. Todo a su tiempo.

Para hacerlo mas sencillo supongamos que todos los circuitos trabajan con 5V. ¿De acuerdo?

Los circuitos digitales, genéricamente hablando, pueden tener 2 estados*: BAJO y ALTO (0 y 1). Esos estados representan 2 niveles de tensión, 0V (masa) y 5V (o sea la alimentación o Vcc).
Entonces: 0V es 0 en digital (LOW en lenguaje arduino) y 5V es 1 en digital (HIGH en arduino).

Tengamos en cuenta que lo antedicho es representación "para humanos" porque al micro en sí (mejor dicho a sus circuitos internos) solo le importa si hay 0V o 5V y actúa en consecuencia.

Entrada: lee el estado (o sea la tensión) de lo que hay conectado al pin y nada más que eso. No puede por si misma fijar un estado 0 ni 1.
Por hacer una analogía sería como las puntas de un multímetro, cuando lee tensión (función voltímetro) solo detecta lo que hay en los cables que tocan pero no hay tensión en las puntas cuando están sobre la mesa porque el voltímetro no genera nada, solo mide (¿se entiende la idea?).

Salida: pone en el pin la tensión (0V ó 5V) correspondiente al estado deseado (BAJO o ALTO).

Entonces, cuando quieres saber cuál es el estado de un pin lo defines como entrada. Lo normal es definirlo durante el desarrollo, en tal pin conecto el sensor que quiero leer, y como lo quiero leer será entrada.

Cuando quiero enviar un estado, entonces al pin lo defino como salida. Otra vez, lo hago durante el desarrollo, en tal otro pin voy a conectar un led que debo encender, entonces es salida.

Ahora vamos al tema de las resistencias PULL-UP en las entradas.
Veamos el sensor más sencillo, un pulsador, mecanicamente tiene 2 estados: abierto o cerrado. Ahora imaginemos que una de sus patas (no digo pin para no confundir con el micro) la conectamos a masa. Cuando se pulsa cierra contacto y en la otra pata también tengo masa.
Pero cuando lo suelto esta otra pata queda "al aire", no hay nada conectado a ella. ¿Ok?
Ahora esa pata la conectamos a un pin que definimos como entrada. Cuando actúo sobre el pulsador (vamos, lo pulso) cierra circuito a masa y la entrada lee 0V, o sea.. "0" (o LOW en lenguaje arduinense :o ).
Pero cuando lo libero, ¿qué valor lee la entrada si el circuito está abierto y no hay ninguna tensión?
Acá entra en juego la resistencia pull-up, que se encarga de poner 5V en la pata que estaba "al aire", así el pin de entrada puede leer ese valor (HIGH) cuando el pulsador está sin pulsar.
En resumen, el LOW lo "manda" el pulsador y el HIGH lo fija la resistencia.
También hay configuraciones pull-down, en este caso la resistencia va a masa para "poner" el estado LOW cuando el circuito está abierto y el pulsador (conectado a 5V) da el HIGH al ser pulsado y cierra circuito.
Pero ojo, la necesidad de resistencias pull-xxx depende de lo que se conecte en esa entrada, por ej. la mayoría de los módulos generan ambos estados entonces no necesitan resistencias, por el contrario un simple pulsador si la necesitará, como vimos antes.

Redondeando, para actuar sobre una carga (LED, transistor, la entrada de un módulo que maneje otra cosa, o "sacar" un bit por serial) se usa una salida, independientemente de si esa carga reacciona a LOW o a HIGH (léase masa o fuente, respectivamente)
Para leer el estado de un sensor, pulsador, o recibir un bit por serial, uso una entrada, sin importar si va a llegar un LOW o un HiGH. Eso a la entrada no le "importa", el soft se encargará de su tratamiento.

Ahora conectando con la idea de usar un pin para encender el LED del sensor, porque este sólo requiere ir a tierra ¿Debo entonces colocar la puerta en input y LOW?

¿Y si quiero apagar el led sólo ponerlo en alto?

NO, el micro usará una SALIDA porque "enviará" un estado, que comandará al LED, hacia la entrada del módulo.
Si, el LED se enciende con LOW.

Y sí, pones la salida en HIGH, o sea que la entrada del módulo lee HIGH y apaga el LED.

Finalmente,

¿si estoy en pullup mi puerta de arduino se "chupa" los electrones y al pasarla a low es como si los dejo que vayan a tierra?

Si, mas o menos es eso, pero no te compliques, sólo entender que como la entrada no puede por sí misma establecer un estado, a veces, necesita ayuda de una resistencia.


(*) Hay circuitos que tienen 3 estados de salida: ALTO, BAJO y HiZ (alta impedancia). Este último estado implica que la salida virtualmente está desconectada. Se llaman circuitos "tristate" (o triestado, en la lengua de Cervantes). Por ahora lo dejamos así, solo a título informativo, para no complicarte más. :wink:

Ok, la primera parte la tenía clarísima, la segunda no, ahora entiendo qué hace la resistencia, le da electricidad a la
"pata suelta" genial, gracias

Sin embargo, he cometido un error de narices. Me explico:

Mi sensor es un TCS34725 RGB por I2C, las pruebas que hice de I2c no mayor problema, he de afinar más, pero están súper documentadas por Adafruit, hasta hice un objeto para controlarlas (hale de ello en otro hilo)

El tema es el siguiente:

  • Nada más se conecta, contrario a lo que había leído/entendido la primera vez, el led queda prendido.
  • Hay una patilla en el sensor que si la conecto a GND es cuando el led se apaga. Esto implica que, de no resolverlo, sólo por conectar mi proyecto estará consumiendo energía en el led, lo cual no deseo porque voy a leer color aproximadamente el 10% del tiempo del uso, el otro 90% es operaciones en la pantalla táctil.
  • Necesito conectar GND a una pata específica del sensor para apagarlo, SI O SI.
  • Adafruit indica:

El pin LED se puede bajar para apagar el LED. Esto se puede hacer de tres formas:
Conecte directamente a tierra para apagarlo por completo.
Conéctese a un pin digital de repuesto y contrólelo con digitalWrite ().
Conecte el pin LED al pin INT y controle con setInterrupt () (consulte la Referencia de la biblioteca para obtener más detalles).

Vamos a controlarlo con un pin, de momento
está claro que lo tengo que poner en salida, porque como dices, quiero controlar algo, perfecto, y además

¿Salida con la resistencia pullup activada cierto?

Mi pregunta es, si lo pongo en 1/Alto/HIGH, estoy "escupiendo electrones" por la puerta, debería quedar encendido ¿ok?
SI lo pongo en 0/Bajo/LOW, me "chupo electrones" y los llevo a GND, lo apago

¿Estoy en lo cierto?

Eeehhh...
Bueno, mala mía, por la configuración del pin LED interpreté que encendía con LOW, no se me ocurrió que estuviera encendido por defecto.
Como dije, mala mía. :wink:

  • Hazle caso a Adafruit, pon el pin que conectes a "LED" en HIGH cuando lo quieres encender y en LOW para apagarlo.
  • Si pones "LED" directamente a masa, queda apagado y ya no puedes controlarlo.
  • Como no he leído la Referencia no se me ocurre como se manejaría con una entrada INT.

Las salidas no tienen resistencias pull-up, solo las entradas las tienen, "cabeza dura". :grin:

No existe el parámetro OUTPUT_PULLUP, no puedes hacer

pinMode(x, OUTPUT_PULLUP);

Sobre lo último: si te cierra así, que así sea...

Pero preferiría que en el caso particular de ESE led, solo pienses que enciende con HIGH y apaga con LOW, nada mas.
No te enrolles con como fluye la corriente, solo te confundes más.

No, yo te dije que encendía con LOW, yo leí mal no tu

Lo de la electricidad y entenderla es que no puedo apagar mi natural curiosidad, pero veo que me falta mucho por leer y aprender, pero no logro apagar mi curiosidad natural, necesito entenderlo todo

imagínate yo de adolescente cuando mi padre me decía PORQUE SÍ, que paciencia tuvo que tener el pobre, y gracias a esa paciencia yo soy lo que soy

No hay nada como la curiosidad y las ganas de aprender.
Dos cosas que también espero que me sigan acompañando por el resto de mis días. :wink:

Una pregunta ¿Debo conectar la puerta/pin a sensor y todo a tierra si estoy pullueando?

No entendí.

La referencia siempre es GND, por eso siempre hay que unificar las masas para que la referencia sea la misma para todo (si es a lo que te refieres)

PD: dale sedante a los perros así puedes terminar lo del video... jajaja

JAJAJAJ, es que aquí ha llovido en los últimos días y no habían salido, ya casi acabo el scketh de prueba y te digo

no no p ullluleo porque estoy en output, y eso que me lo has dicho, (puñetero staling)

Vale, efectívamente

#include <Arduino.h>
#define PIN_CONTROL 8
void setup() {
    pinMode(PIN_CONTROL, OUTPUT);
}

void loop() {
    digitalWrite(PIN_CONTROL, HIGH); // sets the digital pin 13 on
    delay(1000);            // waits for a second
    digitalWrite(PIN_CONTROL, LOW);  // sets the digital pin 13 off
    delay(1000);  
}

El LOW me lo apaga, genial, gracias @gatul, te debo una birra