Морзе клавиатура

primnet
Offline
Зарегистрирован: 08.08.2016

привет, пытаюсь сделать морзе клавиатуру на основе ps2 клавиатуры, возникла сложность с синхронизацией полученных символов с клавиатуры и кодом воспроизводящим морзе.

#include <PS2Keyboard.h>

const int DataPin = 2; // подключение к разъему клавиатуры DATA
const int IRQpin =  3; // подключение к разъему клавиатуры CLK

// Таблица кодов Морзе. N-ный элемент кода соответствует n-ному символу раскладки.
char* morseCode[] = {
  "*-","-***","*--","--*","-**","*","***-","--**","**","*---",
  "-*-","*-**","--","-*","---","*--*","*-*","***","-","**-",
  "**-*","****","-*-*","---*","----","--*-","-*--","-**-","**-**","**--",
 "*-*-",
 "*----","**---","***--","****-","*****","-****","--***","---**","----*","-----",
  "......","*-*-*-","---***","-*-*-","-*--*-","*----*","*-**-*","-****-","-**-*","**--**","--**--",
 "-***-","********","*--*-*","**-*-",
  ""
};
 
// Кириллическая раскладка.
char* layoutCyrillic[] = {
 "а","б","в","г","д","е","ж","з","и","й",
  "к","л","м","н","о","п","р","с","т","у",
  "ф","х","ц","ч","ш","щ","ы","ь","э","ю",
  "я",
  "1","2","3","4","5","6","7","8","9","0",
  ".",",",":",";","(","\'","\"","-","/","?","!",
  " *DELIMITER* "," *ERR* ","@"," *END* ",
  ""
};
 
// Латинская раскладка.
char* layoutLatin[] = {
  "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",
  ".",",",":",";","(","\'","\"","-","/","?","!",
  " *DELIMITER* "," *ERR* ","@"," *END* ",
  ""
};
 
PS2Keyboard keyboard;

void morse(char* str, int pin, int led)
{
  pinMode(pin, OUTPUT);
  pinMode(led, OUTPUT);
 
 int n = 0;
 
  while(str[n] != '\0')
    n++;
 
  int* morseMas = new int [n];
 
  for(int i = 0; str[i] != '\0'; i++)
  {
   for(int j = 0; layoutCyrillic[j] != ""; j++)
    {
     for(int k = 0; layoutCyrillic[j][k] != '\0'; k++)
      {
       if(str[i+k] != layoutCyrillic[j][k])
          break;
 
        if(layoutCyrillic[j][k+1] == '\0')
         morseMas[i] = j;
      }
 
     for(int k = 0; layoutLatin[j][k] != '\0'; k++)
     {
       if(str[i+k] != layoutLatin[j][k])
         break;
 
        if(layoutLatin[j][k+1] == '\0')
          morseMas[i] = j;
      }
   }
 }
 
 Serial.print("Morse code: ");
 
 for(int i = 0; i < n; i++)
 {
   for(int j = 0; morseCode[morseMas[i]][j] != '\0'; j++)
   {
     if(morseCode[morseMas[i]][j] == '*')
      {
       Serial.print("*");
        if(led) digitalWrite(led, HIGH);
        tone(pin, 1500);
        delay(100);
       noTone(pin);
        digitalWrite(led, LOW);
     }
 
     if(morseCode[morseMas[i]][j] ==  '-')
     {
       Serial.print("-");
        if(led) digitalWrite(led, HIGH);
        tone(pin, 1500);
        delay(300);
       noTone(pin);
        digitalWrite(led, LOW);
     }
 
     delay(100);
   }
   Serial.print(" ");
    
    delay(200);   
  }
 
 Serial.print("\n");
  delete [] morseMas;
}

void setup() {
  keyboard.begin(DataPin, IRQpin);  // инициализация клавиатуры
  Serial.begin(9600); // настройка скорости COM порта
  Serial.println("Keyboard Test:");  // вывод данных с клавиатуры в COM порт
 }

void loop() {
    if (keyboard.available()) {
     char* c = keyboard.read();        //сложность пока здесь(
      morse('sos', 8, 13);
       }
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

primnet пишет:

привет, пытаюсь сделать морзе клавиатуру на основе ps2 клавиатуры, возникла сложность с синхронизацией полученных символов с клавиатуры и кодом воспроизводящим морзе.

И что? У Вас есть вопрос? Или Вы просто поставили всех в известность?

Судя по коду, сложностей у Вас выще головы.

Например, что делает константа 'sos' в строке 126. Что он, по-вашему, означает?

Строки 56-78 ... Вы уверены, что для того, чтобы райти символ, необходим цикл тройной вложенности?

Про массивы layoutХХХ я уж и не говорю. Зачем хранить одиночные символы как строки?

primnet
Offline
Зарегистрирован: 08.08.2016

ЕвгенийП пишет:

Например, что делает константа 'sos' в строке 126. Что он, по-вашему, означает?

это строка для передачи в функцию morse, должна быть в двойных кавычках)

ЕвгенийП пишет:

Строки 56-78 ... Вы уверены, что для того, чтобы райти символ, необходим цикл тройной вложенности?

в этом я не особо уверен, так было предложенно в примере, я так и не смог полностью разобраться.

у меня вопрос как конвентировать массив полученный с клавиатуры в str в функцию morse.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, это совсем не так делать надо.

Выпишите все символы, идущие подряд у Вас получится несколько последовательностей. Одна - 'а'-'я', вторая - 'a'-'z', третья '0'-'9'

Всякие запятые с точками, выпишите сами.

Вам нужны последовательности символов, которые идут подряд. Таких у Вас получится штуки 4.

Потом просто сделаете столько же масивов символов морзе и в качестве индекса в них будете использовать введённый с клавиш код. 

Если сразу непонятно, я Вам помогу, пока выпишите все последовательности.

primnet
Offline
Зарегистрирован: 08.08.2016

Нашел работающую библиотеку воспроизводящую морзе, и опять не могу подружить символы введеные с клавиатуры с функцией morse.sendmsg(" ");

//#include <PS2Keyboard.h>
// Usage: morse( <pin number>, <speed WPM>, <1=beep, 0=PTT> )
//        sendmsg( "<text-to-send>" )

#include <Morse.h>

//const int DataPin = 2;
//const int IRQpin =  3;

// Uncomment to beep a speaker at pin 9
Morse morse(9, 6, 1);
//PS2Keyboard keyboard;

// Use pin 13 (built-in LED of Arduino 2009)
// Morse morse(13, 12, 0);

void setup()
{
 // delay(1000);
 // keyboard.begin(DataPin, IRQpin);
  Serial.begin(9600);
 // Serial.println("Keyboard Test:");
}

void loop()
{
 /*if (keyboard.available()) {
   // char c = keyboard.read();
      Serial.print(keyboard.read());
   } */
morse.sendmsg("333");
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А Вы пробовали так, как я Вам говорил? 

Клапауций 823
Клапауций 823 аватар
Offline
Зарегистрирован: 13.01.2017

ЕвгенийП пишет:

А Вы пробовали так, как я Вам говорил? 

я запретил.

primnet
Offline
Зарегистрирован: 08.08.2016

ЕвгенийП пишет:

А Вы пробовали так, как я Вам говорил? 

Пробывал, но с использованием библиотеки предположил что будет проще.

#include <PS2Keyboard.h>
// Usage: morse( <pin number>, <speed WPM>, <1=beep, 0=PTT> )
//        sendmsg( "<text-to-send>" )
#include <Morse.h>

const int DataPin = 2;
const int IRQpin =  3;

// Uncomment to beep a speaker at pin 9
Morse morse(9, 20, 1);
PS2Keyboard keyboard;

// Use pin 13 (built-in LED of Arduino 2009)
// Morse morse(13, 12, 0);

void setup()
{
 // delay(1000);
 keyboard.begin(DataPin, IRQpin);
 Serial.begin(9600);
 Serial.println("Keyboard Test:");
}

void loop() {
if (keyboard.available()) {  
    char ch = keyboard.read();
    char *ptrCod;
    ptrCod = &ch;
    Serial.println(ch);
    morse.sendmsg(ptrCod); /* должен содержать указатель на массив знака морзе, 
   но в этом месте после одного веденного знака зацикливается и 
   начинает передавать только короткие сигналы */
    delay(5000);
  }
}

https://www.dropbox.com/s/nq2m24xehwd8m82/morse.zip?dl=0 - Библиотека Morse.h

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

primnet пишет:

Пробывал, но с использованием библиотеки предположил что будет проще.

И как предположение? Оправдалось?

primnet
Offline
Зарегистрирован: 08.08.2016

Пока нет(((

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, тогда делайте по-человечески. Я сказал, что помогу, но мезаническую-то работы по составлению массивов Вы можете сами сделать, не нм же её делать за Вас.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

В библиотеке следующие коды, а у Вас?
 

morsecode
    107, //ASCII 33 !   
    82,  //ASCII 34 "   
    1,   //ASCII 35 #   
    137, //ASCII 36 $   
    1,   //ASCII 37 %   
    40,  //ASCII 38 &   
    94,  //ASCII 39 '  
    109, //ASCII 40 (
    109, //ASCII 41 )   
    1,   //ASCII 42 *   
    42,  //ASCII 43 +   
    115, //ASCII 44 ,   
    97,  //ASCII 45 -   
    85,  //ASCII 46 .   
    50,  //ASCII 47 /  
    63,  //ASCII 48 0
    62,  //ASCII 49 1
    60,  //ASCII 50 2
    56,  //ASCII 51 3
    48,  //ASCII 52 4
    32,  //ASCII 53 5
    33,  //ASCII 54 6
    35,  //ASCII 55 7
    39,  //ASCII 56 8
    47,  //ASCII 57 9
    120, //ASCII 58 :
    53,  //ASCII 59 ;
    1,   //ASCII 60 <
    49,  //ASCII 61 =
    1,   //ASCII 62 >
    76,  //ASCII 63 ?
    69,  //ASCII 64 @
    6,   //ASCII 65 A
    17,  //ASCII 66 B
    21,  //ASCII 67 C
    9,   //ASCII 68 D
    2,   //ASCII 69 E
    20,  //ASCII 70 F
    11,  //ASCII 71 G
    16,  //ASCII 72 H
    4,   //ASCII 73 I
    30,  //ASCII 74 J
    13,  //ASCII 75 K
    18,  //ASCII 76 L
    7,   //ASCII 77 M
    5,   //ASCII 78 N
    15,  //ASCII 79 O
    22,  //ASCII 80 P
    27,  //ASCII 81 Q
    10,  //ASCII 82 R
    8,   //ASCII 83 S
    3,   //ASCII 84 T
    12,  //ASCII 85 U
    24,  //ASCII 86 V
    14,  //ASCII 87 W
    25,  //ASCII 88 X
    29,  //ASCII 89 Y
    19,  //ASCII 90 Z
    1,   //ASCII 91 [    
    1,   //ASCII 92 \    
    1,   //ASCII 93 ]    
    1,   //ASCII 94 ^    
    77,  //ASCII 95 _    
    94,  //ASCII 96 `    
    6,   //ASCII 97 a
    17,  //ASCII 98 b
    21,  //ASCII 99 c
    9,   //ASCII 100 d
    2,   //ASCII 101 e
    20,  //ASCII 102 f
    11,  //ASCII 103 g
    16,  //ASCII 104 h
    4,   //ASCII 105 i
    30,  //ASCII 106 j
    13,  //ASCII 107 k
    18,  //ASCII 108 l
    7,   //ASCII 109 m
    5,   //ASCII 110 n
    15,  //ASCII 111 o
    22,  //ASCII 112 p
    27,  //ASCII 113 q
    10,  //ASCII 114 r
    8,   //ASCII 115 s
    3,   //ASCII 116 t
    12,  //ASCII 117 u
    24,  //ASCII 118 v
    14,  //ASCII 119 w
    25,  //ASCII 120 x
    29,  //ASCII 121 y
    19   //ASCII 122 z
    };

 

andreysemenow
Offline
Зарегистрирован: 13.02.2018

Здравствуйте, а не могли бы вы полностью скетч сбросить на почту, если не сложно?

Andrey.semenow94@yandex.ru

Green
Offline
Зарегистрирован: 01.10.2015

Было дело. Индикация, рус/лат, скорость, громкость, регулировка длительностей - всё с клавиатуры. Запись, воспроизведение по Fn клавишам... Песня для тех кто понимает.)

andreysemenow
Offline
Зарегистрирован: 13.02.2018

Может быть у вас остался данный проект? Не могли бы поделиться своими трудами? 

Green
Offline
Зарегистрирован: 01.10.2015

Запросто. Ищите в исполнителях.

andreysemenow
Offline
Зарегистрирован: 13.02.2018

Отписал на почту.