Morse Codec – TxRx Inalámbrico 433Mhz ASK/OOK

El punto de partida es la combinación de Morse Codec – LEDTxRx Inalambrico 433Mhz ASK/OOK . Al primero se añade el pin 4 con el dato/símbolo bit «Alto»(1) o «Bajo» (0), que al repetirlos genera el espacio o tono morse.

Como receptor se usa la misma configuración de TxRx Inalambrico 433Mhz ASK/OOK , que permite visualizar lo recibido en un segundo arduino.

El mensaje de prueba del transmisor es » SOS   » que permite observar los valores o la gráfica en el monitor o plotter serial del programa de arduino.

Al separar el receptor del transmisor, o bloquear la señal, se obtendrán lecturas diferentes a las ideales, lo que permite disponer de nuevo material de trabajo para decodificar la señal correctamente.

Temas como corrección de errores, distancias de cobertutas, etc aparecen a partir de éste punto.

El siguiente paso consiste en decodificar la secuencia de 0’s y 1’s como puntos y rayas, previo a convertirlos nuevamente a letras.

Calidad de Señal entre Tx y Rx

El los dispositivos RF433 transmisor y receptor se encuentran muy cercanos, a unos 10 cm, pues aún no se les ha añadido una antena. Al separar un poco los RF433 se visualiza ruido en la señal, que afecta al mensaje enviado.

Si se presentan muchos problemas, simplifique conectando un cable entre el TxRfPin 4 y el RxRfPin A0

/*  CODificador morse
 *   recibe un mensaje y transmite usando RF 433 Mhz
 *   equivale: estructura de datos char y string
 *   funciones: codificar y decodificar
 */

// PIN para el LED, led integrado = 13
#define PIN_LED 13
//Duración de un símbolo en  ms
#define DURACION 100
#define TxRfPin 4 

void setup(){
  pinMode(PIN_LED, OUTPUT );
  digitalWrite( PIN_LED, LOW );
  pinMode(TxRfPin, OUTPUT);
  digitalWrite( TxRfPin, LOW );
  
}

void loop(){
  String mensaje = " SOS  ";
  String mensajemorse;
  char simbolo;
  int n;
  mensajemorse = codifica(mensaje);
  // Transmite el mensaje
  n = mensajemorse.length();
  for(int i=0; i<=n; i++){
    simbolo = mensajemorse[i];
    morseTxRF(simbolo);
  }
}

void morseTxRF(char simbolo){
    if (simbolo == '.'){
        digitalWrite(PIN_LED, HIGH );
        digitalWrite(TxRfPin, HIGH);
        delay( DURACION ); 
        digitalWrite(PIN_LED, LOW );
        digitalWrite(TxRfPin, LOW);
        delay( DURACION );
    }
    if (simbolo == '-'){
        digitalWrite(PIN_LED, HIGH );
        digitalWrite(TxRfPin, HIGH);
        delay( DURACION*3 );
        digitalWrite(PIN_LED, LOW );
        digitalWrite(TxRfPin, LOW);
        delay( DURACION );
    }
    if (simbolo == ' ') {
        digitalWrite(PIN_LED, LOW );
        digitalWrite(TxRfPin, LOW);
        delay( DURACION );
    }
}

// Equivalente letra a código Morse. Estructura de datos
static const struct {const char letra, *codigo;} equivale[] =
{
  { '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', "--.." }, 
  { ' ', " " },   //espacio entre palabras 
  { '1', ".----" }, { '2', "..---" }, { '3', "...--" },
  { '4', "....-" }, { '5', "....." }, { '6', "-...." }, 
  { '7', "--..." }, { '8', "---.." }, { '9', "----." }, 
  { '0', "-----" },
  { '.', ".–.–.–" }, { ',', "--..--" }, { '?', "..--.." },
  { '!', "-.-.--" }, { ':', "---..." }, { ';', "-.-.-." }, 
  { '(', "-.--." }, { ')', "-.--.-" }, { '"', ".-..-." },
  { '@', ".--.-." }, { '&', ".-..." },
};

String codifica(String mensaje){
  String mensajemorse = "";
  int i, j, n, m;
  bool encontre;
  n = mensaje.length();
  m = (sizeof equivale / sizeof *equivale);
  for( i = 0; i<n; i++ ){
    encontre = 0;
    j=0;
    while(j<m and encontre==0){
      if(toupper(mensaje[i]) == equivale[j].letra){
        mensajemorse += equivale[j].codigo;
        encontre=1;
       }
      j++;
    }
    mensajemorse += " "; //separador de caracteres
  }
  return mensajemorse;  
}

Por realizar:

Fácilmente se determina la necesidad de un decodificador que use los datos y convierta a morse, o a texto, en el arduino o en un computador a partir de los datos seriales. Mostrar los datos en pantalla del PC o en una pantalla LCD en el arduino.