ATtiny85で横振り電鍵用エレキーを作った話

3級アマチュア無線の試験に続き、2級陸上特殊無線技士の試験を受けてきました。 試験範囲がほとんど同じなので、アマ3級取るならついでに受験したほうがお得です^^
2陸特はアマチュア無線と違って実務にも使えるし・・・昨今流行りのドローンとか、一部は陸特の免許が必要なようです。

結果は・・・

速報値満点💯なので、多分合格しているでしょう^^

さて、エレキー

この前Arduinoで作ったエレキーですが、ブレッドボードのままだとあちこち持ち歩いて練習するには不向きです。
ケーブルとか抜けまくるもんね・・・

ちなみに前回↓ kikyujin.hatenablog.com

そこで、今回ユニバーサルボードに実装することにして、ついでにコンパクトなマイコンに変更しようと思います。

  • 出力がLEDとブザーの2本
  • 入力がL/Rの2本

8ピンのATtiny85でも十分ですね。
あと、CR2032で駆動できるなら、かなりコンパクトにできそうです。

配線もソースもそんなに変わらない

配線図はこちら↓

まずはブレッドボードに実装してみます。
 

ソースもほとんど変わりません。
Arduinoって本当にプロトタイピングに向いてますよね。

#include <avr/sleep.h>
#include <avr/interrupt.h>

#define BUZ_PIN 1
#define LED_PIN 0
#define SW_S_PIN 3
#define SW_L_PIN 4

#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 sleep()
{
    GIMSK |= _BV(PCIE);   // Enable Pin Change Interrupts
    PCMSK |= _BV(PCINT3); // Use PB3 as interrupt pin
    PCMSK |= _BV(PCINT4); // Use PB4 as interrupt pin
    ADCSRA &= ~_BV(ADEN); // ADC off
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    sleep_enable();       // Sets the Sleep Enable bit
    sei();          // Enable interrupts
    sleep_cpu();    // sleep

    cli();          // Disable interrupts
    PCMSK &= ~_BV(PCINT3);    // Turn off PB3 as interrupt pin
    PCMSK &= ~_BV(PCINT4);    // Turn off PB4 as interrupt pin
    sleep_disable();      // Clear SE bit
    ADCSRA |= _BV(ADEN);  // ADC on

    sei();    // Enable interrupts
}

ISR(PCINT0_vect) {
}

// 長点
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;
    } else {
      sleep();
    }
  }
}

トピックとしては、コイン電池で駆動するので無入力時に今まで全力で待ってたところスリープするように変更した程度でしょうか。

なお、スリープについてはこちらのサイトを参考にしました↓ maplerain78.blogspot.com

Arduino/AT系マイコンは情報多くて助かりますm(_ _)m

ユニバーサル基板に実装

さらっと実装したところ
ついでにスイッチで音量の大小を切り替えられるようにしておきました。
裏面はハンダ跡が醜いので勘弁^^;

100円ショップで購入したカンに入れて持ち運べます。

都合の良いことに、フタの上に電鍵がくっつく仕様。

これで、出張中でもどこでもモールス練習ができますぞ!

youtu.be