Arduinoで横振り電鍵のエレキーを作った話

2週間程前にアマチュア無線3級を受験したのですが、昨日ようやく格通知が届きました

ちなみに前回はこちら。 kikyujin.hatenablog.com

やったぜ、これで電波出し放題・・・ではなく、これから免許証の申請をしないといけません。

このページを参考に申請するです↓ www.tele.soumu.go.jp

pdfで申請書があるので、印刷して、収入印紙と証明写真を貼って、住民票を添付して、切手を貼付した免許返送封筒を同封して、その一式を郵便で送付すると1ヶ月ぐらいで返送されてくるそうです。

あれ?デジタル化・・・いなくなってしもたん?
はは、目から鼻水が・・・

ちなみにこて台のスポンジ収入印紙の貼付に便利です
もう印紙の裏をぺろぺろしなくて良いですね😋

それはさておき

諸々準備が整うまでモールスの練習しようと思って、Amazonで安い横振り電鍵を買いました!

なんかカッコいい


ん?モールスってこういうヤツなのでは・・・?
kenelephant.co.jp

これはこれで今もあるんですが、どうも最近はトン・ツーをそれぞれ別のレバー(パドル)で打ち分ける方式になってるようなんです。
多分打電速度が安定するんじゃないかと。

しかし、電鍵言うからには言うてみればただのスイッチなので、このコードをつなぐ先がないと音は鳴りません

当然のことながら無線機ならばこのコードを挿すところが付いているのですが、こちとらまだ電波を出すわけにいかないので、Arduino電波を出さずに好きなだけトン・ツーできる器具を自作しました。

必要なパーツ

  • 言わずとしれたArduino UNO
  • 3.5Φのステレオジャック
    これは秋月でブレッドボードにさせるジャックキットを購入。 150円。

  • そのへんに転がっていたパッシブブザー
    無いとトン・ツー鳴りません。
    まあLEDでチカチカさせるだけでも練習にはなりますが・・・
    あ、アクティブブザーでも良いですが、その場合は音程が変えられません

  • 抵抗
    無くても音が大きいだけで問題ないかと。
    1kΩでだいぶ低音量になります。

配線図


パッシブブザーはPWMできるD11に接続します。
ステレオジャックのL/R(この図ではRING1/2となってますが)はD7/8に接続。
どっちをどっちに繋いでも後々何とでもなります

実際 ↓

プログラム

本物?のエレキーの動作が良くわかってないので、とりあえずで作成しました。
いろんな動画を見ていると、短音(トン)・長音(ツー)が同時押しされた時には長音が優先になっている気がしたので、そのように実装しました。
押しっぱなしでリピートします。
また、素人が打っても短音→長音、長音→短音を素早くすると入力落とすことがあったので、発音待ち時間で1回スキャンを入れました(このあたりは適当です)。
打電速度はDELAY_Sで調整しますが、ひとまずLCWOサイトの20WPMとほぼ同じになるように調整しました(ちょっと遅いかも)。

#define BUZ_PIN 11
#define LED_PIN 13
#define SW_S_PIN 7
#define SW_L_PIN 8

#define DELAY_S 70
#define DELAY_L (3*DELAY_S)

#define TONE_N 0
#define TONE_S 1
#define TONE_L 2

unsigned char nextTone;

void buz_on()
{
  digitalWrite(LED_PIN, HIGH);
  tone(BUZ_PIN, 600);
}

void buz_off()
{
  digitalWrite(LED_PIN, LOW);
  noTone(BUZ_PIN);
}

void setup() {
  pinMode(LED_PIN, OUTPUT);
  pinMode(BUZ_PIN, OUTPUT);
  pinMode(SW_S_PIN, INPUT_PULLUP);
  pinMode(SW_L_PIN, INPUT_PULLUP);
  nextTone = TONE_N;
}


// 長点
void longTone () {
  buz_on();
  delay(DELAY_L);
  buz_off();
  
  // 短点分間隔を開ける&合間に先読みをする
  delay(DELAY_S / 2);   // まず半分待つ

  // 違うキー(短点)が押されているか?(長音優先)
  if (digitalRead(SW_L_PIN) == HIGH && digitalRead(SW_S_PIN) == LOW) {
     nextTone = TONE_S;      // 次は短点
  }

  delay(DELAY_S / 2);   // 残り半分待つ
}

// 短点
void shortTone () {
  buz_on();
  delay(DELAY_S);
  buz_off();
  
  // 短点分間隔を開ける&合間に先読みをする
  delay(DELAY_S / 2);   // まず半分待つ

  // 違うキー(長点)が押されているか?
  if (digitalRead(SW_L_PIN) == LOW) {
     nextTone = TONE_L;      // 次は長点
  }

  delay(DELAY_S / 2);   // 残り半分
}


void loop() {
  if (nextTone == TONE_L) {
    // 長点
    nextTone = TONE_N;
    longTone();
  } else if (nextTone == TONE_S) {
    // 短点
    nextTone = TONE_N;
    shortTone();
  } else {
    // キーが押されている?長点優先でチェック
    if (digitalRead(SW_L_PIN) == LOW) {
      nextTone = TONE_L;
    } else if (digitalRead(SW_S_PIN) == LOW) {
      nextTone = TONE_S;
    }
  }
}

使ってみる


電鍵の底面が磁石になってて固定できるので、その辺にあった中国茶の缶の蓋に貼り付けました^^;

動画はこちら↓ youtube.com

んー、なかなかいい感じ?
というか、本物がどういう動作なのかわからないので比較ができない^^;

この後どうする?

このままでも全然良いのですが、せっかくなのでどこでも練習できるようにATtiny85を使って小型化&電池動作するようにしたいと思います。
ケース・・・どうしようかな・・・