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を使い送信速度とサイドトーン周波数を設定記録する方法の記事を予定します。