Categoría: Tecnología

  • Medición de pulso cardíaco con Sensor AD8232 y Arduino IDE

    El AD8232 es un pequeño chip que se utiliza para medir la actividad eléctrica del corazón.

    Esta es la experiencia de ayudar a montar un sistema básico de monitorización cardíaca usando el sensor AD8232 y un entorno Arduino IDE. Veremos desde la configuración del hardware y la lectura de la señal ECG hasta los pasos para filtrar y visualizar el pulso en tiempo real. El objetivo es ofrecer una guía práctica, apta tanto para quien se inicia en electrónica biomédica como para quienes buscan incorporar un pequeño proyecto de pulso a sus aplicaciones IoT.

    El AD8232 es un pequeño chip que se utiliza para medir la actividad eléctrica del corazón. Se buscará registrar la actividad eléctrica como un ECG o electrocardiograma. La electrocardiografía se utiliza para ayudar a diagnosticar diversas afecciones cardíacas, así como aprender más del corazón y hasta para armar detectores de mentiras.

    Según su datasheet, “La potencia, el tamaño y el nivel de integración resultantes permiten a los diseñadores desarrollar dispositivos de monitorización cardíaca y de frecuencia cardíaca para su uso fuera de entornos de cuidados intensivos en áreas como la gestión de la salud personal y la monitorización remota de la salud.”

    NOTA: Este dispositivo no está diseñado para diagnosticar o tratar ninguna condición.

    Entendiendo el ECG

    En términos generales, veamos qué representa un ECG y cómo podemos detectarlo. El ECG se divide en dos intervalos básicos, el intervalo PR y el intervalo QT, que se describen a continuación.

    Sistema de conducción eléctrica del corazón: 1. Nodo SA; 2. Nódulo AV.

    El corazón tiene cuatro cámaras: dos aurículas y dos ventrículos, izquierdos y derechos. La aurícula derecha recibe la sangre venosa del cuerpo y la envía al ventrículo derecho el cual la bombea a los pulmones, lugar en el que la sangre se oxigena y libera dióxido de carbono (CO2) y del que pasa a la aurícula izquierda. De aquí la sangre se deriva al ventrículo izquierdo, de donde se distribuye, al contraerse éste, a todo el cuerpo y regresa a la aurícula derecha cerrando el ciclo cardíaco.

    Fuente de todo el contenido sobre el corazón: Wikipedia

    Antes de sumergirnos en los detalles de la señal ECG, conviene recordar que la calidad de la medición depende en gran medida de una correcta colocación de los electrodos y de un adecuado filtrado del ruido. Asegúrate de mantener los cables lo más cortos posible y de trabajar en un entorno con mínimas interferencias eléctricas. Además, el sensor AD8232 incorpora detectores de “leads-off” (LO+ y LO–) que nos ayudarán a verificar si la piel y los electrodos están en buen contacto antes de empezar la lectura.

    Actividad eléctrica del corazón

    Intervalo PR

    El intervalo PR es la onda inicial generada por un impulso eléctrico que viaja desde la aurícula derecha hacia la izquierda. La aurícula derecha es la primera cámara en ver un impulso eléctrico. Este impulso eléctrico hace que las cámaras se “despolaricen”. Esto lo obliga a contraerse y drenar la sangre desoxigenada de la vena cava superior e inferior hacia el ventrículo derecho. A medida que el impulso eléctrico viaja a través de la parte superior del corazón, hace que la aurícula izquierda se contraiga. La aurícula izquierda es responsable de recibir sangre recién oxigenada desde los pulmones hacia el ventrículo izquierdo a través de las venas pulmonares izquierda y derecha. Las venas pulmonares están rojas en el diagrama porque transportan sangre oxigenada. Todavía se les llama venas porque las venas llevan la sangre hacia el corazón. ¡Ciencia!

    Intervalo QT El Intervalo QT

    El QRS es un proceso complejo que genera el “bip” característico en los monitores cardíacos. Durante QRS ambos ventrículos comienzan a bombear. El ventrículo derecho comienza a bombear sangre desoxigenada hacia los pulmones a través de las arterias pulmonares izquierda y derecha. Las arterias pulmonares son azules en el diagrama porque transportan sangre desoxigenada. Todavía se les llama arterias porque las arterias llevan la sangre fuera del corazón. ¡Ciencia, otra vez! El ventrículo izquierdo también comienza a bombear sangre recién oxigenada a través de la aorta y hacia el resto del cuerpo. Después de la contracción inicial viene el segmento ST. El segmento ST es bastante silencioso eléctricamente, ya que es el momento en que los ventrículos esperan ser “repolarizados”. Finalmente, la onda T se hace presente para “re-ploarizar” activamente o relajar los ventrículos. Esta fase de relajación reinicia los ventrículos para ser llenados nuevamente por las aurículas.

    Conexión de AD8232 con Microcontrolador:

    Prueba con Arduino IDE

    Conexión del hardware

    En este texto, se conectará el AD8232 a un microcontrolador Arduino Uno y a un módulo ESP32 con pantalla OLED. ¡Construiremos un monitor cardíaco simple que le permitirá medir la actividad eléctrica del corazón en tiempo real!

    Prueba con Arduino Uno

    Arduino Uno original (usado para este proyecto)

    Prueba con ESP32 + OLED

    Para una cómoda representación del pulso

    También probaré el ECG con un ESP32 que cuenta con una pantalla integrada.

    Conexión de pines

    El monitor de frecuencia cardíaca AD8232 cuenta con nueve conexiones desde el IC. Estos pines provienen de los pines en el IC, pero en realidad son agujeros a los que puede soldar cables o pines de cabecera.

    Conectaremos cinco de los nueve pines de la placa Arduino y al ESP32 respectivamente. Los cinco pines que necesita están etiquetados GND, 3.3v, OUTPUT, LO- y LO+.

    Board LabelFunciónConexión Uno/ESP32
    GNDGroundGND
    3.3v3.3v Power Supply3.3v
    OUTPUTOutput SignalA0
    LO-Leads-off Detect –11
    LO+Leads-off Detect +10
    SDNShutdownNo usado

    Conexión del Sensor AD8232 con Arduino Uno (Atmega328P), ESP8266 y ESP32

    AD8232Atmega328PESP8266ESP32
    OUTPUTA5A023
    LO+21
    LO-32
    3.3V3.33.33.3
    GNDGNDGNDGND

    Código Para compilar Atmega 328P – Medición de pulso cardíaco:

    // Previous values
    int val;
    float lowPass1;
    float highPass1;
    float rawSignal, rawSignal1, rawSignal2, rawSignal3;
    int threshold1;
    long bpm;
    unsigned long t1, t2;
    unsigned long milliseconds;
    
    // -------- Functions --------- //
    static inline void initTimer(void) {
      /*Write code to initialize Timer 1*/
      TCNT1 = 65223; //  preload timer 65536-16MHz/256/200Hz (sampling frequency of the ECG)
      TCCR1B |= (1 << CS12); // prescaler value of 256
      TIMSK1 |= (1 << TOIE1); // enable timer overflow interrupt
    }
    
    static inline void initIOPorts(void) {
      /*Write code to initialize the GPIO ports (pins) that you need*/
      DDRB = 0b00100000;
    }
    
    static inline void initADC(void) {
      /*Write code to initialize the ADC*/
      ADMUX |= (1 << REFS0); // reference voltage on ADC as AVcc
      ADCSRA |= (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // ADC clock prescaler of 128
      ADCSRA |= (1 << ADATE); // Enables ADC auto trigger
      ADCSRB |= (1 << ADTS2) | (1 << ADTS1); // ADC triggers when Counter1 overflows
      ADCSRA |= (1 << ADIE); // ADC interrupts enabled
      ADCSRA |= (1 << ADEN); // enable ADC
      ADCSRA |= (1 << ADSC); // start ADC conversion
    }
    
    void tiempo(void);
    
    // ------ Interrupt Service Routine ------ //
    ISR(TIMER1_OVF_vect) {
      /*This is the interrupt service routine for Timer 1 Overflow*/
      PORTB ^= 0b00100000;
      TCNT1 = 65223;   // preload timer
      rawSignal = analogRead(A0);
      tiempo();
      val = 1;
    }
    
    ISR(ADC_vect) {
      /*This is the interrupt service routine for the ADC
         It is executed when the ADC completes a conversion.
      */
      if (ADC > 512) // turn LED on or off
      {
        PORTB = 0b00100000;
        // measure();
    
      }
      else
        PORTB = 0b00000000;
    
      rawSignal = ADC; //Store the ADC value in the variable ECG_rawsignal
      val = 1;
    }
    
    void tiempo(void) {
      static int counter;
      static int counter2;
      static long segundos;
      counter++;
      //Contador de segundos /////////////////////////////////////////////////////
      if (counter > 200) {
        counter = 0;
        segundos++;
        // Serial.print("***************************** Segundos de ejecición: ");
        // Serial.print(segundos);
        // Serial.println(" segundos *****************************");
      }
    
      /////////////////////////////////// Contador de milliseconds ///////////////
      milliseconds = milliseconds + 5;
    
    
    }
    
    boolean serialMonitor = 0;
    
    unsigned long lastMillisBpm[] = {0, 0, 0, 0, 0}; //A cuántos millis se detectó beat
    
    unsigned long lastTimeBeat[] = {0, 0, 0, 0, 0}; //Tiempo entre pulso y pulso
    
    int main(void) {
    
    
      Serial.begin(115200); //Sets the data rate bits/s for serial data submission
    
      pinMode(LED_BUILTIN, OUTPUT);
    
      noInterrupts(); //Disable interrupts
      initIOPorts(); //Initiate GPIO module
      initTimer(); // Initiate timer module
      initADC(); //Initiate ADC module
      interrupts(); //Enable interrupts
    
      while (1) {
    
        Serial.flush(); //Waits for the transmission of outgoing serial data to complete
        if (val == 1) { //Tests if val is equal to 1
          // Filtered signal calculation
    
          float highPass = -0.5096 * rawSignal - 0.6456 * rawSignal1 + 0.6456 * rawSignal2 + 0.5096 * rawSignal3;
          float lowPass = 0.91 * lowPass1 + 0.045 * highPass + 0.045 * highPass1;
    
          // Comparison with threshold
          int threshold;
          if (lowPass < 0) lowPass = -lowPass; // Calculates the module
          if (lowPass > 10) threshold = 400;
          else threshold = 0;
    
    
          // Print the values on serial plotter/
    
          if (serialMonitor) {
    
    
            Serial.print(rawSignal);
            Serial.print(",");
            Serial.print(highPass);
            Serial.print(",");
            Serial.print(lowPass);
            Serial.print(",");
            Serial.print(threshold);
            Serial.print(",");
            Serial.println(bpm);
            //  Serial.print(",");
            //  Serial.println(milliseconds);
          }
          //   if ()
    
          rawSignal1 = rawSignal;
          rawSignal2 = rawSignal1;
          rawSignal3 = rawSignal2;
          highPass1 = highPass;
          lowPass1 = lowPass;
    
          static int QRS = 0;
          static int j = 0;
    
          if (threshold == 400) {
            if (!QRS) {
    
              int k = j - 1;
              if (k < 0) k = 4;
    
              if ( milliseconds > lastMillisBpm[k] + 300 ) {
    
                //Rutina de detección
                QRS = 1;
                if (!serialMonitor)Serial.print("QRS complex detected");
                lastMillisBpm[j] = milliseconds;
    
                //Compara los ultimos 2
                long lastTime = lastMillisBpm[k] - lastMillisBpm[j] ;
                if (lastTime > 300 && lastTime < 1200) {
                  lastTimeBeat[k] = lastTime;
                }
    
                int nuevosBpm=600000/lastTime;
    
                j++;
    
    
              }
              else
              {
                if (!serialMonitor)Serial.println("Discard the pulse");
              }
    
    
    
    
    
    
    
              if (j > 5) j = 0;
            }
            else {
              //There was a pulse
    
    
    
            }
    
            digitalWrite(LED_BUILTIN, HIGH);
          }
          else
            QRS = 0;
          digitalWrite(LED_BUILTIN, LOW);
    
    
          long testPulse = lastMillisBpm[2] - lastMillisBpm[1];
    
          bpm = 60000 / (testPulse);
          if (!serialMonitor) Serial.print(testPulse);
          if (!serialMonitor) Serial.print(",");
          if (!serialMonitor) Serial.println(bpm);
    
    
    
          ///////////////////////////////////////////Serial.println("bpm" + bpm);
    
          threshold1 = threshold;
          val = 0;
        }
      }
      return 0; /* This line is never reached */
    }
    

    Ahora la detección de pulsaciones:

    Con este montaje y el código de ejemplo ya puedes capturar y procesar tu pulso cardíaco en tiempo real. Como siguiente paso, podrías mejorar la visualización integrando una pantalla OLED o enviando los datos a una plataforma web (por ejemplo, usando MQTT o HTTP). Asimismo, explorar ajustes de filtro más avanzados o implementar detección automática de arritmias te permitirá convertir este prototipo en una herramienta aún más potente para proyectos de salud conectada.

  • Tecnología de Comunicación de Campo Cercano: NFC (Near Field Communication)

    NFC (Near Field Communication) es una tecnología de comunicación inalámbrica de corto alcance (unos pocos centímetros) que permite el intercambio de datos entre dispositivos compatibles. Es la base de pagos contactless, llaves digitales, tarjetas de transporte y más.

    En electrónica de prototipado, NFC se usa para interactuar con tarjetas, llaveros y smartphones compatibles.

    Hay varios módulos disponibles en el mercado para incorporar NFC en proyectos con microcontroladores. Aquí vamos a explicar los dos más comunes y dar ejemplos prácticos para usarlos.

    1️⃣ Módulo PN532 V3 (el “rojo”)

    Este es uno de los más populares. Se reconoce por su PCB roja (versión v3 más frecuente) y su chip PN532, compatible con ISO/IEC 14443 (MIFARE, NFC-A).

    ✔️ Características:

    • Compatible con SPI, I2C y UART
    • Soporta lectura y escritura de tarjetas MIFARE Classic y Ultralight
    • Puede actuar como lector o emulador
    • Buen soporte en bibliotecas

    ✔️ Uso típico:

    • Lectura de llaveros y tarjetas NFC
    • Proyectos de acceso sin llave
    • Pagos simulados o demo
    • Comunicación con smartphones (algunos soportan lectura)

    🔧 Ejemplo de conexión (ESP32 o Arduino UNO)

    • VCC → 3.3V o 5V (según versión)
    • GND → GND
    • SDA → Pin 21 (ESP32) o A4 (Arduino UNO)
    • SCL → Pin 22 (ESP32) o A5 (Arduino UNO)
    #include <Wire.h>
    #include <Adafruit_PN532.h>
    
    // ESP32 pins
    #define SDA_PIN 21
    #define SCL_PIN 22
    
    Adafruit_PN532 nfc(SDA_PIN, SCL_PIN);
    
    void setup() {
      Serial.begin(115200);
      Serial.println("Iniciando NFC...");
    
      nfc.begin();
      uint32_t versiondata = nfc.getFirmwareVersion();
      if (!versiondata) {
        Serial.println("No se encontró el PN532");
        while (1);
      }
      nfc.SAMConfig();
      Serial.println("Esperando tarjeta...");
    }
    
    void loop() {
      uint8_t success;
      uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
      uint8_t uidLength;
    
      success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
    
      if (success) {
        Serial.print("UID de tarjeta: ");
        for (uint8_t i=0; i < uidLength; i++) {
          Serial.print(uid[i], HEX); Serial.print(" ");
        }
        Serial.println();
        delay(1000);
      }
    }
    
    

    2️⃣ Módulo MFRC522

    Otro muy común y muy barato. Es más limitado pero muy usado en makerspaces.

    ✔️ Características:

    • Compatible con SPI
    • Lectura de tarjetas MIFARE Classic
    • Muy económico
    • Buen soporte en Arduino IDE

    ✔️ Limitaciones:

    • No soporta todos los estándares NFC
    • No puede actuar como emulador

    🔧 Ejemplo de conexión (ESP32 o Arduino UNO)

    • VCC → 3.3V
    • GND → GND
    • RST → Pin 5
    • SDA → Pin 21 (ESP32) o 10 (Arduino UNO)
    • MOSI → Pin 23 (ESP32) o 11 (Arduino UNO)
    • MISO → Pin 19 (ESP32) o 12 (Arduino UNO)
    • SCK → Pin 18 (ESP32) o 13 (Arduino UNO)
    #include <SPI.h>
    #include <MFRC522.h>
    
    #define SS_PIN 21
    #define RST_PIN 5
    
    MFRC522 mfrc522(SS_PIN, RST_PIN);
    
    void setup() {
      Serial.begin(115200);
      SPI.begin();
      mfrc522.PCD_Init();
      Serial.println("Aproxime la tarjeta NFC...");
    }
    
    void loop() {
      if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) return;
    
      Serial.print("UID de tarjeta: ");
      for (byte i = 0; i < mfrc522.uid.size; i++) {
        Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
        Serial.print(mfrc522.uid.uidByte[i], HEX);
      }
      Serial.println();
      mfrc522.PICC_HaltA();
    }
    
    

    ¿Cuál elegir?

    PN532 (rojo v3)

    • Más versátil
    • Emulación y lectura
    • I2C/SPI/UART
    • Mejor para NFC con móviles

    MFRC522

    • Muy barato
    • Simple
    • Solo lectura MIFARE Classic
    • Solo SPI

    Algunas imagenes sobre tags (mas viejunos)

    -> Comunicación de Campo cercano (NFC)

    -> Etiquetas de frecuencia ultra alta (UHF)

    En la implementación de una solución RFID, es primordial comprender las diferencias entre cada tipo de RFID.

    ¿Qué son las etiquetas RFID?

    La tecnología RFID se basa en ondas de radio para enviar y recibir información entre una etiqueta y un lector. En su nivel más simple, un lector RFID envía una señal a una etiqueta RFID y la etiqueta devuelve una señal con información.

    Se puede programar información única, por ejemplo:

    Código Electrónico de Producto (EPC) GS1 / GS1 Electronic Product Code™ (EPC)

    Cada etiqueta RFID individual, se puede fijar a productos, cajas, llaveros y teléfonos móviles.

    Al igual que con los clásicos “Códigos de barras”, las etiquetas RFID se usan para recuperar de manera rápida información a nivel de producto (o paquete, o pallet con muchos productos).

    Como las etiquetas RFID usan tecnología de ondas de radio, no requieren una línea de visión directa para ser leídas, lo que permite que se pueden leer contenedores enteros o camiones repletos de productos de a cientos de productos por segundo.

    Esto otorga que las etiquetas RFID una clara ventaja cuando se trata de impulsar la visibilidad y la eficiencia a nivel de la cadena de suministro (lo que se denomina seguimiento inteligente de etiquetas o “smart label tracking” en inglés).

    Además de los beneficios en el campo de la logística, instituciones de toda índole están aprovechando las etiquetas RFID para interactuar con el público a nivel personal, lo que permite acceder a contenido en bares, centros educativas, lugares recreativos y más.

  • Programación

    La programación es el proceso utilizado para idear y ordenar las acciones necesarias para realizar un proyecto, preparar ciertas máquinas o aparatos para que empiecen a funcionar en el momento y en la forma deseados o elaborar programas para su empleo en computadoras.

  • Manual de configuración para Wi-Fi en microcontoladores ESP8266 y ESP32: Creación de un driver LED

    Melange con Argie incorporó un sistema de configuración de sus dispositivos a través de tecnología Wi-Fi desarrollado por HUE CAT

  • Sistemas embebidos

    Sistemas embebidos

    Circuitos dedicados a objetos, sistemas computacionales diseñados para realizar funciones dedicadas cubriendo necesidades específicas. Al contrario de lo que ocurre con los ordenadores de propósito general (PC)

    Con algunos conocimientos del lenguaje C, se pueden programar estos «CHIP» para interactuar con cualquier objeto del mundo.

    La comunicación adquiere gran importancia en los sistemas embebidos. Lo normal es que el sistema pueda comunicarse mediante interfaces estándar de cable o inalámbricas. Así un SI normalmente incorporará puertos de comunicaciones del tipo RS-232, RS-485, SPI, I²C, CAN, USB, IP, Wi-Fi, GSM, GPRS, DSRC, etc.

    El subsistema de presentación tipo suele ser una pantalla gráfica, táctil, LCD, alfanumérico, etc

    Se denominan actuadores a los posibles elementos electrónicos que el sistema se encarga de controlar. Puede ser un motor eléctrico, un conmutador tipo relé etc. El más habitual puede ser una salida de señal PWM para control de la velocidad en motores de corriente continua

    El módulo de E/S analógicas y digitales suele emplearse para digitalizar señales analógicas procedentes de sensores, activar diodos ledes, reconocer el estado abierto cerrado de un conmutador o pulsador, etc

    El módulo de reloj es el encargado de generar las diferentes señales de reloj a partir de un único oscilador principal. El tipo de oscilador es importante por varios aspectos: por la frecuencia necesaria, por la estabilidad necesaria y por el consumo de corriente requerido. El oscilador con mejores características en cuanto a estabilidad y coste son los basados en resonador de cristal de cuarzo, mientras que los que requieren menor consumo son los RC. Mediante sistemas PLL se obtienen otras frecuencias con la misma estabilidad que el oscilador patrón

    El módulo de energía (power) se encarga de generar las diferentes tensiones y corrientes necesarias para alimentar los diferentes circuitos del SE. Usualmente se trabaja con un rango de posibles tensiones de entrada que mediante conversores ac/dc o dc/dc se obtienen las diferentes tensiones necesarias para alimentar los diversos componentes activos del circuito

    Además de los conversores ac/dc y dc/dc, otros módulos típicos, filtros, circuitos integrados supervisores de alimentación, etc

    El consumo de energía puede ser determinante en el desarrollo de algunos sistemas embebidos que necesariamente se alimentan con baterías, con lo que el tiempo de uso del SE suele ser la duración de la carga de las baterías

  • STEAM

    STEAM siglas en inglés para Ciencia, Tecnología, Ingeniería, Arte y Matemática (Science, Technology, Engeniereeng, Arts and Mathmatics)