Autor: Ger

  • Utilizar ambos núcleos de un ESP32

    FreeRTOS (Free Real-Time Operating System) es un sistema operativo de tiempo real de código abierto diseñado para sistemas embebidos y aplicaciones en tiempo real. Un sistema operativo es un software que administra los recursos del hardware y proporciona una interfaz para que las aplicaciones se ejecuten en un dispositivo, como un microcontrolador o microprocesador.

    En el contexto de los microcontroladores, como el ESP32, los sistemas operativos en tiempo real (RTOS) como FreeRTOS son útiles para administrar tareas concurrentes que deben ejecutarse de manera independiente y en un orden específico. Esto permite que las tareas se ejecuten en paralelo y que el sistema pueda responder rápidamente a eventos en tiempo real.

    Las tareas son como pequeños programas que se ejecutan de forma independiente y tienen su propia parte de la memoria (pila) para almacenar datos locales y trabajar en una tarea específica. Un RTOS permite que las tareas compartan el tiempo de ejecución del procesador, lo que permite una mejor utilización de los recursos del sistema.

    En FreeRTOS, xTaskCreatePinnedToCore es una función utilizada para crear tareas que se ejecutarán en un núcleo de procesador específico en sistemas multi-núcleo, como el ESP32.

    Se utiliza FreeRTOS para crear dos tareas: parpadearLedNucleo0 y parpadearLedNucleo1. Cada tarea controla un LED y los hace parpadear con diferentes intervalos de tiempo. Al usar FreeRTOS, estas tareas se pueden ejecutar en núcleos diferentes del ESP32, lo que permite que las tareas de parpadeo se realicen en paralelo sin bloquear la ejecución del programa principal.

    FreeRTOS también proporciona mecanismos para sincronización y comunicación entre tareas, lo que permite que las tareas se comuniquen y cooperen en la resolución de problemas complejos.

    const int ledPinNucleo0 = 2;
    const int ledPinNucleo1 = 4;
    
    void parpadearLedNucleo0(void *parameter) {
      (void)parameter; // Ignorar el parámetro, ya que no lo usamos en este ejemplo
    
      while (true) {
        digitalWrite(ledPinNucleo0, HIGH);
        Serial.println("LED Núcleo 0 encendido");
        delay(500);
        digitalWrite(ledPinNucleo0, LOW);
        Serial.println("LED Núcleo 0 apagado");
        delay(500);
      }
    }
    
    void parpadearLedNucleo1(void *parameter) {
      (void)parameter; // Ignorar el parámetro, ya que no lo usamos en este ejemplo
    
      while (true) {
        digitalWrite(ledPinNucleo1, HIGH);
        Serial.println("LED Núcleo 1 encendido");
        delay(300);
        digitalWrite(ledPinNucleo1, LOW);
        Serial.println("LED Núcleo 1 apagado");
        delay(300);
      }
    }
    
    void setup() {
      Serial.begin(115200);
      pinMode(ledPinNucleo0, OUTPUT);
      pinMode(ledPinNucleo1, OUTPUT);
    
      xTaskCreatePinnedToCore(parpadearLedNucleo0, "Nucleo 0 LED", 10000, NULL, 1, NULL, 0);
      xTaskCreatePinnedToCore(parpadearLedNucleo1, "Nucleo 1 LED", 10000, NULL, 1, NULL, 1);
    }
    
    void loop() {
      // Nada que hacer en loop, ya que las tareas se encargan del parpadeo de los LEDs
    }
    
    

    Con estos cambios, se mostrarán mensajes en el monitor serie cada vez que los LEDs cambien de estado, lo que te permitirá verificar el funcionamiento correcto del código y seguir el comportamiento de los LEDs. Recuerda que necesitarás abrir el Monitor Serie en el IDE de Arduino para ver los mensajes que se imprimen.

  • Configurar interrupciones en ESP8266

    Configuración de interrupciones ESP8266 en Arduino IDE

    La función attachInterrupt tiene 3 argumentos:

    attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)

    digitalPinToInterrupt(pin): Esta es una función que toma el pin GPIO de la placa ESP8266 como un parámetro dentro de ella. El pin denota el GPIO asociado con el pin que provocará que ocurra una interrupción. Por ejemplo, si configura GPIO2 como un pin de interrupción, la función se especificará como digitalPinToInterrupt(2). Puede usar cualquiera de los pines de interrupción ESP8266 que se muestran en el diagrama anterior, como un parámetro dentro de esta función.

    ISR: este es el segundo argumento utilizado para configurar una interrupción. Es un tipo especial de función conocida como Rutina de Servicio de Interrupción que no toma parámetros y tampoco devuelve nada. Cada vez que ocurra la interrupción, se llamará a esta función.

    mode: Esto denota la acción de activación para que ocurra la interrupción. Los cuatro parámetros siguientes se utilizan para especificar el modo:

    LOW (BAJO) Esto se usa para activar la interrupción cuando el pin está en un estado bajo.

    CHANGE (CAMBIO): Esto se usa para disparar la interrupción cuando el pin cambia su estado (HIGH-LOW o LOW-HIGH)

    RISING: Esto se usa para activar la interrupción cuando el pin pasa de BAJO a ALTO.+

    const int led_pin = LED_BUILTIN;
    const int sensor_pin = D1;
    
    unsigned long current_time = millis();
    unsigned long last_trigger = 0;
    //boolean timer_on = false;
    
    volatile long cuentaVuelta;
    
    ICACHE_RAM_ATTR void movement_detection() {
      //Serial.println("Motion was detected");
      cuentaVuelta++;
      last_trigger = millis();
    }
    
    void setup() {
    
      Serial.begin(115200);
    
      pinMode(sensor_pin, INPUT_PULLUP);
      attachInterrupt(digitalPinToInterrupt(sensor_pin), movement_detection, RISING);
      pinMode(led_pin, OUTPUT);
      digitalWrite(led_pin, LOW);
    }
    
    long cuentaVueltaAnterior;
    
    void loop() {
      static unsigned long lastTimer;
      if (millis() > lastTimer + 1000) { //Timer por 1 segundo
        
        lastTimer = millis();
    
        if (cuentaVuelta != cuentaVueltaAnterior) {
          Serial.print("Tacómetro: ");
          Serial.print(cuentaVuelta);
          Serial.println("por segundo");
          cuentaVuelta = 0;
        }
        else {
          Serial.println("No se han detectado vueltas");
        }
      }
    }
  • Interrupciones en un microcontrolador

    Interrupciones en un microcontrolador

    Las interrupciones se utilizan para manejar eventos que no ocurren durante la ejecución secuencial de un programa.

    Por ejemplo, queremos realizar ciertas tareas y estas tareas se ejecutan secuencialmente en su programa Arduino. En ocasiones, hay unas tareas que solo se ejecutarán cuando ocurre un evento especial, como una señal de activación externa al pin de entrada digital de un microcontrolador.

    Una interrupción externa o una “interrupción de hardware” es causada por el módulo de hardware externo. Por ejemplo, Un Sensor de efecto Hall que detecta la vuelta en un cigueñal, o un botón táctil que envía una señal con un toque. En este caso, una interrupción GPIO sucede cuando se realiza dicha acción.

    La idea es que interrupción se activará cuando se detecte el movimiento.

    Con la interrupción, no necesitamos verificar continuamente el estado del pin de entrada digital. Cuando ocurre esta interrupción (se detecta un cambio), el procesador detiene la ejecución del programa principal y llama a una función conocida como ISR o Rutina de Servicio de Interrupción (Interruption Service Routine en inglés).

    Luego, el procesador trabaja temporalmente en una tarea diferente (ISR) y luego regresa al programa principal después de que finaliza la rutina de con la que estaba trabajando (el loop).

    Configurar interrupciones con ESP8266

  • Conectar placa SIM900 y Arduino Uno, Nano, ESP8266, ESP32, (…etc)

    Para conectar el módulo SIM900 con un Microcontrolador ATMEGA 328P, se pueden utilizar las librerías SerialAT y TinyGSM.

    Preparación: Conectar el módulo SIM900 al microcontrolador y comprobar que se puedan enviar comandos AT.

    Concepto: Se enviarán mensajes vía comandos AT desde el microcontrolador a programar hacia el SIM900. Mediante estos comandos se podrán solicitar y enviar SMS, llamados telefónicos y conectarse a Internet para obtener un proyecto IoT autónomo en cualquier parte del mundo.

  • SK6812

    SK6812 es un conjunto de circuito de control inteligente y un circuito emisor de luz en una de las fuentes LED controladas. Cada elemento es un píxel, contenido dentro del circuito de amplificación de forma de señal de pestillo de datos de interfaz digital inteligente, circuito de fuente de alimentación, un circuito de corriente constante incorporado, oscilador RC de alta precisión, la salida es impulsada por tecnología PWM, garantiza efectivamente los píxeles en el color de la luz alta consistencia. Protocolo de datos usando el modo de comunicación unipolar NRZ, el píxel se restablece después del final de DIN, acepta los datos transmitidos desde el controlador a 24 bits, el primero en enviar datos por la primera extracción de píxel a píxel, pestillo de datos interno, los datos restantes después El circuito de procesamiento de plástico interno después de dar forma a la amplificación a través de la salida del puerto DO comenzó a girar a la siguiente cascada de píxeles, cada píxel a través de una señal de transmisión, reducir. El píxel que utiliza la tecnología de reenvío de forma automática hace que el número de cascadas sin límite de transmisión de señal del píxel, solo velocidad de transmisión de señal limitada. El LED tiene un bajo voltaje de conducción, protección ambiental y ahorro de energía, alto brillo, ángulo de dispersión, buena consistencia, baja potencia, larga vida útil, etc. El circuito de control está integrado en el LED anterior, circuito más simple, pequeño volumen, fácil instalación. Campo de aplicación principal: ● Guirnalda de luces LED a todo color, módulo LED a todo color, luces LED súper duras y suaves, tubo de barandilla LED, apariencia LED/iluminación de escena ● Punto de luz LED, pantalla de píxeles LED, pantalla con forma de LED, una variedad de productos electrónicos, equipos eléctricos, etc.

  • Conexión a Escritorio Remoto Chrome Remote Desktop

    Conexión a Escritorio Remoto Chrome Remote Desktop

    Para brindar acceso a su ordenador, ingrese a este enlace:

    https://remotedesktop.google.com/support

    Presione el botón “+ Generar Código” para obtener un código de 12 dígitos, de único uso.

    ¿No aparece el botón “+ Generar código” ?

    En ese caso debe aparecer un botón con el símbolo de DESCARGA. Presionar y siga los pasos para e instalar el pluguin en su ordenador.

  • ESP32 Pines Captativos o Sensores Touch con Arduino IDE

    ESP32 Pines Captativos o Sensores Touch con Arduino IDE

    Pines del sensor táctil capacitivo ESP32 con Arduino IDE

    Cómo utilizar los pines TOUCH del ESP32 con Arduino IDE. Los pines táctiles ESP32 pueden detectar variaciones en cualquier objeto que contenga una carga eléctrica. Muchas veces se utilizan para despertar el ESP32 del “deep sleep” o sueño profundo.

    El ESP32 tiene 10 GPIO táctiles capacitivos. Estos GPIO pueden detectar variaciones en cualquier cosa que contenga carga eléctrica, como la piel humana. Así pueden detectar variaciones inducidas al tocar los GPIO con un dedo.

    Estos pines se pueden integrar fácilmente en almohadillas capacitivas y reemplazar botones mecánicos. Además, los pines táctiles también se pueden utilizar como fuente de activación cuando el ESP32 está en sueño profundo.

    Eche un vistazo a la distribución de pines de su placa para ubicar los 10 sensores táctiles diferentes: los pines sensibles al tacto están resaltados en color rosa.

    Tener en cuenta que no todas las placas de desarrollo permiten acceder a todos los pines del ESP32.

    tocarLeer()

    Leer el sensor táctil es sencillo. En el IDE de Arduino, se utiliza la función touchRead(), que acepta como argumento el GPIO que desea leer.

    touchRead(GPIO);
    

    Prueba de Touch con ESP32 y ARDUINO IDE o Platformio con librería arduino.h:

    // ESP32 Touch Test
    // Just test touch pin - Touch0 is T0 which is on GPIO 4.
    
    void setup() {
      Serial.begin(115200);
      delay(1000); // give me time to bring up serial monitor
      Serial.println("ESP32 Touch Test");
    }
    
    void loop() {
      Serial.println(touchRead(4));  // get value of Touch 0 pin = GPIO 4
      delay(1000);
    }
    
    
  • Prototipo Mecatrónica: Máquina Encapsuladora de Café

    Prototipo Mecatrónica: Máquina Encapsuladora de Café

    El núcleo del desarrollo se centró en la creación de un sistema capaz de gestionar múltiples variables críticas en tiempo real: desde el movimiento coordinado de motores paso a paso para el posicionamiento de las cápsulas, hasta el control de un motor DC y una resistencia de sellado térmico. Este prototipo no solo buscaba la funcionalidad mecánica, sino establecer una base sólida de automatización industrial a pequeña escala.

    Electrónica y programación para prototipo con ESP32, LCD, Controladoras de Motor paso a paso y transistor para motor DC y resistencia de sellado.

    A nivel técnico, la arquitectura del sistema evolucionó hacia el uso de un ESP32, aprovechando su potencia de procesamiento y versatilidad frente a soluciones más limitadas. La implementación incluyó el diseño de placas de circuito impreso (PCB) personalizadas para organizar la electrónica de potencia, controladores de motores y la interfaz de usuario mediante una pantalla LCD. El software, permitió sincronizar las etapas de llenado y sellado, garantizando que cada componente actuara en el milisegundo exacto para mantener la integridad del producto final.

    Lo que comenzó como un prototipo de laboratorio terminó validando conceptos complejos de control de temperatura y torque, demostrando que es posible construir maquinaria funcional de alta complejidad con herramientas accesibles. Este proyecto no solo resolvió una necesidad técnica de encapsulado, sino que sirvió como prueba de concepto para la integración total entre el diseño de hardware, la programación robusta y la ejecución mecánica.

  • Sistema de luminarias y ambientador por IoT

    Sistema de luminarias y ambientador por IoT

    Conexión a base de datos MySQL, sensor de movimiento, sensor de nivel de líquido por ultrasonido (SR-04), conexión por WiFi, LCD1602

  • Brazo robótico

    📍Barcelona 2022

    Proyecto de programación de acciones e iteraciones en Software para ubicar las esferas en diferentes posiciones.

    Un brazo robótico es un dispositivo mecánico controlado por computadora que se utiliza para manipular objetos de manera similar a un brazo humano. Estos brazos robóticos se pueden programar para realizar una variedad de tareas, desde simples movimientos hasta operaciones más complejas. La programación de acciones e iteraciones en software es fundamental para controlar y coordinar los movimientos del brazo robótico.

    Arduino es una plataforma electrónica de código abierto que se utiliza ampliamente en proyectos de robótica, incluidos los brazos robóticos. Proporciona una forma fácil de controlar y programar componentes electrónicos, lo que permite a los ingenieros y aficionados crear sus propios sistemas robóticos.

    La ingeniería mecatrónica es una disciplina que combina elementos de ingeniería mecánica, electrónica y de control para diseñar y construir sistemas automatizados. Los brazos robóticos son un ejemplo común de aplicación de la ingeniería mecatrónica, ya que requieren conocimientos en estas áreas para su diseño y programación.