Foros GRG
Baliza con Arduino nano - Versión para impresión

+- Foros GRG (https://foros.radiogalena.es)
+-- Foro: Radioafición (https://foros.radiogalena.es/forumdisplay.php?fid=7)
+--- Foro: Electrónica y Reparaciones (https://foros.radiogalena.es/forumdisplay.php?fid=12)
+--- Tema: Baliza con Arduino nano (/showthread.php?tid=391)



Baliza con Arduino nano - EA1IMW - 10-08-2019

Con motivo de las pruebas de radiogoniometría, que se están a punto de celebrar en mi comunidad, me he puesto a trabajar para montar una baliza que facilite este tipo de pruebas.

La idea es crear una baliza que opere de forma automática los equipos de radio sin necesidad de un operador físico. Entre las características que debe de tener se encuentra, como característica principal, que sea fácil de programar, que el tamaño sea lo más pequeño posible y lo más barato posible. Y como no podía ser de otra forma, lo más económico y que es capaz de cumplir con los requisitos es el famoso Arduino, en este caso el modelo NANO.

Pues bien, una vez decidido, lo primero de todo es crear un pequeño circuito que hará de interface entre el Arduino y nuestros equipos de radio. Es tan sencillo como colocar un par de optoacopladores (uno para TX y otro para RX), tres resistencias y un led que indicará el estado de nuestra baliza y que se iluminará a la vez que emite el mensaje en CW.

Lo ideal sería realizar este circuito del tamaño justo para conectarlo al Arduino a través de sus pines de conexión. Esta tarea no será difícil debido a los escasos componentes que vamos a utilizar... Como placa podemos utilizar una multiperforada.

Veamos el circuito:

   

Solo utilizaremos cuatro salidas digitales (D4 - D5 - D7 - D13) y la conexión "vin(+)" y "GND(-)" de nuestro Arduino. Los últimos para conectar una pila de 9 voltios. Debemos conectarlo todo según el esquema de arriba. En la salida de audio, es decir, en el pin D7, es necesario colocar una pequeña resistencia variable para ajustar el nivel de tono a la entrada de audio de los equipos donde se va a conectar.

Os muestro un vídeo de como lo he realizado yo y como ha quedado para daros una idea:



Continuamos cargando el código a nuestro Arduino para que se porque tal y como queremos. No voy a profundizar como hacerlo ya que existen muchos tutoriales para ello.

El código podéis descargarlo desde aquí:
Código:
// Simple CW Beacon
// by Charlie Davy M0PZT  www.m0pzt.com
// 23rd December 2014

int pinPTT = 4;
int pinRX = 5;
int pinPTTSignalLed = 6;
int MorseLEDPin = 13;
int MorseTonePin = 7;
int MorseToneFreq = 800; //Aquí ajustamos el tono
int MorseWPM = 20; //Aquí las pulsaciones por minuto
double MorseLoopTime = 60000; //Aquí ponemos el tiempo entre emisiones en milisegundos
#define strBeacondID "EA1UVR/EA1RCG EN SEGUNDA CACERIA MIXTA DE ASTURIAS K" //Y aquí el mensaje que se va a emitir

// Bung Morse into an array
char* MorseCodeCharacters[] = {
"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","--..",
"0","-----",
"1",".----",
"2","..---",
"3","...--",
"4","....-",
"5",".....",
"6","-....",
"7","--...",
"8","---..",
"9","----.",
"/","-..-.",
"*","-.-.-",
".",".-.-.",
"&","...-.-",
" "," "
};
 
// ----------------------------------------------------------------------------------------


void setup() {
 char str[12];
 Serial.begin(9600);
 pinMode(pinPTT, OUTPUT);
 pinMode(MorseLEDPin, OUTPUT);
 pinMode(MorseTonePin, OUTPUT);
 Serial.println("EA1IMW CW BEACON");
 Serial.println();
 digitalWrite(MorseLEDPin, LOW);
 delay(1000);
 digitalWrite(MorseLEDPin, HIGH);
 delay(1000);
 digitalWrite(MorseLEDPin, LOW);
 delay(1000);
 digitalWrite(MorseLEDPin, HIGH);
 delay(1000);
 digitalWrite(MorseLEDPin, LOW);
 delay(1000);
 digitalWrite(MorseLEDPin, HIGH);
 //Serial.println("Configuración:");
 Serial.print("T:" );Serial.print(MorseToneFreq);Serial.print("H ");
 Serial.print("W:" );Serial.print(MorseWPM);Serial.println("PPM ");
 Serial.print("TIME:" );Serial.print(MorseLoopTime/1000);Serial.print(" segundos");
 Serial.println();
 //Serial.println("Estado: en RX... ");
 delay(10000);
}

 void TransmitMorse(String MorseString, int MorseWPM,int MorseToneFreq) {
 int CWdot = 1200 / MorseWPM;
 int CWdash = (1200 / MorseWPM)*3;
 int istr;
 for (istr=0; istr < MorseString.length(); istr++) {
   String currentchar = MorseString.substring(istr,istr+1);
   Serial.print(currentchar);
   int ichar = 0;
   while(ichar < sizeof(MorseCodeCharacters)) {
     String currentletter = MorseCodeCharacters[ichar];   // letter
     String currentcode = MorseCodeCharacters[ichar+1];   // corresponding morse code
     if (currentletter.equalsIgnoreCase(currentchar)) {
       int icp=0;
       for (icp=0;icp < currentcode.length(); icp++) {
         // Transmit Dit
         if (currentcode.substring(icp,icp+1).equalsIgnoreCase(".")) {
           digitalWrite(MorseLEDPin, HIGH);
           tone(MorseTonePin, MorseToneFreq);
           delay(CWdot);
           digitalWrite(MorseLEDPin, LOW);
           noTone(MorseTonePin);
           delay(CWdot);
         }
         // Transmit Dah
         else if (currentcode.substring(icp,icp+1).equalsIgnoreCase("-")) {
           digitalWrite(MorseLEDPin, HIGH);
           tone(MorseTonePin, MorseToneFreq);
           delay(CWdash);
           digitalWrite(MorseLEDPin, LOW);
           noTone(MorseTonePin);
           delay(CWdot);
         }
         else if (currentcode.substring(icp,icp+1).equalsIgnoreCase(" ")) {
           delay(CWdot*3);
         };
         }
       }
       ichar=ichar+2;
    }
     delay(CWdot*3);
     }    
   delay(CWdot*7);
 }

void loop() {
 digitalWrite(pinRX, LOW);
 digitalWrite(pinPTT, HIGH);
 digitalWrite(pinPTTSignalLed, HIGH);
 digitalWrite(MorseLEDPin, HIGH);
 Serial.println();
 Serial.println("Estado: en TX... ");
 digitalWrite(MorseLEDPin, LOW);
 TransmitMorse(strBeacondID, MorseWPM, MorseToneFreq);
 digitalWrite(pinPTT, LOW);
 digitalWrite(pinPTTSignalLed, LOW);
 Serial.println("");
 Serial.println("Estado: en RX... ");
 digitalWrite(pinRX, HIGH);
 digitalWrite(MorseLEDPin, HIGH);
 Serial.print(MorseLoopTime/1000);Serial.print(" segundos");
 delay(MorseLoopTime);
}

El código es una modificación del creado por el compañero M0PZT.

Del código hay poco que decir, simplemente, como vemos en la imagen inferior, existen unos campos que podemos modificar para que la baliza se adapte a lo que buscamos. Entre estos campos, podemos modificar el tono de la baliza, el tiempo entre emisiones, las pulsaciones por minuto y por supuesto el mensaje que emitirá.

   

El funcionamiento es de la siguiente manera: una vez montado y cargado el código, en cuanto le suministramos alimentación al sistema, este iluminará el led dos veces y a la tercera quedará iluminado indicando la carga del programa y nos advertirá que esta preparado para emitir nuestra configuración. Atendiendo al temporizado que le hemos administrado en el programa, el led se apagará, pondrá el equipo en TX y se volverá a encender siguiendo el patrón del mensaje en CW; una vez haya finalizado el mensaje pondrá el equipo en RX y mantendrá el led encendido hasta la siguiente transmisión, volviendo a comenzar el proceso.

Os muestro un vídeo de como ha quedado finalizado el proyecto:



Ya veis que yo he optado por un simple tubo de PVC con tapas laterales y un conector A/V para poder fabricar varios litiguillos con distintos conectores para que la baliza se pueda conectar a diferentes equipos simplemente seleccionando el latiguillo correcto. Pero como realicéis este paso es decisión vuestra; existen infinidad de opciones, escoged la que más os guste o se adapte a lo que buscáis.

Y recordad que yo no me hago responsable de los daños que podáis causar por la realización de este proyecto, eso es responsabilidad vuestra.

Por cierto, cabe destacar que no me he gastado ni 5€ en llevar a cabo todo el proyecto y el tamaño es más que aceptable.

¡¡A disfrutar...!!

73'sss