cwKeyboard
hr.icon
モールス符号をパドルを使わずに、MacやWinのキーボードから入力したい。
https://gyazo.com/aede793b1c7d2fe0bd005db71af67cc2
special tnx
and
happy birthday
hr.icon
まず、
FT232RL USBチップのドライバをインストールする必要がある
■ ダウンロードページ
該当するドライバを選択してインストールする
ダウンロードしたこのドライバを、まずは「アプリケーション」フォルダにインストールしてから、クリックしたインストールを始める。
ggzは、1.5.0をインストールした動作した。
https://gyazo.com/da965d48ec61613fa1583946b1b25c55
hr.icon
キーボードの入力をarduinoに直接渡す方法
1. デバイスを探す(USBと付いたもの)
$ ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port /dev/tty.usbmodem101 /dev/tty.wlan-debug
2. デバイスに接続(9600bps)
$ screen /dev/tty.usbmodem101 9600
ggz
$ screen /dev/tty.usbmodem14201 9600
$ screen /dev/tty.usbmodem14301 9600
hr.icon
D13:内蔵LED(橙)が符号に合わせて点滅する
code:tontu_v05_220923.ino
int s_speed=100; //短点長 ms
int l_speed=s_speed*3; //長点長=短点長x3 ms
int m_speed=s_speed*2;
int ll_speed=s_speed*6;//単語間長=短点長x6 ms
// モールスコードデータ構造
//0bxxxxxyyz
//xxxxx + z モールスコード 0が短点1が長点の並び 例えばAの場合01 .-
//yyz 要素数 短点と長点の総数 バイナリー Aの場合010 Zの場合101 ?の場合110
//yy yyが11の場合zが末尾のモールスコード 例えば@の場合01101110となります .--.-.
// . - -. - プラス 末尾の . 結果 .--.-.となる
//0b00000000 モールス符号にない場合は0b00000000とする
unsigned char m_t[]={
0b00000000, // sp ascii code No. 32
0b00000000, // !
0b01001110, // "
0b00000000, // #
0b00000000, // $
0b00000000, // %
0b00000000, // &
0b01111110, // '
0b10110101, // (
0b10110111, // )
0b10010100, // *
0b01010101, // +
0b11001111, // ,
0b10000111, // -
0b01010111, // .
0b10010101, // /
0b11111101, // 0
0b01111101, // 1
0b00111101, // 2
0b00011101, // 3
0b00001101, // 4
0b00000101, // 5
0b10000101, // 6
0b11000101, // 7
0b11100101, // 8
0b11110101, // 9
0b11100110, // :
0b01111110, // ;
0b00000000, // <
0b00000000, // =
0b00000000, // >
0b00110110, // ?
0b01101110, // @
0b01000010, // A
0b10000100, // B
0b10100100, // C
0b10000011, // D
0b00000001, // E
0b00100100, // F
0b11000011, // G
0b00000100, // H
0b00000010, // I
0b01110100, // J
0b10100011, // K
0b01000100, // L
0b11000010, // M
0b10000010, // N
0b11100011, // O
0b01100100, // P
0b11010100, // Q
0b01000011, // R
0b00000011, // S
0b10000001, // T
0b00100011, // U
0b00010100, // V
0b01100011, // W
0b10010100, // X
0b10110100, // Y
0b11000100, // Z
0b00011110, // [
0b00000000, //
0b00011111, // ]
0b00000000, // ^
0b00110111, // _
0b00000000, //
0b01000010, // a
0b10000100, // b
0b10100100, // c
0b10000011, // d
0b00000001, // e
0b00100100, // f
0b11000011, // g
0b00000100, // h
0b00000010, // i
0b01110100, // j
0b10100011, // k
0b01000100, // l
0b11000010, // m
0b10000010, // n
0b11100011, // o
0b01100100, // p
0b11010100, // q
0b01000011, // r
0b00000011, // s
0b10000001, // t
0b00100011, // u
0b00010100, // v
0b01100011, // w
0b10010100, // x
0b10110100, // y
0b11000100 // z ascii code No. 122
};
void tontu( char s){
int p=7; //
unsigned char w=0;
int len;
len=int(m_ts&0b00000111); // zzyのみ読み取り /*
Serial.print("len=");
Serial.println(len,BIN);
Serial.print("s=");
Serial.println(int(s+32));
Serial.print("m_t=");
Serial.println(m_ts,BIN); */
if(len>0){
if(len==6){ // 総数が6で末尾が短点の場合
w=m_ts&0b11111011; // 強制的に2ビット目を0にする }
if(len==7){ // 総数が7で末尾が長点の場合
// w=m_ts|0b00000100; // 強制的に2ビット目を1にする len=6; // 総数を6に戻す
}
// Serial.print("w=");
// Serial.println(w,BIN);
Serial.print(s);
do {
if(bitRead(w,p)==0){ //p番目のビットを調べて0なら短点違う場合は長点
digitalWrite(tontu_out,HIGH); //短点長分ポートをオン
delay(s_speed);
digitalWrite(tontu_out,LOW);
Serial.print(".");
}
else{ //長点長分ポートをオン
digitalWrite(tontu_out,HIGH);
delay(l_speed);
digitalWrite(tontu_out,LOW);
Serial.print("-");
}
p--;//調べるビット位置を減らす
len--;//調べる数を減らす
delay(s_speed);//1短点長、間を開ける
}while(len>0);
Serial.print(" ");
}
}
void setup() {
// put your setup code here, to run once:
pinMode(tontu_out,OUTPUT);
digitalWrite(tontu_out,LOW);
Serial.begin(9600);
}
void loop() {
char incomingByte=0;
if (Serial.available() > 0) {
incomingByte = Serial.read();
if((incomingByte>33) && (incomingByte<123)){
tontu(incomingByte-32);
delay(m_speed);
}
if(incomingByte==32){
delay(ll_speed);
}
}
}
hr.icon
欧文和文切り替えに対応しました
リファクタリングしてないのでコード汚いのはご容赦を by JK1MQZ 使い方
Tabキー : 和文/欧文切り替え (ホレ / ラタ を送信します)
code:wabun_v01_221005.ino
int wabun_mode = 0;
int baffa = 0;
int s_speed=100; //短点長 ms
int l_speed=s_speed*3; //長点長=短点長x3 ms
int m_speed=s_speed*2;
int ll_speed=s_speed*6;//単語間長=短点長x6 ms
// モールスコードデータ構造
//0bxxxxxyyz
//xxxxx + z モールスコード 0が短点1が長点の並び 例えばAの場合01 .-
//yyz 要素数 短点と長点の総数 バイナリー Aの場合010 Zの場合101 ?の場合110
//yy yyが11の場合zが末尾のモールスコード 例えば@の場合01101110となります .--.-.
// . - -. - プラス 末尾の . 結果 .--.-.となる
//0b00000000 モールス符号にない場合は0b00000000とする
unsigned char m_t[]={
0b00000000, // sp ascii code No. 32
0b00000000, // !
0b01001110, // "
0b00000000, // #
0b00000000, // $
0b00000000, // %
0b00000000, // &
0b01111110, // '
0b10110101, // (
0b10110111, // )
0b10010100, // *
0b01010101, // +
0b11001111, // ,
0b10000111, // -
0b01010111, // .
0b10010101, // /
0b11111101, // 0
0b01111101, // 1
0b00111101, // 2
0b00011101, // 3
0b00001101, // 4
0b00000101, // 5
0b10000101, // 6
0b11000101, // 7
0b11100101, // 8
0b11110101, // 9
0b11100110, // :
0b01111110, // ;
0b00000000, // <
0b00000000, // =
0b00000000, // >
0b00110110, // ?
0b01101110, // @
0b01000010, // A
0b10000100, // B
0b10100100, // C
0b10000011, // D
0b00000001, // E
0b00100100, // F
0b11000011, // G
0b00000100, // H
0b00000010, // I
0b01110100, // J
0b10100011, // K
0b01000100, // L
0b11000010, // M
0b10000010, // N
0b11100011, // O
0b01100100, // P
0b11010100, // Q
0b01000011, // R
0b00000011, // S
0b10000001, // T
0b00100011, // U
0b00010100, // V
0b01100011, // W
0b10010100, // X
0b10110100, // Y
0b11000100, // Z
0b00011110, // [
0b00000000, //
0b00011111, // ]
0b00000000, // ^
0b00110111, // _
0b00000000, //
0b01000010, // a
0b10000100, // b
0b10100100, // c
0b10000011, // d
0b00000001, // e
0b00100100, // f
0b11000011, // g
0b00000100, // h
0b00000010, // i
0b01110100, // j
0b10100011, // k
0b01000100, // l
0b11000010, // m
0b10000010, // n
0b11100011, // o
0b01100100, // p
0b11010100, // q
0b01000011, // r
0b00000011, // s
0b10000001, // t
0b00100011, // u
0b00010100, // v
0b01100011, // w
0b10010100, // x
0b10110100, // y
0b11000100, // z ascii code No. 122
0b11011101, // ア origin code No. 123
0b01000010, // イ
0b00100011, // ウ
0b10111101, // エ
0b01000101, // オ
0b01000100, // カ
0b10100101, // キ
0b00010100, // ク
0b10110100, // ケ
0b11110100, // コ
0b10101101, // サ
0b11010101, // シ
0b11101101, // ス
0b01110101, // セ
0b11100100, // ソ
0b10000010, // タ
0b00100100, // チ
0b01100100, // ツ
0b01011101, // テ
0b00100101, // ト
0b01000011, // ナ
0b10100100, // ニ
0b00000100, // ヌ
0b11010100, // ネ
0b00110100, // ノ
0b10000100, // ハ
0b11001101, // ヒ
0b11000100, // フ
0b00000001, // ヘ
0b10000011, // ホ
0b10010100, // マ
0b00101101, // ミ
0b10000001, // ム
0b10001101, // メ
0b10010101, // モ
0b01100011, // ヤ
0b00000000, //
0b10011101, // ユ
0b00000000, //
0b11000010, // ヨ
0b00000011, // ラ
0b11000011, // リ
0b10110101, // ル
0b11100011, // レ
0b01010100, // ロ
0b10100011, // ワ
0b01001101, // ヰ
0b00000000, //
0b01100101, // ヱ
0b01110100, // ヲ
0b01010101, // ン origin code No. 173(123+50)
0b00000010, // 濁点
0b00110101, // 半濁点
0b01101101, // - 長音
0b01010111, // , 区切点
0b01010110, // enter 段落
0b10110111, // (下向き括弧
0b01001110, // )上向き括弧
0b10011111, // ホレ
0b00010101 // ラタ
};
String wabun_display[]={
"ア",
"イ",
"ウ",
"エ",
"オ",
"カ",
"キ",
"ク",
"ケ",
"コ",
"サ",
"シ",
"ス",
"セ",
"ソ",
"タ",
"チ",
"ツ",
"テ",
"ト",
"ナ",
"ニ",
"ヌ",
"ネ",
"ノ",
"ハ",
"ヒ",
"フ",
"ヘ",
"ホ",
"マ",
"ミ",
"ム",
"メ",
"モ",
"ヤ",
" ",
"ユ",
" ",
"ヨ",
"ラ",
"リ",
"ル",
"レ",
"ロ",
"ワ",
"ヰ",
" ",
"ヱ",
"ヲ",
"ン",
"”",
"゜"
};
void tontu_wabun( char s, char s2 ){
int array_num = 123-32;
int dakuten_mode = 0;
if(s2 == 0){
switch (s) {
case 'a':
array_num += 0;
break;
case 'i':
array_num += 1;
break;
case 'u':
array_num += 2;
break;
case 'e':
array_num += 3;
break;
case 'o':
array_num += 4;
break;
// 和文記号
case '-':
array_num = array_num+53;
break;
case ',':
array_num = array_num+54;
break;
case (char)13:
array_num = array_num+55;
break;
case '(':
array_num = array_num+56;
break;
case ')':
array_num = array_num+57;
break;
case (char)9:
array_num = array_num+59;
break;
}
}else{
switch (s) {
// 通常 五十音 母音
case 'k':
array_num += 5;
break;
case 's':
array_num += 10;
break;
case 't':
array_num += 15;
break;
case 'n':
array_num += 20;
break;
case 'h':
array_num += 25;
break;
case 'm':
array_num += 30;
break;
case 'y':
array_num += 35;
break;
case 'r':
array_num += 40;
break;
case 'w':
array_num += 45;
break;
// 濁点 五十音 母音
case 'g':
dakuten_mode = 1;
array_num += 5;
break;
case 'z':
dakuten_mode = 1;
array_num += 10;
break;
case 'd':
dakuten_mode = 1;
array_num += 15;
break;
case 'b':
dakuten_mode = 1;
array_num += 25;
break;
// 半濁点 五十音 母音
case 'p':
dakuten_mode = 2;
array_num += 25;
break;
}
switch (s2) {
case 'a':
array_num += 0;
break;
case 'i':
array_num += 1;
break;
case 'u':
array_num += 2;
break;
case 'e':
array_num += 3;
break;
case 'o':
array_num += 4;
break;
case 'n':
array_num += 30;// 母音「n」時点で +20 なので +30 して +50 にする
break;
}
}
if ((array_num>90) && (array_num<142)) {
if (dakuten_mode > 0) {
// 濁点 or 半濁点の場合
}
}
tontu(array_num);
delay(m_speed);
if (dakuten_mode > 0) {
tontu(123-32+50+dakuten_mode);
delay(m_speed);
}
}
void tontu( int s){
int p=7; //
unsigned char w=0;
int len;
len=int(m_ts&0b00000111); // zzyのみ読み取り if(len>0){
if(len==6){ // 総数が6で末尾が短点の場合
w=m_ts&0b11111011; // 強制的に2ビット目を0にする }
if(len==7){ // 総数が7で末尾が長点の場合
// w=m_ts|0b00000100; // 強制的に2ビット目を1にする len=6; // 総数を6に戻す
}
//Serial.print("w=");
//Serial.println(w,BIN);
//Serial.print(s);
do {
if(bitRead(w,p)==0){ //p番目のビットを調べて0なら短点違う場合は長点
digitalWrite(tontu_out,HIGH); //短点長分ポートをオン
delay(s_speed);
digitalWrite(tontu_out,LOW);
Serial.print(".");
}
else{ //長点長分ポートをオン
digitalWrite(tontu_out,HIGH);
delay(l_speed);
digitalWrite(tontu_out,LOW);
Serial.print("-");
}
p--;//調べるビット位置を減らす
len--;//調べる数を減らす
delay(s_speed);//1短点長、間を開ける
}while(len>0);
Serial.print(" ");
}
}
void setup() {
// put your setup code here, to run once:
pinMode(tontu_out,OUTPUT);
digitalWrite(tontu_out,LOW);
Serial.begin(9600);
}
void loop() {
char incomingByte=0;
if (Serial.available() > 0) {
incomingByte = Serial.read();
if(wabun_mode == 1){
// tab key (欧文へ切り替え)
if( incomingByte == (char)9 ){
tontu_wabun(incomingByte, 0);
baffa = 0;
wabun_mode = 0;
// tab key (欧文へ切り替え)
}else if( incomingByte == 32 ){
Serial.print(" ");
delay(ll_speed);
baffa = 0;
// 数字
}else if( baffa == 0 && ( incomingByte == '0' ||
incomingByte == '1' ||
incomingByte == '2' ||
incomingByte == '3' ||
incomingByte == '4' ||
incomingByte == '5' ||
incomingByte == '6' ||
incomingByte == '7' ||
incomingByte == '8' ||
incomingByte == '9') ){
Serial.print(incomingByte);
tontu(incomingByte-32);
delay(m_speed);
// 記号
}else if( baffa == 0 && ( incomingByte == '-' ||
incomingByte == ',' ||
incomingByte == (char)13 ||
incomingByte == '(' ||
incomingByte == ')') ){
Serial.print(incomingByte);
switch (incomingByte) {
case '-':
break;
case ',':
break;
case (char)13:
break;
}
tontu_wabun(incomingByte, 0);
baffa = 0;
// 子音のみ
}else if( baffa == 0 && ( incomingByte == 'a' ||
incomingByte == 'i' ||
incomingByte == 'u' ||
incomingByte == 'e' ||
incomingByte == 'o') ){
tontu_wabun(incomingByte, 0);
baffa = 0;
// 母音+子音
}else{
// 2文字入力
if(baffa == 0){
// バッファが未入力ならバッファリング
baffa = incomingByte;
}else{
// バッファがあれば2文字送信
tontu_wabun(baffa, incomingByte);
baffa = 0;
}
}
}else{
Serial.print(incomingByte);
if(incomingByte==9){
tontu(123+58-32);
baffa = 0;
wabun_mode = 1;
}
if((incomingByte>33) && (incomingByte<123)){
tontu(incomingByte-32);
delay(m_speed);
}
if(incomingByte==32){
delay(ll_speed);
}
}
}
}