Arduino: ¡dos entradas analógicas más!

Estoy tratando con sensores analógicos. Tengo una placa simple Arduino Lilypad con solo 4 entradas analógicas. Ahora, necesito dos sensores más y he encontrado en la red este esquema:ingrese la descripción de la imagen aquí

Pero no entiendo si podría agregar demoras en mi proyecto porque estoy controlando material de audio y video y se debe evitar cualquier tipo de demora.

Luego, en el enlace leí esto:

Es posible calcular la resistencia real a partir de la lectura, pero desafortunadamente, las variaciones en la placa IDE y arduino la harán inconsistente. Tenga en cuenta que si cambia las versiones IDE de los sistemas operativos, o usa un arduino de 3,3 V en lugar de 5 V, o cambia de un Arduino de 16 MHz a uno de 8 MHz (como un lilypad), puede haber diferencias debido al tiempo que se tarda en leer el valor de un pin. Por lo general, eso no es un gran problema, pero puede hacer que su proyecto sea difícil de depurar si no lo espera.

No soy un gran experto en arduino y no entiendo que tengo que cambiar por lilypad.

¡Cualquier consejo podría ser apreciado!

Respuestas (2)

Esto sin duda agregará retrasos mientras sondea el pin en un bucle de bloqueo

while (digitalRead(RCpin) == LOW) { // count how long it takes to rise up to HIGH
reading++;      // increment to keep track of time 

if (reading == 30000) {
  // if we got this far, the resistance is so high
  // its likely that nothing is connected! 
  break;           // leave the loop
}

Suponiendo que su compilador pueda optimizar el código de manera extremadamente eficiente, este ciclo tomaría algo así como 4 líneas de código para ejecutarse, ya que tiene que leer el pin, luego compararlo con un valor, luego bifurcarse según el resultado (me impresionaría mucho si podría obtener estas pocas instrucciones). Suponga además que cada una de esas instrucciones tarda solo 1 ciclo de reloj en ejecutarse (esto también probablemente llevará más, pero ayuda a delimitar el problema). Esta rutina podría tomar como máximo :

METRO a X R o tu t i norte mi T i metro mi = L o o pag I t mi r a t i o norte s × I norte s t r tu C t i o norte s L o o pag I t mi r a t i o norte × S mi C o norte d s I norte s t r tu C t i o norte s

METRO a X R o tu t i norte mi T i metro mi = 30 , 000   I t mi r a t i o norte s × 4   I norte s t r tu C t i o norte s L o o pag I t mi r a t i o norte × S mi C o norte d s 8 , 000 , 000   I norte s t r tu C t i o norte s

METRO a X R o tu t i norte mi T i metro mi = 15   metro S

pero supongo que tomará un poco más que eso debido a las concesiones antes mencionadas.

La razón por la que no agrega demoras cuando se usa un ADC es porque el periférico se puede configurar para generar interrupciones y solo se le notificará cuando se complete la lectura del ADC. El tiempo que tarda el ADC en completar una medición es un número finito de ciclos de reloj, por lo que la nota de la aplicación a la que hace referencia señala que si reduce la velocidad de su reloj, aunque el ADC seguirá tomando la misma cantidad de ciclos de reloj para completar una medición, su medición tomará más tiempo porque el reloj es más lento.

Editar

A primera vista de su imagen, combinada con el hecho de que mencionó el audio, pensé que estaba midiendo la entrada de un micrófono. Sin embargo, parece que solo está usando una resistencia sensible a la fuerza (FSR), que es solo un sensor de presión. Si no necesita saber la cantidad de presión, solo que se empujó, no tiene que pasar por todo el problema de encontrar la lectura exacta. Simplemente puede usar cualquier entrada digital que genere interrupciones si elige el valor de resistencia correcto (en lugar del capacitor). Simplemente configurará un pin digital para generar interrupciones en los bordes ascendentes y elegirá una resistencia que le dará un cambio de estado (bajo/alto) con la cantidad deseada de fuerza para su toque. Entonces sabrá cada vez que se presionó el FSR y podrá manejarlo de manera desbloqueante, introduciendo la menor latencia posible.

¿"al menos" o "como mucho"? Como máximo ( 30000 × n ) / 8Mhz, donde n es el número de ciclos de CPU gastados en el bucle (creo que el orden de n=4 ciclos. Reducir el límite acelera la conversión, pero reduce la precisión.
@jippie - ¡Buena captura! Una diferencia sutil, pero importante. Editado en consecuencia.

Nunca trabajé con Arduino, pero la mayoría de los microcontroladores tienen pines de interrupción, por lo que Arduino también debe tenerlos. Si usa un pin de interrupción para detectar que el capacitor se ha cargado hasta el nivel de umbral, entonces no tendrá demoras y su programa podría ejecutarse normalmente mientras se realiza la medición. Solo necesita usar un pin que permita interrumpir.

  1. Afirmar el pin bajo
  2. Asegúrese de que el pin esté lo suficientemente bajo como para descargar el capacitor
  3. Habilitar interrupción y restablecer un temporizador
  4. Haga que el pin sea una entrada (el capacitor comenzará a cargarse)
  5. Ejecuta tu código
  6. Cuando ocurra la interrupción, lea el valor del temporizador (este es su valor medido) y afirme el pin bajo
+1: esa es la forma de medir los tiempos RC usando una entrada digital. Me gustan especialmente las pintas.
@stevenvh Corregido. Comete un error, copia y pega y así se hace :-)