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でも十分組めるサイズです。