26 Arduino モールス通信キーヤーを作成 1
この記事では、モールス通信をするときに使用するエレクトリック・キーヤーを作成します。キーヤーはすでにPICマイコンを使い以前の記事で作っていますから、その時のアルゴリズムを用いて Arduino のスケッチを作りました。
今回使用する部品は、圧電スピーカーとパドルキーだけで、以下のピンに接続しています。
- pin 2 -> パドルのDot接点
- pin 3 -> パドルのDash接点
- pin 9 -> 圧電スピーカー
プログラムの流れ
機能を実現するプログラムフローは、以前と変わりありませんが、もう一度確認しておきます。
- DotKey確認
パドルの短点キーがONになっているか、確認します。もし、ONなら、直前までにONになった記録フラック(flagDot)を true 「1」にします。続いて、このフラッグを検査し、 true 「1」なら、短点を送信する sendDot関数を実行します。フラッグが、 false 「0」なら、DashKey確認を行います。
- DashKey確認
パドルの長点キーがONになっているか、確認します。もし、ONなら、直前までにONになった記録フラック(flagDash)を true 「1」にします。続いて、このフラッグを検査し、 true 「1」なら、短点を送信する sendDash関数を実行します。フラッグが、 false 「0」なら、DotKey確認に戻ります。
- sendDot関数
短点送信開始:
送信手順が開始したので、フラック(flagDot)をクリアします。そして、LEDをONにし、サイドトーンを出力します。送信を終了するタイミングは、millis関数を利用します。送信開始時点の時間をmillis関数で取得し、短点の継続時間(Speed)を加えた値(tUp)とします。
短点の終了を待つ:
millis関数をを確認し、送信終了を待ちます。待っている間、パドルの長点キーがONになっていないか常に確認し、ONが確認されれば、フラック(flagDash)を「1」にします。
短点送信終了:
LEDをOFFにし、サイドトーンも停止します。短点後のスペース時間タイミングを得るために、現在の時間をmillis関数で取得し、スペースの継続時間(Speed)を加えた値(tUp)をセットします。
短点後のスペース終了を待つ:
millis関数をを確認し、終了を待ちます。待っている間、パドルの長点キーがONになっていないか常に確認し、ONが確認されれば、フラック(flagDash)を「1」にします。
- sendDash関数
sendDot関数と同じ流れです、ただ信号の継続時間だけが異なります。
スケッチの作成
モールス 符号の送信速度をサイドトーンの周波数は、スケッチ上部の変数で指定しています。希望の値に書き換えてください。次の記事でこれらをSWで切り替える機能を追加する予定です。
// Electoric keyer
// 2021-6-24
int keySpeed = 125; // 短点の時間 ms
int frequency = 700; // サイドトーン周波数
int KEY_DOT = 2; // パドルのDot接点は pin 2
int KEY_DASH = 3; // パドルのDash接点は pin 3
int PIN_SPK = 9; // 圧電スピーカーは pin 9
int PIN_LED1 = 13; // LED は ボード内蔵使用
boolean flagDot = 0; // Dotが押された
boolean flagDash = 0; // Dashが押された
unsigned long tUp; // 完了時間
void setup() {
pinMode(KEY_DOT, INPUT_PULLUP);
pinMode(KEY_DASH, INPUT_PULLUP);
pinMode(PIN_LED1, OUTPUT);
}
void loop() {
// 短点が押されてたなら、sendDot()を実行
if(! digitalRead(KEY_DOT)) flagDot = 1;
if(flagDot)sendDot();
// 長点が押されたなら、sendDash()を実行
if(! digitalRead(KEY_DASH)) flagDash = 1;
if(flagDash)sendDash();
}
// dot信号を送る
void sendDot(){
flagDot = 0; // 端点フラグをクリア
digitalWrite(PIN_LED1, 1); // LED ON
tone(PIN_SPK,frequency); // サイドトーン ON
tUp = millis() + keySpeed; // Mark終了時間セット
while(tUp > millis()){ // Mark終了時間まで待つ
// 長点が押されたなら、長点フラグをセット
if(! digitalRead(KEY_DASH)) flagDash = 1;
}
digitalWrite(PIN_LED1, 0); // LED OFF
noTone(PIN_SPK); // サイドトーン OFF
tUp = millis() + keySpeed; // コード終了時間セット
while(tUp > millis()){ // コード終了を待つ
// 長点が押されたなら、長点フラグをセット
if(! digitalRead(KEY_DASH)) flagDash = 1;
}
}
// Dash信号を送る
void sendDash(){
flagDash = 0;
digitalWrite(PIN_LED1, 1);
tone(PIN_SPK,frequency);
tUp = millis() + (keySpeed * 3);
while(tUp > millis()){
if(! digitalRead(KEY_DOT)) flagDot = 1;
}
digitalWrite(PIN_LED1, 0);
noTone(PIN_SPK);
tUp = millis() + keySpeed;
while(tUp > millis()){
if(! digitalRead(KEY_DOT)) flagDot = 1;
}
}
動作の確認
スケッチを Arduino に書き込みプログラムがスタートしたら、接続したパドルを叩いて下ださい。ボード上の「L」LEDが点灯し、LEDに同期してサイドトーンが圧電スピーカーから聞こえます。
次回は、使いやすくするために、EEPROMを使い送信速度とサイドトーン周波数を設定記録する方法の記事を予定します。