
🤖 TUTORIAL: CONTROL INALÁMBRICO DE CUTEBOT CON JOYSTICK BIT

1. Introducción y Concepto
En este proyecto, transformaremos tu micro:bit y un Joystick bit en un mando a distancia para el Cutebot. Usaremos la funcionalidad de radio de micro:bit para enviar coordenadas desde el joystick. El Cutebot recibirá estas coordenadas y calculará la velocidad exacta para cada motor para girar, avanzar o retroceder suavemente.
2. Material Necesario
- 1x Micro:bit (para el mando).
- 1x Elecfreaks Joystick bit V2 (el mando físico).
- 1x Cutebot (con su propio micro:bit instalado).
- Pilas/Baterías para ambos (Cutebot y Joystick bit).
- Cable USB para programar.
- Software MakeCode (online).
3. Explicación de la Lógica
El control se basará en dos programas independientes:
Mando (Emisor)
- Configuración de Radio: Ambos micro:bits deben estar en el mismo grupo de radio (un canal).
- Lectura del Joystick: El mando leerá continuamente los valores analógicos de los ejes X (izquierda-derecha) e Y (arriba-abajo) del joystick. El Joystick bit usa el Pin P1 para X y P2 para Y.
- Transmisión: Enviaremos estos dos números por radio como una “pareja de datos”: una “etiqueta” (ej. “X” o “Y”) y el valor medido.
Cutebot (Receptor)
- Configuración de Radio: El mismo grupo que el mando.
- Recepción: Cuando reciba un dato de radio con etiqueta “X” o “Y”, actualizará variables internas.
- Cálculo de Motores: En un bucle continuo, usará los valores recibidos para calcular las velocidades de los motores Izquierdo y Derecho. El algoritmo mezclará los valores Y (velocidad base) y X (diferencia de giro).
- Avanzar: Alta Y, baja X.
- Girar Derecha: Motores izquierdos rápidos, derechos lentos o quietos.
4. Montaje y Configuración (Joystick bit)
Este tutorial asume que estás usando el Joystick bit V2 de Elecfreaks, que simplifica mucho el cableado.
- Inserción: Inserta tu micro:bit (el emisor) en la ranura del Joystick bit con los LEDs hacia arriba.
- Alimentación: Asegúrate de que el Joystick bit tenga pilas (suelen usar 3x AAA o batería de litio integrada) y que el interruptor esté en ON. No confíes solo en la alimentación del micro:bit, el mando necesita energía para el transmisor de radio y el sensor del joystick.
5. El Código
Necesitas dos programas separados. Primero, añade las extensiones necesarias en MakeCode:
- En MakeCode para el Cutebot, busca y añade la extensión:
cutebot. - En MakeCode para el Mando, busca y añade la extensión:
joystickbit.
Código del Mando (Emisor)
Este código se carga en el micro:bit insertado en el Joystick bit.
Fragmento de código
// Configuración inicial al encender
radio.setGroup(7) // Usa el mismo número de grupo (1-255) en ambos
joystickbit.initJoystickBit() // Inicializa el hardware del Joystick bit
// Bucle principal continuo
basic.forever(function () {
// Lee los valores analógicos de los ejes
// Estos valores suelen ir de 0 a 1023, con 512 en el centro.
let valorX = joystickbit.getRockerValue(joystickbit.rockerType.X)
let valorY = joystickbit.getRockerValue(joystickbit.rockerType.Y)
// Envia los valores por radio con etiquetas
radio.sendValue("X", valorX)
radio.sendValue("Y", valorY)
// Un pequeño retraso para no saturar la radio
basic.pause(50)
})
Código del Cutebot (Receptor)
Este código se carga en el micro:bit instalado dentro del Cutebot.
Fragmento de código
let velocidadBase = 0
let giroDiferencial = 0
// Configuración inicial al encender
radio.setGroup(7) // Debe ser el MISMO grupo que el mando
cutebot.stopCar() // Asegura que empiece parado
// Evento de recepción de datos por radio
radio.onReceivedValue(function (name, value) {
if (name == "X") {
giroDiferencial = value
} else if (name == "Y") {
velocidadBase = value
}
})
// Bucle principal continuo para mover motores
basic.forever(function () {
// Algoritmo de mezcla para calcular velocidades de motor individuales.
// Mapea los valores analógicos (0-1023) a porcentajes de motor (-100 a 100)
// Convierte Y (0-1023) en -100 (retroceder) a 100 (avanzar)
let motorPowerY = Math.map(velocidadBase, 0, 1023, -100, 100)
// Convierte X (0-1023) en -50 (girar izquierda) a 50 (girar derecha)
// El rango de giro es menor para mejor control.
let motorTurnX = Math.map(giroDiferencial, 0, 1023, -50, 50)
// Mezcla Y y X para cada motor
let motorLeftSpeed = motorPowerY + motorTurnX
let motorRightSpeed = motorPowerY - motorTurnX
// Asegura que las velocidades no superen -100 o 100
motorLeftSpeed = Math.constrain(motorLeftSpeed, -100, 100)
motorRightSpeed = Math.constrain(motorRightSpeed, -100, 100)
// Aplica las velocidades a los motores
cutebot.motors(motorLeftSpeed, motorRightSpeed)
})
6. Resultado y Calibración
- Enciende el Mando.
- Enciende el Cutebot.
- Usa el joystick:
- Mueve hacia arriba: El Cutebot avanza.
- Mueve hacia abajo: El Cutebot retrocede.
- Mueve hacia la derecha: El Cutebot gira a la derecha (motor izquierdo más rápido).
- Mueve hacia arriba y a la derecha: El Cutebot avanza curvando a la derecha.
Solución de Problemas (Calibración)
- El Cutebot se mueve solo cuando el joystick está centrado: Los joysticks analógicos rara vez están exactamente a 512 en el centro. Necesitas añadir una “zona muerta” en el código del mando. Antes de enviar
radio.sendValue, verifica si el valor está cerca de 512.if (Math.abs(valorX - 512) < 20) { valorX = 512 }(Repetir para Y).
- Las direcciones están invertidas: Si mover hacia arriba lo hace retroceder, simplemente invierte la lógica del mapeo en el receptor. Cambia
Math.map(velocidadBase, 0, 1023, -100, 100)aMath.map(velocidadBase, 0, 1023, 100, -100). - No se mueven: Verifica que el grupo de radio (
radio.setGroup) sea idéntico y que ambos micro:bits tengan suficiente energía de sus respectivas baterías.
Kirill Stepchenkov y Gonzalo Ruiz
Etiqueta:ies monterroso, steam, tic

