Si usted tiene un sistema con microcontrolador para manejar o automatizar un sistema eléctrico o electrónico, y debe aislar eléctricamente todas las entradas de sensores del micro, encontrará que es fácil hacerlo con señales digitales, donde basta colocar un optoacoplador 4N25 entre el sensor y el microcontrolador (ó Arduino, o PLC)añadir 2 resistencias y asunto arreglado.
Si es un tren de pulsos, pues la solución es igual.
Sin embargo si la señal que viene del sensor es análoga la cosa no es fácil. Tal vez usted necesita aislar esta señal eléctricamente por posibles interferencias de la señal del sensor, o para evitar que un sobrevoltaje presente en la señal de entrada dañe el micro principal.
Puede darse el caso también en que la señal análoga es entre 0-12 VDC ó 0-24 VDC y no solo 0-5VDC. La solución propuesta acá funciona directo para el caso de señales de 0-5VDC y con un par de ajustes puede servir para 12 y 24 VDC también. Puede llamarnos para contratar una asesoría de ser necesario.
Antes de continuar, recomendamos leer el apartado "Lo que debes hacer si un optoacoplador no responde a una señal análoga".
Hecho esto, tenemos que aceptar que un optoacoplador por sí solo no va a seguir a una señal análoga linealmente nunca; están hechos mas bien como suiches electrónicos, y si tratamos de que sigan señales análogas toca realizar una etapa completa de amplificación que podría tener la misma forma de la señal de entrada pero no la misma amplitud.
Pasos a seguir
Entonces vamos a colocar un micro pequeño, que reciba la señal del sensor análogo en su entrada A/D y su salida ingrese a un 4N25. Luego esa salida del 4N25 ya aislada eléctricamente, ingresa al micro principal. Para ello vamos a utilizar la salida PWM que se genera equivalente a la conversión interna A/D que hace el micro, y se ve en el siguiente programa:
// 2024-03-04 Código del arduino que lee la entrada analógica y hace la salida PWM hacia el 4N25- SIM1 en el circuito
int sensorPin = A0; // Entrada del potenciómetro
int pinPWM = 11; // pin de salida PWM a 490Hz
int sensorValue = 0; // valor lectura de A0
int salidaPWM = 0; // valor salida PWM
void setup() {
// declarar pin OUTPUT:
pinMode(pinPWM, OUTPUT);
}
void loop() {
// Leer potenciómetro en pin A0
sensorValue = analogRead(sensorPin);
// Obtenemos valor de 10 bits de resolución (0 a 1023)
/*
La salida PWM se hace por el pin 11 que tiene una frecueuncia de 490Hz y
una resolución de 1 byte (0 a 255)
Como en la lectura en el segundo arduino de esta señal PWM con la función pulsein() da
problemas cuando el voltaje es 0v ó 5v, se mapea a un valor seguro entre entre 10 y 245.
*/
salidaPWM = map(sensorValue,0,1023,10,245);
analogWrite(pinPWM, salidaPWM);
}
Se agregaron un par de lineas de mapeo al final debido a que queremos que la conversión sea de 8 bits (0-255) y no de 10 bits (0-1023), y que se ignore si la señal de entrada es 0V ó si es 5 V, ya que el micro las interpretaría como DC al no tener flancos en el PWM.
Hecho esto se recibe la señal en el micro principal.
En el grabaremos este programa, el cual viene comentado y explicado internamente:
int pin = 7;
unsigned long duracion;
unsigned long pulso;
double voltaje;
void setup()
{
pinMode(pin, INPUT);
Serial.begin(9600);
}
void loop()
{
/* COMENTARIOS
La función pulsein() mide la pulsación del pulso HIGH o LOW según se especifique en microsegundos
por lo que conociendo la frecuencia o el periodo de nuestro pulso de entrada, podemos calcular el
duty cicle de nuestra señal y el voltaje promedio.
En nuestro caso, recibimos una señal de 490Hz (periodo de 2.0408 ms | 2040.8 us)
La función pulsein() nos devolverá un valor entre 0 y 2040us aprox.
Como en este caso la señal tiene un valor máximo de 5V, tenemos que por cada voltio de señal nos envía un pulso en HIGH
de 408.16 us que utilizaremos para convertir a voltaje.
Un problema de esta función es que trabaja con los cambios de flanco y en el caso que reciba una señal de 100% (5V) constante 0 cero,
no encuentra los cambios de flanco y en ambos casos hace un delay y al final nos devuelve cero en la lectura.
Para evitar esto, se envían valores de PWM entr 10 y 245, a fin de no recibir 0v ó 5V, por lo que hay que mapear la señal de entrada de nuevo
entre 0 y 2040 para no perder res0lución. De ahí la necesidad de la función map()
*/
pulso = pulseIn(pin, HIGH);
duracion=map(pulso,110,1980,0,2040);
voltaje =(duracion / 408.16);
Serial.print("Voltaje: ");
Serial.println(voltaje,2); //Podemos regular la precisión del voltaje obtenido en décimas, centésimas o milésimas de voltio
}
Con esto ya tenemos solucionado el Aislador de señal análoga para Arduino y micros con optoacoplador 4N25.
Puede ponerse en contacto para arreglar precios y tiempo de entrega.
He visto que, como lo habías comentado, publicaste un artículo acerca de la conversión AD y su conversión a PWM para luego transmitirla y leerla nuevamente en otro micro, se me ocurre otra solución, no mejor ni nada parecido, solo otra solución...
Dado que la salida de la conversión AD es un número, como ya lo habíamos charlado, puede transmitirse como tal por un canal serial sea vía RS 232, I2C o alguna de las formas one wire que he desarrollado en los proyectos que te he mandado anteriormente con lo que evitamos la lectura del PWM, que dicho sea de paso, me pareció ingeniosa.
Para ese fin los 4N25 se adaptan maravillosamente y tanto el valor cero como el máximo se leerían y transmitirian sin problemas. Este comentario es solo para mostrar otro camino y no para criticar lo hecho, sabes que mi posición al respecto es que un sistema que funciona es un sistema perfecto
Juan Diego.