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.
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.
- D13 del UNO → resistencia de 330 Ω.
- Otro extremo de la resistencia → ánodo del LED, la pata larga.
- 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
- Descarga
morse-led.inoy ábrelo en el IDE de Arduino. Acepta crear una carpeta con el mismo nombre si el IDE lo pide. - Conecta el UNO por USB. Selecciona la placa Arduino UNO y el puerto correspondiente.
- Verifica y sube el programa. Después de una pausa inicial de un segundo, el LED emite SOS una vez y queda apagado.
- 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.
| Evento | Unidades | Duración |
|---|---|---|
| Punto encendido | 1 | 120 ms |
| Raya encendida | 3 | 360 ms |
| Entre señales | 1 | 120 ms |
| Entre letras | 3 | 360 ms |
| Entre palabras | 7 | 840 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.