Hace un tiempo estaba jugando con el Arduino IDE y una placa Arduino Nano. Me puse a cargar ejemplos y ver qué podía hacer de simple pero útil para radio. Partí del famoso ejemplo Blink, ese que hace parpadear el LED de la placa, y lo llevé un poco más lejos: me hice una baliza CW que transmite un mensaje en código Morse.
¿Qué hace este proyecto?
Básicamente, usa un buzzer piezoeléctrico y un LED para transmitir un mensaje en CW (código Morse) de manera cíclica. Podés usarlo como baliza, para probar propagación, o simplemente para experimentar con algo fácil y radialmente útil.
Pines que uso
Primero defino los pines:
// Pines
const int BUZZER_PIN = 9;
const int LED_PIN = 13;
- El buzzer piezo va en el pin digital 9.
- El LED es el integrado en la placa (pin 13), así que lo aproveché también para que se encienda en cada “punto” o “raya”.
Parámetros configurables
Después vienen algunos parámetros útiles para ajustar el comportamiento:
// Parámetros
const int toneFreq = 700; // Tono CW en Hz (No me acuerdo cuál usaba y era el correcto… Averiguar o probar.)
const int wpm = 10; // Velocidad en palabras por minuto
const char* message = “LU1VJK FE48HV 1W TEST”; // Texto que ponemos para que tire la baliza
toneFreq
: frecuencia del tono CW, normalmente se usa entre 600 y 800 Hz.wpm
: palabras por minuto. Cuanto más alto, más rápido transmite.message
: es el texto que querés que repita la baliza. En mi caso: indicativo, grid locator, potencia y una etiqueta de prueba.
Tiempos de los elementos Morse
Acá se calculan los tiempos típicos del CW en base a la velocidad (wpm):
// Cálculo de tiempos en ms
const int ditTime = 1200 / wpm; // Punto
const int dahTime = 3 * ditTime; // Raya
const int intraCharSpace = ditTime; // Entre puntos/rayas
const int interCharSpace = 3 * ditTime; // Entre letras
const int wordSpace = 7 * ditTime; // Entre palabras
Los tiempos están expresados en milisegundos, siguiendo la convención de que una palabra promedio (“PARIS”) tiene 50 elementos. De ahí sale la fórmula.
Tabla Morse
Acá defino una tabla con los caracteres A-Z y 0-9 en Morse. Se usa después para traducir el mensaje:
// Armo la tabla Morse (A-Z + 0-9)
const char* morseTable[] = {
“.-“, “-…”, “-.-.”, “-..”, “.”, “..-.”, “–.”, “….”, “..”, // A-I
“.—“, “-.-“, “.-..”, “–“, “-.”, “—“, “.–.”, “–.-“, “.-.”, // J-R
“…”, “-“, “..-“, “…-“, “.–“, “-..-“, “-.–“, “–..”, // S-Z
“—–“, “.—-“, “..—“, “…–“, “….-“, “…..”, “-….”, // 0-6
“–…”, “—..”, “—-.” // 7-9
};
Función setup()
Arranca configurando los pines como salida, y le da un pequeño delay inicial para estabilizar todo antes de empezar a transmitir:
void setup() {
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
delay(2000); // Le doy un delay inicial para estabilizar
}
Función loop()
Es el corazón del ciclo: transmite el mensaje, espera un rato, y repite:
void loop() {
sendMorse(message);
delay(10000); // Acá le doy el valor de cada cuanto se repite. EN este caso repite cada 10 segundos
}
Podés cambiar el delay para que lo repita más o menos seguido.
Función sendMorse()
Esta función convierte el texto a Morse y lo manda por el buzzer y el LED:
void sendMorse(const char* text) {
for (int i = 0; text[i] != ‘\0’; i++) {
char c = toupper(text[i]);
if (c == ‘ ‘) {
delay(wordSpace);
} else {
const char* morse = getMorse(c);
if (morse != nullptr) {
for (int j = 0; morse[j] != ‘\0’; j++) {
if (morse[j] == ‘.’) {
playTone(ditTime);
} else if (morse[j] == ‘-‘) {
playTone(dahTime);
}
delay(intraCharSpace);
}
delay(interCharSpace – intraCharSpace);
}
}
}
}
Hace todo: convierte cada letra, lee su versión Morse y toca el tono correspondiente. También gestiona los espacios entre letras y palabras.
Función playTone()
Se encarga de hacer sonar el buzzer y prender el LED por el tiempo indicado (punto o raya):
void playTone(int duration) {
tone(BUZZER_PIN, toneFreq, duration);
digitalWrite(LED_PIN, HIGH);
delay(duration);
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN);
}
Función getMorse()
Esta es la que busca en la tabla qué código Morse corresponde a cada letra o número:
const char* getMorse(char c) {
if (c >= ‘A’ && c <= ‘Z’) return morseTable[c – ‘A’];
if (c >= ‘0’ && c <= ‘9’) return morseTable[c – ‘0’ + 26];
return nullptr;
}
Conclusión
Un proyecto simple, barato y útil. Ideal para experimentar con CW, hacer pruebas de propagación o dejar una baliza tirando mientras te vas a buscar a la vuelta un growler de IPA. También se puede usar con un módulo de RF o interfaz de audio si querés transmitirlo por radio real.
¿Querés el archivo listo para subirlo al Arduino? ¿Te gustaría que agregue una versión con control por botón o que cambie el mensaje por puerto serie? ¡Escribime!
LU1VJK
barilochemesh.com.ar
Deja un comentario