Saltar a contenido
← Volver a OPRobots.github.io

Sistema de Menú

Índice

  1. Estructura General
  2. Menú RUN
  3. Menú CONFIG
  4. Interacción
  5. Algoritmos de Ejecución
  6. Control Remoto RC5

Estructura General

El sistema de menú tiene dos niveles principales, alternados mediante pulsación larga del botón MODE:

┌──────────────┐         ┌──────────────┐
│  MENU_RUN    │ ◄─────► │ MENU_CONFIG  │
│  (carrera)   │  long   │ (debug/cal)  │
└──────────────┘  press  └──────────────┘

Archivos: menu.c, menu_run.c, menu_configs.c.

Controles

Botón Función
MODE (pulsación corta) Cambiar modo dentro del menú actual
MODE (pulsación larga) Alternar entre RUN y CONFIG
UP Subir valor del modo actual
DOWN Bajar valor del modo actual
START Iniciar carrera (en MENU_RUN)
DEBUG Activar debug (en MENU_CONFIG)

7 modos de configuración para la carrera:

1. SPEED (Estrategia de Velocidad)

Valor Nombre Velocidad máx Aceleración
0 SPEED_EXPLORE 800 / 3500 mm/s 8000 mm/s²
1 SPEED_NORMAL 3000 mm/s 12000 mm/s²
2 SPEED_MEDIUM 5000 mm/s 15000 mm/s²
3 SPEED_FAST 5500 mm/s 20000 mm/s²
4 SPEED_SUPER 6000 mm/s 25000 mm/s²
5 SPEED_HAKI 6500 mm/s 30000 mm/s²

Nota: SPEED_EXPLORE usa 800 mm/s en fase de exploración y 3500 mm/s en run.

2. RACE (Modo de Carrera)

Valor Nombre Descripción
0 EXPLORE_SIMPLE Ir a la meta explorando en el camino
1 EXPLORE_HOME Llegar a la meta y volver al inicio
2 EXPLORE_COMPLETE Explorar TODAS las celdas antes de volver

3. EXPLORE_TYPE (Tipo de Floodfill)

Valor Nombre Descripción
0 FLOODFILL_TYPE_BASIC Coste 1.0 por celda (Manhattan)
1 FLOODFILL_TYPE_DIAGONAL Coste 1.0 ortogonal / 0.7 diagonal
2 FLOODFILL_TYPE_TIME Costes basados en tiempo real con cinemática

4. MAZE_TYPE (Tipo de Laberinto)

Valor Nombre Descripción
0 MAZE_HOME Laberinto de pruebas local
1 MAZE_COMPETITION Laberinto de competición

5. SOLVE_STRATEGY (Estrategia de Resolución)

Valor Nombre Descripción
0 SOLVE_STANDARD Giros estándar (L→LEFT_90, LL→LEFT_180)
1 SOLVE_DIAGONALS Optimización con diagonales compuestas

6. EXPLORE_ALGORITHM (Algoritmo de Ejecución)

Valor Nombre Descripción
0 EXPLORE_HANDWALL Wall follower (mano derecha/izquierda)
1 EXPLORE_TIME_TRIAL Carrera contrarreloj
2 EXPLORE_FLOODFILL Floodfill con exploración y speed run
3 EXPLORE_DRAGRACE Aceleración máxima en recta

7. RESET_MAZE_ON_START

Controla si el maze se reinicia al comenzar una nueva exploración.


2 modos de configuración:

1. CALIBRATION (Calibración)

Valor Nombre Función
0 CALIBRATE_NONE Sin calibración
1 CALIBRATE_GYRO_Z Calibrar offset Z del giroscopio
2 CALIBRATE_SIDE_SENSORS_OFFSET Calibrar offset de sensores laterales
3 CALIBRATE_FRONT_SENSORS Calibrar sensores frontales
4 CALIBRATE_FRONT_SENSORS_MIDDLE Calibrar distancia media frontal
5 CALIBRATE_STORE_EEPROM Guardar calibraciones en EEPROM

2. DEBUG (Modos de Visualización)

Valor Modo Descripción
0 DEBUG_NONE Sin debug
1 DEBUG_MACROARRAY Imprimir datos de macroarray
2 DEBUG_TYPE_SENSORS Valores de sensores en vivo
3 DEBUG_ENCODERS Milímetros de encoders
4 DEBUG_GYRO Datos del giroscopio
5 DEBUG_FLOODFILL_MAZE Imprimir maze con floodfill
6 DEBUG_MOTORS_CURRENT Corriente de motores
7 DEBUG_TIMETRIAL Demo de time trial
8 DEBUG_KEEP_FRONT_DISTANCE Demo de control de distancia frontal
9 DEBUG_GYRO_DEMO Demo de estabilización con giroscopio
10 DEBUG_FAN_DEMO Demo de ventilador

Interacción

Flujo en el Bucle Principal

while (1) {
    if (!is_race_started()) {
        menu_handler();  // Navegación por menú

        // Activar sensores si el menú lo permite
        set_sensors_enabled(menu_run_can_start() || is_debug_enabled());

        if (menu_run_can_start()) {
            // Esperar detección de mano en sensores
            sensor_started = check_start_run();

            if (is_race_started()) {
                // Iniciar algoritmo seleccionado
                switch (menu_run_get_explore_algorithm()) {
                case EXPLORE_HANDWALL:
                    handwall_start();
                    break;
                case EXPLORE_FLOODFILL:
                    switch (sensor_started) {
                        case SENSOR_FRONT_LEFT_WALL_ID:
                        floodfill_start_run();
                        break;
                        case SENSOR_FRONT_RIGHT_WALL_ID:
                        floodfill_start_explore();
                        break;
                    }
                    break;
                case EXPLORE_TIME_TRIAL:
                    timetrial_start();
                    break;
                case EXPLORE_DRAGRACE:
                    dragrace_start();
                    break;
                }
            }
        }
    } else {
        // Carrera en curso
        switch (menu_run_get_explore_algorithm()) {
        case EXPLORE_HANDWALL:
            handwall_loop();
            break;
        case EXPLORE_FLOODFILL:
            floodfill_loop();
            break;
        case EXPLORE_TIME_TRIAL:
            timetrial_loop();
            break;
        }
    }
}

Algoritmos de Ejecución

HandWall (EXPLORE_HANDWALL)

  • Wall follower clásico. Sigue la pared con mano izquierda o derecha.
  • El sensor que se activa primero determina la mano a usar.
  • Simple y robusto para laberintos sin islas.
  • Archivos: handwall.c, handwall.h

FloodFill (EXPLORE_FLOODFILL)

  • Navegación inteligente con floodfill.
  • Fase 1: Exploración construyendo mapa de paredes.
  • Fase 2: Speed run por el camino óptimo.
  • Usa el tipo de floodfill, estrategia de solve y velocidad configurados.
  • Archivos: floodfill.c

Time Trial (EXPLORE_TIME_TRIAL)

Drag Race (EXPLORE_DRAGRACE)

  • Aceleración máxima en línea recta.
  • Sin navegación, solo velocidad.
  • Archivos: dragrace.c, dragrace.h

Control Remoto RC5

El menú puede controlarse remotamente mediante un receptor IR RC5 (38 kHz, TSSP77038TR):

menu_rc5_mode_change()  → Cambiar modo
menu_rc5_up()           → Subir valor
menu_rc5_down()         → Bajar valor

Los códigos RC5 se almacenan en EEPROM (5 palabras).


Documento generado el 2026-06-12. Ver también Debug, Calibración, Arquitectura Software.