Saltar a contenido
← Volver a OPRobots.org

Sensores

Sharp GP2Y0D815Z0F

Sensor infrarrojo digital de proximidad fabricado por Sharp. Proporciona una salida digital (on/off) cuando un objeto se encuentra dentro de su rango de detección.

Principio de Funcionamiento

El sensor emite un haz de luz infrarroja modulada y mide la reflexión. Cuando la luz reflejada supera un umbral interno, la salida digital conmuta a nivel bajo (activa-baja). El sensor incluye demodulación interna, por lo que es inmune a la luz ambiente en condiciones normales.

Características Técnicas

Parámetro Valor
Modelo Sharp GP2Y0D815Z0F
Tipo Digital (on/off, sin medición de distancia)
Rango típico 15 cm
Salida Activa-baja
Tiempo de respuesta ~5 ms
Consumo ~5 mA
Voltaje 3.3 V (compatible con ESP32-C3)

Disposición

Sensor ID GPIO Función
Módulo principal SENSOR_PIN 1 Detección de paso en LineFollower (Modo Main)
Pared START SENSOR_PIN 1 Detección del robot en casilla de inicio (Modo Aux)
Pared FINISH SENSOR_PIN 1 Detección del robot en meta (Modo Aux)

Configuración de Pin

Ambos módulos configuran el pin del sensor con pull-up interno:

pinMode(SENSOR_PIN, INPUT_PULLUP);

Con el pull-up, el pin lee HIGH en reposo (sin detección) y LOW cuando el sensor detecta un objeto. La detección se evalúa como !digitalRead(SENSOR_PIN).

Lógica de Detección — Modo Main

stopwatch.cpp:26-46

flowchart TD
    Loop[loop → control_manage_screen] --> Screen{¿SCREEN_TIMER?}
    Screen -->|No| Skip[No se lee el sensor]
    Screen -->|Sí| Check{!digitalRead SENSOR_PIN?}
    Check -->|No| Done[Sin detección]
    Check -->|Sí| Running{¿is_running?}
    Running -->|Sí| Debounce{lap_ms >= 200?}
    Debounce -->|Sí| Lap[stopwatch_lap]
    Debounce -->|No| Skip2[Ignorar]
    Running -->|No| Start[stopwatch_start]

El cronómetro del Main solo se ejecuta cuando la pantalla activa es SCREEN_TIMER. En cualquier otra pantalla el sensor no se lee.

Lógica de Detección — Modo Aux

aux_module/stopwatch.cpp:1-45

flowchart TD
    Loop[loop → stopwatch_check] --> Sensor{!digitalRead SENSOR_PIN?}
    Sensor -->|No| NoDetect[last_event_ms = 0]
    Sensor -->|Sí| Debounce{millis - last_event_ms >= 500?}
    Debounce -->|No| Ret[Esperar]
    Debounce -->|Sí| Update[last_event_ms = millis]
    Update --> Wall{¿Tipo pared?}
    Wall -->|START| CanStart{¿can_start?}
    CanStart -->|Sí| SendStart[client_start → ESP-NOW 27]
    CanStart -->|No| Wait[Esperar en bucle]
    Wall -->|FINISH| SendStop[client_finish → ESP-NOW 42]
    SendStart --> Inhibit[can_start = false]

Debounce: 500 ms mínimo entre detecciones consecutivas.

Inhibición de re-trigger (pared START): tras enviar la señal de inicio, can_start = false. Si el robot permanece bloqueando el sensor > 1 segundo, can_start se rehabilita para permitir rearranques manuales.


Sensor de Batería

Circuito

La batería LiPo 1S se monitoriza mediante un divisor de tensión conectado al ADC del ESP32-C3.

Parámetro Valor
Pin ADC 0 (BATT_VOLTAGE_PIN)
Resolución ADC 12 bits (0–4095)
Voltaje referencia 3.3 V
Ratio divisor ~3.13:1

Cálculo

utils.cpp:121

float voltage = analogRead(BATT_VOLTAGE_PIN) * 3.3 / 4095 * 3.13;

Donde: - 3.3 = voltaje de referencia del ADC (V) - 4095 = valor máximo del ADC de 12 bits (2^12 - 1) - 3.13 = ratio del divisor de tensión (R1+R2)/R2

Monitorización de Carga

Pin Función Lógica
3 BATT_CHARGING_PIN LOW = cargando
2 BATT_FULL_PIN LOW = carga completa

Documento generado el 2026-06-29. Ver también Hardware, Arquitectura Software, Batería y LEDs.