[Apéndice] Transmisor de código Morse

Este es un proyecto relativamente sencillo y entretenido que puede ser un buen ejemplo de diseño de código o como aproximación a la forma de afrontar un problema con descomposición despreocupada.

Se trata de lo siguiente:

Tenemos un circuito muy simple enchufado a nuestro ordenador (por ejemplo una Raspberry Pi, Arduino, BeagleBone... o incluso un PC o cualquier otro ordenador) que consiste básicamente en un único LED conectado a un cierto pin de salida. Es decir, que tenemos una bombilla que podemos controlar su encendido y apagado simplemente poniendo una salida a 1 o a 0. No hace gran cosa (como un ornitorrinco), pero se nos ocurre que un uso simpático que se le puede dar es el que emitir código Morse.

Para hacernos la vida un poco más sencilla, a la vez que darle algo de contenido al proyecto, lo que nos planteamos es hacer un sistema en el que nosotros introduzcamos -de algún modo- texto, el sistema haga la conversión a Morse, de Morse haga la conversión a 1s y 0s y luego la emita por el LED.

Hay algunas reglas para traducir un código Morse a una secuencia de luz o de sonido. Son estas:

  • 1 significa LED encendido, 0 LED apagado.
  • La unidad básica de tiempo es la que queramos establecer. Podemos decir, por ejemplo, que es 0.1s o que es 1s.
  • Un punto (.) se representa con un uno: 1, es decir tiene una duración de 1 unidad de tiempo. Un guion (-) dura el triple que un punto y por tanto se representa con tres unos: 111.
  • Dentro de una misma letra, cada símbolo (punto o guion) se separa con una unidad de tiempo de apagado, es decir: un cero 0.
  • Dentro de una palabra, cada letra se separa con tres unidades de tiempo apagado, por tanto: 3 ceros 000.
  • Dentro de una frase, cada palabra se separa con siete unidades de tiempo apagado. Así, 7 ceros 0000000.

Aplicando estas reglas, tendríamos por ejemplo que Hola chaval se traduciría así:

Texto: h o l a c h
Morse: .... --- .-.. .- -.-. ....
Secuencia: 1010101 000 11101110111 000 101110101 000 10111 0000000 11101011101 000 1010101 ...etc...
Resultado final: 101010100011101110111000101110101000101110000000111010111010001010101...etc...

En principio, el problema de software que planteamos va a incluir hasta aquí, hasta generar la secuencia de unos y ceros. Idealmente, un lector entusiasta, montaría realmente el circuito y haría que el LED se encendiera de verdad ;)

Si no contamos con un LED y una placa de este tipo que tenga pines de entrada y salida, una alternativa puede ser hacer que la propia pantalla de nuestro ordenador parpadee en blanco (1) y negro (0). Es... como un LED gigante xD


En el otro lado, el lado del receptor, tenemos un sistema parecido. En lugar de un LED emisor, tendremos algún tipo de sensor que detecte la luz. Para lectores entusiastas: hay bastantes formas de hacer esto. Hay varios tipos de sensores (LDR, fotodiodo, ...) y podríamos incluso utilizar una webcam si la tenemos ya por ahí.

Así que con el detector recibimos el mensaje codificado en Morse, lo traduciremos y mostraremos el texto en pantalla. Es sencillamente el proceso inverso al anterior.

Como es lógico, podemos juntar ambas partes en un mismo sistema emisro+receptor y construir una pareja de sistemas, de modo que obtendríamos comunicación en ambas direcciones. Esto tiene alguna complicación mecánica, pero es un proyecto divertido. En cualquier caso, esto no añade más programación al proyecto.

Igualmente podríamos sustituir LEDs y fotocélulas por altavoces y micrófonos y transmitir con sonido en lugar de con luz.


Es interesante tener a mano un alfabeto Morse, así que lo dejo aquí:

{
    "0": "-----",
    "1": ".----",
    "2": "..---",
    "3": "...--",
    "4": "....-",
    "5": ".....",
    "6": "-....",
    "7": "--...",
    "8": "---..",
    "9": "----.",
    "a": ".-",
    "b": "-...",
    "c": "-.-.",
    "d": "-..",
    "e": ".",
    "f": "..-.",
    "g": "--.",
    "h": "....",
    "i": "..",
    "j": ".---",
    "k": "-.-",
    "l": ".-..",
    "m": "--",
    "n": "-.",
    "o": "---",
    "p": ".--.",
    "q": "--.-",
    "r": ".-.",
    "s": "...",
    "t": "-",
    "u": "..-",
    "v": "...-",
    "w": ".--",
    "x": "-..-",
    "y": "-.--",
    "z": "--..",
    ".": ".-.-.-",
    ",": "--..--",
    "?": "..--..",
    "!": "-.-.--",
    "-": "-....-",
    "/": "-..-.",
    "@": ".--.-.",
    "(": "-.--.",
    ")": "-.--.-"
}