← Índice Valentina Tech
Misión 6 · Bitácora de Misiones · Astra-7

Contacto con la otra nave

El sonar de la Astra-7 detecta otra nave hundida en el fondo del océano de K-342. El cadete toma un carrete de cable de la bodega y lo lleva caminando por el suelo marino hasta la otra nave, para comunicar las dos placas con mensajes de luz y notas musicales.

🎯 Tu misión

Comunicar dos placas por un cable para que se manden un mensaje de 10 valores: quien
envía lo "canta" primero con luz y música, lo transmite por el cable, y la otra nave lo
recibe y lo repite igualito. Todo con la misma máquina de estados del Laboratorio 6.

🎨 Ficha técnica (valores exactos)

Los 10 colores (arreglo colores, uno por cada valor):

Están ordenados para que valores vecinos salgan de colores bien distintos (no un
arcoíris que va cambiando de a poquito):

valor color RGB valor color RGB
0 🔴 rojo (255, 0, 0) 5 🩵 cian (0, 255, 255)
1 🟢 verde (51, 255, 0) 6 🟣 morado (204, 0, 255)
2 🔵 azul (0, 102, 255) 7 🟠 naranja (255, 153, 0)
3 🩷 rosa (255, 0, 153) 8 💚 esmeralda (0, 255, 102)
4 🟡 limón (204, 255, 0) 9 💙 añil (51, 0, 255)

Las 10 notas (arreglo notas, do re mi fa sol la si + do re mi de la siguiente octava):

valor nota Hz valor nota Hz
0 do 262 5 la 440
1 re 294 6 si 494
2 mi 330 7 do↑ 523
3 fa 349 8 re↑ 587
4 sol 392 9 mi↑ 659

Otros valores: Brillo = 0.2 · Tiempo por LED/nota = 0.5 s · Valores por mensaje = 10
(cada uno del 0 al 9) · Marcas del protocolo: Start = 170, End = 85.

🧠 La idea: la misma máquina de estados del Lab 6

Esto es el proyecto final del Laboratorio 6, pero en vez de mandar un color, las placas
se mandan un mensaje de 10 valores que suena como una pequeña melodía. La máquina es
una sola, igual en las dos placas, con cuatro estados:

🗺️ El diagrama de estados

Cada burbuja es un estado y cada flecha dice qué evento la dispara. La rama
ámbar es la placa que envía; la turquesa la que recibe. Es la misma máquina en
las dos.

inicio presionaBotón A envíaStart envíaEnd recibeStart recibeEnd envíavalor[i] recibevalor[i] Escuchando Preparando genera 10 valores,prende su LEDy toca su nota Enviando Recibiendo al recibir los 10,prende su LEDy toca su nota
Rama ámbar = la placa que envía; rama turquesa = la que recibe. Es la misma máquina en las dos.

🔗 Conecta las dos naves (tres cablecitos)

Necesitas dos placas y tres caimanes (cables con pinza). Une tres pads del borde de
una placa con los de la otra, cruzando TX y RX:

Placa 1 Placa 2
pad TX → pad RX
pad RX → pad TX
pad GND → pad GND

El que habla en una placa (TX) tiene que ir al que escucha en la otra (RX). El
cable de GND une el "cero" de las dos placas para que se pongan de acuerdo en qué es un 0
y qué es un 1. Sin él, el mensaje llega hecho un revoltijo.

🧱 Dale cuerpo a la nave: las dos naves

Marca cuál placa es cada nave para no confundirte al mandar los mensajes.

💡 Ideas de material

🛠️ Cómo hacerlo (paso a paso)

  1. En una hoja escribe "Astra-7" y en la otra "Desconocida".
  2. Pon una placa CPX arriba de cada hoja.
  3. Conéctalas con sus tres cables (TX↔RX cruzados y GND↔GND) y manda un mensaje de una a la otra.

💻 El programa, estado por estado

No lo escribas todo de golpe. Tu profe te dará el esqueleto Mision6Alumno.py: ya trae el
encabezado (los import, las listas colores y notas, las marcas START/END y
estado = "escuchando"), el while y los cuatro estados vacíos con un pass adentro. Tu
trabajo es llenar el hueco de cada estado (donde dice pass) con el código de abajo.
Hazlo uno por uno y prueba entre cada paso. El mismo programa va en las dos placas.

💡 colores y notas son dos listas de 10. El valor es la posición en la lista, así
que colores[valor] te da su color y notas[valor] su nota.

🟢 Estado: Escuchando

La placa espera. Si aprietas el Botón A, tú vas a mandar el mensaje; si te llega un
Start por el cable, te toca recibir. En el hueco de escuchando escribe:

if cp.button_a:                     # Boton A: yo mando el mensaje
    estado = "preparando"
    print("EVENTO: Boton A -> preparando")
    while cp.button_a:
        time.sleep(0.01)
else:
    marca = uart.read(1)            # me hablan: leo una marca del cable
    if marca and marca[0] == START:
        estado = "recibiendo"
        print("EVENTO: llego Start -> recibiendo")

🟠 Estado: Preparando

Inventa 10 valores al azar y "canta" cada uno: prende solo su LED con su color y toca
su nota medio segundo. Al terminar, pasa a Enviando. En el hueco de preparando escribe:

valores = []
for i in range(10):
    valores.append(random.randint(0, 9))
for valor in valores:               # los muestra uno a uno
    cp.pixels.fill((0, 0, 0))
    cp.pixels[valor] = colores[valor]       # prende SOLO ese LED con su color
    cp.play_tone(notas[valor], 0.5)         # suena 1/2 s (el LED sigue prendido)
cp.pixels.fill((0, 0, 0))
estado = "enviando"

🟠 Estado: Enviando

Manda todo por el cable de un jalón: Start + los 10 valores + End (son 12 números). Luego
vuelve a Escuchando. En el hueco de enviando escribe:

uart.write(bytes([START] + valores + [END]))
print("Envie:", valores)
estado = "escuchando"
print("---> Estado: escuchando")

🩵 Estado: Recibiendo

Llegó un Start. Lee los 10 valores y la marca End, y repite el mensaje con la misma
luz y sonido que el emisor. En el hueco de recibiendo escribe:

datos = uart.read(10)               # el DATO: los 10 valores
if datos and len(datos) == 10:      # cuando YA llegaron los 10...
    uart.read(1)                    # la marca de End
    print("Recibi:", list(datos))
    for valor in datos:             # los repite igual que el emisor
        cp.pixels.fill((0, 0, 0))
        cp.pixels[valor] = colores[valor]
        cp.play_tone(notas[valor], 0.5)
    cp.pixels.fill((0, 0, 0))
estado = "escuchando"
print("---> Estado: escuchando")

🧩 Cuando llenes los cuatro huecos, tu programa queda completo: es la misma máquina de
estados del diagrama, ahora hablando entre dos naves.

🎯 Pruébalo con la otra nave

  1. Conecta las dos placas con los tres cables (TX↔RX cruzados y GND↔GND).
  2. Carga este mismo programa en las dos placas y ábreles la consola serial.
  3. Aprieta el Botón A en una: verás correr una lucecita de colores mientras suena una
    pequeña melodía de 10 notas. Eso es el mensaje que inventó.
  4. En cuanto termina, la otra nave repite la misma melodía y los mismos colores. ✨
    ¡Le pasó el mensaje por el cable!
  5. Ahora aprieta el Botón A en la otra placa: los papeles se invierten (es la misma máquina).

⚠️ ¿La otra nave no repite nada? Revisa que TX y RX estén cruzados y que el GND
esté conectado. Si sale un error al arrancar, revisa que llenaste bien el hueco de cada
estado (la sangría cuenta).

🌟 Si quieres ir más allá (reto opcional)

✅ Misión cumplida cuando…

🏅 Insignia: "Primer contacto". ¡Ya no estás sola/o en K-342! 📡

Valentina Tech · Circuit Playground Express · CircuitPython