Cálculo continuo en Arduino

Era la estrella 2267. Una misteriosa forma de vida conocida como Redjac poseía el sistema informático del USS Enterprise. Bien versado tanto en operaciones informáticas como en matemáticas, [Spock] instruyó a la computadora para calcular pi hasta el último dígito. "... el valor de pi es una figura trascendental sin resolución"Él diría. La tarea de calcular pi presenta a la computadora un proceso sin fin. La computadora tendría que trabajar en la tarea para siempre, eventualmente forzando a Redjac a salir.

El cálculo depende de infinitos procesos. Y el Arduino es una computadora (de un solo hilo). Entonces la idea de ejecutar una función computacional en un Arduino presenta un escenario aparentemente imposible. En este artículo exploraremos la idea de utilizar técnicas derivadas similares con un microcontrolador. Recordemos que la derivada proporciona un cambio inmediato. Obtener una tasa de cambio instantánea cuando se conoce la función es fácil. Sin embargo, cuando se trabaja con un microcontrolador y se varían los datos analógicos sin una función conocida, no es tan fácil. Nuestro objetivo será obtener un cambio medio de los datos. Y debido a que un microcontrolador es mucho más grande que la tasa de cambio de los datos entrantes, podemos calcular el cambio promedio a intervalos muy pequeños. Nuestro trabajo se basará en el hecho de que el cambio promedio y el cambio inmediato son los mismos en intervalos de tiempo cortos.

Houston, tenemos un problema

En el segundo artículo de esta serie, finalmente había una sección llamada “Crédito adicional”, que presentaba un problema y desafiaba al lector a resolverlo. Hoy resolveremos ese problema. Dice así:

Contamos con una máquina que agrega líquido en un recipiente cerrado. La máquina calcula la cantidad de líquido añadido midiendo el cambio de presión dentro del recipiente. La ley de Boyle, una ley básica de los gases muy antigua, dice que la presión en un recipiente cerrado es inversamente proporcional al volumen del recipiente. Si lo hacemos cuanto más pequeño sea el recipiente, aumentará la presión. Debido a que el líquido no se puede comprimir, la introducción de líquido en el recipiente reduce efectivamente el recipiente, lo que genera presión. Luego relacionamos el aumento de presión con el volumen de líquido agregado para obtener una curva manométrica.

A veces, el problema es que el líquido se agota y en su lugar se inyecta gas. Cuando esto sucede, la máquina deja de funcionar. Necesitamos una forma de saber cuándo está entrando gas en el contenedor para poder detener la máquina y advertir al usuario que no hay más líquido.

Una forma de hacerlo es aprovechar el hecho de que la presión en el recipiente aumentará mucho más rápido al agregar gas en lugar de líquido. Si podemos medir la tasa de cambio de la presión en el recipiente durante la adición, podemos diferenciar entre gas y líquido.

Una revisión rápida de la derivada

Antes de comenzar, hagamos una revisión rápida de cómo funciona la derivada. Aquí entraremos en gran detalle sobre la derivación, pero resumiremos la idea en los siguientes párrafos.

Adición de líquido completo

La velocidad promedio de cambio es un cambio de posición durante un cambio de tiempo. La velocidad es un ejemplo de cambio. Por ejemplo, un automóvil que viaja a 50 millas por hora cambia su posición en 50 millas por hora. La derivada nos da tuja tipo de cambio. Para ello, adquiere la tasa de cambio promedio mientras que los intervalos de tiempo entre las mediciones se hacen cada vez más pequeños.

Imaginemos que un automóvil está en la milla uno en el tiempo cero. Una hora más tarde, está en la milla 51. Deducimos que la velocidad promedio del automóvil fue de 50 millas por hora. ¿Cuál es la velocidad por milla? ¿Cómo calculamos eso? [Issac Newton] nos aconsejaría comenzar a obtener las velocidades promedio en intervalos de tiempo más pequeños. Acabamos de calcular la velocidad promedio entre el marcador de milla 1 y 51. Calculemos la velocidad promedio entre el marcador de milla 1 y 2. Y luego el marcador de milla 1 y 1.1. Y luego 1 y 1.01, luego, 1.001 ... etc. A medida que hacemos el intervalo entre mediciones cada vez más pequeño, comenzamos a converger a la velocidad inmediata en el marcador de milla uno. Este es el principio básico detrás de la derivada.

Tasa de cambio promedio

El gas entra entre el tiempo T4 y T5

Podemos utilizar un proceso similar mediante nuestras mediciones de presión para distinguir entre gas y líquido. La tasa de unidades de cambio para este proceso es PSI por segundo. Necesitamos calcular esta velocidad a medida que se agrega el líquido. Si sube demasiado, sabemos que ha entrado gas en el contenedor. Primero necesitamos algunos datos para funcionar. Hagamos dos comprobaciones. Recibiremos los datos de presión para la adición normal de líquido, como se ve en el gráfico de arriba y de la izquierda. El otro son los datos de presión cuando se agota el líquido, como se muestra en el gráfico de la derecha. Visualmente, es fácil ver cuándo ingresa gas al sistema. Vemos un aumento entre el tiempo T4 y T5. Si calculamos el cambio promedio entre intervalos de tiempo de 1 segundo, vemos que todos menos uno son menores a 2 psi / seg. Entre el tiempo 4 y 5 en el gráfico de gas, el cambio promedio es 2.2 psi / seg. El siguiente cambio más alto es de 1,6 psi / seg entre los tiempos T2 y T3.

Entonces ahora sabemos lo que tenemos que hacer. Verifique las tasas de cambio y error cuando exceda 2 psi / seg.

Nuestro pseudocódigo se vería así:

x = pressure;
delay(1000);
y = pressure;
rateOfChange = (y - x);
if (rateOfChange > 2)
    digitalWrite(13, HIGH);  //stop machine and sound alarm

Tipo de cambio inmediato

Parece que solo necesitamos resolver nuestro problema observando la tasa de cambio promedio durante un intervalo de tiempo de 1 segundo. Si quisiéramos obtener una tasa de cambio instantánea en un tiempo específico, necesitamos disminuir ese intervalo de tiempo de 1 segundo. Recordemos que nuestro microcontrolador es mucho más rápido que los datos de presión cambiantes. Esto nos da la capacidad de calcular una tasa de cambio promedio en intervalos de tiempo muy pequeños. Si los hacemos lo suficientemente pequeños, el cambio promedio y el cambio inmediato son básicamente los mismos.

Por lo tanto, todo lo que tenemos que hacer para hacer nuestra derivada es reducir el retraso, por ejemplo, 50 ms. No puede hacerlo demasiado pequeño o su cambio será cero. El valor de retardo debe adaptarse a la máquina específica mediante un método de prueba y error obsoleto.

¿Llevas el límite en un microcontrolador?

Una cosa que no hemos abordado es la idea del límite dentro de un microcontrolador. Principalmente porque no lo necesitamos. Volviendo a nuestro ejemplo de automóvil, si podemos calcular la velocidad promedio del automóvil entre el signo de milla uno y el signo de milla 0,0001, ¿por qué necesitamos hacer un proceso de limitación? Ya tenemos nuestra tasa de cambio inmediata por el cálculo único.

Se puede argumentar que la idea detrás de la derivada es converger en un solo número pasando sin embargo por un proceso limitante. ¿Es posible hacer esto con datos entrantes sin una función conocida? Probemos, ¿de acuerdo? Podemos aprovechar la gran brecha entre la velocidad cambiante de los datos entrantes y la velocidad del procesador para formar un plan.

Repasemos nuestro problema original y configuremos una matriz. Llenaremos la tabla con datos de presión cada 10ms. Esperamos 2 segundos y obtenemos 200 puntos de datos. Nuestro objetivo es obtener la tasa de cambio instantánea del punto de datos medio por límite y convergencia a un solo número.

Comenzamos calculando el cambio promedio entre los puntos de datos 100 y 200. Mantenemos el valor en una variable. Luego obtenemos la tasa de cambio entre los puntos 100 y 150. Luego comparamos nuestro resultado con nuestra tasa anterior, tomando la diferencia. Continuamos este proceso para obtener la tasa de cambio entre tiempos cada vez más pequeños (desde el punto 100 de datos) y compararlos por la diferencia. Cuando la diferencia es un número muy pequeño, sabemos que hemos convergido a un solo valor.

Luego repetimos el proceso en la dirección opuesta. Calculamos el cambio promedio entre los puntos de datos 0 y 100. Luego 25 y 100. Luego 50 y 100 y así sucesivamente. Continuamos el proceso como antes hasta que convergemos en un solo número.

Si nuestra idea funciona, obtendremos dos valores que se verán como 1.3999 y 1.4001. Decimos que nuestra tasa de cambio instantáneo en T1 es 1.4 psi por segundo. Entonces simplemente repetimos este proceso.

Ahora es tu turno. ¿Crees que tienes los trucos para codificar este proceso limitante?

  • David dice:

    Este ejemplo de código debería ser:

    x = presión;

    retraso (1000);

    y = presión;

  • dahud dice:

    Este código debe ser:

    x = presión;

    retraso (1000);

    y = presión;

    • Mike Szczys dice:

      Tienes razón, arreglado. ¡Gracias!

  • Artenz dice:

    "Continuamos este proceso para obtener la tasa de cambio entre tiempos cada vez más pequeños"

    Esto hace que el proceso sea cada vez más sensible al ruido.

  • M Taylor dice:

    “Imaginemos que un automóvil está en la milla uno a la vez de cero. Una hora más tarde, está en la milla 50. Deducimos que la velocidad promedio del automóvil fue de 50 millas por hora. "

    Creo que estás apuntando a un marcador * cero * en el momento cero. De lo contrario, la velocidad promedio es de 49 millas por hora.

    • Es Sweatman dice:

      Reparado. ¡Gracias!

  • Scott_Tx dice:

    No nos estás pidiendo que hagamos tu tarea, ¿verdad?

    • Es Sweatman dice:

      Mi intención era codificar la idea del límite, pero fracasé estrepitosamente. Estaría bien si alguien pudiera hacerlo. Creo que nadie lo ha hecho nunca. No estoy seguro de cuán útil sería. Pero sería bastante bueno "tomar el borde" de un pin analógico. No estoy seguro de si es posible.

      • TheRegnirps dice:

        A medida que el delta t se vuelve muy pequeño, alcanzará las estadísticas electrónicas hasta que obtenga una variación salvaje (1 electrón, 3 electrones, sin electrones, 7 electrones) en sus intervalos y colapsará. Los límites necesitan funciones continuas, puede aproximarse, pero necesita conocer las matemáticas del ruido y los efectos cuánticos si usa corriente eléctrica en un ejemplo.

      • Isótopo dice:

        Hice esto antes para crear un controlador PID con Arduino. Realmente no es tan difícil como todo el mundo lo hace. Cuando calcula integrales o derivadas de datos en vivo, ni siquiera QUIERE usar límites. El cálculo real es simplemente aritmético. Si su señal es muy ruidosa, primero tome promedios de puntos de datos o lo que sea para alcanzar sus valores confiables. Tendrá una matriz o fila de estos valores actuales. Luego, determina cómo desea que sea su intervalo de tiempo. Un rango mayor también rechazará más ruido. Calcule la derivada tomando su valor "actual", reste el valor histórico y divida por su intervalo de tiempo. Elija un intervalo que sea una potencia de 2 para que pueda dividir rápidamente barajando solo. Así es como se hace en el mundo real.

        Piénselo de esta manera: ningún sistema de sensores producirá una función continua al probar datos n veces por segundo, sin importar cuán grande sea n. Sabemos por cálculo que solo puede tomar una derivada de una función continua. Como puede ver, no es posible "tomar el borde de un pin analógico".

        • Kris dice:

          Eso suena mucho a un filtro FIR.

        • Es Sweatman dice:

          Sí ... cuando lo pensé, realmente no vi la necesidad de un proceso de limitación. Pero pensé que al menos lo mencionaría y tendría una idea aproximada de cómo hacerlo.

    • Pete dice:

      ¡JAJAJA! Cínico ...

  • Marvin dice:

    El último dígito de Pi sería cero en Pi básico.

    • Isótopo dice:

      Excepto cuando intenta construir un sistema numérico en base Pi, se desmorona rápidamente cuando se da cuenta de que muchos números tienen representaciones infinitamente diferentes, o dicho de otra manera, casi cualquier número que anote no será único. Así que prácticamente no es posible un sistema numérico en base Pi.

  • TheRegnirps dice:

    ¡La figura muestra a Pi! o Pi factorial. Déjame hacer un pequeño cálculo de la función Gamma en mi cabeza ... sí. ¡Pi! es alrededor de 7.188. Si estás leyendo hasta ahora, eres un nerd total de Trek y apuesto a que estás discutiendo sobre Kirk versus Picard, como si no fuera obvio.

    • Lupus Mecánico dice:

      ¡Hay algo en el ala, algo!

  • Joel dice:

    Si podemos medir la tasa de cambio de la presión en el recipiente durante la adición, podemos diferenciar entre gas y líquido.

    diferencia

    ¿Fue eso un juego de palabras? 😉

    • Hyratel dice:

      solo si dijiste "diferenciar", pero creo que en realidad es un nombre inapropiado. A veces, portmaneteau se puede clasificar como un juego de palabras. No estoy seguro si esto es apropiado

  • Tema dice:

    No he tenido la oportunidad de leer todo de arriba a abajo, mi única pregunta es ¿cómo se supone que un microcontrolador de amenazas individuales rastrea millas de viajes si también realiza otras tareas? ¿No sería un odómetro una tarea para un arduino que maneja muchas otras cosas dentro de mi automóvil?

    • envase dice:

      cualquier interrupción es una amenaza 🙂

  • acantilado dice:

    El cambio es (yx) / 1000. (Yx) es solo el cambio. ¡Ten cuidado!

    • Dueto dice:

      ¿No es que si el cambio fuera grande, habría gas dentro del contenedor / máquina?

  • Phil dice:

    ¿No obtuvo la mejor respuesta que obtendrá, utilizando un promedio ponderado de tantas muestras como pueda tomar en un período de calibración razonablemente definido? Tal vez no sea * el límite *, pero seguramente será lo suficientemente bueno.

  • ESTOLA dice:

    "Π!" es un oxímoron porque el signo de exclamación tiene una función matemática (factorial) que solo puede funcionar con números enteros.

    • tekkieneet dice:

      https://en.wikipedia.org/wiki/Gamma_function
      > En matemáticas, la función gamma (representada por la letra mayúscula Γ) es una extensión de la función factorial, con su argumento cambiado de 1, a números reales y complejos.

  • Quinto dice:

    Por eso odiaba la física en la escuela secundaria y la amaba en la universidad. ¡O incluso geometría! 2πr, πr², F = MA pero EK = ½mv²? Sin contar, esas son solo una fórmula que memoriza. Por cálculo, son las hermosas formas en que todos estos conceptos están interconectados.

    Honestamente, desearía haber contado antes en la escuela. Un gran maestro de séptimo grado se ocupó de nuestra clase con álgebra y geometría (y nos dijo que esto es matemáticas, no lo escondas detrás de nada) al final de cada curso de 6 semanas si terminamos las cosas asignadas de antemano. Tocamos el cálculo haciendo arte de cuerdas (como http://mathforum.org/mathimages/imgUpload/thumb/X%5E2_string.gif/400px-X%5E2_string.gif) y explicando que vemos la pendiente de la línea en el punto, donde era una clave. "Pendiente" es una palabra fácil aquí, estamos en las montañas, y una clave que ella acaba de llamar un punto. Si pudiéramos tener más de esa información en mi cabeza antes de tomar geometría y luego trigonométrica, creo que sería interesante en lugar de simplemente "memorizar, probar, olvidar".

    Sin embargo, necesita necesidades para un cálculo más interesante, y eso requiere una base de geometría. Entonces sé por qué se enseña en ese orden, solo desearía que no fuera así.

    • Isótopo dice:

      Por eso odiaba el cálculo en la universidad y lo amaba en la secundaria. Las diferentes reglas del cálculo son solo cosas que memorizas. El teorema de la divergencia, el teorema del cálculo fundamental y el teorema de Green parecen conceptos diferentes. Pero con el teorema de Stokes se ve cuán maravillosamente están interconectados. Honestamente, creo que simplemente enseñan diferentes formas al principio de la escuela. 😉

  • Erik Johnson dice:

    Teniendo en cuenta que las calculadoras TI funcionan con Z80 y progresan en matemáticas, AVR puede hacer lo mismo

    • Dueto dice:

      excepto que la carrera mas rapida? ¡No crea que solo funciona con el z80 a 4 MHz más o menos!

  • eanao dice:

    Como en el artículo anterior, muchos comentarios pero ninguno hace la tarea. Aquí hay un breve comentario al respecto, por favor dígame dónde me equivoqué (obviamente, este es solo el valor anterior).

    int arrayPos = 200; // array position
    int decAmount = 100; // amount to decrement array position by
    float change = 0;
    float rate = 10000; // rate, initialise large to begin while loop
    float prevrate = 0; // store previous rate for comparison
    float limit = 0.1;  // set how finer limit we want to work too
    
    while ( (prevrate - rate) > limit ) {
      prevrate = rate; // store rate for comparison next time around
      change = presArray[arrayPosition] - presArray[arrayPos - decAmount];
      rate = change / (arrayPos - decAmount); // should get everything in same per unit time
      decAmount /= 2; // reduce decrement amount by half
      arrayPos -= decAmount; // reduce array position for next loop
    }
    
    • Es Sweatman dice:

      ¡Gracias por esto! ¡Buen material!

  • eanao dice:

    Sería genial si el personal de la-tecnologia pudiera modificar los comentarios para el código si es posible. Tenía sangrías que iban 🙁

    • Mike Szczys dice:

      Intente insertar su código en etiquetas anteriores

      • eanao dice:

        Muy bien, gracias por la solución. No sabía que estaban trabajando aquí. Ahora me siento estúpido: s

  • Wilbertofdelaware dice:

    La idea general es hacer coincidir un polinomio con los datos en el área de interés y luego calcular una derivada exacta de ese polinomio. Tengo entendido que la mayoría de los análisis numéricos se basan en ajustar un polinomio lo mejor posible y luego calcularlo.
    Existe una compensación para reducir el intervalo entre obtener una imagen más precisa de la pendiente en el punto exacto donde se desea la derivada y disminuir la precisión numérica del truncamiento en los cálculos. Creo que encajaría en un polinomio de segundo orden centrado en el punto de interés con una diferencia de al menos 100 cálculos A / D arriba y abajo.

    Luego calcule la derivada de esto y evalúela en el punto. Tenga en cuenta que la derivada se puede formar en programas directamente desde el poli.

    f (x) = a * x ^ 2 + b * x + c
    f '(x) = 2 * a * x + b

    • Nik dice:

      De hecho, el análisis numérico es el camino a seguir. Sin embargo, debe tenerse en cuenta que un polinomio de interpolación no es automáticamente monótono mientras tanto con un extremo local. Esto puede causar problemas porque el interpolador tendrá una monotonía diferente de los datos registrados alrededor de los nodos con un punto final local, lo que hará que la derivada calculada tenga el signo incorrecto en estas regiones. Esto requiere una interpolación polinomial popular con limitación de pendiente local para obtener la conservación de la monotonicidad local, por ejemplo, con polinomios ermitaños cubanos; establecer los valores de pendiente en cero para los nodos de datos que representan extremos será suficiente.
      Tanto la construcción como la estimación de dicho polinomio deberían ser posibles en el tiempo de línea.

      • Wilbertofdelaware dice:

        Si realmente implementara esto, lo haría.

        In = (lectura A_D) 2 // pasaje bajo filtra el DIff por ruido
        Xold = En
        DiffOut = Diffav >> 4

        Esto implementa un diferenciador seguido de un paso bajo.
        La salida del filtro de paso bajo se actualiza con la diferencia / 4

        • Wilbertofdelaware dice:

          sin importar el formato destruyó el comentario.

Gloria Vega
Gloria Vega

Deja una respuesta

Tu dirección de correo electrónico no será publicada.