esmKeyer222:45円PICマイコン(10F222-I/P)でシンプルエレキー(計画編)

Initial release: 20 June, 2024
Revised: 22 Aug., 2024

12F629で作ったベーシックエレキー(esmKeyer629)のメモリ使用状況を見ていると,機能を絞ってシンプルにすれば秋月電子で45円の10F222-I/Pでもできそうです(そのままではデータメモリが不足).機能の絞り方として速度を3段階に限定し,プッシュスイッチを押すたびに順次切換え巡回(中→高→低→中→...)するようにしました.短点優先,メモリなしはesmKeyer629と同じです.

回路図

回路図です(PDFはこちら).キーイングトランジスタQ1はフォトカプラでエレキーの主回路から絶縁してフローティングになっていますので,プラスキーイング・マイナスキーイングのいずれにも対応できます.ベース・エミッタ間抵抗は,キーイングトランジスタを確実にオフにするため挿入しています.キーイング電流が1mA程度でしたら,Q1と10kΩなしにフォトカプラのトランジスタを直接キーイング出力にしても良いと思います.電池は回路図上ではLR6(単3)と記載していますが,LR03(単4)で十分です.カメラ用リチウム電池(CR2とかCR123A)やボタン型電池(例えば,LR44×2とかCR2032とか)もあり得るかもしれません.


スピードは50cpm/70cpm/85cpm(欧文暗語)の3段階としました.デフォルトは中速の70cpmです.符号発生の方法はesmKeyer629の方に書きましたが,短点は1ms,長点は3msの時間待ちを送信速度に応じた回数繰返しています.本当なら_delay_us()を用いてfor文を廻る際に費やす時間を1000μs,3000μsから差し引いて時間待ちを設定する必要がありますが,本機では省略しています.

xc8のソースコード(ダウンロードはこちら)は以下のとおりです.ライセンスはCC BY-NC-SA 4.0 Internationalです:

/*
 * File:   esmKeyer222.c
 * Author: Cosy MUTO, JH5ESM
 *
 * Version 1.0, 20 June, 2024
 * CC BY-NC-SA 4.0 International
 *     https://creativecommons.org/licenses/by-nc-sa/4.0/
 */

// PIC10F222 Configuration Bit Settings

// 'C' source line config statements

// CONFIG
#pragma config IOSCFS = 4MHZ    // Internal Oscillator Frequency Select bit (4 MHz)
#pragma config MCPU = OFF       // Master Clear Pull-up Enable bit (Pull-up disabled)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config CP = OFF         // Code protection bit (Code protection off)
#pragma config MCLRE = OFF      // GP3/MCLR Pin Function Select bit (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

#define _XTAL_FREQ 4000000
#define basetime_dot    1
#define basetime_dash   3
#define antichatter   500

// Pin assignment
//   1: N/C
//   2: VDD
//   3: GP2             --> Output: Key out
//   4: GP1/AN1/ICSPCLK --> Input : Dot
//   5: GP0/AN0/ICSPDAT --> Input : Dash
//   6: N/C
//   7: VSS
//   8: GP3/MCLR/VPP    --> Input : Fast(85cps)/Medium(70cps)/Slow(50cps)

int spd[] = {101, 72, 59};

void main(void) {
    int i;
    int j = spd[1]; // default speed: 70cps/14wpm, 72ms/dot
    int k = 1;
    
    OSCCAL = 0b00000000; // GP2 as GPIO
    OPTION = 0b10000000; // Weak pull-up enabled on GP3, GP1 & GP0 / GP2 as GPIO
    ADCON0 = 0b00001100; // AD off, GP0 & GP1 as GPIO
    TRIS   = 0b00001011; // Input setting for GP3, GP1 and GP0
    GPIO   = 0b00001011;

    while(1){
        if(!GP1){ // make dot
            GP2 = 1;
            for(i = 0; i < j; i++){
                __delay_ms(basetime_dot); // wait 1ms for designated times
            }
            GP2 = 0;
            for(i = 0; i < j; i++){
                __delay_ms(basetime_dot);
// wait 1ms for designated times
            }
        }
        if(GP1 && !GP0){ // make dash
            GP2 = 1;
            for(i = 0; i < j; i++){
                __delay_ms(basetime_dash);
// wait 3ms for designated times
            }
            GP2 = 0;
            for(i = 0; i < j; i++){
                __delay_ms(basetime_dot);
// wait 1ms for designated times
            }
        }
        if(!GP3){ // change keyer speed: medium -> fast -> slow -> medium-> ...
            k += 1;
            if(k == 3){
                k = 0;
            }
            j = spd[k];
            __delay_ms(antichatter);
        }
    }
}

メモリ使用状況は,データが19バイト,プログラムが274ワードでした.速度設定のところで「3で割った余り: k = (k + 1) % 3」を用いるとデータメモリが足りずコンパイルできませんでしたので,上記のようにして巡回させています.

PIC10F222はプログラムメモリの最終番地に内蔵クロックの補正値が入っているのですが,このプログラムではそれを読み込んでOSCCALに入れることはしていません.私がテストしたチップはちょっと遅めのようで,オシロスコープで短点の時間幅を測って欧文暗語の送信速度に換算してみると45/60/70cpm程度になっていました.

ソルダーレスブレッドボード上のテスト回路では,キーイングトランジスタはプラスキーイング,マイナスキーイングのいずれでも40mAをドライブできましたが,VCEsatが0.6V程度ありました.

HEXファイルはこちら

消費電流はPICマイコンのみで0.3mA(@VDD=3V)でした.フォトカプラのLED電流を0.5mA程度と見込んでいますので,キーイング時は0.8mAの消費電流になるものと予想されます.ボタン型電池というのは十分考えられますね.実機はどうしようかしら?

実機製作編はこちら