2019年7月19日金曜日

関西アマチュア無線フェスティバル(KANHAM2019)に参加します!

毎年大阪池田市で行われる恒例の関西アマチュア無線フェスティバル(KANHAM2019)に今回もはるばる1エリアから参加します。

昨年新たに結成されメンバーに加えていただいたアマチュアキットクリエイターズ(AKC)がこの関ハムでブースを持つこととなりました。いつもはリトルガンくらぶブースでキットなどの頒布を行っていましたが、混乱を避けるため実際のキット頒布はAKCブースで、完成品のデモンストレーションをリトルガンくらぶブースで行うことにしました。

各ブースは関ハムのサイトの配置図をご覧いただくとわかりますが、ほぼ向かいあった位置に配置されています。

目印はまずリトルガンくらぶの毎度おなじみ『むせんぶ』ポスター



こちらで頒布予定のキットの完成品の展示を行います。また『むせんぶ』グッズを頒布されるそうなので是非お立ち寄りください。

でもって・・・


こちらの横幕を掲げているアマチュアキットクリエイターズ(AKC)ブースにてキットの頒布を行います。

内容はこのブログの上にある『イベント頒布情報』タブを左クリックしてご参照ください。

当日会場内で黒いAKCのTシャツを着たでかいおっさんがいたら多分それは私だと思います。アイボールや自作談義など楽しみましょう!

2019年7月7日日曜日

通過型電力計の製作(その2~マイクロコントローラ編)

回路図が決まったところで、次は得られた進行波と反射波の整流電圧を測定して計算表示させるまでを担うマイクロコントローラー(マイコン)部分のプログラムを設計していきましょう。

わざわざマイコンなんて使わなくても感度の良い電流計を取り付けて校正すればいいじゃん・・・はい、ごもっともです(汗)

しかし高周波とマイコンが融合する姿に私としては非常に引き付けられるものがあるので、ここはぜひマイコンを活用しようではないか!というわけで強引に進めていきます(笑)

具体的にマイコンを選定する前に、何をマイコンにさせるかということを決めておくことが大事です。それからマイコン動作の基本を理解することです。マイコン動作の本質は『計算』です。つまり、外から入力したデータを『計算』して出力に送る、ということです。その『計算』の手順を示すものがいわゆるプログラムということになります。

今回製作した通過型電力計に当てはめてみます。まずデータの入力ですが、進行波や反射波の電圧レベルはそのままマイコンで計算することができないので、最初にアナログーディジタル変換(AD変換)によって電圧レベルをディジタル値に変換します。このディジタル値をもって初めてマイコンによる『計算』が可能になります。それから計算した結果をキャラクターLCDディスプレイで表示するため、計算結果を含めたデータをLCDに送ることによってLCDに表示させます。あとはおまけとしてLCDバックライト電源を制御する出力とファンクションボタン入力を加えています。

ということで、マイコンに必要なポートを列挙してみると・・・

1.入力
 進行波電圧入力(アナログ)
 反射波電圧入力(アナログ)
 ファンクションボタン(ディジタル)

2.出力
 LCDへの通信ポート(今回は2線シリアルI2Cバス SCLポート,SDAポート)
 LCDバックライト電源ポート(ディジタル出力)

と、入出力合わせて6ポート必要になります。

ということは、8ピンPICですべてのポートを使い切るということになります。特に機能拡張をする予定はないので必要最小限の8ピンPICを使うことにしました。


8ピンのPICは12Fシリーズがポピュラーですが、その中でも上位クラスの拡張ミッドレンジコアを持っている12F1840を採用しました。値段も秋月で1個120円と非常に安価です。これでAD変換やEEPROM、いくつかの通信モジュールもひとつ小さなパッケージに内蔵されているのは驚きです。

最近の8bitPICにはほとんどがAD変換とシリアル通信、EEPROMモジュールが内蔵されていて、発振源も内蔵CR発振が選択出来て外部に水晶振動子やセラロックを接続しなくても良い設計になっています。ましてや8ピンしかないマイコンには内部発振は必須といってよいかも知れません。



またPICのピンには各々役割が複数あって、初期設定で各々のモジュールのレジスタに書き込み設定を行っています。今回のプログラムでの割り当ては赤色の枠になっています。

では処理の流れをブロックダイヤグラム風に示してみます。
実際のプログラムに落とし込みますが、最初にPICのコンフィギュレーションの記述やヘッダファイルxc.hのインクルード、初期設定(PIC各ピン(入出力、アナログ・ディジタル、プルアップなど)、モジュール(ADC、I2Cバス))を行い、メインループ内にAD変換、各電力値とVSWR値計算、計算結果表示関数を置きます。

通常表示するだけであればメインループ内で繰り返し処理を行うようにしてほぼリアルタイムに表示させていけばOKですが、進行波と反射波表示切替やバックライトの制御を加えて少し使いやすくしてみます。

通常自分がスイッチによる制御を加える場合は、タイマー割込み処理でスイッチ状態を監視してメイン処理を修飾するようにしています。

タイマー処理はTIMER0で割り込みをかけるようにしています。時間設定は1ミリ秒としてスイッチの状態をメモリにコピーし、コピーしたメモリを参照してあるパターンに一致したときにフラグを立ててメインループ内でフラグに応じた処理を修飾するという流れです。
スイッチは一つしかありませんが、押し続ける時間によって機能をいくつか持たせるようにしてピンの少なさをカバーしています。(スイッチポートをアナログにして電圧変化に応じて複数の機能を持たせる方法もあります)

次にメインの計算処理についてですが、AD変換された値(AD value)は電圧の整数値(符号なしの10bit値)です。電力はW=V^2 / Rで導かれますので、電力値に変換するにはAD valueを2乗し適当な定数を乗すれば良さそうです。この方法ではある程度信号が大きければ問題ないのですが、ダイオードによる整流のためダイオードのVf付近つまりはQRP電力の場合ダイオードのひずみにより、単純にAD valueの2乗ですべてOK!というわけにはいきません。

そこで実際の電力値とAD valueを測定、表にプロットして計算方法を探ることにしました。

縦軸は出力電力値、横軸はPICのAD変換で得られたAD value ( = det) の2乗値det^2です。

det^2値が14000超えの場合はdet^2とPowerはほぼ1次関数に収まりますが、14000以下の場合はダイオードの低VfでのVf-If特性を踏まえて上表の青色の式のように当てはめるようにしました。(2次曲線に近似しており、この領域では整流電圧と電力の関係を1次関数とみなしています。言い訳ですが(笑)、この程度の測定器であればこれ以上突き詰めても仕方ないでしょう。)

また計算途中で必要な変数の型については、AD変換で得られる値のbit桁数は10bitなので2乗としても20bitあれば事足ります。ですので計算プログラムの変数の型はunsigned longでOKです。整数同士の計算なので4MHz駆動の8bitPICでもサクサク動いてくれます。

またVSWRの計算はおなじみの

VSWR値 = (|Vf| + |Vr|) / (|Vf| - |Vr|)

をそのまま当てはめています。

最後に表示にはI2C接続の16x2キャラクタLCDを使い、LCDとのI2C通信にはMSSPモジュール使用しています。

それでは実際のコードを公開しちゃいます。

//
// VSWR_meter.c
// Copyright JL1VNQ / HARU
//
//
//  ver.1.00 9 June 2019
//  first release
//
//  ver.1.10 12 June 2019
//  change power calculation algorithm
//


#define EEPROM_SIZE  256
#define _XTAL_FREQ  4000000


#include <xc.h>


//for 12F1840 config
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
#pragma config CPD = OFF, BOREN = OFF, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF
#pragma config WRT = OFF, PLLEN = OFF, STVREN = ON, LVP = OFF


#define POW   LATAbits.LATA5      // backlight LED control
#define FUNC  PORTAbits,RA3       // function switch
#define LCD_AD  0x7C    // Akiduki's I2C LCD(AQM0802, AQM1602) address
#define TMR0_set 0x83    // TMR0 1msec interval


unsigned char contrast = 5;

unsigned long forward = 0;
unsigned long reverse = 0;
unsigned long po = 0;                   // calculated power (x10^-1 watts)
unsigned int vswr = 0;                  // VSWR * 10

unsigned char for_rev = 0;              // display change (0:forward, 1:reverse)

void msec_delay(unsigned short time);

void I2C_send(unsigned char data);
void lcd_cmd(unsigned char work);
void lcd_data(unsigned char work);
void lcd_init(void);
void lcd_clear(void);
void cgram_set(void);
void lcd_position(unsigned char li, unsigned char col);

void lcd_str_disp(unsigned char li, unsigned char col, const char *string);
void lcd_char_disp(unsigned char li, unsigned char col, unsigned char ascii);

void var_disp_conv(unsigned char li, unsigned char col, unsigned int val);
void pow_disp(unsigned char li, unsigned char col);
void vswr_disp(unsigned char li, unsigned char col);


void __interrupt() isr(void){
 if(INTCONbits.TMR0IF){
  INTCONbits.GIE = 0;
  TMR0IF = 0;
       
        static unsigned int cnt0 = 0, cnt1 = 0;
        static unsigned char sw_mem = 0, sw_down = 0, dim = 0;
       
        sw_mem <<= 1;
        if(FUNC == 0) sw_mem |= 1;
       
        if((sw_mem & 0x0F) == 0x03) sw_down = 1;
       
        if(sw_down == 1){
            if(cnt0 < 2000) cnt0 ++;
           
            if(cnt0 < 1000){
                if((sw_mem & 0x0F) == 0x00){
                    if(dim == 0) dim = 1;
                    else if(dim == 1) dim = 0;
                    sw_down = 0;
                    cnt0 = 0;
                    cnt1 = 20000;
                }
            }
            else{
                if(for_rev == 1) for_rev = 0;
                else if(for_rev == 0) for_rev = 1;
                sw_down = 0;
                cnt0 = 0;
            }
        }
       
        if(dim == 1){
            if(forward > 10) cnt1 = 5000;
            if(cnt1 > 0){
                cnt1 --;
                if(POW == 0) POW = 1;
            }
            else POW = 0;
        }
        else POW = 0;

  TMR0 = TMR0_set;
  INTCONbits.GIE = 1;
 }
 else if(INTCONbits.IOCIF){   // for Interrupt On Change(hang-up occur if compiling without this code)
  INTCONbits.GIE = 0;
  IOCAF = 0;

  INTCONbits.GIE = 1;
 }
}

void main(void){

 OSCCON = 0x6A;      // 4MHz internal OSC no PLL

    PORTA = 0x00;
 ANSELA = 0x11;                      // RA4, RA0 Analog Input
 TRISA = 0x1F;
 WPUA = 0x2E;      // PORTA weak pull-up

 OPTION_REG = 0x02;     // weak pull_up, TMR0 internal clock(1us/cycle), prescaler 1:8

 POW = 1;       // LCD LED POW PORT on
 SSP1CON1 = 0b00101000;              // I2C Master mode
 SSP1STAT = 0b10000000;
 SSP1ADD = 9;      // I2C Freq = (SSP1ADD + 1)*4/Fosc = 100kHz

 ADCON1 = 0b11000000;    // ADFM = 1 (right), ADCS = 100 (fosc/4), ADPREF = 00 (Vref = VDD)
 ADCON0bits.ADON = 1;    // ADC module enable
   
    msec_delay(10);

 lcd_init();
    cgram_set();

 lcd_str_disp(0,0,"VSWR Meter QPM01"); //startup splash for AQM1602
 lcd_str_disp(1,0,"(c)HARU 20190612");
 msec_delay(750);
   
    POW = 0;

 lcd_clear();

 TMR0 = TMR0_set;     // 1msec
 INTCONbits.TMR0IF = 0;
 INTCONbits.TMR0IE = 1;
 INTCONbits.IOCIE = 1;
 INTCONbits.GIE = 1;

 IOCAN = 0xFF;      // interrupt on change negative edge detect
 IOCAF = 0;


 while(1){

  ADCON0 = 0b00000001;  // AN0
        __delay_us(10);
  ADCON0bits.GO = 1;
  while(!ADCON0bits.GO){
  }
         __delay_us(10);
  forward = ((unsigned int)ADRESH << 8) + (unsigned int)ADRESL;

  ADCON0 = 0b00001101;  // AN3
        __delay_us(10);
  ADCON0bits.GO = 1;
  while(!ADCON0bits.GO){
  }
        __delay_us(10);
  reverse = ((unsigned int)ADRESH << 8) + (unsigned int)ADRESL;
       
        if(for_rev == 1){
            if(reverse < 118) po = (reverse * 5428) / 10000;
            else po = ((reverse * reverse + 20000) * 19) / 10000;
            po = po * 11 / 10;
        }
        else if(for_rev == 0){
            if(forward < 118) po = (forward * 5428) / 10000;
            else po = ((forward * forward + 20000) * 19) / 10000;
            po = po * 11 / 10;
        }
       
        var_disp_conv(0,0,po);
        pow_disp(0,10);
       
        if(forward > 10 && forward > reverse) vswr = (forward + reverse) *10 / (forward - reverse);
        else vswr = 9;
       
        if(vswr > 9) var_disp_conv(1,0,(vswr - 10) * 30);
        else var_disp_conv(1,0,0);

        vswr_disp(1,10);

        msec_delay(40);
 }
}


void msec_delay(unsigned short time){
 unsigned short i;
 for(i=0;i<time;i++){
  __delay_ms(1);
 }
}


void lcd_init(void){
 lcd_cmd(0x38);
 lcd_cmd(0x39);
 lcd_cmd(0x14);
 lcd_cmd(0x70 + contrast);
// lcd_cmd(0x73);
 lcd_cmd(0x56);      // 3.3V
// lcd_cmd(0x52);      // 5V
 lcd_cmd(0x6C);
 msec_delay(210);
 lcd_cmd(0x38);
 lcd_cmd(0x0C);
 lcd_cmd(0x01);
 msec_delay(2);
}


void I2C_send(unsigned char data){
 SSP1IF = 0;
 SSP1BUF = data;
    while(!SSP1IF){
    }
}


void lcd_cmd(unsigned char work){
 SSP1CON2bits.SEN = 1;
    while(SSP1CON2bits.SEN){
    }
 I2C_send(LCD_AD);
 I2C_send(0x80);      // Co=1, RS=0
 I2C_send(work);
 SSP1IF = 0;
 SSP1CON2bits.PEN = 1;
    while(SSP1CON2bits.PEN){
    }
    SSP1IF = 0;
 __delay_us(30);
}


void lcd_data(unsigned char work){
 SSP1CON2bits.SEN = 1;
    while(SSP1CON2bits.SEN){
    }
 I2C_send(LCD_AD);
 I2C_send(0xC0);      // Co=1, RS=1
 I2C_send(work);
 SSP1IF = 0;
 SSP1CON2bits.PEN = 1;
    while(SSP1CON2bits.PEN){
    }
    SSP1IF = 0;
 __delay_us(30);
}


void lcd_position(unsigned char li, unsigned char col){
 lcd_cmd(0x80 | (li << 6) | col);
}


void lcd_str_disp(unsigned char li, unsigned char col, const char *string){
 unsigned char i = 0;
 lcd_position(li,col);
 while(((col + i) < 16) && string[i]){
  lcd_data(string[i]);
  i++;
 }
}


void lcd_char_disp(unsigned char li, unsigned char col, unsigned char ascii){
 lcd_position(li,col);
 lcd_data(ascii);
}


void pow_disp(unsigned char li, unsigned char col){
   
    if(for_rev == 0) lcd_char_disp(li,col,'F');
    else if(for_rev == 1) lcd_char_disp(li,col,'R');
   
    if(po < 1000) lcd_data(' ');
    else lcd_data(po / 1000 + '0');
    po %= 1000;
    lcd_data(po / 100 + '0');
    lcd_data('.');
    po %= 100;
    lcd_data(po / 10 +'0');
    lcd_data('W');
}


void vswr_disp(unsigned char li, unsigned char col){
    lcd_str_disp(li,col,"SWR");
    if(vswr < 10){
        lcd_data(' ');
        lcd_data(' ');
        lcd_data(' ');  
    }
    if(vswr < 100){
        lcd_data(vswr / 10 + '0');
        lcd_data('.');
        lcd_data(vswr % 10 + '0');
    }
    else{
        lcd_data('>');
        lcd_data('1');
        lcd_data('0');
    }
}


void lcd_clear(void){
 lcd_cmd(0x01);
 msec_delay(2);
}


void cgram_set(void){        // bargraph caharacter setting
 unsigned char i;
 for(i=0;i<7;i++){
  lcd_cmd(0x40 + i);       // bar0
  if(i == 0) lcd_data(0x01);
  else if(i == 1) lcd_data(0x15);
  else lcd_data(0x00);

  lcd_cmd(0x48 + i);       // bar1
  if(i == 0) lcd_data(0x01);
  else if(i == 1) lcd_data(0x15);
  else lcd_data(0x10);

  lcd_cmd(0x50 + i);       // bar2
  if(i == 0) lcd_data(0x01);
  else if(i == 1) lcd_data(0x15);
  else lcd_data(0x14);

  lcd_cmd(0x58 + i);       // bar3
  if(i == 0) lcd_data(0x01);
  else lcd_data(0x15);

  lcd_cmd(0x60 + i);       // bar4
  if(i == 0) lcd_data(0x07);
  else lcd_data(0x17);
 }
 lcd_cmd(0x68);
 lcd_data(0x11);
 lcd_cmd(0x69);
 lcd_data(0x15);
 lcd_cmd(0x6A);
 lcd_data(0x15);
 lcd_cmd(0x6B);
 lcd_data(0x0A);
 lcd_cmd(0x6C);
 lcd_data(0x00);
 lcd_cmd(0x6D);
 lcd_data(0x00);
 lcd_cmd(0x6E);
 lcd_data(0x00);
}


void var_disp_conv(unsigned char li, unsigned char col, unsigned int val){
    char value = 0;
    value = (char)(val >> 5);
   
 unsigned char col_max = 0, reg_col = 0;
    col_max = value / 3;
 reg_col = value % 3;

 lcd_position(li, col);

 if(value < 28)
  {
  for(unsigned char i=0;i<col_max;i++){
   lcd_data(3);
   }
  if(col_max < 9){
            lcd_data(reg_col);
   for(unsigned char i=0;i<(8-col_max);i++){
   lcd_data(0);
    }
   }
  }
 else{
  for(unsigned char i=0;i<8;i++){
   lcd_data(3);
   }
        lcd_data(4);
  }
}


(EOF)

最新のMPLAB X IDEとXC8コンパイラ(フリー版)でコンパイル可能です。(フリー版でない場合は最適化オプションによっては動作がうまくいかない可能性があります。検証していませんが(通常版持ってないし))

次はPCBデザイン編です^^

秋月Cタイプユニバーサル基板に実装テスト 1.8~50MHz帯、20Wまで使えそうです

2019年7月2日火曜日

通過型電力計の製作(その1~回路編)

運用中の送信出力やVSWRモニタリングはメーカー製のトランシーバであれば、たいていは内蔵されているものですが、そういった機能を持っていないVNシリーズなどキットや自作QRP機を運用していると、実際出力が出ているのかどうか気になってきます。またアンテナ調整はアンテナアナライザであらかじめ調整しますが、運用中のアンテナトラブルも特に移動運用では少なくありません。

送信しても呼ばれないなぁとかなんとなく感度が悪いなぁと思っていたら、極端な話エレメントが切れていたなんてこともない話ではありません。

というわけで運用中のモニタリングとして通過型電力計の必要性を感じました。メーカー製のしっかりしたものもありますがここはやはり自作で、ということで製作を試みました。

それでは最初に回路を吟味していきましょう。通過型電力計は方向性結合器と整流部、それに表示部で構成されています。HF~VHF帯で使用されている回路は、方向性結合器としてCM結合のものが多く、整流にはVfの低いゲルマダイオードやショットキーダイオード、表示部はメカニカルなメーター(パネルメーターやラジケーター)といったところが通常でしょうか。

まずは方向性結合器ですが、先ほど述べた通り自作の通過型電力計として好んで採用されている回路のほとんどがCM型と呼ばれる回路です。



CM型は図のように電流検出用としてトロイダルトランスなどを用い、コンデンサにより電圧検出を行っています。この方式は比較的単純ですが、素子によるばらつきや周波数による結合度の変化など不安定要素もあり、なるべく調整箇所を少なくしたいことから次の図のように電圧検出もトランスを用いた回路を採用してみました。(今回mcHFに採用されている回路を参考にしました)



これってMM型っていうのでしょうか?タンデム型と呼んでいる文献も見かけたことがありますが、正式には何と呼んでいるのかは分かりません。いずれにせよトランスの巻き数比によって計算通りにインピーダンス変換することが可能です。

それから各トランスの巻き数比については大きくとることで電力計挿入による影響(損失や不整合、高調波の発生など)を少なくする事が出来ますが、検出した信号をダイオードで整流する場合信号が小さい、特にダイオードのVfを下回る時には電流はほとんど流れません。したがってこの場合例えば出力が小さいQRPの場合VSWRの値は過小評価になってしまいます。

色々な製作例などを見てみると巻き数比10:1として20dBカップラーとしているものがほとんどですが、これはダイオード整流の場合の妥協点なのかなと勝手に想像しています。実際今回のプロジェクトでは5W前後の出力を対象にするつもりなのでこの巻き数比で進めることにします。

もしQRPp(~27dBm)から100W級(+50dBm~)を一台でカバーする電力計を作るとするならばトランスの巻き数比は33:1にして、アッテネーターを加え十分レベルを下げたところで整流(レベル検出)にダイナミックレンジの広いログアンプを使うべきでしょう。

整流には定番のゲルマニウムダイオード1N60よりもVfが低く高周波特性の良い1SS106というショットキーダイオードを採用しました。2019年7月現在秋月でセカンドソース品が販売されています。負荷抵抗はやや高めの10kΩとしてその後にPICマイコンのアナログ入力ポートに接続します。PICの入力ポート保護のためにツエナーダイオードなどによるクランプやオペアンプのボルテージフォロワを前置したほうが安全ですが、実測20Wまでなら整流電圧がPICの電源電圧を超えないことを確認したので、5W前後での使用であれば問題なさそうということでシンプルさを優先して省略しました。

進行波、反射波それぞれの整流電圧を8ピンPICのPIC12F1840の対応するアナログポートに接続しPIC内でAD変換、数値演算とLCD表示制御を行います。このPICは8ピンPICの中でもプログラムメモリやRAMサイズも大きく、今回のプログラムを純正のXC8コンパイラフリー版でコンパイルしてもプログラムエリアの50%弱に収まっています。しかも1個120円(秋月)と安いので使い勝手、コストパフォーマンスが非常に良いです。その代わりピン数が少なく今回の製作ではすべてのピンを使い切っています。でも逆に制限があるほうがいろいろと工夫を考えるのでこれはこれで良いのかもしれません。

というわけで下に固まった回路図と、プロトタイプ版の画像を上げておきます。

ディジタル通過型電力・VSWR計回路図

秋月基板Cタイプに方向性結合器と整流部を実装し動作テスト

 ~次はプログラム編に移ります。

2019年6月15日土曜日

AKC~アマチュアキットクリエイターズ ローンチ!

AKC? アマチュアキットクリエイターズ? って唐突になんのこっちゃって感じですが、

これは

関西アマチュア無線フェスティバル2019ハムフェア2019に向け自主制作した電子工作キットをみんなで合同頒布しちゃおうぜっ!

という企画です。

メンバーは某AK〇48よろしくうら若き美少女48名・・・ではなく6人のおっさん達です(失礼^^;)。

現在確定している具体的な活動予定は関西アマチュア無線フェスティバル2019とハムフェア2019当日、ステージで歌や踊りを披露・・・ではなくてブースをひとコマ確保し、そこで各々AKCメンバーが用意した自主制作のキットを並べて頒布するというものです。

以前私がCQ誌の記事の中にも書かせていただきましたが、ここ数年でプロレベルのプリント基板が非常に安価にしかも手軽にオーダーができるようになったこと、電子部品通販やCAD、マイコンのプログラミング環境が整備されていること、測定器関連の低コスト化などによって思ったことが容易にできてしまうようになりました。しかも一点ものではなくいくらでもコピーが作れてしまうので、これを利用しない手はないでしょう。

つまりは自分の思い描いたことが比較的容易に実現できてしまうということは、究極頒布しているキットは作り手の自己表現ではないだろうかと思っています。いわゆる自費出版やインディーズ、同人誌と自主制作キットは根っこは同じなのかもしれませんね。

まぁ御託はこれくらいにして、詳細は下の大きなバナーをクリックしてご覧ください。
https://www.amateur-kit-creators.com/
Rise upなんてちょっと過激な表現ですが、積極的に自作しましょ!という意味に捉えていただければ幸いです
錚々たるメンバーがみな凄いキットを企画しています。私も今までのキットに加え何か新しいものができればと考え中です。

それからイベント当日はキット目当にするのはもちろんですが、ブースにいるメンバーにぜひお声がけしていただいてキットに対する質問などなどいろいろ談義できることも楽しみにしています。

2019年4月21日日曜日

CQ hamradio 5月号に紹介されたVN-4002

大変ありがたいことに、先般CQ hamradio 2019年5月号にVNシリーズ(VN-4002)の紹介記事を寄稿する機会をいただきました。

商業誌に寄稿した経験はなくはないですが、作家などの文章書きを生業としているわけではない所詮は素人ですから雑誌の意向に沿った気の利いた文章などはなかなか書けません。にもかかわらず体裁含めきれいにまとめてくださった編集の皆様に感謝申し上げます。


原稿のやり取りの中で、編集者の方のメールに『読者にこのキットの魅力を伝えたい。特徴を箇条書きに。』とありました。

え?『魅力』ってなんだろう・・・考えたことがなかったのでしばらく悩みました。

もともとこのトランシーバーをどうして作りたかったのかっていう最初の動機をたどってみました。それがもしかしたら魅力につながっているかも、ということで。

カムバックした数年前ネットで海外の様々なQRPキットを取り寄せては作っていました。このときから移動用で実用的な無線機を作ってみようと思い、どうせ作るなら小型にしてマイコンを取り入れてメモリーキーヤー内蔵したりなど一台で完結させてしまおうと欲張りな仕様を考えました。

最初はブレッドボードからスタートし、ユニバーサル基板にまとめ、プリント基板を外注した初めての人柱版から現在に至るわけですが、一貫して目指したところはいかに小型にするかということと、十分な受信性能と送信出力、無線機としての機能も充実させるということでした。

実際に頒布を継続している中で、頒布させていただいた方々の使用感を眺めてみると、小型でいてそれにもかかわらず性能が十分であるというところが評価されているようで、このことが一つの魅力なのだろうかと思いました。

文章では表現がなかなか難しく、掲載された記事を見ても大きさなどは例えば実際の市販のハンディ機などと横並びさせた画像を出しておけばよかったとか実際の移動運用レポートをもう少し具体的に挙げるなど何点か反省点はありますが、紹介記事としては十分なのかもしれません。

ともあれ自分がこういったものを作りたい、という思いを忘れずに新しいプロジェクトを進めていこうと思っています。

2019年4月2日火曜日

Si5351Aによる任意周波数の3波同時出力

新年度です。

3月ブログ更新をうっかりしそこなってしまいました・・・(´・ω・`)

とりあえずここのところいろいろと私事やら何やらで更新する気にならなかったという言い訳をしておきましょう。

ところでSiliconLab製の便利なSi5351Aは入手性も良好で、製作例も最近多く見かけるようになってきました。Si5351は3つのバリエーションがあって、Si5351Cにあっては8波同時出力が可能となっていますが、いずれのバリエーションも内蔵されたVCOは2つにとどまっています。

ほら、どれもVCOは2つしかないでしょ?
任意の周波数の2波同時出力の設定は比較的単純で、各VCOの周波数設定を変更するだけで後のMultiSynthの設定は簡単な整数で固定で済ませられます。

VNシリーズの構成は、下のように受信は2波同時(局発、BFO)、送信波1波のみ(送信周波数の信号)で3波同時に出力する必要はありませんでした。

VNシリーズの受信・送信時のSi5351A動作
QCXトランシーバーのように受信機の調整などに使える信号発生機能を検討してみましたが、VNシリーズで実現するためには任意周波数の3波同時出力が必要となります。そうすると、下図のように3波目はすでに使用しているPLLのどちらかを流用するしかありません。
3波目はどちらかのPLLを他ポートと共有せざるを得ない
 VNシリーズではCLK1のTX出力がSG出力になりますが、固定周波数ののBFO(CLK2)とPLLを共有(PLL A)としました。PLL Bでも可能ですが、LOの周波数は可変のためパラメータ計算になにがしかの支障が出ることが懸念されたため周波数がほとんど変わらないPLL Aを選択しました。

さてつぎにいよいよ目的周波数から各設定値の算出方法を考えるわけですが、まずはおなじみの(笑)パラメータと条件のまとめ図をおさらいします。
図の中のa,b,c,fvcoはBFO周波数設定ですでに規定されているので、これらのパラメータの条件は満たされています。次に上の図の2つの式をもとに、fout値を代入することによってパラメータd,e,fを算出する計算式を導きます。

ここからはPCよりもずっと直感的で自由度の高い『直接紙に書く』方法が一番です。下の画像は実際に紙に書いて導き出した記録です。

(クリックすると拡大して見れるかもしれません)
書き文字が読みにくくて恐縮ですが(汗)、左下の赤線で囲ってある計算式がd,e,f値のそれぞれの算出式です。これらの算出式の導き方については上の画像を見てぜひ考えてみてください。算出式はプログラミング言語の四則計算のルールに沿って記述しているので、この結果を見ながら実際にファームウエアのコードに新しい関数として記述していきます。

void Si5351A_ex_fset(long freq_ex){
 long a=0, b=0, c=1000000, d=25, e=0, f=0, fbfo=0;
 

 if(TX_freq < 10000000) fbfo = BFO_freq;
  else fbfo = BFO_R_freq;     // -> BFO frequency check

 a = fbfo + (calib * (fbfo / 100000)) / 100;
        // display frequency adjust to real frequency
 b = a % 1000000;
 a = (char)(a / 1000000);


 if(a > 0 && a < 36){
  while(a < 16){
   a <<= 1;
   c >>= 1;
   d <<= 1;
  }
 }


 f = freq_ex / 100;
 d = (250000 * (long)a) / f;
 e = (250000 * (long)a) % f + ((250000 / c) * b);


 ms_set(1, d, e, f, 0);
}


上のコード前半ではBFO周波数値からパラメータa,b,cを割り出しています。この部分はシステムの起動時にはすでに計算されており、各変数をグローバル変数としてコードを省略することも可能です。

コード後半の赤字部分がd,e,fの算出式で、最後に得られた数値をms_set()関数に代入してSi5351Aに転送します。やってみると意外と簡単な式に収まっていますが、各パラメータの条件の制約からこの方法では100Hzステップより細かくできませんでした。

それでも任意の周波数で同時に3波発生可能となったので、何か応用できるものはないだろうかと思案中です。

2019年2月28日木曜日

表面実装部品の手ハンダ装着方法

気が付かないうちにもう2月も終わりですね(汗

ところで、ぼちぼちVNシリーズキットの頒布ご希望をいただいており大変ありがたく思うとともに、表面実装部品を扱うのが初めてという方も多くなかなか苦戦されておられる方も多いと聞きます。

組み立てる自信がない場合のために製作代行も合わせて行うようにはしましたが、本来はやはりご自身の手で組み上げ、完成のよろこびと実際に運用して楽しんでいただきたいと思っています。

そんなわけで、最難関の一つ表面実装部品の装着方法(ハンダごてを使う方法でリフローではありません)について、VNシリーズのマニュアルにも簡単に書いてありますが、自分の経験とほかの資料を合わせ備忘録として少しばかり具体的にまとめてみます。

1.まずは道具
何はなくともハンダごて・・・
 とはいえハンダごてなら何でもいいというわけではないです。よく表面実装用のハンダごてと称したものもよく見かけますが、30W以下の低W数のハンダごてではたいていうまくいきません。
 もし部品のランドにつながるパターンがいずれも細ければ低Wのハンダごてでも装着はできますが、やや大きな部品や高周波回路を扱うような広いグラウンドパターンにつながる場合はハンダごての熱が拡散し温度が下がってしまってうまくハンダ付けする事が出来ません 。
 ですので大は小を兼ねるといった感じで最初からW数の大きなハンダごてを用意するべきだと考えています。そのほうが作業がスムーズになりより楽になります。

 例として私のハンダごてはgoot製のPX-201という70Wの温度調整付きのものです。
http://www.goot.jp/handakote/px-201/

 このモデルは比較的安価で(4,5千円くらい)こて先のバリエーションも豊富です。私の場合は標準のものよりやや細めので先端が斜めにカットされたPX-2RT-2BCというこて先に替えて使用しています。この先端斜めカットが自分にとってはやりやすくほかのこて先も試しましたがこれが一番使いやすかったです。

あとは、拭き取り用のスポンジ付きのこて台はあると良いですね。水を含ませたスポンジでこて先に付着した余計なハンダや酸化膜を拭きとってくれます。

ハンダ
 最初から扱いの難しい鉛フリーハンダを無理して使わなくても、従来の共晶ハンダで問題ありません。0.5mm径以下の極細のフラックス入り糸ハンダがベストです。小さい範囲のハンダ付けですから使用するハンダの量も少ないので、ハンダの送り速度が大きくても、細ければハンダの送り量は少なくなるので調整もしやすくなります。

しっかりしたピンセット
 前の2つと同じくらい表面実装で使う道具として重要なのがピンセットです。ピンセットはいろいろな種類がありどれを選んでよいものか迷ってしまいますが、正確に確実にチップ部品をつまめてなおかつしならないものが理想です。ただつまめても保持が不安定でまたしなってしまうと容易にチップ部品を飛ばしてしまいます。
 現在私が好んで使っているピンセットは、HOZANのP-894という肉厚で先端が極細のものです。投げたら当たったものに容易に刺さります。手裏剣としても使えそうです(笑)

https://www.hozan.co.jp/catalog/Tweezers/P-894.html

 なぜ細いのが良いかというと、チップ部品の包装フィルムをはがすのにちょうどよいからです。ピンセットは先端がチップの形状に合わせて角ばったものなども使っていますが、このP-894は応用範囲が広いので便利です。肉厚でしっかりしているのでピンセットの先端の感覚が指に伝わりやすくそれだけでも使い心地は全然違います。

拡大鏡
 普通の手持ちルーペや電子拡大スコープなどは手軽な反面作業にはあまり向かずどちらかというと装着後のチェックとして使うのに向いています。
 というわけで装着作業には頭部に装着するタイプのヘッドルーペが最適でしょう(ハ○キルーペっていうのもありますが)。拡大率は2倍前後で十分です。作業エリアはできるだけ明るくすると見やすくなるのでLEDライト付きのでもデスクライトを近くに持ってくるなどでも良いでしょう。

ハンダ吸い取り線(ハンダ吸い取り器)
 狭ピッチのICピン同士のハンダショートをリカバーするために必要です。幅の種類がいくつかありますが、比較的太めのもの1種類あればよいです。先端を斜めにカットすれば狭い部分にも対応できるので何種類も用意する必要はありません。

フラックス・フラックス除去剤
 ICのピンや表面実装の薄く平べったい水晶発振子のハンダ付けにはあらかじめ基板のランドとパーツの足にフラックスを塗っておくとすっときれいにハンダがのってくれます。慣れてくると糸ハンダに含まれているフラックスだけで十分ハンダがのりますが、部品の裏に端子が出ているものはフラックスがないと裏の端子までハンダが行きわたらないので、そういう場合にはフラックスを使います。
 装着後はハンダ付けによって周りに焦げたフラックスなどが残ってしまうため、フラックス除去剤で余分なフラックスを装着後に塗って拭き取ってしまいます。

そのほか
  カッティングマットや滑り止めシートなど。基板がずれないように固定するには100均ショップで売っている滑り止めシートが便利です。あとは小さなチップ部品をなくさないように一時的にためておくバットなどもあると便利です。

2.表面実装部品の装着方法について
  でもっていよいよ実際のハンダ付けの方法ですが・・・
私の場合こちらのサイトの手順に近いです。

https://noseseiki.com/kisokouza/15.html

(右利きの場合ですが)コンデンサや抵抗のような2つの端子の場合、まず向かって右側のランドに薄く予備ハンダを盛ります。次に左手にピンセットを持ち装着したいパーツの長辺をピンセットの先でつまみます。このときパーツが浮かないように底面を基板に接しながらスライドして予備ハンダしたランドに近づけます。そして右手にハンダゴテを持ち予備半だのランドにこて先を当てて予備ハンダを溶かしながらピンセットでつまんだパーツの右端子を溶けている予備ハンダのランドまでスライドさせ装着位置にセットしコテ先をランドから離して右側を仮装着します。それから反対側のランドにコテ先を当てハンダを少量送り反対側をハンダ付けしたら仮装着した右側のランドに再度こて先をあてて本装着します。
 上のサイトのページでは微量フラックスを塗布するように書かれていますが、糸ハンダ内のフラックスで十分きれいに装着することが出来ます。
 同じような要領でトランジスタやICのピンを装着していきます。要はどこかのピンを先に仮装着して位置決めをしてから他の端子からじっくりハンダ付けすればOKです。
 言ってしまえばそれほど難しいものではありません。実際に手を動かして数をこなせば失敗は少なくなります。
 あと、ランドにつながっているパターンの大きさを見てこてを当てる時間やランドに当てるこて先の面積などを自分なりに調整できるようになれればより確実に装着できるようになるでしょう。

 また実際に組む前に練習したいならば、amazonあたりで検索すると練習キットなども購入できるようなので、取り寄せて練習するのも良いでしょう。

装着例(VN-4002 RF部)

2019年1月9日水曜日

野毛の会よ永遠なれ

1月5日土曜日新年1発目の横浜電子工作連絡会(通称:野毛の会・・・私が勝手に言っているわけですが^^;)に出かけてきました。

夕方5時ごろはすでにあたりは暗くなっていますが、土曜日の野毛は人でいっぱいで活気にあふれています。


開始時間に少し遅れて会場に到着しましたが、どうやら今回この地での定期会は最後なのだそうです。会場となった飲み屋さんは創業65年で大変な老舗なのですが、女将さんがご高齢になりそろそろ引退されるため毎月この会に提供されていたスペースを閉じることになりました。

この会はお店の2階にあるおよそ12畳程度のお座敷で、大体10名ほどの自作大好き人間がテーブルを囲んでお酒と食事をしながら各自持ち寄った自作品などをゆっくり堪能できる心地よい空間と時間でした。そういうわけで少し寂しい思いを抱きつつ最後の会を楽しませていただきました。

今回はこの地での最後の会ということで20名近い方が参加されました。


各自思い思いの自作談義が続き、参加者1名ずつ持ち寄った自作品などのプレゼンテーションを行います。またパーツなどの提供品のじゃんけん大会など特に式次第なく自然に進行していくところもまた和やかで良い雰囲気でした。

今回私がプレゼンテーションしたものは・・・


400セット近くという驚異の頒布数を誇るあのCW INVADERSキットの携帯ゲーム化セット(笑)です。

3Dプリンターで本体基板のエンクロージャと、アーケードゲーム用のボタンスイッチ(マルツで販売されています)と006P乾電池を内蔵したボックスを作製し、本体と合体させて使用します。

各ジャックの位置に合わせて取り付けたプラグを挿入しCW INVADERS On The GO!
そんなこんなで4時間近くの時間はあっという間に過ぎ集合写真撮影後はめいめいで2次会3次会と流れていきました。

最後に、刷り上がった最初で最後の工作会の会誌が参加者に配布されました。私も寄稿しましたが、想像以上に濃い内容になっていました。この会は30年ほど前に始まるなど簡単な歴史も記されていて、良い資料になっています。当時はこんなことしていたんだとか、将来もいろいろと読み返される機会があろうかと思いますがこうして紙媒体に残るというのは良いものです。


ネットではたいていの情報を得たり、自分の成果をブログやSNSなどで公開することが容易ですが、こういった実際に自作erの面々が一度に集まる会にはネットでは得られない情報や新しい発見、人前でのプレゼンテーションなどネットでは難しい体験ができると思います。

この会も現在の形ではファイナルですが、今後も何らかの形で継続することになるようです。私も参加して2年弱の新参者ですが、なにかお手伝いが出来ればと考えています。

最後に10年以上ほぼ毎月幹事としてこの会を守っていただいた7N4MIS 宇佐美OM本当にありがとうございました。そしてお疲れさまでした。

横浜電子工作連絡会のサイト

工作王トロフィーとメダル(私も何回か頂戴いたしました)

2019年1月3日木曜日

2019年始動

みなさま新年明けましておめでとうございます。

2019年になりすでに三が日が終わろうとしています。

三が日といえばNew Year Partyがありますが、カムバックして数年続けていたのがある年年越しで旅行で出れなかったのをきっかけに出るのが億劫になってしまいました。

12年分のシールを集めないと完成しないのでいったん穴が開くと半分やる気がなくなってしまうのは私だけでしょうか?(苦笑)

まぁそれでも期間中は各バンドにぎやかになるので今年は参加することにしました。

三が日から仕事は始まっているので合間を縫って160mCW、40mCW、2mSSB、70cmFMで呼び回りして23Qかき集めました。

160mは久しぶりに自作SRA(SuperRad Antenna)を取り出して設置しました。


再調整なしでバンド内VSWRは1.5以内に収まっていたのでそのまま50Wで数局コールし3局に拾っていただきました。

近距離は応答確率が高いのですが、6エリアや8エリアはよく聞こえても呼んでも取ってもらえずでした。

SRAについては動作についていろいろとすったもんだがあったようですが、なんとなくこれもいろいろといわれているGAWANTに動作が似ているのでは?と思える節があって、機会みて記事にしようと思います。

とにかく飛ぶ飛ばないという以前に大きなアンテナを建てられなくてもとりあえずバンドに出たいという需要にこたえるアンテナのひとつかもしれません。

ただ限界を見て次にどうしようかと考える時期に来ているのかもしれません。

というわけで2019年はじめの活動報告でした。

本年もどうぞよろしくお願いいたしますm(_ _)m