Documentación
Ficha técnica, pines del Escudo, armado, lista de materiales, puesta en marcha, programación y reglamento. Se publica por partes: lo que todavía no está aparece marcado como pendiente.
Tres capas: base, Escudo y módulos
Open Lambda Core es un robot seguidor de línea para la categoría Robotrace. La placa base es chasis y circuito en una sola pieza. Sobre ella va el Escudo Core, que ocupa el zócalo 2×15 del Arduino Nano y lo reemplaza por un ESP32-S3. En el Escudo van los módulos: el ESP32-S3, el multiplexor, los reguladores, la IMU y el sensor de distancia.
Ficha técnica
- Microcontrolador
- ESP32-S3, en un módulo LOLIN S3 Mini
- Conexión
- USB y WiFi de 2,4 GHz
- Sensores de línea
- 6 reflectivos, a 9,5 mm uno del otro
- Sensores de marca
- 2, uno por lado
- IMU
- MPU6050, giroscopio y acelerómetro
- Distancia
- VL53L0X (ToF), mirando al frente
- Motores
- 2 × N20 HP de 6 V, con encoder en cuadratura
- Driver de motores
- TB6612FNG
- Ruedas
- Ø 32 mm · 100,53 mm por vuelta
- Batería
- LiPo 2S HV · 7,6 V · 300 mAh · JST XH
- Reguladores
- 4 en el Escudo: 2 de 5 V y 2 de 3,3 V
- Señales
- LED RGB, buzzer y botón
- Placa base
- 88 × 100 mm
- Escudo Core
- 61 × 96 mm
El arreglo de línea trae ocho sensores, de los que el robot usa seis. Un multiplexor 74HC4051 lleva esos seis y los dos de marca a una sola entrada analógica del ESP32-S3.
El Escudo trae montado un radar RD-03E de 24 GHz. El firmware actual no lo usa.
Sin el Escudo, la placa base funciona con un Arduino Nano en el mismo zócalo y con su propio firmware: sigue la línea, pero sin encoders, IMU, sensor de distancia ni WiFi. La plataforma y las funciones de esta documentación son para el Escudo.
El robot no mide su batería. El nivel se revisa por fuera, con un tester.
Pines del Escudo
La asignación de los GPIO del ESP32-S3 en el Escudo Core. Para verla sobre el robot, pieza por pieza: Componentes y conexiones.
| GPIO | Señal | Para qué |
|---|---|---|
| 1 | MUX_Z | Salida del multiplexor: la lectura analógica de los sensores |
| 11 · 12 · 13 | MUX_S0 MUX_S1 MUX_S2 | Selección del canal del multiplexor |
| 14 | PWMA | Motor izquierdo, potencia |
| 16 · 17 | AIN1 AIN2 | Motor izquierdo, sentido |
| 15 | PWMB | Motor derecho, potencia |
| 18 · 21 | BIN1 BIN2 | Motor derecho, sentido |
| 4 · 5 | Encoder izquierdo | Las dos fases del encoder |
| 6 · 7 | Encoder derecho | Las dos fases del encoder |
| 35 · 36 | SDA SCL | Bus I²C: MPU6050 en 0x68 y VL53L0X en 0x29 |
| 8 | IMU_INT | Interrupción de la IMU |
| 2 | XSHUT | Habilita el sensor de distancia |
| 34 | LEDON | Enciende los emisores infrarrojos del arreglo de sensores |
| 38 | BUTTON | Botón |
| 33 | BUZZER | Buzzer |
| 47 | LED RGB | El LED integrado del módulo; es el único LED de aviso del robot |
| 43 · 44 | UART | Reservada para el radar RD-03E; sin uso |
| 3 · 9 · 10 · 37 | Libres | Sin uso. No tienen conector en el Escudo: se toman de los pines del módulo ESP32-S3 |
No uses los GPIO 0, 19 y 20 (USB), 26 a 32, 43 y 44, 45 y 46. Los GPIO 35 y 36 son solo para el bus I²C.
Canales del multiplexor
| Canal | Señal | Sensor |
|---|---|---|
| Y0 | HL | Marca lateral izquierda |
| Y1 a Y6 | QTR6 a QTR1 | Los seis sensores de línea |
| Y7 | HR | Marca lateral derecha |
El firmware no sabe de antemano qué extremo de la fila queda a la izquierda ni cuál sensor de marca es el izquierdo. Eso se fija una vez en la puesta a punto, sin tocar el programa.
Zócalo de la placa base
El Escudo se enchufa en el zócalo 2×15 del Arduino Nano y recibe por ahí las señales de la base.
| Pin del zócalo | Señal |
|---|---|
| A0 | HR, marca lateral derecha |
| A1 a A6 | QTR1 a QTR6, sensores de línea |
| A7 | HL, marca lateral izquierda |
| D2 | BUTTON |
| D10 | BUZZER |
| D11 | LEDON |
Driver de motores
El TB6612FNG recibe tres señales por motor: una de potencia (PWM) y dos de sentido.
| IN1 | IN2 | El motor |
|---|---|---|
| Alto | Bajo | Avanza |
| Bajo | Alto | Retrocede |
| Alto | Alto | Frena |
| Bajo | Bajo | Queda libre |
La señal STBY del driver está fija en alto en la placa base: el firmware no puede apagar el driver. Un motor queda libre con las dos señales de sentido en bajo y frena con las dos en alto. Con el PWM en 0 y una sola señal de sentido en alto, el driver también frena.
Energía y conectores
El robot se alimenta con una batería LiPo de dos celdas (2S) de alto voltaje (HV): 7,6 V nominales, 300 mAh y 16 × 12 × 46 mm. Se carga con un cargador para 2S: hasta 8,7 V si tiene modo HV, y hasta 8,4 V si no lo tiene.
Los motores son de 6 V y reciben el voltaje de la batería. Por eso el firmware limita la potencia que les entrega: el tope viene en 75 %.
El Escudo tiene cuatro reguladores: dos de 5 V, que bajan el voltaje de la batería, y dos de 3,3 V, que se alimentan de esos 5 V. Ese recorrido se puede seguir sobre el robot, de la batería a cada pieza: El camino de la energía.
| Qué se conecta | Conector |
|---|---|
| Batería | JST XH de 3 pines, paso 2,5 mm |
| Cada motor con su encoder | JST ZH de 6 pines, en el Escudo |
| Escudo Core o Arduino Nano | Zócalo 2×15 |
| Arreglo de sensores | Zócalo 1×11 |
| Driver TB6612FNG | Zócalo 2×8 |
| Computador | El USB del módulo ESP32-S3 |
Como el robot no mide su batería, toda corrida que cuente se hace con la batería cargada.
Armado: dónde va cada pieza
El robot tiene tres capas: la placa base, el Escudo Core y los módulos. Esta tabla dice dónde van las piezas principales.
| Pieza | Dónde va |
|---|---|
| Escudo Core | En el zócalo 2×15 de la placa base, el mismo que usa el Arduino Nano. Las patas MOTOR_L y MOTOR_R del Escudo caen sobre los dos conectores de motor de la placa base |
| Módulo ESP32-S3 | En el Escudo, sobre dos filas de pines |
| Sensor de distancia | En la punta del cuello del Escudo, hacia adelante |
| IMU | En el cuerpo central del Escudo |
| Arreglo de sensores | En el zócalo 1×11, al frente de la placa base |
| Sensores de marca | En las puntas de los dos brazos de la placa base, uno por lado |
| Driver TB6612FNG | En el zócalo 2×8 |
| Motores | Atrás, uno a cada lado de la placa base, cada uno con su soporte atornillado a la placa |
| Cable de cada motor y su encoder | En el conector JST ZH de 6 pines del Escudo, uno por lado |
| Ruedas | Directo en el eje de cada motor |
| Batería | Se enchufa al conector JST XH de 3 pines de la placa base; la serigrafía marca + y − |
| Pivote | Bajo el cuello de la placa base, pegado con cinta de doble contacto o silicona caliente. Es el tercer punto de apoyo |
El driver TB6612FNG se quema al encender si está montado al revés. Revisa su orientación contra la serigrafía de la placa.
Si después de armar un motor gira al revés o un encoder cuenta hacia atrás, no se desarma nada: se corrige en la puesta a punto, que necesita el firmware 4.0.0 o posterior.
El manual de armado paso a paso está en preparación.
Lista de materiales
Lista preliminar de las piezas del robot con Escudo Core, por bloque. Salvo las dos placas y el pivote, que se imprime en 3D, son piezas de catálogo. Cada pieza enlaza a su ficha en Componentes y conexiones: cómo funciona, por dónde se conecta y dónde comprarla.
| Bloque | Pieza | Cant. | Nota |
|---|---|---|---|
| Placas | Placa base, 88 × 100 mm | 1 | Chasis y circuito en una sola pieza |
| Placas | Escudo Core, 61 × 96 mm | 1 | Va en el zócalo 2×15 |
| Cómputo | Módulo LOLIN S3 Mini (ESP32-S3) | 1 | En el Escudo |
| Cómputo | Multiplexor 74HC4051 | 1 | En el Escudo |
| Sensores | Arreglo de 8 sensores reflectivos, tipo QTR-8A | 1 | El robot usa seis |
| Sensores | Sensor de marca lateral: módulo TCRT5000 de 3 pines | 2 | Uno por lado |
| Sensores | IMU MPU6050 | 1 | En el Escudo |
| Sensores | Sensor de distancia VL53L0X | 1 | En el Escudo, al frente |
| Sensores | Radar RD-03E de 24 GHz | 1 | En el Escudo; el firmware actual no lo usa |
| Motores | Motor N20 HP de 6 V, con encoder | 2 | Uno por lado |
| Motores | Soporte de motor | 2 | Con sus tornillos |
| Motores | Cable de motor y encoder | 2 | Al conector JST ZH del Escudo |
| Motores | Rueda de Ø 32 mm, para eje en D | 2 | En el eje del motor |
| Motores | Driver TB6612FNG | 1 | En el zócalo 2×8 |
| Energía | Batería LiPo 2S HV de 7,6 V y 300 mAh, 16 × 12 × 46 mm | 1 | Conector JST XH |
| Energía | Regulador de 5 V: módulo AMS1117 de 3 pines | 2 | En el Escudo |
| Energía | Regulador de 3,3 V: módulo AMS1117 de 3 pines | 2 | En el Escudo |
| Energía | Interruptor de encendido 1P2T | 1 | En la placa base |
| Señales | Buzzer de 12 mm | 1 | En la placa base |
| Señales | Pulsador de 6 × 6 mm | 1 | En la placa base |
| Señales | Resistencia de 47 kΩ | 1 | Del pulsador |
| Mecánica | Pivote impreso en 3D | 1 | Tercer punto de apoyo. Se pega con cinta de doble contacto o silicona caliente |
| Zócalos y conectores | Tiras de zócalo hembra de 2,54 mm, en la placa base | 10 | Dos de 1×15, una de 1×11, dos de 1×8, dos de 1×3, dos de 1×2 y una de 1×4 |
| Zócalos y conectores | Conector JST XH de 3 pines | 1 | Batería |
| Zócalos y conectores | Conector JST ZH de 6 pines | 2 | En el Escudo, uno por motor |
El cargador para 2S no está en esta lista.
El kit de repuestos trae un Arduino Nano de respaldo, que va en el mismo zócalo 2×15 si falla el Escudo. Lo que trae el kit está en Liceos.
La lista con el modelo exacto y el número de parte de cada pieza está en preparación.
Puesta en marcha
La plataforma es una sola página que se abre en el navegador. Conecta el robot por USB, le instala el firmware base, lo deja en tu red WiFi y muestra sus sensores en vivo.
Qué necesitas
- Un computador con Chrome o Edge, que son los navegadores que pide la plataforma: la conexión por USB usa Web Serial.
- Un cable USB de datos. Los que son solo de carga no sirven.
- Una red WiFi de 2,4 GHz, con el computador en la misma red que el robot.
- Conexión a internet para instalar o actualizar el firmware base y para usar la IA del chat.
Abrir la plataforma Descargarla
La primera vez que la página busque al robot por el WiFi, el navegador pregunta si puede conectarse a dispositivos de tu red local: hay que permitirlo. Si prefieres no dar ese permiso, o tu navegador no lo ofrece, descarga el archivo y ábrelo desde tu computador con doble clic: funciona igual y no pide nada.
Los tres pasos
- Conectar
Enchufa el robot y pulsa Conectar por USB. Si el robot es nuevo, la página le instala el firmware base, versión 5.5.1; si trae uno anterior, lo actualiza. Después elige tu red, escribe la clave y pulsa Guardar red. Cuando la página pase sola al paso Revisar, el robot ya está en el WiFi y puedes desenchufar el cable. Desde entonces el cable no hace falta: con el robot encendido, Conectar por WiFi entra directo a la pantalla de trabajo. Si la conexión se corta, la página lo sigue buscando sola y vuelve a entrar cuando aparece.
- Revisar
Mueve el robot con la mano y mira que los datos cambien: las seis barras de línea, las dos marcas, el rumbo y la distancia. Aquí también se calibran los sensores y se prueban los motores a mano.
- Trabajar
La pantalla donde se pasa la clase. A un lado está el robot en 3D, que se mueve como el de verdad: copia su rumbo, lo que avanzó cada rueda y lo que ve su sensor de distancia, y deja dibujado el camino que recorrió. Al otro lado está el chat: le pides algo, la IA escribe el programa y, mientras viaja, se ve el enlace del computador a la IA y de la IA al robot. El botón Parar queda a la vista mientras el programa corre. Con Control manual el robot se maneja con las flechas del teclado o con W A S D (Shift acelera, Espacio frena), y hay botones para ir a un punto del piso, volver a casa por donde vino y dar una vuelta mirando alrededor; mientras corre un programa, el control manual espera. Reiniciar vista devuelve la cámara a su lugar, sin tocar nada más. Punto cero hace que el lugar donde está el robot sea el origen: el robot dibujado vuelve al centro, se borra el trazo y la casa queda ahí. Borrar el trazo limpia solo el dibujo. Con Conocer el robot el modelo se abre en capas y cada pieza lleva una marca: al tocarla aparece qué hace, cómo se conecta y cómo probarla. Si el computador no puede dibujar el 3D, la página muestra la misma información en una vista plana desde arriba. El robot atiende a una página a la vez: si lo abres en otra pestaña o en otro computador, la anterior queda en pausa con el aviso «Otra página tomó este robot». Desde ese aviso se puede retomar el robot o detenerlo.
Puesta a punto
Los pasos 1 a 5 se hacen una vez por robot y quedan guardados dentro del robot al pulsar Guardar en el robot, al final de la hoja. La calibración del paso 6 no se guarda: se repite cada vez que se enciende el robot o se cambia de pista. Los pasos 2 y 6 mueven las ruedas de verdad; en los demás lo mueves tú. Sujétalo o déjalo en el suelo según lo que pida cada uno.
- Qué extremo de la fila es la izquierda
Tapas con el dedo el sensor del extremo izquierdo y miras cuál barra se mueve.
- Para dónde gira cada motor
Con el robot levantado, cada botón mueve una sola rueda.
- Para dónde cuentan los encoders
Empujas el robot hacia adelante; las dos cuentas tienen que subir.
- Cuál sensor de marca es el izquierdo
Pasas algo blanco por el costado izquierdo del robot.
- Cuántas cuentas da una vuelta de rueda
Empujas el robot derecho una distancia medida con huincha y la escribes; la página calcula el número.
- Calibrar los sensores
Tres segundos, con la línea blanca y el negro pasando bajo los sensores.
Si algo sale al revés se corrige con un botón; no hay que reinstalar nada. Mientras no se haga el paso 5, los milímetros y la velocidad que informa el robot son aproximados.
Calibrar la odometría. Para que el robot vuelva a casa sin desviarse, cada robot mide una vez cuánto gira y cuánto avanza de verdad. En Trabajar, abre Control manual y elige Calibrar la odometría. Dejas el robot en el piso con un metro y medio libre por delante y marcas dónde está; él avanza un metro, da dos vueltas y media, vuelve y deshace las vueltas. Tú mides dos cosas con una regla: cuánto avanzó y cuánto quedó corrido hacia el lado. Con eso la página calcula la escala del giroscopio, el diámetro de la rueda y el ancho entre ruedas, y los deja guardados en el robot. Necesita el firmware 5.3.0; si el robot trae uno anterior, la misma ventana ofrece actualizarlo por WiFi.
El LED de estado
| Color | El robot está |
|---|---|
| Azul | En espera, recién encendido |
| Verde | Corriendo, o con los motores manejados a mano |
| Ámbar | Calibrando |
| Rojo | Detenido: lo cortó el supervisor, se pulsó Parar o el programa llamó a stop() |
| Celeste | Detenido en la meta, con el seguidor de fábrica |
Desde que un programa llama a led(), el LED pasa a ser del programa.
Si algo falla
- El computador no ve el robot. El cable puede ser solo de carga: prueba con uno de datos.
- No se pudo instalar el firmware. Mantén BOOT, toca RST, suelta BOOT y pulsa Conectar por USB de nuevo.
- El robot no entra a la red. Revisa la clave y que la red sea de 2,4 GHz.
- No se llega al robot por WiFi. Revisa que el computador esté en la misma red.
Programar
El robot se programa en Python. El programa es un texto: viaja por WiFi, queda guardado en el robot y corre al pulsar Correr en la plataforma o el botón del robot. No se compila ni se instala nada.
Esta es la referencia del firmware 5.5.1. Está en versión preliminar y puede cambiar.
VELOCIDAD = 40 # de 0 a 100 GANANCIA = 0.08 # cuánto corrige por cada punto de error calibrate(3000) # gira sobre sí mismo: que la línea le pase por debajo beep(900, 100) while True: v = line() suma = sum(v) if suma > 200: posicion = sum(i * v[i] for i in range(6)) * 1000 / suma # 0 = izquierda, 5000 = derecha error = posicion - 2500 motors(VELOCIDAD + error * GANANCIA, VELOCIDAD - error * GANANCIA) sleep_ms(2)
Este programa no mueve nada hasta que pulsas Correr en la plataforma o el botón del robot. Entonces calibra tres segundos girando sobre sí mismo, pita y sigue la línea. Es el programa que el robot trae de fábrica.
Cómo corre un programa
| Qué | Cómo funciona |
|---|---|
| Correr | El programa corre de arriba abajo, una vez. Lo que tiene que repetirse va dentro de un while True:. |
| Parar | Lo detiene en cualquier punto, también en medio de una espera. Cuando el programa termina, por Parar, por un error o porque llegó al final, los motores quedan detenidos. |
| Funciones del robot | Ya están cargadas: se usan sin ningún import. |
| Módulos | math, random y time. No hay pines, archivos ni red: el programa solo llega al robot por las funciones de esta página. |
| Errores | Si el programa falla, el error llega al chat de la plataforma con el número de línea, y la IA puede corregirlo. |
| Esperas | Todo while True: lleva una espera adentro; en un lazo de control, sleep_ms(2). |
| Tamaño | El robot guarda un programa de hasta 32 768 bytes. El que se envía reemplaza al anterior. |
Sensores
| Función | Qué entrega |
|---|---|
line() | Una lista con las seis lecturas de línea, de 0 a 1000, de izquierda a derecha. La línea blanca da valores altos. |
line(i) | Una sola lectura; i va de 0 a 5. |
mark_left() | De 0 a 1000. La marca izquierda avisa un cambio de curva. |
mark_right() | De 0 a 1000. La marca derecha es la partida y la meta. |
gyro() | Velocidad de giro, en grados por segundo. |
heading() | Rumbo acumulado, en grados, desde el último zero(). |
encoders() | Milímetros recorridos desde zero(), promedio de las dos ruedas. |
encoder_left() encoder_right() | Milímetros de cada rueda. |
speed() | Velocidad, en milímetros por segundo. |
distance() | Distancia a lo que tiene delante, en milímetros; −1 si no ve nada hasta 1 metro. El robot ya descarta las mediciones falsas: avisa de algo cuando varias mediciones coinciden en el mismo lugar y traen señal de sobra. De cerca tarda 0,1 segundos; de lejos, o con mucho sol, hasta 1 segundo. |
button() | Verdadero mientras el botón está apretado. El mismo botón es Correr y Parar: con el programa corriendo, apretarlo lo detiene. |
clock_ms() | Milisegundos desde el encendido. |
Moverse una distancia o un ángulo
Para avanzar una distancia, girar un ángulo o llegar hasta una pared se usan estas funciones, no motors(). El robot acelera, frena antes de llegar y se detiene en el punto: mide la distancia con los encoders y sostiene el rumbo con el giroscopio. El programa espera hasta que el movimiento termina.
| Función | Qué hace |
|---|---|
forward(mm) | Avanza esa distancia en milímetros y se detiene ahí, con un error de unos 3 mm. Devuelve True si llegó. Si aparece algo delante a menos de 15 cm, frena y devuelve False. |
backward(mm) | Lo mismo hacia atrás. |
forward_until(mm) | Avanza derecho hasta quedar a esa distancia de lo que tenga delante (una pared, una caja) y se detiene ahí: forward_until(200) queda a 20 cm. Mide con el sensor de distancia mientras avanza, frena antes de llegar y, ya detenido, mide de nuevo y corrige. mm va de 100 a 1000, que es lo que el sensor mide bien. Devuelve True si quedó a esa distancia. Avanza a lo más 2 metros: si en ese tramo no encuentra nada, se detiene y devuelve False. Si al partir ya está más cerca, no se mueve. |
forward_until(mm, tope, v) | El segundo número cambia cuánto avanza a lo más, en milímetros. El tercero es la velocidad, de 140 a 500 mm/s; sin él se acerca a 300. |
turn(grados) | Gira en el lugar; positivo es hacia la izquierda. Llega con un error de unos 1,5°. |
turn_to(rumbo) | Gira hasta quedar mirando a ese rumbo, el mismo que entrega heading(). |
arc(radio, grados) | Una curva de un solo trazo: el centro del robot recorre un círculo de ese radio, en milímetros, mientras gira esos grados; positivo es hacia la izquierda y negativo hacia la derecha. arc(150, 360) es un círculo de 30 cm de diámetro. Con el radio negativo hace la misma curva marcha atrás. Acepta la velocidad del centro como tercer número. |
wheels(izq, der) | Cada rueda recorre su propia distancia en milímetros (negativo es hacia atrás) y las dos parten y llegan juntas. Es el movimiento más general: iguales es un avance, opuestas un giro en el lugar, distintas una curva. wheels(0, 200) pivotea sobre la rueda izquierda. Acepta una velocidad como tercer número. |
forward(mm, v) turn(grados, w) | Las cuatro aceptan una velocidad como segundo número: de 140 a 500 mm/s al avanzar y de 120 a 360 °/s al girar. Sin ese número van a la velocidad máxima. |
last_move() | Cómo terminó el último movimiento: 'arrived' (llegó), 'obstacle' (algo delante), 'stuck' (no pudo avanzar: una rueda trabada o algo que lo sujeta), 'timeout' (no cerró el error), 'cancelled' (lo cortaron), 'sensors' (encoders y giroscopio no coinciden, o el sensor de distancia no responde) o 'not_found' (forward_until() avanzó su tope sin encontrar nada). |
# Un cuadrado de 30 cm de lado for lado in range(4): forward(300) # 300 mm: acelera, frena y llega turn(90) # 90 grados a la izquierda
if forward_until(200): # derecho hasta quedar a 20 cm de la pared print("quedé a", distance(), "mm") else: print("no llegué:", last_move()) # 'not_found': avanzó 2 m y no vio nada
arc(150, 360) # radio 150 mm, una vuelta a la izquierda: un círculo de 30 cm sleep_ms(400) arc(150, 360) # el ocho: una vuelta hacia la izquierda... arc(150, -360) # ...y otra hacia la derecha
Velocidad controlada en cada rueda
Cuando no hay una distancia fija ni un obstáculo al que llegar (dar vueltas mientras pasa algo, avanzar hasta que un sensor vea la línea) se le pide al robot una velocidad para cada rueda. El robot mide cada rueda mil veces por segundo y corrige el motor para sostenerla: 200 son 200 mm/s con la batería llena o gastada. Estas funciones no esperan: el programa sigue, y el robot sigue andando hasta que se le pida otra cosa. Por eso el programa necesita siempre una condición para terminar.
| Función | Qué hace |
|---|---|
drive(izq, der) | Cada rueda a esa velocidad en mm/s, hasta 1000; negativo es hacia atrás. drive(0, 0) frena. |
curve(v, radio) | Lo mismo, dicho como una curva: el centro del robot a v mm/s por un círculo de ese radio en milímetros. Radio positivo dobla a la izquierda; negativo, a la derecha. |
speed_left() speed_right() | La velocidad medida de cada rueda, en mm/s. |
position() | Dónde está el robot respecto de donde partió: (x, y) en milímetros, x hacia donde miraba al partir e y hacia su izquierda. Sale de los encoders y el giroscopio. |
track() | Los milímetros entre las dos ruedas: con ese número se saca la cuenta de cualquier curva. |
curve(200, 150) # el centro a 200 mm/s por un círculo de 15 cm de radio sleep(5) # cinco segundos dando vueltas drive(0, 0) # frena
Si el robot choca. Cuando las ruedas empujan y el robot no se mueve (chocó con algo, patina o está en el aire), el robot apaga los motores por su cuenta en cerca de un segundo y termina el programa. La plataforma lo avisa en el chat. Vale para todas las formas de moverlo, incluida motors().
Motores, señales y ajustes
| Función | Qué hace |
|---|---|
motors(izq, der) | Potencia directa a cada motor, sin control, de −100 a 100; positivo es adelante. Sirve para lazos que corrigen en cada vuelta, como seguir la línea. Acepta decimales. Con los ajustes de fábrica, el firmware ignora un mando menor que 5, sube a 20 los que van de 5 a 19 y limita a 75 los mayores. Si hay un obstáculo a menos de 6 cm, el supervisor retiene los motores. |
stop() | Detiene los motores. |
beep(hz, ms) | Suena el buzzer; el programa espera mientras suena. |
led(r, g, b) | Color del LED; cada componente va de 0 a 255. |
calibrate(ms) | Calibra los sensores con los motores girando; el programa espera mientras tanto. |
zero() | Pone en cero los milímetros recorridos y el rumbo y, si el robot está detenido, vuelve a medir el error de reposo del giroscopio. Se llama con el robot quieto. Cada vez que se pulsa Correr el robot parte de cero. |
sleep_ms(ms) sleep(s) | Espera, en milisegundos o en segundos. Se interrumpe al pulsar Parar en la plataforma o el botón del robot. |
Chat
| Función | Qué hace |
|---|---|
print(…) | Escribe una línea en el chat de la plataforma, como mensaje del robot. Acepta texto, números y listas, separados por comas: print("error", error). Dentro de un lazo rápido, escribe a lo más unas diez veces por segundo: el robot descarta lo que la página no alcanza a mostrar. |
No existe battery(): el robot no mide su batería.
Enviar el programa al robot
En la plataforma, pulsa Editor de código: se abre la hoja Mi programa. Escribe el programa o pídeselo a la IA y, con el robot conectado por WiFi, pulsa Enviar al robot. El programa queda guardado en el robot: sigue ahí aunque lo apagues. Para correrlo, pulsa Correr o el botón del robot.
Desde el chat es lo mismo: cada programa que escribe la IA trae su botón Enviar al robot, y al recibirlo el robot contesta con los botones Correr y Parar.
Reglamento Robotrace
Robotrace es una competencia en la que un robot autónomo recorre un circuito de línea blanca y compite en velocidad e inteligencia. El reglamento de referencia es «Rules for Robotrace», de la New Technology Foundation de Japón, en su versión del 1 de junio de 2024. Esto es un resumen: el número entre paréntesis es la regla.
El robot
- Es autónomo: salvo la operación de partida, no se lo controla desde afuera, ni por cable ni de forma inalámbrica (1-1).
- No se le agrega, quita ni cambia hardware o software durante la competencia; solo reparaciones menores (1-2).
- Su proyección sobre el piso cabe en un círculo de 25 cm de diámetro y no pasa de 20 cm de alto (1-3).
- No puede agregar fuerza adhesiva excesiva a las ruedas ni a otras partes para aumentar el contacto con el piso (1-4).
La pista
- Superficie negra y línea blanca de 1,9 cm de ancho; el recorrido mide hasta 60 m (2-1).
- Solo rectas y arcos. El radio mínimo es de 10 cm y entre dos cambios de curvatura hay 10 cm o más (2-2, 2-3).
- La línea puede cruzarse a sí misma, a 90° ± 5°, con 10 cm de recta antes y después del cruce (2-2, 2-4).
- Partida y meta van en una recta, con la meta 1 m detrás de la partida; sus marcas van a la derecha de la línea (2-5).
- Cada cambio de curvatura lleva una marca a la izquierda de la línea, en el sentido de carrera (2-8).
- El borde de la pista queda al menos a 20 cm del centro de la línea (2-10).
La corrida
- Cada competidor tiene 3 minutos y un máximo de 5 corridas; su tiempo oficial es la vuelta más rápida (3-2, 3-5).
- La proyección del robot tiene que cubrir la línea durante toda la corrida. Si la suelta por completo, o se detiene más de 2 segundos, el intento es fallido (3-1, 3-7).
- Al terminar, el robot se detiene solo dentro del área de partida y meta, y se queda quieto al menos 2 segundos. Si no queda entero dentro del área, el tiempo no se registra (3-4, 3-6).
- Con el trazado ya a la vista no se le entrega información de la pista al robot (3-8), ni se le cargan programas durante la competencia (atención 1).
En el robot
Open Lambda Core lee esas marcas con sus dos sensores laterales: mark_right() ve la partida y la meta, y mark_left(), los cambios de curvatura.
Japón y Chile
El All Chile Robot Contest publica su propio reglamento para la categoría, que cambia algunas medidas.
| Regla | Japón (NTF) | Chile (ACRC) |
|---|---|---|
| Tamaño del robot | Círculo de 25 cm de diámetro, 20 cm de alto | 25 × 25 × 20 cm |
| Ancho de la línea | 1,9 cm | 2,0 cm |
| Entre cambios de curvatura | 10 cm o más | 5 cm o más |
| Pórticos de partida y meta (ancho × alto) | 40 × 25 cm | 20 × 12,5 cm |
| Tiempo por competidor | 3 minutos | 5 minutos (regla 3-2) |
El reglamento chileno se contradice en el tiempo: su regla 3-2 da 5 minutos por competidor y su definición de la categoría habla de tres. Confírmalo con la organización antes de competir.