LU9CBL

LU9CBL
LU9CBL

domingo, 4 de diciembre de 2016

Baliza de CW con Arduino Pro Mini [Parte 1]

Hace unos días, Claudio LU7DW, me comento la necesidad que tenia de armarse una baliza para la banda de 10 metros (28 MHz), para lo cual necesitaba hacer con algún PIC o Arduino que pueda realizar la manipulación del mensaje de la misma. A raíz de esto, buscando un poco en mi baúl de electrónica, decidí realizarlo en un Arduino Pro Mini, debido a su costo y su simplicidad de uso.



Aún no decidimos sobre qué equipo será instalado, pero como para ir avanzando en la codificación fue que se realizó una prueba preliminar. Se utiliza el pin 13 que ya posee un led incorporado para poder realizar la visualización de la manipulación.

Se utilizará en principio un LM7805 para poder darle los 5v que necesita la placa desde los 13,8 VCC del equipo que se elija, y se utilizará un transistor como conmutador para la secuencia de TX aplicada a su base (en principio se utilizará un 2N2222 y una resistencia en su colector, emisor conectado a masa).

A continuación se adjunta el código generado para que sobre el PIN 13 se emita los caracteres en telegrafía “VVV de LU7DW/BCN LU7DW/BCN GF05 GF05”. Se utiliza una única constante de tiempo en la variable cteTiempo declarada dentro de void loop() {} por lo que al modificar ese parámetro se aumenta y se disminuye la velocidad de tx, manteniendo las relaciones de espacio entre caracteres / palabras y entre sonidos cortos / largos.


Código Generado:
// Realizado por LU9CBL - Mat - 01/12/2016
// MENSAJE PARA BALIZA LU7DW:
// VVV de LU7DW/BCN LU7DW/BCN GF05 GF05
// Cada 20 segundos

int ledPin = 13; // LED en el pin digital 13
int cte;
int cteTiempo;
int cteTiempoLargo;

void setup() {
 
  // Configura el pin 13 como salida
  pinMode(ledPin, OUTPUT);
 
}

void loop() {
 
  // Declaro la constante de tiempo
  cte = 50;

  // Llamo a la función de la licencia de la baliza
  vvvde(cte);
  lu7dw(cte);
  lu7dw(cte);
  gridLocator(cte);
  gridLocator(cte);

  //ESPERA ENTRE MENSAJES (20 Segundos == 20000)
  delay(20000);
 
}

void vvvde(int cteTiempo){

  cteTiempoLargo = 3 * cteTiempo;

  //V
  digitalWrite(ledPin, HIGH);   // activa el LED
  delay(cteTiempo);             // espera el tiempo de constante
  digitalWrite(ledPin, LOW);    // desactiva el LED
  delay(cteTiempo);             // espera el tiempo de constante

  digitalWrite(ledPin, HIGH);   // activa el LED
  delay(cteTiempo);             // espera el tiempo de constante
  digitalWrite(ledPin, LOW);    // desactiva el LED
  delay(cteTiempo);             // espera el tiempo de constante

  digitalWrite(ledPin, HIGH);   // activa el LED
  delay(cteTiempo);             // espera el tiempo de constante
  digitalWrite(ledPin, LOW);    // desactiva el LED
  delay(cteTiempo);             // espera el tiempo de constante

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

  //V
  digitalWrite(ledPin, HIGH);   // activa el LED
  delay(cteTiempo);             // espera el tiempo de constante
  digitalWrite(ledPin, LOW);    // desactiva el LED
  delay(cteTiempo);             // espera el tiempo de constante

  digitalWrite(ledPin, HIGH);   // activa el LED
  delay(cteTiempo);             // espera el tiempo de constante
  digitalWrite(ledPin, LOW);    // desactiva el LED
  delay(cteTiempo);             // espera el tiempo de constante

  digitalWrite(ledPin, HIGH);   // activa el LED
  delay(cteTiempo);             // espera el tiempo de constante
  digitalWrite(ledPin, LOW);    // desactiva el LED
  delay(cteTiempo);             // espera el tiempo de constante

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

  //V
  digitalWrite(ledPin, HIGH);   // activa el LED
  delay(cteTiempo);             // espera el tiempo de constante
  digitalWrite(ledPin, LOW);    // desactiva el LED
  delay(cteTiempo);             // espera el tiempo de constante

  digitalWrite(ledPin, HIGH);   // activa el LED
  delay(cteTiempo);             // espera el tiempo de constante
  digitalWrite(ledPin, LOW);    // desactiva el LED
  delay(cteTiempo);             // espera el tiempo de constante

  digitalWrite(ledPin, HIGH);   // activa el LED
  delay(cteTiempo);             // espera el tiempo de constante
  digitalWrite(ledPin, LOW);    // desactiva el LED
  delay(cteTiempo);             // espera el tiempo de constante

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

  //D

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);
 
  delay(cteTiempoLargo);

  //E

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

}

void lu7dw(int cteTiempo){

  cteTiempoLargo = 3 * cteTiempo;

  //L
  digitalWrite(ledPin, HIGH);   // activa el LED
  delay(cteTiempo);             // espera el tiempo de constante
  digitalWrite(ledPin, LOW);    // desactiva el LED
  delay(cteTiempo);             // espera el tiempo de constante

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);
 
  //U
  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

  //7

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);
 
  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);
 
  delay(cteTiempoLargo);
 
  //D

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);
 
  delay(cteTiempoLargo);

  //W

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

// "/"

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

  //B

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);
 
  delay(cteTiempoLargo);

  //C

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

  //N

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

}


void gridLocator(int cteTiempo){

  cteTiempoLargo = 3 * cteTiempo;

  //G

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

  //F
  digitalWrite(ledPin, HIGH);   // activa el LED
  delay(cteTiempo);             // espera el tiempo de constante
  digitalWrite(ledPin, LOW);    // desactiva el LED
  delay(cteTiempo);             // espera el tiempo de constante

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

  //"0"

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempoLargo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

  //"5"

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  digitalWrite(ledPin, HIGH);
  delay(cteTiempo);
  digitalWrite(ledPin, LOW);
  delay(cteTiempo);

  delay(cteTiempoLargo);

}

miércoles, 12 de octubre de 2016

MFJ-1026 Noise Canceller.... ¡Al Rescate!



En el Grupo DX Norte, donde nos juntamos con amigos a disfrutar de la radio y de los concursos, hace un tiempo que tenemos una interferencia en las tres bandas principales (20m, 15m y 10m). Esto nos dejaba sordos en esas tres bandas, que es justamente donde está la direccional JVP36DX que funciona excelente.

A raíz de esto, Beto LU7BTO nos prestó un Noise Canceller MFJ-1026, el cual realmente nos salvó y genera el motivo de esta entrada, luego de “aprender” a utilizarlo, por si alguno tiene el mismo inconveniente.

En la parte delantera, podemos ver cuatro perillas y cuatro botones.
·         Perilla T/R DELAY: es la perilla que define el tiempo que tarda en conmutar entre RX y TX una vez que detecta la portadora. Esto también se puede realizar mediante una ficha RCA de la parte posterior que luego veremos. Nosotros lo utilizamos entre 2 y 3.
·         Perilla AUXILIARY ANTENNA GAIN: Es la que determina la ganancia de la antena auxiliar o que debe captar (de ser posible) la mayor cantidad de ruido que es el que buscamos eliminar.
·         Perilla PHASE: Es la fase entre ambas entradas (Main y Auxiliar).
·         Perilla MAIN ANTENNA GAIN: Es la perilla que determina la ganancia de la antena principal.
·         Botón de POWER: Es auto descriptivo permite encender el equipo.
·         Baton PRE-AMP, FREQ (High y Low) y PHASE (Normal o Invertido).



En la parte trasera, tenemos:
·         Conector de MAIN ANTENA: es donde va la antena principal.
·         Conector de Radio: Donde va conectado el transceptor.
·         Conector AUXILIARY ANTENNA: dónde va la antena de Ruido.
·         Conector de Power.
·         GND.
·         Conector T/R Control: Es el que permite por ejemplo agregar al foot-switch para que se active cuando deseamos transmitir.



Comentarios Previos
En nuestro caso, conectamos la antena principal (Direccional JVP) en la MAIN ANTENNA, y una antena direccional de 11 elementos de VHF apuntando al ruido. Esto lo hicimos así porque es lo que teníamos a mano y resulto funcionar muy bien, pero esta puede ser reemplazada también por una antena Loop apuntando a la fuente de ruido.

El MFJ también posee una antena telescópica que sale desde dentro del equipo, la cual resulto ser muy poco efectiva. Según pude leer la misma se usa cuando la fuente de ruido se encuentra hasta 10 metros de donde tenemos el equipo (ergo muy rara vez nos servirá).

Operatoria
En principio debemos poner las tres perillas (MAIL, AUX y PHASE) al mínimo. Una vez realizado eso, el S-METER del equipo va a quedar en su posición mínima.
Primero vamos a mover la perilla de antena auxiliar (AUX) hasta que en el medidor del receptor, tengamos una señal considerable, por ejemplo en nuestro caso es un S5. Anotamos cual es el valor de la perilla que marca (por ejemplo 6 u 8 o el que sea) y volvemos la perilla a su posición original.
Segundo, vamos a mover la perilla de la antena principal MAIN, hasta que tengamos el mismo nivel de señal que vimos con la auxiliar (en nuestro ejemplo S5). Una vez obtenido eso, llevamos la perilla de antena auxiliar a la posición que habíamos anotado antes (6 u 8 en nuestro ejemplo). Esto genera que se equiparen las dos señales.
Como tercer paso, vamos a ir girando lentamente la perilla de PHASE, hasta que se observe que las señales del SMETER decaen, por ejemplo se visualiza generalmente un pozo, que es donde la señal del ruido se resta con la señal de la principal. En algunos casos se llega al final del recorrido de la perilla sin encontrar ese pozo, en cuyo caso oprimimos el botón de INVERT para invertir justamente una de las señales. Esto es porque tal vez el ruido ya viene invertido, entonces con solo mezclarlos ya se restan (posición NORMAL).
Una vez realizado esto y luego de haber detectado el pozo, se deja en esa posición, y se opera normalmente. Generalmente al principio cuesta un poco, pero es como cuando se utiliza un sintonizador de antenas. Al principio es algo complejo, pero una vez que uno se acostumbra, lo hace casi de manera intuitiva.

Espero que les sirva, y si alguno conoce alguna otra forma los invito a dejar sus comentarios.
73s
Mati LU9CBL

***** ACTUALIZACIÓN 28/10/2016 *****
Googleando por internet. encontre un video de otra forma de poder utilizar el MFJ. Puntualmente en este caso deja fijo el MAIN a maxima ganancia, y juega con el AUXILIAR y el PHASE para encontrar cuando disminuye mas el ruido.


domingo, 28 de agosto de 2016

Reparación Raspberry Pi 1 Modelo B

Hace ya mucho tiempo que tengo una Raspberry PI modelo B (la primera versión de la raspi), que utilizo para hacer distintas pruebas (scripts varios, recolección de cosas en internet, etc.). Realmente es una placa que tiene una versatilidad enorme, porque permite dejarla conectada funcionando con un cargador de celular y una interfaz de red cableada.

Para aquellos que deseen adquirir una placa de este estilo, ya van por la versión 3 de la placa que viene con procesador Quad Core, mucha más RAM, y adicionalmente wifi y bluetooth integrado, por la módica suma de 1000 pesos (según la publicación más barata de Mercado Libre).

El tema es que mi placa, por el paso del tiempo, se le rompió el zócalo SD, el cual se utiliza como Disco para almacenar el sistema operativo, y realmente me fue imposible conseguir el mismo zócalo acá en Argentina. Adquirí uno similar y tenía que hacer algunas adaptaciones cuando un amigo me recomendó tratar de reparar el actual.

Buscando alguna forma de repararla (no hacia contacto la tarjeta SD al romperse las aletas que permiten que haga contacto cada uno de los pines), encontré una tapa metálica de las que vienen en los gabinetes, y con un poco de paciencia la corte y doble para que encajara por sobre el zócalo roto. Previamente medí ambos extremos para confirmar lo que suponía (que eran masa ambos), y podía usarlos para soldar en cada uno de los extremos el soporte. La reparación resulto exitosa, por lo que la comparto por si alguno le pasa lo mismo (ya que leí que hay muchos reclamos de ese zócalo en internet, porque se rompe con el tiempo), así pueden seguir utilizando la placa para el uso que tengan en mente.

Una vez finalizada la reparación ya se pudo instalar nuevamente el sistema operativo (en este caso Raspbian desde su versión NOOBS).








¡Saludos!
Mati LU9CBL