Voltaje negativo y analogread

Hola a todos,

Tengo un sensor inductivo PNP que cuando está activo manda una señal de -5v y cuando no 0v
El problema lo tengo en que analogread no devuelve nunca -5, si no que 0, entonces nunca detecta el cambio de estado.

¿Se os ocurre que puedo hacer?

Gracias.

Primero, no necesitas analogRead sino digitalRead.
Luego usa un optoacoplador de manera que tu GND (sensor) sera el positivo que conectarás con una R al ánodo y la salida pnp (-5V) la pondras al cátodo.

Si tienes dudas consulta.

Gracias por la respuesta surbyte.

Necesito usar analogRead debido a que el pin lo tengo en A2
Ahora mismo tengo la conexión a un NPN y cuando detecta devuelve 0V y cuando no detecta devuelve 2v

El problema lo tengo cuando uso PNP. Que cuando detecta devuelve 0v y cuando no detecta devuelve -2v

El código que uso para NPN es

int P_HI = 300;
int P_LO = 150;
int status = 0;
int cont = 0;
void setup() {
  
}
void loop() {
  int analog2 = analogRead(2);
  if (analog2 > P_HI && status == 0)
  {
    cont++;
    status = 1;
  }
  if (analog2 < P_LO && status == 1){
    status = 0;
  }    
}

y me gustaría adaptarlo a cualquier tipo de sensor, NPN y PNP.

Gracias

Necesito usar analogRead debido a que el pin lo tengo en A2

El hecho de usar A2 no quita que puedas definirlo como pin digital.

bool valor;
bool valorAnt = false;
void setup() {
   pinMode(A2, INPUT);  
}
void loop() {
  valor = digitalRead(A2);
  if (valor && !valorAnt) {
     Serial.println(valor?"ON":"OFF");
  }
  valorAnt = valor;
 
]

Usando lo que ya te indiqué.

Tema Conexiones.
Supongo que el sensor tiene su alimentación asi que el hecho de que entregue algo negativo respecto de su salida es un problema de como mides.
Simplemente usa su salida PNP conectado a GND del arduino y el GND del sensor lo conectas al pin A2 con el programa que yo te indique o bien con el tuyo.
En lo personal usaría un opto acoplador tal como te indique por seguridad.

Gracias de nuevo.

digitalRead devuelve HIGH o LOW pero no he encontrado en ninguna documentación que considera HIGH (<0 v) ??

Si es así si me serviría.

En cuanto a invertir los cables de GND lo probaré

Ya te lo respondí pero es mi ultima respuesta del tema:

  1. Opcion: Te sugerí usar un opto acoplador con las conexiones adecuadas
  2. Opción: Imagina una bateria que la pones al revés.. bueno, simplemente usa las conexiones que conoces.

Cuando tu me hablas de algo negativo lo haces referenciándote con Arduino
Eso es poque conectaste GND del SENSOR a GND del Arduino, pero ya que tu sensor esta funcionando invertido para lo que necesitamos, que te prohibe usar -5V como GND unido al GND del Arduino y entonces el punto GND Sensor estará a potencial superior.

Simple !!

Gracias.

He logrado con el código que me has puesto (usando digitalRead) que funcionara con un sensor PNP.
Sin embargo, me ha dejado de funcionar con NPN.

Me he dado cuenta, que el PNP manda 0V o 4,8V según detecte o no, por lo tanto, digitalRead devuelve HIGH o LOW correctamente.

Sin embargo, el sensor NPN me devuelve 0V o 1,70v. Me da la sensación de que digitalRead no detecta 1,7v como HIGH ... ¿Es posible? ¿Cual sería el voltaje mínimo para que sea HIGH?

Se os ocurre alguna solución a mi problema?

Gracias de antemano.

Tu sensor NPN debe ser colector abierto y le falta una resistencia que establezca su nivel HIGH.
Revisa bien

Sin embargo, el sensor NPN me devuelve 0V o 1,70v. Me da la sensación de que digitalRead no detecta 1,7v como HIGH … ¿Es posible? ¿Cual sería el voltaje mínimo para que sea HIGH?

La VIh min es de 2.8V si mal recuerdo… si tu sensor no llega a 2.8, jamas Arduino lo va a ver como un HIGH.
Ademas te repito… eso ocurre porque no estas polarizando bien la salida del sensor NPN.

Yo te sugerí una forma de conexión para un PNP no para un NPN. OJO y atención con eso. Porque te sugeri envirtir cables.
Asi que cuidado con las conexiónes que puedes quemar arduino o la fuente del lado de los sensores.

Si, las conexiones las tengo claras. Estoy midiendo voltajes y lo tengo claro. Mi problema ahora es poder unificar código. Me explico:

Para que funcione sensor PNP lo hace con este código:

  valor = digitalRead(A2);
  if (valor && !valorAnt) {
     Serial.print(1, DEC);
    
  }
  valorAnt = valor;

Esto funciona perfecto. PNP cuando detecta saca 5V y cuando no 0V con lo cual funciona!

Por otra parte, para el sensor NPN tengo que tener este otro código para que funcione:

  int analog2 = analogRead(2);
  
  if (analog2 > 300 && estado == 0)
  {
    Serial.print(1, DEC);
    estado = 1;
  }
  
  if (analog2 < 150 && estado == 1){
    estado = 0;
  }

Con esto el NPN funciona. Devido a que cuando detecta saca 1,7v y cuando no 0v.

Mi problema es ahora unificar todo esto en un sólo bloque. Es decir, mi arduino tiene que poder funciona tanto si le conecto el NPN como si le conecto el PNP

¿Se os ocurre algo?

Gracias !!!

Pero ese NPN esta funcionando mal!!
Que modelo es?

El modelo no lo sé. ¿Lo dices por devolver 1,7v?
Creo que hoy lo he entendido. La entrada al pin A2 le tengo un divisor de tensión que baja de 12v a 5v.
La NPN antes del divisor tiene 5V y cuando sale del divisor tiene 1,7
Sin embargo, la PNP entra en el divisor 12 y salen 4,8v

No se que puede estar pasando.

¿Se te ocurre como puedo unificar mi código?

Claro que es eso.
Te sugiero otra alternativa mas apropiada.
Usa un zener 5.1V para bajar de 12 a 5V.

Te digo cómo hacerlo con este esquema

es mas usa una R de 1K en lugar de los 100 ohms, así limitamos la corriente zener.

El problema lo tengo en que ahora mismo no puedo tocar los componentes de los dispositivos (ya están todos ensamblados) y la correción la tengo que hacer por software.

¿Se te ocurre algo?

Gracias de nuevo

Para los futuros ensamblados si tendré en cuenta lo que me dices del ZENER. Pero creo que voy a tener el mismo problema, no? El PNP si rebajará de 12 a 5 sin embargo el NPN como manda + ya tendrá 5v y rebajrá esos 5v, no?

Pero eso que te sugerí lo haces en la entrada del arduino. Elimina el divisor de tensión y asunto resuelto. Pones el zener claro, como te indiqué.

Entonces si pongo el ZENER como me indicas hace el mismo efecto que el divisor de tensión?

pero debes sacar el divisor.
El zener para limitar la tensión a 5V para la entrada del arduino.

Gracias Surbyte. Lo he hecho así y con el código anterior me funciona todo perfecto!!!

Ahora tengo otro "problema".
En la entrada del circuito tengo:

  • Cable +12v de alimentación -> A Pin RAW de arduino
  • Cable GND de alimentación -> A Pin GND de arduino
  • Cable SEÑAL PNP de +12V que pasa por la resistencia y el ZENER al PIN A2

Resulta que, tengo un interruptor antes del circuito que corta el +12V de la alimentación... Y claro, cuando el sensor detecta y el interruptor está OFF realmente manda corriente y se enciende el arduino!!! Pero se enciende y hace cosas raras!!!

A ver si entendí. Con interruptor OFF arduino no recibe +12 por VIN y GND. Sin embargo via sensor sigue funcionando? Digo via sensor porque no me queda otro camino del que estemos hablando.

Eso es. Con interruptor OFF por VIN no entra +12 y GND está directo (no pasa por interruptor)
Pero claro, como el sensor PNP cuando detecta envía +12V y la GND es la misma me está metiendo corriente al arduino por el PIN A2 y se enciende cada vez que detecta.

Me resulta raro de creer. Hare algunas pruebas a ver que ocurre en uno mio.