Proyecto con LED

Código Morse con Arduino

Haz que un Arduino UNO R3 transmita un mensaje con su LED. Empieza con SOS, cambia el texto y comprueba las pausas; el programa completo está listo para descargar.

Descargar código .ino

Archivo completo para el IDE de Arduino; sin bibliotecas adicionales.

Ver el programa completo
// Codigo Morse: emisor LED para Arduino UNO R3.
// A-Z, a-z, 0-9 y espacios. No requiere bibliotecas adicionales.
const byte LED_PIN = LED_BUILTIN;
const unsigned int DOT_MS = 120; // 10 WPM: 1200 / 10
const char MESSAGE[] = "SOS";

const char* const LETTERS[] = {
  ".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..",
  ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.",
  "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."
};
const char* const DIGITS[] = {
  "-----", ".----", "..---", "...--", "....-",
  ".....", "-....", "--...", "---..", "----."
};

const char* codeFor(char character) {
  if (character >= 'a' && character <= 'z') character -= 'a' - 'A';
  if (character >= 'A' && character <= 'Z') return LETTERS[character - 'A'];
  if (character >= '0' && character <= '9') return DIGITS[character - '0'];
  return nullptr;
}

void sendLetter(const char* code) {
  for (unsigned int i = 0; code[i] != '\0'; ++i) {
    if (i > 0) delay(DOT_MS); // Pausa entre senales de una letra: 1 unidad.
    digitalWrite(LED_PIN, HIGH);
    delay(code[i] == '.' ? DOT_MS : 3UL * DOT_MS);
    digitalWrite(LED_PIN, LOW);
  }
}

bool sendMessage(const char* message) {
  // Valida todo antes de emitir: un caracter no admitido cancela el mensaje.
  bool hasCharacter = false;
  for (unsigned int i = 0; message[i] != '\0'; ++i) {
    if (message[i] == ' ') continue;
    if (codeFor(message[i]) == nullptr) return false;
    hasCharacter = true;
  }
  if (!hasCharacter) return false;

  bool sent = false;
  unsigned int gap = 0;
  for (unsigned int i = 0; message[i] != '\0'; ++i) {
    if (message[i] == ' ') {
      if (sent) gap = 7; // Pausa entre palabras: 7 unidades en total.
      continue;
    }
    if (sent) delay(static_cast<unsigned long>(gap) * DOT_MS);
    sendLetter(codeFor(message[i]));
    sent = true;
    gap = 3; // Pausa entre letras: 3 unidades en total.
  }
  return true; // No anade una pausa de letra al final.
}

void setup() {
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, LOW);
  Serial.begin(9600);
  delay(1000);
  if (!sendMessage(MESSAGE)) {
    Serial.println("Usa solo A-Z, 0-9 y espacios; sin tildes ni signos.");
  }
}

void loop() {
  // Una sola transmision. Pulsa RESET para repetir.
}

Prepara la placa

Materiales y circuito

Para empezar necesitas un Arduino UNO R3 y un cable USB de datos. El LED integrado, marcado con L, ya tiene su circuito: no hace falta añadir un LED ni una resistencia. El programa usa LED_BUILTIN, que en el UNO R3 corresponde a D13.

Para montar la versión externa, añade un LED rojo, una resistencia de 330 Ω, una protoboard y cables de conexión. Desconecta el USB mientras montas el circuito.

Conexión externa opcional, en serie
  1. D13 del UNO → resistencia de 330 Ω.
  2. Otro extremo de la resistencia → ánodo del LED, la pata larga.
  3. Cátodo del LED, la pata corta o lado plano → GND.

Con un LED rojo de unos 2 V, la corriente estimada es (5 − 2) / 330 ≈ 9 mA. Conserva la resistencia en serie. Esta conexión es para un LED pequeño; no conectes un altavoz, una lámpara o una carga de potencia al pin.

La documentación oficial de Blink explica el LED integrado y la conexión con resistencia. Consulta también la ficha del UNO R3. Aquí elegimos 330 Ω para el montaje opcional con LED rojo.

Programa el mensaje

Carga el código y cambia el mensaje

  1. Descarga morse-led.ino y ábrelo en el IDE de Arduino. Acepta crear una carpeta con el mismo nombre si el IDE lo pide.
  2. Conecta el UNO por USB. Selecciona la placa Arduino UNO y el puerto correspondiente.
  3. Verifica y sube el programa. Después de una pausa inicial de un segundo, el LED emite SOS una vez y queda apagado.
  4. Para repetir, pulsa RESET. Para cambiar el mensaje, edita MESSAGE, por ejemplo "HOLA 2026", y vuelve a subirlo.

El programa acepta A–Z, minúsculas, 0–9 y espacios. Escribe Ñ como N y elimina tildes. Un carácter no admitido cancela todo el mensaje; abre el monitor serie a 9600 baudios para leer el aviso. No se eliminan símbolos a escondidas ni se transmite una frase incompleta.

DOT_MS = 120 equivale a 10 WPM con espaciado estándar. Para practicar más despacio, usa 240 ms, es decir, 5 WPM. El programa usa delay(): mientras emite no atiende otras tareas. Es una introducción con LED, no un receptor que descifre sonido ni un sistema de comunicación de emergencia.

Verifica el ritmo

Comprueba puntos, rayas y pausas

La relación es 1:3 para punto y raya. Las pausas se cuentan completas: no sumes una pausa de símbolo a otra de letra.

Tiempos con DOT_MS = 120
EventoUnidadesDuración
Punto encendido1120 ms
Raya encendida3360 ms
Entre señales1120 ms
Entre letras3360 ms
Entre palabras7840 ms

El ejemplo escribe tres letras: ... --- .... Contiene nueve encendidos y dura 3.240 ms desde el primer punto hasta el final del último. No añade silencio al final. El SOS de socorro también puede emitirse como un bloque continuo; consulta esa diferencia en SOS en código Morse.

Validación del proyecto: comprobamos por simulación lógica el código descargable, la tabla de 36 caracteres, los tiempos y la cancelación de mensajes no válidos. La compilación para UNO se registra en la verificación del proyecto. No hemos probado aquí un montaje físico; el brillo, la polaridad y las conexiones deben comprobarse en tu placa.

Los caracteres y las proporciones temporales siguen ITU-R M.1677-1. Puedes consultar cada letra en el abecedario Morse y preparar un mensaje con el traductor.

Resuelve los fallos

Si el LED no responde

El programa no se carga

Comprueba la placa y el puerto seleccionados, prueba un cable USB que transmita datos y cierra otros programas que usen ese puerto. Antes de montar el LED externo, carga el ejemplo Blink oficial para verificar la placa.

El LED integrado funciona, pero el externo no

Desconecta la alimentación y revisa D13, GND, la resistencia en serie y la polaridad del LED. Dos agujeros próximos de la protoboard no siempre comparten conexión.

El LED emite una vez y se detiene

Es el comportamiento previsto. La transmisión está en setup() y loop() queda vacío. Pulsa RESET para repetir sin convertirlo en un parpadeo permanente.

¿Puede descifrar audio o usar un zumbador?

Este programa solo emite con LED. Un receptor necesita entrada de señal y detección de tiempos; un zumbador requiere elegir el tipo y circuito adecuados. Para leer un archivo de tonos, usa el decodificador de audio del navegador.