記号出題範囲の変更希望
K3NG CW Keyerには、聞こえた符号をそのまま打ち返す練習機能がある。オリジナルでは、その出題範囲はアルファベットのみ。TTKY01では出題範囲を変更し、数字といくつかの記号を追加した。
記号は、「/」、「?」、「.」、「,」の四つ。これはTwitterで得たアドバイスに基づく。
「/」と「?」の二つは必須で、「,」と「.」はあったほうがいいんじゃないかという話。こういう経緯でコードを作ったのだけど、TTKY01のユーザから「,と.は出題しないで欲しい」というような意見をもらった。この二つの記号の重要度(使用頻度)は人によって違うのでそういう意見もあるだろう。
K3NG CW Keyerはオープンソースだし、この出題に関する私の変更箇所も公開しているので、好きなように改造してもらえばいいと思う。が、投げっぱなしもなんなので、少し見てみた。
検討の結果、ハードウェアのわずかな改造と、ソースコードの少しの変更で、両方に対応できることがわかった。以下、その方法。
変更(改造)方法
方針
記号の出題範囲は以下の二種類。
- これまで通り、「/?,.」の四つ
- 「/?」の二つに限定
この二種類をハードウェアの設定で切り替えられるようにする(ソフトウェアを二種類作るのは管理が面倒なので)。
ハードウェア変更
現状、すでにプログラム領域はほとんど空きがない。したがって、複雑な判定をソフトウェアに追加するのは無理(電源投入時にボタンの状態を読むなど)。
ハードウェアにスイッチを追加するなどすればソフトは簡単だけど、ケースの改造などはやりたくない。空きピンも基本的にはないが、ISP用のピンは空けてある。これをじっと眺めてみると、MOSIがGNDの隣り。このピンを切り替えに使うのが簡単そう。MOSIピン、つまり、Arduinoでいうところの(デジタル)11番ピン。これがOpenかGNDに落ちているかを見ればよい。
ソフトウェア変更
出題文字を決めているのは、random_cw_code()。これは私が追加した関数。以下がそれ。
char random_cw_code() {
byte c;
c = (char)random(55,95);
if (c <= 64) { // number
c -= 7; // c: 48(0) to 57(9)
}
else {
switch (c) {
case 91 :
c = '/';
break;
case 92 :
c = '?';
break;
case 93 :
c = ',';
break;
case 94 :
c = '.';
break;
default: // alphabet
break;
}
}
return(c);
}
今回の変更を想定していたかのような構造になっている。乱数を発生させて93と94がそれぞれ,と.。この二つが発生乱数の上限のところに位置しているのが素晴らしい。単純に、乱数の上限値を二つ減らして93にするだけで今回の目的が達成できる。上に書いたように11番ピンの状態を見て出題範囲を変更する。
char random_cw_code() {
byte c;
pinMode(11, INPUT_PULLUP); // D11 (MOSI)
if (digitalRead(11) == HIGH) {
c = (char)random(55,95);
}
else {
c = (char)random(55,93);
}
if (c <= 64) { // number
c -= 7; // c: 48(0) to 57(9)
}
else {
switch (c) {
case 91 :
c = '/';
break;
case 92 :
c = '?';
break;
case 93 :
c = ',';
break;
case 94 :
c = '.';
break;
default: // alphabet
break;
}
}
return(c);
}
これだけ。なお、文字出題のたびにpinMode()が実行されて無駄だけど、プログラム(の改造)をシンプルにするために、これでよしとする。
使用方法
ソースコード(スケッチ)を上のように変更し、コンパイルと書き込みを行う。コンパイル済みのものをここに置いておくので、それを使ってもよい。
ハードウェアは、何もしなければこれまで通り(「/?,.」の四種類が出題される)。MOSIピンを隣のGNDに接続すれば記号は「/?」の二つだけが出題される。この二つだけに固定するなら、MOSIピンとGNDを適当なワイヤでつないでハンダ付けすればよい。下の写真のように、ピンヘッダを立ててショートピンを使えるようにすれば切り替えもできる(蓋を開ける手間はあるが)。
ATmega328Pの書込み環境をお持ちでない方へ
TTKY01をすでにお持ちで、ATmega328Pの書込み環境がない方にはSASEで対応します。こちらの問合せフォームからご連絡ください。詳細は追ってお知らせします。
コメント