sábado, 15 de febrero de 2020

ARDUINO-MAX30105-Opciones en tiempo real


ARDUINO

MAX30105

Opciones en tiempo real

Gambas(VB-Linux) - Visual Basic 6 - wxwidgets


Después de realizar el montaje con el  módulo MAX30105, utilicé Gambas (VB para Linux).
Al tener que hacer pruebas y pruebas, decidí crear otro programa que me permitiera cambiar muchas de las configuraciones del MAX30105 en tiempo real.
También este programa está realizado en Gambas -  Linux bajo la distribución Debian 9. Como he dicho en muchas ocasiones el que quiera lo puede traspasar a Visual Basic con poco trabajo.

Programa con muchas de las opciones de la librería SparkFun_MAX3010x.



VIDEO

PROGRAMA




Un amigo me dijo que estaba bien hacer el programa en Gambas, pero también me dijo que la mayoría tiene Windows, y era una pena no hacerlo para Windows.
Como yo soy muy bien mandado, me puse manos a la obra, y me lo programé para Windows con Visual Basic 6, es lo que tengo a mano.
Lo que si he notado es que se programa mucho mejor en Gambas que en VB6, autocompletado, busca automática de variables, etc... Me imagino que en versiones posteriores lo hayan mejorado.


Programa en Visual Basic.

PROGRAMA_VB6

  







Programa en Linux y Windows, ¿alguien distingue cual es cual?

Una vez puesto a programar, como todos los años, creo un programa multiplataforma (Linux y Windows).
Que mejor que realizar el  visualizador  de pulso con la librería wxwidgets.
Está programado utilizando la versión 3 de la librería
wxwidgets.
Primero se programa en Linux sobre Debian 9 , y luego se traslada a Windows.
Para que se compile en una plataforma u otra solo debemos modificar el archivo define.h  y  poner:
    #define YesWindows 0
o
    #define YesWindows 1
El que quiera ver mas programas realizados con esta librería que visite mi página wxseta.html.
En el fichero comprimido se incorporan la librerías *.dll necesarias para las versiones compiladas en dinámico.
La versiones compiladas en estático programa311s.exe no necesitan ninguna dll , pero su tamaño es mayor.
En Linux se necesitan librerías wx, las necesarias son:
    libwxbase3
    libwxgtk-webview3
    libwxgtk3
Estas librerías suelen estar instaladas, pero si no es así se instalan desde los repositorios.

PROGRAMA WX


Saludos.
Juan Galaz

Bibliografía:
https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library
https://desensores.com/sensores-arduino/tipos-de-sensores-arduino/sensor-de-frecuencia-cardiaca-max30102-para-arduino/
https://create.arduino.cc/projecthub/SurtrTech/measure-heart-rate-and-spo2-with-max30102-c2b4d8?ref=tag&ref_id=health&offset=2
https://polaridad.es/max30100-sensor-latido-corazon-oximetro-pulso-i2c-wearable-salud/

miércoles, 12 de febrero de 2020

ARDUINO - MAX30105 - Interface con librería SDL


ARDUINO

MAX30105

Interface con librería SDL


Cuando realice mi propio detector de pulso con un LED y un LDR,  y mas tarde haberlo hecho con el módulo MAX30105, el interface gráfico lo había realizado con Gambas (VB para Linux).
Toda la programación se había realizado en Linux bajo la distribución Debian 9.
Como en el mundo de los ordenadores el sistema que predomina es Windows, me propuse hacer un interface para Windows.
Lo mas fácil hubiese sido hacerlo en Visual Basic, pero lo que quería es que la misma programación funcionara lo mismo en Linux y Windows. La solución que he tomado es hacerla en una librería para juegos llamada SDL.
Para esta librería he creado una especie de elementos gráficos que facilitan su utilización.

Programa bajo Windows y con el módulo MAX30105,


Programa bajo Linux y con detector LED-LDR.

Para que funcione en Windows necesitamos la LIBRERIA SDL.


PROGRAMA

Saludos.
Juan Galaz

Bibliografía:
https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library
https://desensores.com/sensores-arduino/tipos-de-sensores-arduino/sensor-de-frecuencia-cardiaca-max30102-para-arduino/
https://create.arduino.cc/projecthub/SurtrTech/measure-heart-rate-and-spo2-with-max30102-c2b4d8?ref=tag&ref_id=health&offset=2
https://polaridad.es/max30100-sensor-latido-corazon-oximetro-pulso-i2c-wearable-salud/

martes, 11 de febrero de 2020

ARDUINO - MAX30105


ARDUINO

MAX30105

Detector de pulso sanguíneo.

Latidos del corazón.


Después de haber realizado mi propio detector de pulso con un LED y un LDR, nos toca utilizar el módulo MAX30105.
El MAX30105 dispone de 3 emisores de LED, Rojo, Verde, y Led IR.
El sistema de detección es el mismo que el que yo he empleado en mi anterior montaje.
Se emite una luz al dedo, y se lee los cambios de luminosidad dependiendo del flujo sanguíneo.
La utilización de diferentes tipos de luces, roja, verde, o infrarroja, nos proporciona diferentes tipos de datos, como por ejemplo el porcentaje de oxigeno en la sangre.

MAX30105


Esquema del módulo.

La transmisión de datos entre el arduino y el módulo MA30105 se realiza mediante el protocolo I2C.
El programa lee constantemente los datos del detector intensidad de flujo y los manda junto con el detector de pulsos por segundo y del detector de pulso.
Los 3 datos se mandan a través de la interface serie al PC.
Estos datos se representan en el programa realizado en Gambas (VB linux), este es el mismo programa que realice en mi anterior montaje.



Circuito montado. Para detector MAX30105 y para el LED-LDR.


Dispositivo para el MAX30105


Dispositivo para mi anterior circuito, LED y LDR

Forma de onda en el programa realizado en Gambas (VB para Linux)

Para hacer funcionar el MAX30105 he empleado la librería  https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library.
Como podemos observar la forma de onda es menos estilizada que en el anterior montaje.
Lo bueno de emplear el MAX30105 es lo fácil y barato que resulta el montaje, el módulo puede conseguirse por menos de 2€.
También existe la posibilidad de medir el Oxigeno en sangre, aunque en las prueba que yo he realizado los resultados no fueron buenos, por lo cual no dado ningún resultado.
El MAX30105 tiene muchas opciones, por lo que espero hacer otros montajes que extraigan  todo el potencial de este chip.

PROGRAMA

Saludos.
Juan Galaz

Bibliografía:
https://github.com/sparkfun/SparkFun_MAX3010x_Sensor_Library
https://desensores.com/sensores-arduino/tipos-de-sensores-arduino/sensor-de-frecuencia-cardiaca-max30102-para-arduino/
https://create.arduino.cc/projecthub/SurtrTech/measure-heart-rate-and-spo2-with-max30102-c2b4d8?ref=tag&ref_id=health&offset=2
https://polaridad.es/max30100-sensor-latido-corazon-oximetro-pulso-i2c-wearable-salud/

martes, 4 de febrero de 2020

ARDUINO-GAMBAS-Detector de pulso sanguíneo


ARDUINO

GAMBAS

Detector de pulso sanguíneo.


Intentado realizar un interface  para mi anterior proyecto de medidor de pulso, se me ocurrió utilizar GAMBAS (Visual Basic para Linux).



PROGRAMA

VIDEO










Saludos.
Juan Galaz


martes, 28 de enero de 2020

ARDUINO - Detector de pulso sanguíneo. Latidos del corazon.

ARDUINO

Detector de pulso sanguíneo.

Latidos del corazon.


A la espera del módulo MAX30102 que hace todo el trabajo, he diseñado un detector de pulso sanguíneo mediante un led blanco y detector de luz (LDR).
Con cada pulso cardíaco la sangre se desplaza por todo el cuerpo, al ser mediante impulsos, la cantidad de sangre  en cada momento varía, y esto lo medimos en los dedos.
Como la piel no es opaca completamente, mediante una luz intensa generada por un LED, la  emitimos en una parte del dedo.
En la otra parte del dedo medimos la cantidad la cantidad de luz que traspasa a través de la piel, la medición la hacemos mediante una LDR.

Como pude observa en un osciloscopio la variación es muy pequeña, pero apreciable.
Para poder observa la señal, lo primero que se me vino a la mente fue  un arduino digitalizando las pequeñas variaciones de señal, y mostrando las variaciones en una herramienta que viene en las últimas versiones de arduino, Serial Plotter.


Como podemos observar la señal es muy pequeña.
Se puede aumentar la amplificación del arduino cambiando el voltaje de referencia de convertidor.
Si lo cambiamos a 3.3V la amplificación sera de x1.5 , y se lo ponemos a 1.1V , conseguiremos una amplificación de x4.5  .
Aún así, no conseguimos una señal buena, solo detectaríamos las pulsaciones, pero no la forma de la onda, por lo que debemos utilizar un amplificador operación LM358 para amplificar la señal.

Circuito amplificador.

Ahora ya podemos visualizar perfectamente la señal.

Señal cardíaca.

Para conseguir ondas mas perfectas, o mas o menos pronunciadas , podemos jugar con los valores de C1 y C2.
En mis múltiples pruebas he empleado valores de C1= 400uF  y C2=330nF consiguiendo ondas como estas.

Onda de pulso sanguíneo después de hacer ejercicio.

El programa me costo bastante, hice muchas pruebas, el detectar los flancos de subida fueron una pesadilla, al final me quedo algo digno.
Existen dos modos, el visual para que se represente en la herramienta de arduino Serial Plotter, y otra que solo manda al terminal serie las pulsaciones por segundo.
Para cambiar de un modo a otro debemos de comentar o descomentar  la línea que pone #define VISUAL .

Después de realizar todas las pruebas todo en una placa Breadboard, lo pasé a un circuito impreso, y lo junté con un conjunto de poliespan donde se encuentra el LED y el LDR.



Como podéis observar en el circuito he añadido un zumbador para poder oír los latidos, ademas de ver como parpadea el LED del arduino que se encuentra en el PIN 13  del arduino.


PROGRAMA

Espero que les guste este montaje, es fácil de hacer y es bastante vistoso.
En internet existen bastantes montajes como este, pero yo lo he diseñado desde cero.
También tengo previsto hacer una pinza con la impresora 3D ,  como lo tienen los hospitales.
Otra idea que he visto es colocar un diodo infrarrojo para ver el % de oxigeno en sangre.

PROGRAMA

Saludos.
Juan Galaz

sábado, 18 de enero de 2020

ESP8266 - WebServer - Encender LED desde navegador


ESP8266

WebServer

Encender LED desde navegador


Una de las cosas que mejor puede hacer el ESP8266 es de un mini servidor web.
El montaje que vamos hacer es el de encender 4 LED desde el navegador.





En el programa que proporciono se debe cambiar el nombre de vuesto router y la contraseña Wifi

#ifndef STASSID
#define STASSID "router"
#define STAPSK  "contraseña"
#endif

Veremos en el terminal serie la IP que tiene nuestra placa.
Connected to setamodem3
IP address: 192.168.1.134
MDNS responder started
HTTP server started

Ahora en nuestro navegador tecleamos:
http://192.168.1.134/

En nuestro navegador veremos la siguiente página.


Aquí podemos encender y apagar los 4 LED desde cualquier navegador dentro de nuestra red.

Surgen dos problemas, debemos saber la IP que nos ha dado el router, y el modo texto es poco practico además de ser demasiado espartado.
Lo primero lo arreglamos cambiando en el programa lo siguiente:

IPAddress ip(192,168,1,200);    
IPAddress gateway(192,168,1,1);  
IPAddress subnet(255,255,255,0);

Debemos saber en que rango de direcciones esta nuestro router, en mi caso es 192.168.1.[0-254].
Para mi montaje he indicado la IP 192.168.1.200 , es una dirección lo suficiente alta para que no la dé automáticamente el router.

Para hacer nuestro interface mas agradable, he utilizado botones de colores para encender y apagar nuestros LED.



Como podemos ver la página es ahora bastante mas atractiva.

Y ya si queremos utilizar gráficos para representar a los LED.



Espero que les guste este montaje.

PROGRAMA

Saludos.
Juan Galaz

Bibliografía:

https://polaridad.es/
https://www.luisllamas.es/encender-y-apagar-un-led-en-el-esp8266-con-un-formulario-web/
https://www.instructables.com/id/Quick-Start-to-Nodemcu-ESP8266-on-Arduino-IDE/

https://randomnerdtutorials.com/projects/#esp8266
https://randomnerdtutorials.com/getting-started-with-esp8266-wifi-transceiver-review/
https://www.prometec.net/esp8266-pluggin-arduino-ide/


viernes, 17 de enero de 2020

Primeros pasos con ESP8266 IDE Arduino - BLINK

Página principal

ESP8266

BLINK


Hace 5 años había realizado montajes con el ESP8266, pero lo utilizaba con el Arduino para las comunicación.
Solo lo utilizaba mediante comando AT, a modo de modem, y la comunicación la hacia mediante el puerto serie.
    Arduino NANO - SERVER WEB con ESP8266 - Servidor de temperatura-ds18B20. ardwifi
En estos 4 años la programación del ESP8266 avanzó mucho, ahora el ESP8266 se puede programar directamente desde la IDE del Arduino. Como enseñar a configurar  la IDE de Arduino para programar el ESP8266 sería demasiado repetitivo debido a la gran cantidad de tutoriales que existen, he creído que lo mejor sería indicar los mejores enlaces que yo he encontrado.

https://polaridad.es/programar-un-modulo-wifi-esp8266-desde-el-ide-de-arduino/
https://www.luisllamas.es/programar-esp8266-con-el-ide-de-arduino/
https://www.instructables.com/id/Quick-Start-to-Nodemcu-ESP8266-on-Arduino-IDE/
https://www.esploradores.com/instalacion-del-gestor-del-microprocesador-es8266-en-el-ide-de-arduino/

En estas páginas se explica bastante bien como configurar la IDE del Arduino, seguro que existen otras muchas, pero son las que he utilizado.
Lo primero que he probado es hacer parpadear un LED , es como el hola mundo de la programación.
ESP8266 Blink
// El LED montado en el módulo está conectado a D4

#define LED D4

void setup()
{
  pinMode(LED, OUTPUT); 
}

void loop()
{
  digitalWrite(LED, LOW);
  delay(1000);                    
  digitalWrite(LED, HIGH); 
  delay(1000); 
}

Placa de desarrollo NodeMcu V3.

Lo primero que notamos al compilar y subir el programa es lo mucho que tarda, 21 segundos.
También lo que extraña es el tamaño del programa, 257672 bytes (24%), he de suponer, que sea debido a que además del programa suba un interprete o un pequeño sistema operativo.
Las siguientes modificaciones en el programa y su posterior compilación-subida a la placa solo tardan 8 segundos.
Haciendo algunas pruebas con compilación-subida a la placa, he notado que es mas rápido en versiones de sistema operativo de 32 bits que la de 64 bits , 20% mas rápido. Yo siempre he pensado que los 64 bits están sobrevalorados en muchas aplicaciones y procesadores.

Lo curioso de estas placas es el no disponer de un piloto LED que nos informe que la placa está alimentada, en muchas ocasiones no sabes si la tienes conectada.
Existe un un LED conectado al pin D4, que es el que utilizamos para nuestro montaje. En otros modelos de placa de desarrollo se encuentra conectado a otro pin.


En mi segunda prueba intento saber la máxima frecuencia de parpadeo del LED.
ESP8266 Blink-2
/*
  ESP8266 Blink
*/
// 545 KHz  y parpadeo cada 3 Segundos

#define LED D0

void setup() 
{
  pinMode(LED, OUTPUT); 
  ESP.wdtDisable();  
}

void loop()
{
volver:
  digitalWrite(LED, LOW);                   
  digitalWrite(LED, HIGH);
  ESP.wdtFeed(); //de otra forma salta el Watch Dog
  goto volver; 
}

El resultado de las pruebas me da 545 KHz  y parpadeo cada 3 Segundos, es como si hubiese una interrupción cada 3 segundos.
Después de mucho mirar por la WEB he descubierto que tiene activado por defecto el pero guardián cada 3 segundos.
Con la orden   ESP.wdtDisable();  desactivamos el Watchdog .
Aún así sigue reseteando cada 8 segundos.
Cuando el
Watchdog está desactivado durante mucho tiempo el módulo se desactiva.
Con la orden ESP.wdtFeed(); ya no se resetea el módulo, aunque pierda velocidad. ?????
El resultado es de 332KHz, y una onda que no es cuadrada.

/*
  ESP8266 Blink-2 versión 2
  384 KHz 
*/

#define LED D0

int z;

void setup()
{
  pinMode(LED, OUTPUT);
  ESP.wdtDisable(); 
}

void loop()
{
volver:
  digitalWrite(LED, LOW);                  
  digitalWrite(LED, HIGH);
  z++;
  if(z>60000)
    {
      ESP.wdtFeed(); //de otra forma salta el Watch Dog
      z=0;
    }
  goto volver;
}
Otro modo es poner cada cierto tiempo ESP.wdtFeed(); y ganamos algo de velocidad llegando a 384 KHz.

En un montaje hice pruebas stm2.html
En un  Arduino hacemos oscilar el puerto a 96 KHZ  ,y si utilizamos el 32F103C8T6 oscila a 817KHz .
Como con el Arduino tengo práctica, sé bastantes trucos, y  podemos llegar a 2.6 Mhz , incluso a 3.9 Mhz haciendo alguna trampa.

Otra de las prueba que suelo hacer es un bucle.

Bucle
//  Arduino
//  22.6 Seg.  __2000

//  STM
//  5.8 Seg.  ___2000

// ESP8266
// 6 Segundos

int n1,n2;
char z;

// STM
//#define LED PA0

//Arduino
//#define LED 13

//ESP8266
#define LED D0

void setup()
{
  pinMode(LED, OUTPUT);
  ESP.wdtDisable();
  Serial.begin(115200);
}

void loop()
{
    Serial.println("0");
    digitalWrite(LED, LOW);

    for(n1=0;n1<30000;n1++)
      {
        for(n2=0;n2<2000;n2++) { z=1; }
        ESP.wdtFeed();
      }
   
    Serial.println("1");
    digitalWrite(LED,HIGH );

    for(n1=0;n1<30000;n1++)
      {
        for(n2=0;n2<2000;n2++) { z=1; }
        ESP.wdtFeed();
      }           
}

El resultado es de 6 Segundos, parecido al  32F103C8T6 que tarda 5.8 Segundos.

Aunque me gusta el ESP8266  por su precio, tener WIFI y la memoria que lleva, veo que hay mucho que aprender en cuanto a su programación

Espero que les guste este montaje.

Saludos.
Juan Galaz

Bibliografía:

https://polaridad.es/programar-un-modulo-wifi-esp8266-desde-el-ide-de-arduino/
https://www.luisllamas.es/programar-esp8266-con-el-ide-de-arduino/
https://www.instructables.com/id/Quick-Start-to-Nodemcu-ESP8266-on-Arduino-IDE/
https://www.esploradores.com/instalacion-del-gestor-del-microprocesador-es8266-en-el-ide-de-arduino/

https://randomnerdtutorials.com/projects/#esp8266
https://randomnerdtutorials.com/getting-started-with-esp8266-wifi-transceiver-review/
https://www.prometec.net/esp8266-pluggin-arduino-ide/