📋 Documentación Técnica

Fecha límite de entrega: 14 de noviembre de 2025

Esta sección contiene la documentación técnica completa del proyecto MathLabInt, desarrollado en la asignatura "Laboratorio STEAM+" de la Tecnicatura en Redes y Software del Instituto Tecnológico de Informática (UTU).

📝 Descripción del proyecto

Herramienta educativa que usa sensores de Micro:bit para capturar información del entorno (temperatura, inclinación, orientación, sonido, luz) y transformarla en ejercicios matemáticos.

Genera automáticamente ejercicios personalizados mediante la integración de Inteligencia Artificial, basados en los datos recopilados y adaptados a diferentes niveles de dificultad.

Destinatarios: Profesores y estudiantes de Matemáticas, Física y Química, principalmente.

🔧 Materiales necesarios

2x Micro:bit

Placa profesor y placa estudiante para captura y comunicación de datos

Micro:bit Micro:bit
1x Módulo de batería

Para uso portátil sin conexión USB

1x Computadora/Laptop

Para programación, sistema y generación de ejercicios

1x Placa expansora

Facilita conexiones con sensores externos

Opcional
1x Rotary Encoder

Sensor adicional de rotación para ejercicios avanzados

Opcional
1x Protoboard + cableado

Para prototipos y conexiones personalizadas

Opcional

⚙️ Diseño mecánico

El sistema utiliza los botones integrados del Micro:bit para la interacción básica:

  • Paso 1: Se utiliza el botón A del micro:bit para capturar el dato del sensor activo en ese momento
  • Paso 2: Se toma el dato, como se ve en los siguientes ejemplos:

Una vez capturado el dato, el trabajo principal es realizado por el software, generando el ejercicio matemático mediante IA.

⚡ Diseño electrónico (opcional)

Conexión del Rotary Encoder (opcional)

Diagrama de conexión realizado en TinkerCad:

Esquema de conexiones:

Cable Origen (Micro:bit) Destino (Rotary Encoder)
Violeta Pin 1 Señal A del encoder
Verde Pin 0 Señal B del encoder
Rojo 3V Alimentación (+)
Negro GND Tierra (-)

Nota: La resistencia pull-up está incluida internamente en el módulo del encoder.

🔗 Ver diseño completo en TinkerCad

💻 Diseño de software

El proyecto integra múltiples componentes de software para su funcionamiento completo:

🔄 Flujo del sistema:

  1. El profesor configura tipo de sensor, dificultad y contexto del ejercicio
  2. El sistema envía configuración a Micro:bit alumno vía radiofrecuencia
  3. Micro:bit alumno captura datos del sensor (ej: temperatura, luz, sonido)
  4. Los datos se envían de vuelta a Micro:bit profesor por RF
  5. Micro:bit profesor transmite datos al sistema por USB
  6. El sistema genera ejercicio matemático usando IA con los datos reales

📦 Repositorios del proyecto:

🌐 Sitio web documental

Landing page y documentación

Ver en GitHub 🔌 Conexión Micro:bit

Comunicación serial

Ver en GitHub 👨‍🏫 Cliente web profesor

Interfaz de configuración

Ver en GitHub 🖥️ Servidor Micro:bit

Backend y API de IA

Ver en GitHub

🛠️ Códigos utilizados:

  • Función: Realiza el llamado a la API de LLM.
  • JavaScript
    
        import { showToast } from "./ui.js";
        const API_URL = "/generate";
        
        export async function fetchExercises(payload) {
            try {
                const response = await fetch(API_URL, {
                    method: "POST",
                    headers: { "Content-Type": "application/json" },
                    body: JSON.stringify(payload),
                });
        
                if (!response.ok) {
                  showToast("Error llamando a la API", "danger");
                  throw new Error(`Error en API: ${response.statusText}`);
                }
        
                return await response.json();
            } catch (err) { 
                showToast("Error llamando a la API", "danger");
                console.error("Error llamando a la API:", err);
                return null;
            }
        }
      
  • Función: Vinculación de la placa micro:bit docente con el sistema.
  • JavaScript
    
    export async function connectMicrobit() {
                      if (writer) {
                         showToast("Micro:bit ya está conectado", "info");
                          return;
                      }
                      try {
                          showSpinner("Conectando con micro:bit...");
                          port = await navigator.serial.requestPort();
                          await port.open({ baudRate: 115200 });
                          writer = port.writable.getWriter();
                          reader = port.readable.getReader();
                  
                          readLoop();
                          hideSpinner();
                           showToast("Micro:bit conectado", "success");
                      } catch (err) {
                          hideSpinner();
                          showToast("Error al conectar: " + err, "danger");
                      }
                  }
                  
  • Función: Configuración micro:bit docente.
  • JavaScript
    
                    from microbit import *
                    import radio
                    
                    # Encender radio y configurar grupo
                    radio.on()
                    radio.config(group=1,power=7)
                    
                    # Inicializar UART
                    uart.init(baudrate=115200)
                    
                    while True:
                        # --- UART → RADIO --- UART (Universal Asynchronous Receiver/Transmitter)
                        if uart.any():
                            serial_data = uart.readline()
                            if serial_data:
                                message = serial_data.decode('utf-8').strip()
                                
                                # Enviar al alumno por radio
                                radio.send(message)
                                
                                # Feedback visual
                                display.show(Image.CHESSBOARD)
                                sleep(300)
                                display.clear()
                        # --- RADIO → UART ---
                        msg = radio.receive()
                        if msg:
                            # Mostrar feedback visual
                            display.show(Image.YES)
                            sleep(300)
                            display.clear()
                    
                            # Reenviar al navegador
                            uart.write(msg + "\n")
                        
                        sleep(100)
                  
  • Función: Ejemplo de micro:bit estudiante.
  • JavaScript
    
                    from microbit import display, Image
                    from sensor_strategy import SensorStrategy
                    
                    class SensorLuz(SensorStrategy):
                        def read(self):
                            # truco: contar LEDs encendidos como proxy de luz
                            # (micro:bit no tiene sensor de luz directo, se simula con la pantalla)
                            level = display.read_light_level()
                            pendiente = 13.4181
                            intercepto = -668.1764 
                            resultado = (level * pendiente) + intercepto
                            if resultado < 0:
                                resultado = 0
                            return resultado
                  
⬅️​ 🏠​