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?
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);
}
}
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.
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.
Un par de cosas:
Se supone que no debe medir la resistencia usando un ohmímetro con energía aplicada a su circuito como regla general.
En el lado del software, pinMode
configurar 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 pinMode
INPUT, 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 digitalWrite
BAJO 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);
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/… )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.
Nick Alexeev
abdullah kahraman
BúfaloJacked