quinta-feira, 26 de junho de 2014

Código Morse na placa Intel® Galileo via porta serial

Este será um teste simples da porta serial da Galileo com o envio de caracteres que serão transformados em código morse e apresentados na placa Galileo pelo led.

O código abaixo foi baseado neste código fonte, com algumas modificações:
//Define the LED Pin
#define PIN_OUT        13
//Define unit length in ms
#define UNIT_LENGTH    250

String incomingWord = "";
int menu = 0;    
char message[25];

//Build a struct with the morse code mapping
static const struct {const char letter, *code;} MorseMap[] =
{
 { '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', "--.." },
 { ' ', "     " }, //Gap between word, seven units 
  
 { '1', ".----" },
 { '2', "..---" },
 { '3', "...--" },
 { '4', "....-" },
 { '5', "....." },
 { '6', "-...." },
 { '7', "--..." },
 { '8', "---.." },
 { '9', "----." },
 { '0', "-----" },
  
 { '.', "·–·–·–" },
 { ',', "--..--" },
 { '?', "..--.." },
 { '!', "-.-.--" },
 { ':', "---..." },
 { ';', "-.-.-." },
 { '(', "-.--." },
 { ')', "-.--.-" },
 { '"', ".-..-." },
 { '@', ".--.-." },
 { '&', ".-..." },
};

void setup()
{
  pinMode( PIN_OUT, OUTPUT );
  digitalWrite( PIN_OUT, LOW );
  Serial.begin(9600);
    
}

void loop(){
  
  if (Serial.available() && menu == 0) {
    
    Serial.println("-- Decodificador de string para codigo Morse -- ");
    Serial.println("Pronto para enviar uma mensagem.");
    menu = 1;
  
  }
  
  if (Serial.available() && menu == 1) {
    incomingWord = Serial.readStringUntil('\n');
  
    
    Serial.println("Eu recebi: ");
    Serial.println(incomingWord);
    
    incomingWord.toCharArray(message,incomingWord.length());
  
    String morseWord = encode( message );
    
    for(int i=0; i<=morseWord.length(); i++){
      switch( morseWord[i] ){
        case '.': //dit
          digitalWrite( PIN_OUT, HIGH );
          delay( UNIT_LENGTH );
          digitalWrite( PIN_OUT, LOW );
          delay( UNIT_LENGTH );
            
          break;
   
        case '-': //dah
          digitalWrite( PIN_OUT, HIGH );
          delay( UNIT_LENGTH*3 );
          digitalWrite( PIN_OUT, LOW );
          delay( UNIT_LENGTH );
            
          break;
   
        case ' ': //gap
          delay( UNIT_LENGTH );
      }
    }
  }
}
String encode(const char *string)
{
  size_t i, j;
  String morseWord = "";
  
  for( i = 0; string[i]; ++i )
  {
    for( j = 0; j < sizeof MorseMap / sizeof *MorseMap; ++j )
    {
      if( toupper(string[i]) == MorseMap[j].letter )
      {
        morseWord += MorseMap[j].code;
        break;
      }
    }
    morseWord += " "; //Add tailing space to seperate the chars
  }
 
  return morseWord;  
}
 
String decode2(String morse)
{
  String msg = "";
  
  int lastPos = 0;
  int pos = morse.indexOf(' ');
  while( lastPos <= morse.lastIndexOf(' ') )
  {    
    for( int i = 0; i < sizeof MorseMap / sizeof *MorseMap; ++i )
    {
      if( morse.substring(lastPos, pos) == MorseMap[i].code )
      {
        msg += MorseMap[i].letter;
      }
    }
 
    lastPos = pos+1;
    pos = morse.indexOf(' ', lastPos);
    
    // Handle white-spaces between words (7 spaces)
    while( morse[lastPos] == ' ' && morse[pos+1] == ' ' )
    {
      pos ++;
    }
  }
 
  return msg;
}

O código acima fica em loop esperando até que uma mensagem seja enviada pela porta serial, quando esta mensagem é recebida o programa decodifica cada letra com seu respectivo significado em morse ( a funcção estática no inicio do programa possui todas as relações letra - sinal) em "ponto" e "traço".

Faça upload deste código para a placa Galileo e abra o terminal serial em Tools...Serial Monitor para enviar as mensagens via porta serial.

Acesso ao terminal serial
Terminal serial acima da IDE arduino
Faça os testes enviando uma palavra de cada vez e verifique o led da placa acender em código morse.


Nenhum comentário:

Postar um comentário