2024年12月25日水曜日

10MHzのCWトランシーバを作りたい2 コイル作成

 10MHzのコイル

※リード線の浮遊インダクタンスがありました。約0.3μHです。これを差し引いた値で読み替えが必要

目標インダクタンス

 3uH

Ali 7Kサイズ コイルキットにて
UEW0.1mm
1-3:14turn 1溝3×5, 7turn tap

コアを入れ切った状態で
約2.8uH

次にリンクコイル
5turn 2溝と3溝に3,2turnにて

約0.9uH

同調周波数を確認

100pFとダンプ用抵抗1kΩを並列にして接続後リンクコイル側にNanoVNAを繋いで測定
コアの位置がちょうど真ん中ぐらいで10.1MHz付近に同調。

その時のインダクタンス計ると
2.49uHとなった

10MHz用のコイル定数が決まった。
今後はこれでいく。

FCZコイルが手に入らないので自分でまいている。
使ったコイルキットはAliから仕入れたもの。
難点はコアを調整しずらいこと。ふつうのコアより溝が小さい。
仕方がないので
竹串を削って調整用としている。



2024年12月24日火曜日

10MHzのCWトランシーバを作りたい1 VFO

 VFOをどうするか。。。

 これが、肝となっている。10MHzのトランシーバを”アナログ”で作ろうと思っているので構成はスーパーヘテロダインとなる。デバイスとしてはICを使おうと考えていて、往年のTA7358を使ってみようと思っている。
 となると、VFOをどうするかが問題となるのだが、「トランシーバ製作入門」ではLC発振を3MHzとしてIFを7.2MHzとしている。
 これに倣えば低い周波数でLOを供給できればよいので、アナデバのAD9833が候補に挙がってくる。以前7MHzの送信機を作ったときはAD9850で直接7MHzを供給させた。これを使い同じように10MHzを供給し、受信時には17MHzあるいは3MHzを供給すればよいのだが・・・なにか同じデバイスを使うのもつまらない。それに3MHzならばAD9833でいけそうだ。安いし。

AD9833VFO

AD9833制御にはArduinoNanoを使った。AD9833のライブラリとして唯一みつけられたのが、回路図中のアドレスに記載してある。ありがたく使わせてもらう。

IFを7.2MHzの4素子クリスタルのフィルターで帯域500Hz程度としたので供給周波数は2.9MHzとした。

出力波形(LowPass前)

AD9833の素の状態での出力波形。

2.9MHzを出力

さすがスプリアス発生器・・・24dbc位の大きなスプリアスが20MHzあたりにある
ちなみに

10MHzを出力

15MHzあたりに基本波と変わらないくらいのスプリアス。
やっぱり直接出力は難しいだろう。


出力波形(LowPass後)

3素子のLowPassフィルタ(回路図定数)を追加した。

これなら、使えそうなレベルとみた。

2.9MHz近傍の波形

60kHzスパンでRBW200Hzでみてみた。これも特に問題ないようだ。

ここでちょっとわからなかったこと・・・。RBWを1kHzとしたら・・・
±5kHz付近に大きめの山がみえた。これは発振周波数を変えると一緒に動く。RBWを200Hzとしたら観測されなかったのでどうしてこのような結果になるかは不明。

スケッチ 2024/12/25

元はAD7CさんのAD9850VFOのものをAD9833ライブラリとディスプレイにI2Cを使用した1602を使うための変更を施した。
/*
Main code by Richard Visokey AD7C - www.ad7c.com
Revision 2.0 - November 6th, 2013
https://www.instructables.com/Arduino-30MHZ-DDS-Signal-Generator-In-12/
*/

// Include the library code
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
//https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library
#include <rotary.h>
//
#include <EEPROM.h>
#include <AD9833.h>
//https://github.com/Billwilliams1952/AD9833-Library-Arduino
//#include <digitalWriteFast.h>


//Setup some items
#define stepUpPin 5
#define stepDownPin 6
#define FNC_PIN 10
AD9833 gen(FNC_PIN);
Rotary r = Rotary(2,3); // sets the pins the rotary encoder uses.  Must be interrupt pins.
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD address to 0x27 for a 16 chars and 2 line display

int_fast32_t rx=2902600; // Base (starting) frequency of VFO.  This only loads once.  To force load again see ForceFreq variable below.
int_fast32_t rx2=0; // variable to hold the updated frequency
int_fast32_t rxd=0; //for actual freq dysplay 
int_fast32_t increment = 100; // starting VFO update increment in HZ.
int_fast32_t iffreq = 7197480; // Intermedite Frequency - Amount to subtract (-) from base frequency. ********************************************
int buttonstate = 0;
int buttonstate2 = 0;
String hertz = "100 Hz";
int  hertzPosition = 4;
byte ones,tens,hundreds,thousands,tenthousands,hundredthousands,millions ;  //Placeholders
String freq; // string to hold the frequency
int_fast32_t timepassed = millis(); // int to hold the arduino miilis since startup
int memstatus = 1;  // value to notify if memory is current or old. 0=old, 1=current.
int ForceFreq = 0;  // Change this to 0 after you upload and run a working sketch to activate the EEPROM memory.  YOU MUST PUT THIS BACK TO 0 AND UPLOAD THE SKETCH AGAIN AFTER STARTING FREQUENCY IS SET!



void setup() {
  pinMode(stepUpPin,INPUT); // Connect to a button that goes to GND on push
  pinMode(stepDownPin,INPUT);
  digitalWrite(stepUpPin,HIGH);
  digitalWrite(stepDownPin,HIGH);
  lcd.begin();
  PCICR |= (1 << PCIE2);
  PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
  sei();
  lcd.setCursor(hertzPosition,1);   
  lcd.print(hertz); 
 
  // Load the stored frequency 
  if (ForceFreq == 0) {
    freq = String(EEPROM.read(0))+String(EEPROM.read(1))+String(EEPROM.read(2))+String(EEPROM.read(3))+String(EEPROM.read(4))+String(EEPROM.read(5))+String(EEPROM.read(6));
    rxd = freq.toInt();
    rx=rxd-iffreq;
  }

  // Wave generate
  gen.Begin();
  gen.ApplySignal(SINE_WAVE,REG0,0);
  gen.EnableOutput(true);

}

void loop() {   
  // Update the display and frequency if the new Freq NEQ the old Freq 
  if (rx != rx2){   
        showFreq();
        gen.SetFrequency(REG0,rx);
        rx2 = rx;       
      } 
       
  // Rotate through the rate of tuning as you hold down the button
  buttonstate = digitalRead(stepUpPin);
  if(buttonstate == LOW) {
        setincrement();       
    };
   
  // Rotate through the rate of tuning as you hold down the button
  buttonstate2 = digitalRead(stepDownPin);
  if(buttonstate2 == LOW) {
        setincrement2();       
    };
   
  // Write the frequency to memory if not stored and 2 seconds have passed since the last frequency change.
    if(memstatus == 0){   
      if(timepassed+2000 < millis()){
        storeMEM();
        }
      } 
   
}
 
 
// Interrupt routine to catch the rotary encoder
ISR(PCINT2_vect) {
  unsigned char result = r.process();
  if (result) {   
    if (result == DIR_CW){rx=rx+increment;}
    else {rx=rx-increment;};       
      if (rx >=10000000){rx=rx2;}; // UPPER VFO LIMIT
      if (rx <=0000000){rx=rx2;}; // LOWER VFO LIMIT
  } 
}


void setincrement(){
  if(increment == 10){increment = 50; hertz = "50 Hz"; hertzPosition=5;}
  else if (increment == 50){increment = 100;  hertz = "100 Hz"; hertzPosition=4;}
  else if (increment == 100){increment = 500; hertz="500 Hz"; hertzPosition=4;}
  else if (increment == 500){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
  else if (increment == 1000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;}
  else if (increment == 2500){increment = 5000; hertz="5 Khz"; hertzPosition=6;}
  else if (increment == 5000){increment = 10000; hertz="10 Khz"; hertzPosition=5;}
  else if (increment == 10000){increment = 100000; hertz="100 Khz"; hertzPosition=4;}
  else if (increment == 100000){increment = 1000000; hertz="1 Mhz"; hertzPosition=6;} 
  else{increment = 10; hertz = "10 Hz"; hertzPosition=5;}; 
   lcd.setCursor(0,1);
   lcd.print("                ");
   lcd.setCursor(hertzPosition,1); 
   lcd.print(hertz); 
   delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
};

void setincrement2(){
  if(increment == 1000000){increment = 100000; hertz = "100 khz"; hertzPosition=4;}
  else if (increment == 100000){increment = 10000; hertz="10 Khz"; hertzPosition=5;}
  else if (increment == 10000){increment = 5000; hertz="5 Khz"; hertzPosition=6;}
  else if (increment == 5000){increment = 2500; hertz="2.5 Khz"; hertzPosition=4;}
  else if (increment == 2500){increment = 1000; hertz="1 Khz"; hertzPosition=6;}
  else if (increment == 1000){increment = 500; hertz="500 Hz"; hertzPosition=4;}
  else if (increment == 500){increment = 100;  hertz = "100 Hz"; hertzPosition=4;}
  else if (increment == 100){increment = 50; hertz="50 Hz"; hertzPosition=5;}
  else if (increment == 50){increment = 10; hertz="10 Hz"; hertzPosition=5;} 
  else{increment = 1000000; hertz = "1 Mhz"; hertzPosition=6;}; 
   lcd.setCursor(0,1);
   lcd.print("                ");
   lcd.setCursor(hertzPosition,1); 
   lcd.print(hertz); 
   delay(250); // Adjust this delay to speed up/slow down the button menu scroll speed.
};

void showFreq(){
    rxd=rx+iffreq;
    millions = int(rxd/1000000);
    hundredthousands = ((rxd/100000)%10);
    tenthousands = ((rxd/10000)%10);
    thousands = ((rxd/1000)%10);
    hundreds = ((rxd/100)%10);
    tens = ((rxd/10)%10);
    ones = ((rxd/1)%10);
    lcd.setCursor(0,0);
    lcd.print("                ");
   if (millions > 9){lcd.setCursor(1,0);}
   else{lcd.setCursor(2,0);}
    lcd.print(millions);
    lcd.print(",");
    lcd.print(hundredthousands);
    lcd.print(tenthousands);
    lcd.print(thousands);
    lcd.print(".");
    lcd.print(hundreds);
    lcd.print(tens);
    lcd.print(ones);
    lcd.print(" KHz  ");
    timepassed = millis();
    memstatus = 0; // Trigger memory write
};

void storeMEM(){
  //Write each frequency section to a EPROM slot.  Yes, it's cheating but it works!
   EEPROM.write(0,millions);
   EEPROM.write(1,hundredthousands);
   EEPROM.write(2,tenthousands);
   EEPROM.write(3,thousands);
   EEPROM.write(4,hundreds);       
   EEPROM.write(5,tens);
   EEPROM.write(6,ones);   
   memstatus = 1;  // Let program know memory has been written
};



2024年12月8日日曜日

10MHzのダイポールアンテナを追加する

 10MHzダイポール

10.1MHzなので波長は300/10.1≒29.7029702970297となりダイポールだと片側は、約7.42メートルとなる。

通常は短縮率があり、97~95%の長さになるはず。

なので、セリアで手に入れた。これを使うと6.5mなので少し足りない。


7.42×0.95は7.05mなので、6.5mにあと80㎝も追加すれば7.3mとなるので余裕!!
・・・・・・と思っていた。

しかし、、、、実際にやってみると。なんと足りません。


なして???


あ、写真撮り忘れた・・・・

22Ωで同調点10.7MHz,SWR 1.7とかなり理想からは外れた値だった。

おかしいなぁ。もしかして6.5mってあるけどもっと短い?それとも、7MHzのダイポールと給電点バランを共用しているのでその影響か?

きをとりなおして、今度は長めにと思い115㎝追加にした。

その結果がこれ・・・・・


これでも、同調点が10.2MHz付近とまだ、短いようだ。これには参った。

でも、SWRは最下点で1.1位まで下がっているので、ATUを使って調整することに妥協した。


おりしも、ちょうどFCWAのQSOパーティ。コンテストではないので10MHz帯でも出れる。ということで、総務省へ届け出認定されたばかりのQCX-miniを使ってQSOしてみた。

このバンド、7MHzより少しだけ周波数が高いだけなのに、どうも電波の着地点が遠めの感覚。4エリアあたりに着地点があるような感触。




2024年12月2日月曜日

SOTA JA/MG-089 影倉山

2024/12/1 Summit On The Air 12

SOTA JA/MG-089 影倉山

ここのところ毎週末にどこかの山に行っている。  無線と山はやっぱり相性がよい。
大森山となっているが、ここは影倉山でもある。SOTAとしては影倉山で登録されている。
そして、三角点が二つあった。




福島市は雨交じりのいまいちな天気だったが、こっちは御覧の通りの快晴。冬は西高東低の気圧配置になって、浜は天気が良くても内陸に行くにしたがって荒れてくるという天気のようだ。

駐車ポイント

ここに停めたけどもう少し先の


ここに停められたっぽい。(過ぎてから振り返り撮影、影倉山は来て良かったので次来る時のために覚書)

 登り約50分



登山道というか林道をのような道を登ったが結構草が張り出していて普通の車は登れない。感じだった。


もう12月。やっぱり寒いのでSOTAに行くかどうか迷ったが、来てよかった。思いのほか寒くなかった。先週の口太山のほうがマジ寒かった。浜のほうは12月とはいえ歩くのにはまだ大丈夫なのかもしれない。

2024年12月1日日曜日

BRZのバッテリーは標準ではない

BRZは標準バッテリーでは動かない。

2024/11/30

にエンジンをかけようとしたら全くかからない。
しかも電装系も全く動かない。
そういえば先週、口太山に行った時の帰りに山の中で一時エンジンがかからなかったことを思い出した。(これもあせった。山の中で車が動かないとなると・・・・あまり考えたくない状況だ。)

その時はキーの電池が減っていてだったので、帰ってきてから電池を交換した。


電圧を計ってみると2.5V。どうやら今度はバッテリーらしい。しかし、昨晩ガソリンを入れるためにGSまで車で行ったはずなのに。。。。確かに今朝は寒かった。けど、いきなりここまで放電するか?!と疑問に思いつつも。



BCNに電話をして聞いたところ、バッテリーの寿命は2年から3年らしい。
ということで、やっぱり、変えて備えておこうと思い立ち。
オート〇ック〇にて

55D23Rを買ってきて取り付けてみた。
しかし・・・・・
このバッテリー。どうもおかしい。ふつうは買ってきたときにはすでに充電されているのに、これはちがう。電圧を計ると8Vしかない。
しかも、埃で汚れている。。。新品なのに。

気をとりなおしてうんこらせっと交換。
エンジンをかける・・・・・

かからない。。。


ブースターケーブルなんてもっていないので、とりあえず2芯の電灯線をつかって日産Noteから電力をもらってかけることにする。

これもまた、大変。

電灯線の片側の太さでは電流容量が足りないらしく電圧降下?でエンジン掛からず。
えぃっとばかり2本束ねて繋いでみる。

かかったぁ(^▽^)/

新品(のはずの)バッテリーに充電するため2時間ほどエンジンをかけっぱなしにして

オート〇ック〇に古いバッテリーを引き取ってもらぅために持っていく。そして渡して車に戻って図書の館に本を返しに行こうと思ったら。。。。

また、エンジンがかからない。
こりゃ、どこか壊れてるとおもいBCNまでもっていくのにとりあえずエンジンスタートしなくちゃと・・・・

エンジンをかけるべくオートバックスの店員に声をかけたところ・・・・

どうやら、同じ型番でも充電制御搭載車という項目が付記してあり、同じ型番でも買ったやつは合わないことが判明。

こりゃ、わからんわ・・・・・・おお(;^_^A

差額で交換してくれるとのこと。。。。



無事、作業が終わり・・・・

ふぅ。
なんという日だ(笑)

充電制御車について調べてみた。


ということらしい。。。。

しらなかった。。。。。。