Морзе клавиатура
- Войдите на сайт для отправки комментариев
Ср, 18/01/2017 - 08:46
привет, пытаюсь сделать морзе клавиатуру на основе 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);
}
}
привет, пытаюсь сделать морзе клавиатуру на основе ps2 клавиатуры, возникла сложность с синхронизацией полученных символов с клавиатуры и кодом воспроизводящим морзе.
И что? У Вас есть вопрос? Или Вы просто поставили всех в известность?
Судя по коду, сложностей у Вас выще головы.
Например, что делает константа 'sos' в строке 126. Что он, по-вашему, означает?
Строки 56-78 ... Вы уверены, что для того, чтобы райти символ, необходим цикл тройной вложенности?
Про массивы layoutХХХ я уж и не говорю. Зачем хранить одиночные символы как строки?
Например, что делает константа 'sos' в строке 126. Что он, по-вашему, означает?
это строка для передачи в функцию morse, должна быть в двойных кавычках)
Строки 56-78 ... Вы уверены, что для того, чтобы райти символ, необходим цикл тройной вложенности?
в этом я не особо уверен, так было предложенно в примере, я так и не смог полностью разобраться.
у меня вопрос как конвентировать массив полученный с клавиатуры в str в функцию morse.
Ну, это совсем не так делать надо.
Выпишите все символы, идущие подряд у Вас получится несколько последовательностей. Одна - 'а'-'я', вторая - 'a'-'z', третья '0'-'9'
Всякие запятые с точками, выпишите сами.
Вам нужны последовательности символов, которые идут подряд. Таких у Вас получится штуки 4.
Потом просто сделаете столько же масивов символов морзе и в качестве индекса в них будете использовать введённый с клавиш код.
Если сразу непонятно, я Вам помогу, пока выпишите все последовательности.
Нашел работающую библиотеку воспроизводящую морзе, и опять не могу подружить символы введеные с клавиатуры с функцией 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"); }А Вы пробовали так, как я Вам говорил?
А Вы пробовали так, как я Вам говорил?
я запретил.
А Вы пробовали так, как я Вам говорил?
Пробывал, но с использованием библиотеки предположил что будет проще.
#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
Пробывал, но с использованием библиотеки предположил что будет проще.
И как предположение? Оправдалось?
Пока нет(((
Ну, тогда делайте по-человечески. Я сказал, что помогу, но мезаническую-то работы по составлению массивов Вы можете сами сделать, не нм же её делать за Вас.
В библиотеке следующие коды, а у Вас?
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 };Здравствуйте, а не могли бы вы полностью скетч сбросить на почту, если не сложно?
Andrey.semenow94@yandex.ru
Было дело. Индикация, рус/лат, скорость, громкость, регулировка длительностей - всё с клавиатуры. Запись, воспроизведение по Fn клавишам... Песня для тех кто понимает.)
Может быть у вас остался данный проект? Не могли бы поделиться своими трудами?
Запросто. Ищите в исполнителях.
Отписал на почту.