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
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
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
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.