Lecturas inestables en matriz de fotoresistor con Arduino, OK con Ohmmeter - ¿Qué pasa?

Estoy trabajando en una matriz de fotorresistencias con mi arduino y tengo algunos problemas para obtener lecturas estables.

Estoy conduciendo 7 filas una a la vez con digitalWrite(pin,HIGH)el comando de Arduino y haciendo flotar las otras salidas con pinMode(pin,INPUT);El problema es que NO obtuve LECTURA de mis analogRead()divisores de voltaje a menos que la columna esté conectada a mi ohmímetro. ¿Que pasa con eso?

Solo la columna conectada a mi ohmímetro emite algo, todas las demás columnas leen cero. ¿Qué hay en mi ohmímetro que de repente hace que el sensor funcione?

Esquema con una matriz LDR

Entonces, si conecto mi ohmímetro al riel positivo de P1 y a la conexión MEGA Analog 0 (A0), ¡de repente toda la columna obtiene lecturas! De lo contrario, ceros en todas partes.

void readArray() 
{ 
  for(int i=0; i < ROWS; i++)
  { 
    for(int k=0; k<ROWS; k++)
    { 
      pinMode(rowPins[k], INPUT); 
    } 

    pinMode(rowPins[i],OUTPUT); 
    digitalWrite(rowPins[i],HIGH); 
    delay(250); 

    for(int j=0; j < COLS; j++) 
    { 
      holdVals[i][j] = analogRead(j); 
      Serial.println(holdVals[i][j]); 
    } 

    digitalWrite(rowPins[i],LOW); 
  } 
}
(1) ¿Cuáles son los valores de R? (2) Sugeriría agregar condensadores desde la entrada analógica a tierra (en paralelo con cada R). Eso debería disminuir la impedancia de salida que ve el A/D.
Mira mi pregunta aquí . Tuve el mismo problema con la conducción del teclado matricial.
Los valores R son todos de 10k Ohm, mis fotorresistores tienen una respuesta logarítmica de 2k-12k Ohm. @NickAlexeev Jugaré rociando algunas tapas en mi versión de placa de pruebas cuando regrese al laboratorio. 0.1uF es lo mágico, ¿verdad? Abdullah, parece que ambos tenemos problemas de lectura, modificación y escritura. Volveré a tu publicación si tengo alguna idea.

Respuestas (4)

La respuesta que le dio JustJeff es probablemente correcta por qué solo obtiene algo cuando el ohmímetro está conectado. Me gustaría abordar un tema diferente. Ese problema es que su conjunto de fotorresistores no va a funcionar.

El problema es que no puede "encender" una sola fila a la vez. Por ejemplo, digamos que enciende la fila del medio. Las líneas de las filas superior e inferior están triestablecidas desde el uC. La corriente irá desde la línea de la fila del medio, a través de P5 hasta la columna más a la izquierda, a través de P1 hasta la línea de la fila superior, a través de p2 hasta la siguiente línea de la columna, y estropeará las medidas de esa columna. Ahora imagine muchos "caminos falsos" y probablemente pueda darse cuenta de que todo se estropeará irremediablemente.

Una solución a esto es poner un diodo schottky en serie con cada fotorresistor (con el diodo "apuntando" a las líneas de la columna). Usted lee una fila tal como lo hace ahora, aunque puede intentar conducir las "filas no utilizadas" con una señal baja en lugar de declararlas tres veces. No estoy seguro de si tendrá algunos problemas de corriente de fuga extravagantes si no lo hace.

Sin embargo, incluso sin los diodos, hubiera esperado que leyera al menos algo de voltaje. Sus resistencias de lado bajo (R en sus esquemas) pueden tener un valor demasiado bajo. Haga lo que dijo JustJeff y mida el voltaje en una línea de columna. Si está cerca de cero, entonces tiene un problema de hardware. Si no está cerca de cero, entonces tiene un problema de software.

PD, no miré tu código C, ya que no estoy familiarizado con la programación en Arduino.

Había eliminado mi respuesta hace un tiempo porque no parecía (para mí) agregar mucho valor, pero la resucité ya que la mencionaste. En realidad, lo que se leería en la configuración de ohmios dependería de qué sonda se colocó y dónde. Por ejemplo, invertir las sondas en su lugar debería dar una lectura de ADC bastante diferente.
(1) Intentaré probar un 2x2 en mi protoboard con diodos mañana. Su explicación tiene sentido, y creo que los diodos ayudarán mucho. (2) Experimentará con diferentes métodos de manejo de hileras (bajo, flotante, tri-estado) (3) La resistencia COL se ve bien. Tengo lados bajos de 10k y esa parece ser la resistencia medida (ohmetro). (4) No se preocupe, el código fue solo para referencia. El código siempre necesita revisión de todos modos.
@David No estoy de acuerdo con su evaluación de que su circuito no funcionará. Cuando establece todos los pines del microcontrolador menos uno en alta impedancia, en efecto tiene cuatro divisores de voltaje paralelos, no hay caminos furtivos...
@vicatcu Entonces no entendiste mi post. Mostré cómo el camino a través de P5, P1 y P2 puede afectar la lectura de P6 (la P sin etiquetar a la derecha de P5). De hecho, todas las lecturas del fotorresistor se verán afectadas por todos los demás fotorresistores.
@vicatcu: suponga que pretende leer P1 afirmando la fila superior e intentando leer la columna más a la izquierda. P1 obviamente proporcionará entrada, pero la corriente también puede pasar a través de P2 y P6 y, por lo tanto, 'activar' parcialmente la segunda fila, y desde allí, P5 completa una ruta no deseada. De hecho, todos los elementos de la matriz contribuirán a la lectura, aunque P1, al ser la ruta más directa, debería tener la mayor influencia. Argumentos similares se aplican a todas las demás posiciones de la matriz.
@DavidKessner Oh, ya veo lo que estás diciendo. ¡Eso es complicado! concedo Básicamente, hay una ruta de corriente paralela que va lateralmente desde el circuito divisor "activo" a una ruta adyacente cuando los otros nodos están triestablecidos.
@vicatcu Exactamente. Aquí hay una simulación rápida: circuitlab.com/circuit/47g94g/2x2-photoresistor-matrix Normalmente esperaría Col1 = 5.0v y Col2 = 1.0V, pero en realidad es Col1 = 4.41v y Col2 = 2.06v. Espero que el enlace de simulación funcione, es la primera vez que lo pruebo.
El enlace de simulación de @DavidKessner Circuit Lab funciona - muy bueno, he querido probar eso también
¡@David Kessner CiruitLab es increíble! ¡Hice una edición rápida con su sugerencia de diodo y las cosas se ven muy alentadoras! enlace _ Las simulaciones de voltaje son mucho más limpias con Col1 = 4,98 V y Col2 = 9,42 mV Muchas gracias por la ayuda. Trabajaré en el hardware mañana y regresaré con mis resultados (¡y fotos!). Si no fuera obvio, este es un sensor tipo cámara de muy baja densidad de píxeles.

Cuando está configurado para medir ohmios, su medidor en realidad aplica un poco de voltaje al elemento bajo prueba. Por lo general, esto da como resultado una corriente que el medidor puede usar para inferir la resistencia que se está midiendo. Da la casualidad de que también proporciona una caída de voltaje que su entrada ADC también puede observar.

Lo que debe hacer es configurar el medidor para lecturas de voltaje y ver si su digitalWrite() está teniendo el efecto deseado. Seguro que parece que no lo es. Lo olvidé (en la parte superior de mi cabeza), pero es posible que deba configurar el pin para la salida para que digitalWrite () funcione. Tal vez no.

Gracias, acabo de comprobar las lecturas de voltios y digitalWrite() no parece estar haciendo nada (¡todavía!). Mañana volveré a sacar el soldador para, con suerte, hacer algún progreso.
@BuffaloJacked: después de haber visto su código, debo señalar que probablemente no leerá mucho con su voltímetro, incluso si todo funcionaba según lo planeado; las salidas solo serán altas durante 1/ROWS del tiempo. Podría aumentar el retraso a un par de segundos y esperar en una línea determinada FILAS * retraso para asegurarse de que un máximo habría llegado a esa línea.

Un par de cosas:

  1. Se supone que no debe medir la resistencia usando un ohmímetro con energía aplicada a su circuito como regla general.

  2. En el lado del software, pinModeconfigurar INPUT puede ser un poco engañoso. Los pines AVR en realidad pueden tener tres modos: salida, entrada de alta impedancia y entrada interna débilmente levantada. Cuando especifica pinModeINPUT, se encuentra en uno de los dos últimos casos, porque todo lo que hace es afectar el registro DDRx. Para asegurarse de que, de hecho, es una entrada de alta impedancia, también debe digitalWriteBAJO el mismo pin, lo que afecta el registro PORTx.

En efecto, lo que sucede es que cuando establece sus salidas en ALTO por primera vez, la próxima vez que las convierte en entradas, se habilitan los pullups pasivos internos. Entonces, en resumen, en lugar de pinMode(rowPins[k], INPUT);usar dos declaraciones:

pinMode(rowPins[k], INPUT);
digitalWrite(rowPins[k], LOW);
@BuffaloJacked: este es exactamente el tipo de cosa que probablemente te esté mordiendo. Haría bien en crear un par de programas desechables que funcionen con un solo fotorresistor, para probar sus suposiciones sobre cómo funciona la E/S, antes de intentar lidiar con una serie de ellos. Por supuesto, tal vez ya lo hayas hecho.
(1) Gracias, lo veré en el futuro. Afortunadamente, en su mayoría solo estaba leyendo voltajes en vivo, la resistencia se desconectó. (2) No sabía eso sobre los pines internos, hice la edición y espero probar mañana después de solucionar algunos problemas de hardware.
@BuffaloJacked sí, ayuda haber sido un desarrollador de AVR mucho antes de que existiera Arduino :-). Dicho esto, creo que Arduino 1.0 está extendiendo la API pinMode para aceptar una tercera constante para poder expresar esta intención más claramente en una sola línea. Me gusta pinMode(rowPins[k], INPUT_PULLUP)si desea habilitar el pullup, y presumiblemente hace lo que sugiero anteriormente si solo dice INPUT. Mi respuesta se aplica a cualquier versión de Arduino anterior a 1.0.1 (ref arduino.cc/pipermail/developers_arduino.cc/2012-March/… )
@Vicatcu Si bien esto puede ser un problema, no es EL problema. Está leyendo un valor de ADC de CERO, lo que significa que el voltaje en las entradas de ADC es cero. Si hubiera pullups débiles en los "controladores de fila", las entradas del ADC tenderían a ser más altas de lo que deberían, no más bajas o cero.
@DavidKessner Estoy de acuerdo, creo que nuestro consejo en conjunto resolverá su problema.
@vicatcu Hay suficientes cosas mal aquí para todos (lo siento, BuffaloJacked, ¡sin ánimo de ofender!). Puede que nos tome a los tres (incluido @JustJeff) arreglar las cosas.
si lo que dijo Kessner.
@David Sin ofender, todavía soy un principiante. No hay mejor manera de aprender.

Muchas buenas sugerencias, pero sugeriría algunas frutas maduras:

1) malas conexiones/cables sueltos por lo que las filas no están energizadas;

2) pines incorrectos conectados frente al código;

Intentaría descartarlos antes de profundizar más.

decodificar los valores de la resistencia en función de las lecturas de adc puede ser un desafío, dada la forma en que está conectada la matriz.