JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

ATtiny402 エレキー

2023-08-28 16:13:20 | ATtiny
 ATtiny402でエレキーを作ってみます。

 回路図です。
 パドルはDOTをD1(PA7)に、DASHをD2(PA1)に接続し、各ピンは、10kΩでプルアップしています。
 スピード調節用に10kΩボリュームの電圧をAD変換して0~1023の値で読み込みます。
 送信機用はD3に出力し、それをトランジスタのオープンコレクタで送信機のKEY接続します。出力のモニターとしてLEDを接続しています。
 サイドートーンは、PWM4(PA3)にPWM信号で出力し、スピーカーで音を聞きます。
 


 エレキーのアルゴリズムです。
 このフローチャートは、以前Raspberry Pi Picoでエレキーを作った時のものです。ATtiny402では、Timer割り込みを使わないで、whileループ内で処理を行います。

 それでは、DOT出力とDASH出力は、どれだけの時間なのでしょうか。
 DOTとSPACEは同じ時間、DASHはDOTの3倍です。

 アマチュア無線の場合、CWの送信速度は一般的に20wpm(20 word per minute)程度です。1wordはPARISという符号を基準にしますので5文字、50DOTに相当します。したがって、20wpmの場合は、1DOTは60msとなります。
 
 CWスピードの調整範囲は、
 1DOT=40ms(30wpm=150字/分)から1DOT=200ms(6wpm)としました。
 ADコンバータから得られる0~1023を4で割った値0~255を利用します。

 スケッチです。
 乾電池2本(3V)動作とPWMの周波数の関係で、クロックは16MHzとしてコンパイルしました。
-------------------------------------------
/*
 * ATtiny402 TLEKEY
 * 2023.8.28
 * JH7UBC Keiji Hata
 */

#define SPEED 0
#define DOTKEY 1
#define DASHKEY 2
#define TX 3
#define SIDETONE 4
bool Dot_flag = false;
bool Dash_flag = false;
uint16_t dot_time;//dot_time=0~255

void setup() {
   pinMode(DOTKEY,INPUT);
   pinMode(DASHKEY,INPUT);
   pinMode(TX,OUTPUT);
   pinMode(SIDETONE,OUTPUT);
   digitalWrite(TX,LOW);
   analogWrite(SIDETONE,0);//サイドトーンを出さない
}

void loop() {
   dot_time = analogRead(SPEED)>>2;//Speedを読み込む
   //speedの上限と下限を設定
   if(dot_time <= 40){
     dot_time = 40;
   }else if(dot_time>= 200){
     dot_time = 200;
  }

   //DOTKEYが押されたかDot_flagが立っていれば、DOTとSPACEを送出する。
   if(digitalRead(DOTKEY)==LOW || Dot_flag==true){
     Dot_out();
     Dot_flag = false;//Dot_flagを下す
  }
   //DASHKEYが押されたかDash_flagが立っていれば、DASHとSPACEを送出する。
   if(digitalRead(DASHKEY)==LOW || Dash_flag==true){
     Dash_out();
     Dash_flag = false;//Dash_flagを下す
    }
}

void Space_out(){
   digitalWrite(TX,LOW);//TX off
   analogWrite(SIDETONE,0);//サイドトーンを出さない
   uint16_t c = dot_time;
   while(c){
     c--;
     delay(1);
    }
}

//Dotとspaceを送出
void Dot_out(){
   digitalWrite(TX,HIGH);//TX on
   analogWrite(SIDETONE,127);//サイドトーンを出す
   uint16_t c = dot_time;
   while(c){
     if(digitalRead(DASHKEY)==LOW){
       Dash_flag = true;
    }
       c--;
       delay(1);
  }
       Space_out();
}

//Dashとspaceを送出
void Dash_out(){
   digitalWrite(TX,HIGH);//TX on
   analogWrite(SIDETONE,127);//サイドトーンを出す
   uint16_t c =(dot_time <<1) + dot_time;
   while(c){
     if(digitalRead(DOTKEY)==LOW){
       Dot_flag = true;
    }
       c--;
       delay(1);
       }
       Space_out();
  }
-------------------------------------------
 ブレッドボードでテストしている様子です。
 サイドトーン用のPWMの周波数は約1000Hzです。
 ATtiny402は、結構力持ちでPWM出力ピンに直接スピーカーを接続するとかなり大きな音が出ます。音量の調節と出力電流を制限するため直列に300Ωの抵抗を入れています。


 テストなので、トランジスタはつけず、LEDと音で動作を確認しています。

 乾電池2本で動作させています。

 このエレキーの打ち心地は、普通のエレキーと同じで問題なく使えます。
 自作送信機に組み込むなどして使うと良いと思います。
 プログラムサイズは、フラッシュメモリが958バイト(23%)、RAMが14バイト(5%)です。ATtiny202でも十分組めるサイズです。