sábado, 29 de febrero de 2020

Modelo SEAIHR del brote MERS en Korea del año 2015

Continuando con el post anterior, aqui tenemos el modelo SEAIHR del brote MERS en la República de Korea durante el año 2015.
El modelo SEAIHR es una evolución del modelo SEIR tradicional , e incluye dos estados (compartimientos) adicionales:

  Susceptible -> Expuesto -> Asintomático -> Infectado > Hospitalizado -> Recuperado

En el enlace PLOS|ONE tenemos el artículo con los detalles de este modelo y su aplicación al brote de Korea.

El script Arduino se muestra a continuación
 
 
 
En el script tenemos comentadas algunas variables, de tal forma que sólo se muestran los valores de Infectados y Hospitalizados, Adicionalmente, en la sección loop() hay dos rangos de emulación que permiten variar un parámetro del modelo para ver como las variables cambian.

A continuación un gif animado con el segundo rango del parámetro zeta.

domingo, 23 de febrero de 2020

Modelos deterministicos de enfermedades contagiosas

Lamentablemente estos días las noticias relacionadas con la "epidemia" del coronavirus están muy presentes en todos los medios de comunicación, y también en el día a día.

Un ejemplo de las capacidades de un microcontrolador  de 8bits (Arduino) es la simulación de modelos determinísticos de enfermedades contagiosas.

Los modelos SIR y SEIR son dos de los más utilizados, y sus nombres se corresponden con los estados (compartimientos) que simula cada modelo. Estos modelos tratan de representar el número de elementos en un determinado momento (usualmente días) en cada estado, es decir, es una foto instantánea de la población a simular y su distribución en los estados definidos en el modelo.

El modelo SIR (Kermack WO, McKendrick AG .1927)  es aplicable a enfermedades como la rubeola, el sarampión y las paperas. Este modelo utiliza tres estados posibles  :

     Susceptible -> Infectado > Recuperado

Se asume que la suma de todos los elementos en cada compartimiento es constante y representa el total de la población a simular.

A continuación el script de este modelo y una imagen de la simulación:

 
 

El modelo SEIR es aplicable a enfermedades como la malaria, ébola y SARS. Este modelo utiliza  cuatro estados (compartimientos) posibles  :

     Susceptible -> Expuesto -> Infectado > Recuperado

Se asume que la suma de todos los elementos en cada compartimiento es constante y representa el total de la población a simular.
 
 

En ambos modelos se consideran los efectos de nacimientos y muertes (no relacionadas con la enfermedad) en la población estudiada.

Los gráficos mostrados se generaron mediante la opción Serial Plotter del IDE de Arduino. Se utiliza la variable tfac para ajustar el gráfico en el eje X.

domingo, 20 de enero de 2019

Red Neuronal en Arduino (machine learning)

El tema de Machine Learning está de moda y como es natural , desde hace algún tiempo ya hay implementaciones de ejemplo para Arduino.

Algunos enlaces de interés relacionados con Arduino:
Una implementación interesante de una Red Neuronal en Arduino esta descrita en el enlace http://robotics.hobbizine.com/arduinoann.html

He modificado ligeramente el script original  :
  • La velocidad de conexión con el terminal es 57600 bps.
  • Hay una nueva variable (PrintDetail) para indicar si queremos el detalle de los cálculos.
  • La variable CycleReport indica cada cuantas iteracciones se muestra el resultado detallado.
  • Al seleccionar detalle de cálculos se incluye la impresión de los valores de los nodos Hidden.


sábado, 12 de septiembre de 2015

Simulador e IDE Arduino en la web

Las aplicaciones que normalmente utilizamos en nuestros proyectos de Arduino son programas que instalamos localmente en nuestro ordenador. 
Sin embargo, el auge de aplicaciones cooperativas en la web ha permitido que se hayan hecho desarrollos muy interesantes que nos permiten realizar proyectos sin necesidad de instalar programas localmente.

Dos ejemplos de ello son 123d circuits y codebender.

123d circuits es una página web de la empresa Autodesk que permite hacer simulaciones de circutos electrónicos, diseñar placas, etc.  Una característica muy interesante de esta página es que permite realizar circuitos utilizando placas Arduino como uno de sus componentes. Además del diseño del circuito podemos cargar código en la placa y simular su ejecución. El registro es gratis aunque hay modalidades de pago que ofrecen mayores funcionalidades.



codebender es otro ejemplo de una aplicación cooperativa en la web para trabajar con Arduino, en este caso es un IDE que nos permite desarrollar códígo y cargarlo a traves del puerto USB conectado a nuestra placa. La página esta muy bien elaborada y cuenta con muchas funcionalidades. 
Es necesario instalar plugins para los navegadores (firefox y chrome). Adicionalmente en la página se recomienda instalar los drivers de comunicación para los puertos USB. En mi caso no los instalé y las pruebas básicas de comunicación con una placa Leonardo fueron satisfactorias.
Al igual que en el caso anterior el registro es gratuito pero tienen opciones de pago con funcionalidades adicionales.



No todo el mundo es dado a utilizar aplicaciones en la web, a pesar de la tendencia cada vez mayor a utilizar la web como nuestro "gran repositorio". Sin embargo hay ocasiones en que esta tecnología ofrece ventajas que no ese encuentran en aplicaciones instaladas localmente.  Lo bueno es que están ahi, disponibles para cuando se necesiten (y gratis !!!).


domingo, 1 de marzo de 2015

Números primos grandes en Arduino

Recordando algo de matemáticas podemos decir que un número primo es un número entero que sólo es divisible entre 1 y si mismo. Los números primos son importantes para el común de los mortales porque una gran parte de la seguridad en internet se basa en utilizar un algoritmo muy dificil de descifrar ya que depende de dos números primos muy grandes.
Para mortales no tan comunes , los matemáticos, los números primos son especialmente interesantes ya que no se ha encontrado un algoritmo eficaz para determinar si un número es o no primo. El único algoritmo totalmente determinístico es la criba de eratóstenes , pero este procedimiento requiere recursos inmensos de tiempo y poder de cálculo a medida que los números son mas grandes.
Para otros mortales, como los que tenemos algo que ver con informática, desde muy temprano hemos tenido que desarrollar un programa que emule la criba de eratóstenes. Inclusive se utilizan ciertos algoritmos para determinar el poder de cálculo de un procesador (benchmark).
Es por ello que siempre encontraremos a alguien gastando el tiempo en desarrollar algún programa de búsqueda de números primos para cualquier procesador que tenga entre manos. Y claro, el Arduino no va a quedar huerfano en esta tan encomiable labor !!!
Buscando en la web me encontré con la siguiente entrada en el foro de Arduino  http://forum.arduino.cc/index.php?topic=192209.0 que trata sobre la búsqueda de números primos grandes en la plataforma Arduino.
Para quien tenga unos quince minutos le recomiendo que la revisen aunque sea por encima, ya que entre otras cosas podemos ver como evoluciona el programa desarrollado por el Sr. Nick Gammon (por cierto, muy prolífico en temas de electronica y específicamente Arduino).
Como a mi esto de la teoría de números también me atrae, quise hacer un pequeño aporte.
Haciéndole unas pequeñas modificaciones al programa del Sr. Gammon logré que el programa se ejecutara en un Atmega644 a 20Mhz con una LCD donde se muestran los números primos que van siendo identificados. El programa guarda en el eeprom interno la información cada 1000 números primos, de tal forma que continúa despues de un reset o apagado.  Este número puede ser cambiado en el programa.
La primera que vez que se graba el programa en la memoria flash del micro debemos eliminar los caracteres de comentarios en las líneas 43,44 y 45 , una vez que el programa ha encontrado los primeros 1000 números primos comentamos de nuevo estas líneas y grabamos de nuevo el programa en el micro.

 
 
En la imágen podemos ver la información mostrada en la pantalla del lcd : en la primera línea tenemos el último número primo encontrado, en la segunda línea tenemos durante cuantos minutos ha estado ejecutándose el programa y el número de primos encontrados.

Una mejora al programa sería lograr que se grabaran los primos encontrados en una memoria eeprom externa o en una tarjeta de memoria. Ya veremos ...

Actualización del 09/03/2015
En la imágen podemos ver que después de 9768 minutos ( 163 horas) se han encontrado 731.696 números primos.




viernes, 27 de febrero de 2015

Leer y escribir variables del tipo uint64_t en el eeeprom ( unsigned long long )

La libreria eeeprom original de Arduino permite leer y escribir solamente variables del tipo byte . En caso de querer utilizar variables de otro tipo tenemos que segmentar estas variables en bytes.
En la página arduino.cc hay código adicional que permite utilizar variables de diferentes tipos.Uno de estos programas , muy sencillo por cierto,  permite trabajar con variables del tipo long.
A partir de este código se pueden generar subrutinas para trabajar con variables de 64 bits (unsigned long long , o variables de 64 bits ).

En el recuadro tenemos un programa sencillo con un lazo que escribe y lee en la eeeprom utilizando dichas subrutinas:


Se incluye otra subrutina que permite imprimir en el puerto serial las variables leidas (original de Nick Gammon).

domingo, 5 de octubre de 2014

Simulación de controlador PID en micro 8051

Los controladores PID (Proporcional/Integral/Derivativo) (wikipedia) son muy utilizados para controlar procesos de todo tipo.
Existe mucha documentación en la web donde se explica la teoría asociada y desarrollos tanto analógicos como discretos.
Simplificando podemos decir que la idea es medir un valor y compararlo con el valor deseado. En base a la diferencia de ambos valores (error) se genera una señal de ajuste para lograr que el valor medido se aproxime al valor deseado. El valor de ajuste se calcula mediante tres componentes :

  • Proporcional : Basado en el error actual (presente)
  • Integral : Basado en el historial de errores (pasado)
  • Derivativo : Basado en la proyección del error (futuro)
      Vajuste = Kp * Proporcional + Ki * Integral + Kd * Derivativo

Las constantes de cada factor de la fórmula se seleccionan para determinar la curva de respuesta mas adecuada al proceso a controlar.

Cuando queremos utilizar un micro como controlador PID se utiliza un algoritmo discreto (se mide a ciertos intervalos de tiempo el valor de salida, se calcula el ajuste y se aplica la corrección).

A continuación tenemos un programa en pascal que permite simular el algoritmo PID en un micro de 8bits:

En la imagen se muestra la salida de la simulación donde se puede observar como el valor medido se va incrementando:

En la siguiente imagen podemos ver que el valor medido ya se aproximó al valor deseado, desplazándose hacia arriba y hacia abajo dependiendo del valor de interferencia r .


Es interesante ver como los factores Proporcional/Integral/Derivativo varían a lo largo de la simulación.

Algunos enlaces interesantes: