2 de dezembro de 2018

Código Morse

O Código Morse é um sistema de comunicação binário enviado de modo intermitente. Os caracteres são representados por uma sequência única de pontos e traços.
Vamos codificar textos para sinais sonoros e visuais!


Criado por Samuel Morse em 1835, o código Morse surgiu para ser a linguagem utilizada na transmissão de mensagens através do telégrafo elétrico.

O sinal de socorro mais comum é o SOS, formado por três pontos, três traços e três pontos. Esse sinal é internacionalmente reconhecido.
...---...

A representação de cada caracter podemos ver na imagem abaixo.


A duração de um traço é equivalente ao triplo do tempo de um ponto. Cada ponto ou traço é seguido de um curto silêncio, igual à duração de um ponto. As letras de uma palavra são separadas por um espaço, igual a três pontos, e uma palavra é separada da outra por um espaço de sete pontos.

O projeto codifica o texto recebido através da comunicação serial em Código Morse, que pode ser visualizado através do led, dos sinais sonoros do buzzer e em sua leitura no texto enviado à serial.


Referências:
https://pt.wikipedia.org/wiki/C%C3%B3digo_Morse
https://www.infoescola.com/comunicacao/codigo-morse
https://www.hipercultura.com/codigo-morse


Segue o esquema elétrico e o código fonte:

/*---------------------------------------------------------
  Programa : CÓDIGO MORSE
  Autor    : Fellipe Couto [ http://www.efeitonerd.com.br ]
  Data     : 27/11/2018
  ---------------------------------------------------------*/
#define TIME_DEFAULT 150      //Tempo padrão para pontos e traços
#define NUM_CHARACTERS 40     //Quantidade de caracteres codificados
#define LED 2                 //Porta de conexão do led
#define BUZZER 3              //Porta de conexão do buzzer
#define BUZZER_FREQUENCY 3300 //Frequencia do buzzer

struct libMorse {
  char character;
  String signal;
};

libMorse signs[NUM_CHARACTERS] = {
  {'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() {
  //Configura as portas
  pinMode(LED, OUTPUT);
  pinMode(BUZZER, OUTPUT);

  //Inicia a comunicação serial
  Serial.begin(9600);

  //Exibe a mensagem inicial
  Serial.println("CODIGO MORSE");
  Serial.println("www.efeitonerd.com.br\n");
  Serial.println("Digite o texto para codificar em Codigo Morse:");
}

void loop() {
  String parameter = "";

  //Recebe a string da serial
  while (Serial.available() > 0) {
    parameter += String(char(Serial.read()));
    delay(25);
  }

  //Emite o código morse
  if (parameter.length() > 0) {
    parameter.toUpperCase();
    Serial.print("\n\nTexto: " + parameter + "Codigo Morse: ");
    MorseCode(parameter);
  }
}

void MorseCode(String text) {
  text.toLowerCase();
  text.trim();

  //Caracter por caracter da string text
  for (int t = 0; t < text.length(); t++) {

    //Retorna o sinal do caracter
    String signalChar = " ";
    for (int i = 0 ; i < 36 ; i++) {
      if (signs[i].character == text.charAt(t)) {
        signalChar = signs[i].signal;
      }
    }

    //Emite o sinal do caracter
    for (int i = 0 ; i < signalChar.length() ; i++) {
      switch (signalChar.charAt(i)) {
        case '.':
          Dot();
          break;
        case '-':
          Dash();
          break;
        case ' ':
          Space();
          break;
      }
    }
    EndLetter();
  }
}

void Dot() {
  digitalWrite(LED, HIGH);
  tone(BUZZER, BUZZER_FREQUENCY, TIME_DEFAULT);
  delay(TIME_DEFAULT);
  digitalWrite(LED, LOW);
  delay(TIME_DEFAULT);

  //Serial
  Serial.print(".");
}

void Dash() {
  digitalWrite(LED, HIGH);
  tone(BUZZER, BUZZER_FREQUENCY, TIME_DEFAULT * 3);
  delay(TIME_DEFAULT * 3);
  digitalWrite(LED, LOW);
  delay(TIME_DEFAULT);

  //Serial
  Serial.print("-");
}

void EndLetter() {
  delay(TIME_DEFAULT * 3);
  Serial.print(" ");
}

void Space() {
  delay(TIME_DEFAULT * 7);
  Serial.print("/");
}

Nenhum comentário:

Postar um comentário