この度,TS-520V用のデジタル外部VFOを作成することにしました。
構成は,知人が作成したもので,その知人もどなたかOMから開発環境(Arduino IDE:無料でダウンロード出来ます)や資料をいただいたようです。一連の資料やスケッチ:(プログラムソース)をいただき,それに機能を追加しました。
1.ハード仕様
- PLL部は Si5351を使用。(amazonで2個入手しましたが,これが2個とも不良品でした。別の通販サイトから同じものを入手しましたが,不思議なことに,基板が発熱,とうとう動作しなくなりました。次に秋月電子で入手した同じSi5351を使ったクロックジェネレータモジュールなるもの(1cm四方のPCB)を3.3Vで動作させ,出力のフィルター実験中に壊してしまいました。急遽,秋葉原,秋月電子へ行き,2枚ほど買い求めてきました。今回の製作で,PLL基板が鬼門となりました。)
- コントロールは Arduino Nano を使ってPLLとLCD表示器をI2Cで接続します。
- LCDは 2004で20×4行を使用。
- これらは,すべて中華製の互換品らしく,随分安価でした。
- TS-520Vとの接続は,標準の端子と9ピンプラグで行います。9ピンプラグ①②にVFO信号,④から送信時の12V,⑧⑨は本体,外部VFO切り替えをおこないます。
- ロータリエンコーダは1回転100パルスのものが入手できました。
- 電源は,DC12VをACアダプタで供給し,3端子レギュレータで9Vに落としてCPUに印加します。
- 回廊を次にしめします。
2.プログラム仕様
プログラムソース(ArduinoではスケッチといいますがC/C++準拠)は知人の使ったものや,開発環境(IDE)もすべて流用させていただきました。
- PLLの周波数設定は5.5~5MHzでTS-520に適用させます。
- 標示周波数は,TS-520のバンド,モード情報を取り込めないので,手動によりロータリースイッチで設定したバンド,モードによって,仕様書に記載されている,モード別キャリヤの水晶発振子の周波数,ヘテロダイン水晶発振子の周波数から算出したものを表示しています。ですので,表示されている周波数は必ずしも,TS-520が送受信しているものと同じではありませんし,モードもTS-520に影響は与えません。
- 手動のバンド,モードはロータリースイッチの接点情報を取り込みますが,バンドは5接点,モードは3接点で都合,8個の入力ポートが必要になりますが,Arduino Nanoには十分なポートがありません。そこでバンド情報を3ビットに,モード情報を2ビットのそれぞれ2進数にエンコードして取り込み,CPU内部でプログラム処理します。
- Ritは±999Hzを表示。送信時は当然offします。
- Stepは10Hz,100Hz,1kHz,10kHzおきにアップダウン可能です。。
- 交信中に誤ってダイヤルつまみにさわっても。ロック機能で周波数は変わらないようにできます。
- EEPROMに,電源off時に自動保存しておき,電源on時に読み出すようにします。手動でも,Save,Load可能とします。そのための手段として,電源on,offにリレーを使っています。電源スイッチを押し込むと,電源リレーをONしてCPU回路を通電します。そしてCPUが動作し始めると,電源リレーをトランジスタで電源スイッチの接点と並列にonする状態を保ちます。そして,前回保存した周波数データを読み出して,表示させ,PLLをセットします。
- 電源off時は,押し込んだスイッチを再度押しこんでoffにしますが,トランジスタでリレーはonを保ちますが,電源スイッチの別回路のブレーク接点が閉じますので,NE555のワンショットタイマーを起動し,CPUに電源offを通知します。CPUは,その情報から,周波数リストをEEPROMにセーブし,電源リレーのトランジスタをoffとし,リレー接点を開放して,電源をきります。
- TS-520の送信時,12Vが出力されますので,フォトカプラを介してCPUに通知し”TX”を表示します。この時,当然ながらRitは無効になります。
- スケッチ(プログラム)は,長くなりましたので,このブログでは公開しませんが,参考にされたい方は,お申し出下さい。
- 追加機能
実際運用してみましたが、表示周波数と実周波数にずれがあります。これはどうしても仕方ないことで、PLL自身の偏差もありましょうが、Rigのキャリヤー用水晶発振子の誤差や、同様にヘテロダイン用水晶発振子の誤差があります。表示周波数は、キャリヤー、ヘテロダイン周波数が正しいものとして算出して要受信周波数を表示しています。そこで、Rit機能を利用して表示周波数を他のRigや交信相手にあわせ込む機能を追加しました。受信中、ずれが認められたら、Rit をonして差分を表示させます。差分を表示したら、Rit offを長押しすると、差分が加減されほぼ表示周波数が受信周波数になります。その結果を手動でセーブするため”Save”しておきます。=2024/3/20 追記=
3.外観・構造
ケースは市販のアルミケース(梨地仕上げ)の200w×80h×150d(メーカ不明)を使いました,加工図を次に示します。
4.外観・前面
5.LCD表示
赤文字が機能を動作させたときに標示されます。
6.背面
7.筐体内部
8. 前にも述べましたが,記事の都合上,スケッチ(ソースリスト)はここに公開していません。参照をご希望の方は,ja5zz@jarl.comあてメールいただければ対応いたします。また,お問い合わせについても同様です。
9. 最期に,本製作にあたり,次の諸兄にご協力いただきました。ここに御礼申し上げます。
JR1NBZ 横浜市 西区 森 秀和 様 ・・・基本構想,開発環境のノウハウ,基本スケッチをいただきました。
JA1VBX 横浜市中区 川田 功 様 ・・・ターゲットのRig TS-520Vを拝借しました。
JE1OTB 横浜市 鶴見区 相樂 康夫 様・・・;技術的アドバイスなどをいただきました。
JA6UHG/1 横浜市中区 鍋倉 正文 様 ・・・通信テスト他,アドバイスを板だました。
ありがとうございました。
= 2022/03/14 記 =
10.追加情報
- CPUについて
今回,使用したCPUボードは Arduino Nanoの中華製互換品ですが,先日秋半原,秋月電子へ行ったとき,Nanoの上位機種であるNanoEveryをかいもとめました。あまり考えもせずいわば衝動買いでしたが,CPUがATM4809に変わっていました,その比較は,他の記事に譲りますが,かなり違いがあります。といっても同じIDEで開発できますのであまり,気にすることはないようでした,ですが,Nanoようのスケッチを,Register Emulation "ATMEGA 328"を指定してコンパイルしたところ,重大エラーが2か所ほどでました。
1. ロータリーエンコーダの情報を取り込むためと,Sleep処理に,割り込みを設定しますが,
PCICR |= (1 << PCIE2); // Enable pin change interrupt for the encoder 0x04
PCICR |= (1 << PCIE1); // Enable pin change interrupt forSleep: or して0x06
PCMSK2 |= (1 << PCINT18) | (1 << PCINT19);
PCMSK1 = 0x09; //(2 << PCINT11); // A0,A3を moniter
と,割り込みを設定していますが,PCICT,PCMASK が未定義エラーでした。
2.また
ModeStat = PINB;
ModeStat = ModeStat >> 3; // 3ビットshift
ModeStat = ~ModeStat; //反転
ModeStat &= 0x03; // マスクV
でも,PINBが未定義でエラーとなりました。
そこで,
attachInterrupt(digitalPinToInterrupt(A_pin), RotaryEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(B_pin), RotaryEncoder, CHANGE);
を使うと互換性が保たれました。しかしもう一方のSleep 割り込み設定はNano側ではできません。Sleepは電源を切るときのルーチンなので割り込みを使う必要もないので,ポートを監視して処理することにしました
また,PINBのエラーはポート単位で読み込む互換性のある記述法がみつからなかったので,digitalReadで読み込んで,二進数に変換する処理に変更しました。 - Arduino IDEについて現在,使っている,IDEはインストールの必要のない,V1.8.5ですが,必要なボードマネージャはインストールしてあります。最新バージョンをインストールしてみたのですが,なぜか,ライブラリが見つからないエラーが発生して,どうしても使用できません。過去,DOS 時代のMocrosoft C Ver6.0を使ったのが最後でして,PCの環境設定すれば問題ありませんでした。どのように設定すればよいのか,Webをぐぐっても解決策は見つかりませんでした。
- TS-520のキャリヤ,VFO,送受信周波数の関係表を示します。送受信周波はヘテロダイン周波数-VFO-キャリヤ周波数となります。
=2024/3/15 記= - ちょっと不思議な sprintf()
LCDに周波数を表示しますが、7,163.000Hzを MHz、kHzにカンマを表示させるため、MHz台、kHz台、Hz台に分割して
Sprintf(buff,"%2d,%03d,%03dHz",f1,f2,f3);
と、したのですが、実行結果はフィ齟齬なことに、
7,000,163Hz
と、2番目、三番目が入れ替わってしまいました。仕方ないので、MHz台,kHz台、Hzを順次、LCDに表示させました。
=2024/3/20 記=