Circuito: Programación de PCB de serie de máquinas Máquina Contadora de Tarjetas fabricadas en España

En entornos de producción, la precisión en el conteo de insumos es crítica para evitar fugas financieras y errores logísticos. Este proyecto surge como una solución robusta para automatizar el conteo de tarjetas plásticas y hojas mediante un sistema embebido basado en el ESP32. El objetivo principal fue desarrollar un dispositivo que no solo fuera preciso, sino también capaz de operar en condiciones industriales, integrando sensores ópticos de alta velocidad y una lógica de control avanzada para garantizar la integridad de los datos en tiempo real.

la PCB se ha optimizado para reducir el ruido electromagnético en un entorno de maquinaria compacta. Se han integrado etapas de filtrado por hardware para las señales de los sensores ópticos y se ha priorizado una topología de alimentación con conversores DC-DC de alta eficiencia, minimizando la disipación térmica dentro de la carcasa. El resultado es un sistema embebido que no solo cumple con la velocidad de la mecánica, sino que extiende la vida útil del equipo al operar con márgenes de seguridad sobredimensionados.

Lista de materiales

El objetivo aquí es demostrar que no compras «lo más barato», sino lo que garantiza calidad industrial.

  1. MCU: Módulo Espressif ESP32-WROOM-32E (Versión industrial con rango de temperatura extendido -40°C a +85°C).
  2. Sensores Ópticos: Barreras fotoeléctricas Omron EE-SX671 (Conmutación de alta velocidad, 1kHz min) con conectores de bloqueo para evitar desconexiones por vibración.
  3. Gestión de Energía: Convertidor Buck Texas Instruments serie LM2596 (Original) o módulo Traco Power, sustituyendo reguladores lineales LDO para una eficiencia >90% y cero calentamiento.
  4. Conectividad: Borneras de conexión Phoenix Contact serie MKDS (contactos de aleación de cobre, no latón) para asegurar la integridad de la señal de los sensores externos.
  5. Protección: Fusible rearmable (PTC) y diodo TVS en la entrada de alimentación para protección contra transitorios y polaridad inversa.


Ejemplo de programación

/*
 * FIRMWARE: Máquina Contadora de Tarjetas
 * PLATAFORMA: ESP32
 * AUTOR: [Tu Nombre/Firma]
 * DESCRIPCION: Sistema de conteo por interrupciones con filtrado digital
 * para entornos industriales ruidosos.
 */

#include <Arduino.h>

// --- PIN DEFINITIONS & CONSTANTS ---
const uint8_t PIN_SENSOR_IRQ = 18;  // Pin compatible con interrupciones
const uint8_t PIN_STATUS_LED = 2;   // LED Integrado para heartbeat
const uint32_t DEBOUNCE_US   = 500; // Tiempo muerto en microsegundos (ajustable según velocidad máquina)

// --- VOLATILE VARIABLES (ISR Context) ---
// 'volatile' es crucial para variables modificadas dentro de una interrupción
volatile uint32_t totalCardCount = 0;
volatile uint32_t lastInterruptTime = 0;
volatile bool newCardDetected = false;

// --- INTERRUPT SERVICE ROUTINE (ISR) ---
// IRAM_ATTR coloca la función en la RAM para máxima velocidad de ejecución
void IRAM_ATTR isr_CardSensor() {
    uint32_t currentTime = micros();
    
    // Filtrado de rebotes (Debounce) simple pero efectivo basado en tiempo
    if ((currentTime - lastInterruptTime) > DEBOUNCE_US) {
        totalCardCount++;
        lastInterruptTime = currentTime;
        newCardDetected = true; // Flag para que el loop principal procese la UI/Log
    }
}

// --- SETUP ---
void setup() {
    Serial.begin(115200);
    
    // Configuración de pines
    pinMode(PIN_STATUS_LED, OUTPUT);
    // INPUT_PULLUP asegura un estado lógico estable si el sensor es Open Collector
    pinMode(PIN_SENSOR_IRQ, INPUT_PULLUP);

    // Adjuntar interrupción al flanco de caída (FALLING) o subida (RISING) según el sensor
    attachInterrupt(digitalPinToInterrupt(PIN_SENSOR_IRQ), isr_CardSensor, FALLING);

    Serial.println("--- SISTEMA INICIADO: MODO ALTA VELOCIDAD ---");
}

// --- MAIN LOOP ---
void loop() {
    // 1. GESTIÓN DE EVENTOS CRÍTICOS (Sin bloquear el procesador)
    if (newCardDetected) {
        // Sección crítica: deshabilitar interrupciones momentáneamente para leer variables compartidas
        portENTER_CRITICAL_ISR(&mux); 
        uint32_t safeCount = totalCardCount;
        newCardDetected = false;
        portEXIT_CRITICAL_ISR(&mux);

        // Procesamiento de datos (Log, Display, Serial) fuera de la ISR
        Serial.printf("TARJETA DETECTADA | Total: %u | Tiempo: %lu us\n", safeCount, micros());
    }

    // 2. TAREAS SECUNDARIAS (Heartbeat, chequeo de errores, WiFi, etc.)
    static uint32_t lastBlink = 0;
    if (millis() - lastBlink > 1000) {
        lastBlink = millis();
        digitalWrite(PIN_STATUS_LED, !digitalRead(PIN_STATUS_LED)); // Heartbeat visual
    }
}

Proyectos:

guest
0 Comentarios
El más antiguo
El más nuevo Más votado
Opiniones integradas
Ver todos los comentarios

GDPR