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

5

Estoy tratando con sensores analógicos. Tengo un Arduino Lilypad Simple Board con solo 4 entradas analógicas. Ahora, necesito dos sensores más y he encontrado en la red esto esquemas

Pero no entiendo si podría agregar demoras en mi proyecto porque estoy controlando las cosas de audio y video y debo 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 el tablero de IDE y Arduino lo harán.   inconsistente Tenga en cuenta que si cambia las versiones IDE de los sistemas operativos, o   use un arduino de 3.3V en lugar de 5V, o cambie de un Arduino de 16 mhz a un   8Mhz uno (como un lilypad) puede haber diferencias debido a cuánto tiempo   Lleva a 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 qué debo cambiar para lilypad.

Cualquier consejo podría ser apreciado!

    
pregunta nkint

2 respuestas

5

Esto sin duda agregará retrasos cuando encuestes 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 puede optimizar el código de manera extremadamente eficiente, este bucle tomaría aproximadamente 4 líneas de código para ejecutarse, ya que tiene que leer el pin, luego compararlo con un valor y luego ramificarse según el resultado (estaría muy impresionado si pudiera obtener estas pocas instrucciones). Además, asuma que cada una de esas instrucciones toma solo 1 ciclo de tiempo para ejecutarse (esto también probablemente tomará más, pero ayuda a resolver el problema). Esta rutina podría tomar como máximo :

\ $ MaxRoutineTime = LoopIterations \ times \ frac {Instrucciones} {LoopIteration} \ times \ frac {Segundos} {Instrucciones} \ $

\ $ MaxRoutineTime = 30,000 \ iteraciones de espacio \ veces \ frac {4 \ instrucciones de espacio} {LoopIteration} \ times \ frac {Segundos} {8,000,000 \ space Instructions} \ $

\ $ MaxRoutineTime = 15 \ space mS \ $

pero asumo que tomará un poco más que eso debido a las prestaciones mencionadas anteriormente.

La razón por la que no agrega demoras cuando se usa un ADC es porque el periférico puede configurarse 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 indica que si disminuye la velocidad de su reloj, el ADC seguirá teniendo el mismo número de ciclos de reloj para complete una medición, su medición tomará más tiempo porque el reloj es más lento.

Editar

A primera vista de su imagen, combinado con el hecho de que mencionó el audio, pensé que estaba midiendo una entrada de micrófono. Sin embargo, parece que solo estás 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 presionó, no tiene que pasar por todos los problemas para encontrar la lectura exacta. Simplemente puede usar cualquier entrada digital que genere interrupciones si selecciona el valor de resistencia correcto (en lugar del condensador). Simplemente configurará un pin digital para generar interrupciones en los bordes ascendentes y seleccionará una resistencia que le dará un cambio de estado (bajo / alto) con la cantidad de fuerza deseada para su toque. Entonces sabrá cada vez que se empujó el FSR y podrá manejarlo de manera no bloqueada, introduciendo la menor latencia posible.

    
respondido por el Joel B
9

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

  1. afirmar el pin bajo
  2. Asegúrese de que el pin esté lo suficientemente bajo para descargar el capacitor
  3. Habilita la interrupción y restablece un temporizador
  4. Haz que el pin sea una entrada (el condensador 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 establezca el pin bajo
respondido por el Bruno Ferreira

Lea otras preguntas en las etiquetas