224   221     15   57    
23.07.2019   Уроки   Теги статьи #, #

Перевод азбуки Морзе в текст

Мы общаемся друг с другом через наши естественные сенсоры (язык, жест и т.д.). Интересная часть общения людей начинается тогда, когда вы хотите поделиться с кем-либо какой-то секретной информацией. Но вопрос в том, как это сделать? Нужно передавать информацию так, что даже третье лицо смотря на сообщение не сможет понять его до тех пор, пока не найдет ключ. Так родилась простая экспериментальная идея по созданию проекта расшифровки азбуки Морзе.

Комплектующие

В нашем уроке нам пригодится следующий список комплектующих:

Оборудование

  • Arduino Uno x 1
  • SparkFun Кнопочный переключатель 12 мм x 2
  • Светодиод x 1
  • Зуммер x 1
  • Резисторы 330 Ом x 4
  • Макет (универсальный) x 1
  • Перемычки x 10

Программное обеспечение

Что такое азбука Морзе?

Азбука Морзе - это способ передачи информации, представляющий собой оригинальные буквы в комбинации точек и тире:

Причина  выбора идеи для проекта очень банальна. В одном фильме агент передавал информацию азбукой Морзе, нажимая на кнопку передатчика, а на приемном конце другие люди расшифровывали переданную информацию. Стало интересно сделать это с помощью Arduino и простых базовых компонентов.

На картинке выше приведены буквы латинского алфавита передаваемые азбукой Морзе. Стоит заметить, что на практике вместо заучивания количества точек, тире и их последовательности запоминают так называемый «напев» (мнемоническую словесную форму), соответствующий каждому знаку кода Морзе. «Напевы» не являются стандартными, они могут различаться в зависимости от школы обучения или вообще не применяться (тогда обучаемый запоминает «мелодию» символа). Если в радиограмме только цифры, то вместо пяти тире нуля передается только одно тире. Ниже приводим таблицу с символами латинского и русского алфавитов в азбуке Морзе и примерах напевов:

Русский символ Латинский символ Код Морзе «Напев»
А A · − ай-даа, ай-ваа
Б B − · · · баа-ки-те-кут, беей-ба-ра-бан
В W · − − ви-даа-лаа, вол-чаа-таа
Г G − − · гаа-раа-жи, гаа-гаа-рин
Д D − · · доо-ми-ки, даай-ку-рить
Е (также и Ё) E · есть
Ж V · · · − же-ле-зис-тоо
З Z − − · · заа-каа-ти-ки
И I · · и-ди, ишь-ты
Й J · − − − йес-наа-паа-раа, йош-каа-роо-лаа
К K − · − каак-же-таак, каак-де-лаа
Л L · − · · лу-наа-ти-ки
М M − − маа-маа
Н N − · ноо-мер, наа-те
О O − − − оо-коо-лоо
П P · − − · пи-лаа-поо-ёт
Р R · − · ре-шаа-ет, ру-каа-ми
С S · · · си-ни-е, си-не-е, са-мо-лёт
Т T таак, таам
У U · · − у-нес-лоо, у-бе-гуу
Ф F · · − · фи-ли-моон-чик
Х H · · · · хи-ми-чи-те
Ц C − · − · цаа-пли-наа-ши, цаа-пли-цаа-пли
Ч Ö − − − · чаа-шаа-тоо-нет, чее-лоо-вее-чек
Ш CH − − − − шаа-роо-ваа-рыы, шуу-раа-доо-маа
Щ Q − − · − щаа-ваам-не-шаа, щуу-каа-жи-ваа
Ъ Ñ − − · − − твёёр-дыый-не-мяяг-киий
Ы Y − · − − ыы-не-наа-доо
Ь (также и Ъ) X − · · − тоо-мяг-кий-знаак, знаак-мяг-кий-знаак
Э É · · − · · э-ле-роо-ни-ки, э-ле-ктроо-ни-ка
Ю Ü · · − − ю-ли-аа-наа
Я Ä · − · − я-маал-я-маал
1 · − − − − и-тооль-коо-оо-днаа
2 · · − − − две-не-хоо-роо-шоо
3 · · · − − три-те-бе-маа-лоо
4 · · · · − че-тве-ри-те-каа
5 · · · · · пя-ти-ле-ти-е
6 − · · · · поо-шес-ти-бе-ри
7 − − · · · даа-даа-се-ме-ри
8 − − − · · воо-сьмоо-гоо-и-ди
9 − − − − · ноо-наа-ноо-наа-ми
0 − − − − − нооль-тоо-оо-коо-лоо
Точка · · · · · · то-чеч-ка-то-чеч-ка
Запятая · − · − · − крю-чоок-крю-чоок-крю-чоок
Двоеточие − − − · · · двоо-ее-тоо-чи-е-ставь
Точка с запятой − · − · − · тоо-чка-заа-пя-таа-я
Скобка − · − − · − скоо-бку-стаавь-скоо-бку-стаавь, скоо-бку-тыы-мнее-пи-шии
Апостроф · − − − − · крю-чоок-тыы-веерх-ниий-ставь
Кавычки · − · · − · ка-выы-чки-ка-выы-чки, ка-выы-чки-от-крыы-ли, ка-выы-чки-за-крыы-ли
 Тире − · · · · − чёёр-точ-ку-мне-да-ваай, чёёр-точ-ку-ты-пи-шии
Косая черта − · · − · дрообь-здесь-пред-стаавь-те, доо-ми-ки-ноо-мер
Вопросительный знак · · − − · · вы-ку-даа-смоо-три-те, до-про-сии-лии-е-го, у-нес-лоо-доо-ми-ки, э-ти-воо-проо-си-ки
Восклицательный знак − − · · − − оо-наа-вос-кли-цаа-лаа
Знак раздела − · · · − рааз-де-ли-те-каа
Ошибка/перебой · · · · · · · · хи-ми-чи-те-хи-ми-чи-те, ше-стью-во-семь-со-рок-во-семь
@ · − − · − · со-баа-каа-ре-шаа-ет, со-баа-каа-ку-саа-ет
Конец связи · · − · − хо-ро-шоо-по-каа, хо-ро-шоо-да-ваай, до-сви-даа-ни-яя

Как работает этот проект? Очень просто. Когда вы соберете комплектующие нашего "дешифратора" по схеме на макетной плате и загрузите скетч, то далее нужно будет выбрать Serial Monitor (последовательный монитор) и вы увидите информацию как на картинке ниже:

Схема соединения

Инструкция ниже представлена для соединения цифровых выводов Arduino и макета:

  • контакт D2 подключен к одной ножке первого кнопочного переключателя,
  • контакт D7 подключен к одной ножке второго кнопочного переключателя,
  • контакт D8 подключен к светодиодному выводу через резистор,
  • контакт D12 подключен к клемме зуммера через резистор.

Другие соединения нужно сделать согласно схематическому изображению выше. После того как вы всё соединили вы готовы переходить к следующему шагу, а точнее к коду программы нашего дешифратора. Скажем сразу, знание английского языка приветствуется, если вы хотите стать хорошим программистом.

Код дешифратора

Ниже вы можете скачать или скопировать код нашего "дешифратора" азбуки Морзе в текст с помощью Ардуино:

#define SIZE 26
const int ledPin=8;
const int speakerPin=12;
const int dotButton=2;
const int dashButton=7;

String morseCode="";
String text="";
int characterAscii=0;
int startPos=0, endPos=0;
int startPos1=0, endPos1=0;
String characterCode="";
int dashButtonState=0;
int dotButtonState=0;

//Array of MorseCode for letters of English Language A to Z
String letters[SIZE]={

// A to I
".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..",
// J to R 
".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.",
// S to Z
"...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.." 
};
        
void setup() {
  // put your setup code here, to run once:
//Getting things Ready
pinMode(ledPin, OUTPUT);
pinMode(dotButton, INPUT);
pinMode(dashButton, INPUT);
Serial.begin(9600);

Serial.println("*************************************************************");
Serial.println("                    Demonstration of Morse Code              ");
Serial.println("************************************************************* ");
Serial.println("\nInstructions");
Serial.println("1. First Write Your Morse code");
Serial.println("2. When you are done  Write 1 on above input box and Press Enter or click Send Button ");
Serial.println("3. For Space between letters write 2 and Press Enter ");
Serial.println("4. For Space between words   write 3 and Press Enter ");

Serial.println("5. Thats all Translation of Morse Code  will then be Shown ");

Serial.println("\n\nEnter Your Morse Code Here  ");

}

void loop() {
  // put your main code here, to run repeatedly:

while(Serial.available() > 0 ) 
{
      int ascii=Serial.read();

      switch(ascii)
      {
        case 49: // 49 is Ascii value of 1

        Serial.print("\n");
        morseCode.concat('#');// Placeing # at the end of morseCode to simplify further processing

         Serial.print("\nYour Morse code Translation :  ");
         
        endPos1=morseCode.indexOf('#');

        while(endPos1 < morseCode.length() )
        {
            extractLetters(morseCode.substring(startPos1, endPos1)); // This function would extract Letter as name suggest and would convert  code to text SIMPLE!
           startPos1=endPos1+1;
           if(startPos1 == morseCode.length() )
           {
              break; 
           }
           endPos1= morseCode.indexOf('#', startPos1);
        }
        startPos1=0;
        endPos1=0;

        text=""; //  For New Translation   
        morseCode="";
        Serial.println("\n\nEnter Your Morse Code Here ");        
              
        break;

        case 50: // 50 is Ascii value of 2
        
        morseCode.concat("@");
        Serial.print("@");
        delay(200);
        
        break;

        case 51: // 51 is Ascii value of 3
          
        morseCode.concat("#");
        Serial.print("#");
        delay(200);
        
        break;        
      }      
}
process();
}

void turnONLedSpeaker()
{
  //Turn ON LED
  digitalWrite(ledPin, HIGH);
  tone(speakerPin, 4699, 300); // tone(speakerPin, frequency, duration in milliSec)
}

void process()
{  
dotButtonState=digitalRead(dotButton);
dashButtonState=digitalRead(dashButton);

  if(dashButtonState == HIGH)
  {
    turnONLedSpeaker();
   
    morseCode.concat("-"); // Storing code in variable morseCode with the help of concatenation function
    Serial.print("-");//Prints User entered Code
    delay(200);
  }
  else if(dotButtonState == HIGH)
  {
   turnONLedSpeaker();
  
   morseCode.concat(".");
   Serial.print(".");
   delay(200);
    
  }
  else
  {
    //Turn OFF LED
    digitalWrite(ledPin, LOW);     
  }
}
char convertIntoText(String characterCode)
{
  characterAscii=65;
  
  for(int index=0; index<SIZE; index++)
  {
    if(characterCode == letters[index])
    {
      return characterAscii;   
    }
    characterAscii++;  
  }
}

void extractLetters(String words)
{
        words.concat('@'); // Placeing @ at the end of word to simplify further processing

        endPos=words.indexOf('@');
        
        //Loop to extracting single character morse Code from string of word        
        while( endPos<words.length() )
       {
         characterCode=words.substring(startPos, endPos);
         
         //Now CharacterCode will now convert in text

         text.concat(convertIntoText(characterCode));
         
         startPos=endPos+1;
         characterCode="";
         
          // if condition is just to terminate loop when our extracting single character code is complete thats all
         if(startPos == words.length() )
         {
           break;
         }         
         endPos=words.indexOf('@', startPos);          
       }                        
        Serial.print(text);
        Serial.print(" ");
        startPos=0;
        endPos=0;
        text="";      
}

На этом всё. Желаем вам успешных проектов.

Ардуино+