信号発生器の製作3(R909-VFO)

信号発生器を作る記事は、今までに2つ書いています。
(詳細は下をご覧ください。)

・信号発生器の製作(Pa-Lab2号機)
秋月電子の「広帯域精密波形オシレータキット」(MAXIM社(現在のANALOG DEVICES社)MAX038 使用)
動作周波数:0.1 Hz ~ 20 MHz(コンデンサ切替式の為、実際には 9 MHz まで)
三角波、鋸波、正弦波、方形波、パルス波

・広帯域信号発生器の製作(Pa-Lab3号機)
ANALOG DEVICES社の ADF4351 評価基板を使用
動作周波数:35 MHz ~ 4 400 MHz
4段階でパワーレベル可変

2つ目の信号発生器を作った時は、これで隙間なく必要な周波数の信号が作れると思っていました。
しかし、こうやって性能を比べてみると、対応できない周波数は 9 MHz ~ 35 MHz という結構な範囲でした。

今回は、この隙間を埋める信号発生器を作ってみます。
(画像は、完成した R909-VFO です。対応周波数:10 kHz ~ 225 MHz)

信号発生器用 IC

私のような素人が、RF 回路を1から設計して、まともに動かせるとは思いません。
そこで、市販されている信号発生器 IC を使った評価基板を探します。

AD9833

ANALOG DEVICES 社製
動作周波数:0 ~ 12.5 MHz
サイン波、 三角波、 矩形波出力

AD9833 は、非常によくできた IC で使用例も多いのですが、残念ながら最高周波数が 12.5 MHz なので 35 MHz には届きません。

販売店の HP より引用

Si5351

Silicon Laboratories 社製
動作周波数:2.5 kHz ~ 200 MHz
3チャンネル出力可

販売店の HP より引用

他にも有るかもしれませんが、この2種類なら Arduino のライブラリもあるので簡単に使えそうです。
早速、いつもの AliExpress で2つとも注文してみましょう。

AliExpress で注文

最近の AliExpress では通常商品より多少割高ですが、合計金額が1500円以上で送料無料・返品無料の商品が増えています。
今回は、全てこのカテゴリの商品から選んでみました。

注文方法は、いつものカートに入れるだけなので簡単です。
どちらの信号発生器の評価基板も500円程度なので、他にも必要な部品と合わせて1500円以上になるようにします。

注文した後に気づきました。
いつもなら初めて使う部品は、予備も含めて最低2個は注文するのですが、今回は合計金額を気にしていたら、すっかり忘れていました。
「まぁ、大丈夫かな?」
部品の到着を待ちます。

部品が到着

今回は、初めて送料無料のカテゴリの商品を頼みましたが、1週間ちょっとで到着しました。
送料無料でも、国内輸送はヤマト運輸で十分早いですね。

気になる部品ですが、いつもの AliExpress らしく、梱包材などはなく基板が直接、導電袋に入ってきました。

「本当に大丈夫かな?」
心配になってきました。

動作確認

まず、周波数が低い AD9833 評価基板から確認します。
Arduino UNO(互換機)につないで、ライブラリで動作確認します。
問題なく動作しました。

続いて Si5351 です。
同じく、Arduino UNO(互換機)につないで試験しました。
「あれ?動作しないぞ!」

オシロスコープで見ても何も波形が出ません。

Arduino IDE でシリアルメッセージを見てみると、反応が返ってこないようです。
消費電流を基板単体で計ると、ほぼゼロでした。
「ダメじゃん。」

また、AliExpress にクレームです。
返品と返金、新しい基板の発注と、また忙しくなりそうです。

製作する信号発生器

部品のクレームと返金処理を行っている間に、どんな信号発生器に仕上げるかを考えます。
使用する IC は、出力周波数の広さから Si5351A に決めました。

CesarSound さん作

「Si5351」で検索すると、有名なArduino の「Project Hub」にCesarSound さん作の「10kHz to 225MHz VFO/RF Generator with Si5351 – Version 2」と言うのを見つけました。
(以下の画像はプロジェクトより引用)

たまに AliExpress で見かける完成品の信号発生器は、このプロジェクトを(無断で?)商品化したもののようです。
確かに、中央の OLED の表示は(色以外は)全く同じです。

nobcha さん

次に見つけたのは、日本人の作者さんです。
GitHub で見つけました。「R909-VFO」です。(元々は、エアバンド受信機の制御基板部らしいです。)

後でブログも見つけました。
「nobcha23の日記」の中で細かな製作記事が出ていました。
(最新版の信号発生器は、GPS 基準信号で校正が可能なようです。)

プリント基板製造会社にオーダーして前後のパネルを作っているので、出来上がりが市販品の様な素晴らしさです。
この信号発生器を作ることに決めました。

R909-VFO を作ると決めたころに、正常動作する Si5351 評価基板が届きました。
準備 OK です!

必要な部品

(正常に動作する)Si5351 評価基板以外に、R909-VFO を製作するのに必要な部品は全てnobcha さんのブログに出ています。
標準的名部品を使っているので、ほとんどが在庫品でまかなえそうです。

・ATmega328P
・OLED 0.96 インチ
・16 MHz 水晶振動子
・LED X2
・ダイオード, 1N4001

コンデンサ
・0.1uF 0805 X7
・0.22uF 0603 X2
・20pF 0603 X2
・100uF
・10uF

抵抗
・2kΩ 0805 X1
・330Ω 0805 X1
・33Ω 0805 X1
・10kΩ 0805 X4
・4.7kΩ 0805 X2(LED 用)

・タクトSW X2(軸 14 mm 以上)
・SW 付きロータリーエンコーダ

その他として、
・USB 変換モジュール
・リチウムイオン充電モジュール
・ケース
・ピンヘッダ
などが必要です。

主要部品です。
タクトSW は軸が 14 mm の物を使いました。(もう少し軸が長いほうが良いかもしれません。)

ケースです。
AliExpress で販売されています。
KX JOJO Electron Store の 88 X 38 X 70 mm のアルミケースです。
ケース自体は500円程ですが、送料がそれ以上しますね。

販売店の HP より引用

前面・後方パネルです。
上のアルミケースには前後のパネルも付属しますが、厚いアルミ板を自宅で加工するのは現実的ではないので、プリント基板製造会社にオーダーして作ります。
データは nobcha さんの GitHub に公開されています。

R909-VFO のオリジナルでは、正面パネルと基板の間に 15 mm のスタッドを使用しているようですが、私は 3D プリンタで10 mm から 1 mm 間隔で 14 mm まで5種類の部品を作って試しました。
軸の長さが 14 mm のタクト SW を使うと、ちょうど良かったのは 11 mm でした。

組み立て

まず、プリント基板に表面実装部品を半田付けします。
今回はコンデンサと抵抗を少ししか使っていない基板なので、ステンシルなしで基板上にクリームはんだを絞り出して、自宅リフローをやってみます。

レバー付きのケースに入ったクリームはんだを使って、SMD 部品の端子へ盛ります。
(写真は、以前、自作のステンシルを使ったときに撮影)

次に、先の細いピンセットを使って、SMD 部品を基板上に搭載します。
なお、電源逆刺し対策用のダイオードは手持ちの物に変えています。
また、LED は在庫品を使用した為に明るさ調整で 4.7 kΩから 2 kΩに変更し、使った OLED は I2C ラインにプルアップ抵抗が内蔵されているので 10 kΩ X 2 は省略しています。

いつものヒートプレートで自宅リフローです。
今回も問題なく成功しました。(今のところ、成功率は100%です!)

裏面に必要な部品を取り付けます。
使う事はほぼないですが、リセット SW も取り付けます。

表面の部品を装着し、電源が問題なく来ていることを確認してから、MCU も取り付けました。

Arduino のスケッチ書き込み用に、USB 変換基板に延長ケーブルと端子を付けました。

スケッチの書き込み

これらを仮組み立てして、USB ケーブルでパソコンにつなぎます。
パソコンから Arduino IDE で、機能試験用のスケッチを書き込みます。

機能試験に使用したスケッチは、Nobcha さんが GitHub に公開されている「Changed to KPA-5351 sketch.txt」の拡張子を ino に変えたものです。(ファイル名に空白があるとエラーになるので、「_」などに変更してください。)

現在は Si5351 評価基板をつないでいませんが、OLED の表示までは問題なく動作しました。

追加部品の製作

とりあえず、完成時の姿を見たかったので表面パネルを付けてみます。
適当な長さで取り付けた LED も問題なく見えました。

電源は外部 USB から直接供給するとノイズが気になるので、充電池式にします。
充電式なら、電源ケーブルが不要になるので取り回しが良くなりますね。

必要な追加部品を作ります。
まず、3D プリンタで 18650 サイズのリチウムイオン充電池用ケースを作って、充電基板と配線を取り付けます。

次に、裏面パネルをいつもの Fusion で設計して 3D プリンタで作ります。
失敗作が2個出来ました。(試作品は、余っている透明の材料で作りました。)

全体のサイズを確認します。
充電池の上に基板が収まるので、必要な部品を詰めても余裕がありそうです。(必要ならば、電池の右横に外付けの VCXO ぐらいは入るかな?)

完成した裏面パネルです。

USB 変換基板は、信号発生器基板に直接取り付けると裏面パネルに届かないので、端子を追加しました。(はめ込み式です。)

組み立て

出来上がった部品を組み立てた完成写真です。

表面パネルです。
横にあるのが単3電池なので、その小ささが分かると思います。
表面パネルが基板メーカ製なので、市販品の様な完成度です。(カッコいい!)

裏面パネルです。
文字入れには、NIIMBOT D110 の透明テープ・黒文字を使いました。
(スマホから無線でつながるので、テプラより簡単に使えます。)

不具合の修正

この後、動作させて見ると、いくつかの不具合があったので修正しました。

USB 変換基板の接続

USB 変換基板は、コネクタを2つつなげて基板に届くようにしていました。
しかし、プログラムを書き込む時に2回に1回ぐらいの頻度でエラーが出ます。

この基板を直刺しにするとエラーが出ません。
そこで、変換基板から出ている端子を、緩みやすいコネクタタイプをやめて、半田付けして延長しました。
(写真の上側が完成図です。)
端子部分を変更すると、書き込みエラーはなくなりました。

スケッチの修正

組み立てる際に変更した個所などを、スケッチの修正で正常に動くようにします。
なお、以下のスケッチの変更は、ロータリーエンコーダの回転が正常で、Si5351 の出力チャンネルを CH0 にしている場合には必要ありません。

1 ロータリーエンコーダの向き
ロータリーエンコーダを右に回したら周波数が増加して欲しいのですが、現状では右回しで減少します。
この変更のために、スケッチ内の ENA、ENB 部分を書き換えます。

具体的には、「Changed to KPA-5351 sketch」スケッチの36・37行目の

#define REA        2         //
#define REB        3         //

#define REA        3         //
#define REB        2         //

に書き換えます。

2 Si5351 出力部の変更
Si5351 は、3つの出力チャンネルを持っています。通常は CH0 を出力に使っていますが、今回の組立では裏面パネル配置の都合で、CH2 に出力端子をつなぎました。
そこで、出力チャンネルを CH0 から CH2 に変更しました。

具体的には、106行目の

si5351.drive_strength(SI5351_CLK0, SI5351_DRIVE_8MA);
si5351.output_enable(SI5351_CLK0, 1);                  //1 - Enable / 0 - Disable CLK
si5351.output_enable(SI5351_CLK1, 0);
si5351.output_enable(SI5351_CLK2, 0);

184行目の

si5351.set_freq((freq + (interfreq * 1000ULL)) * 100ULL, SI5351_CLK0);

si5351.drive_strength(SI5351_CLK2, SI5351_DRIVE_8MA);
si5351.output_enable(SI5351_CLK0, 0);                  //1 - Enable / 0 - Disable CLK
si5351.output_enable(SI5351_CLK1, 0);
si5351.output_enable(SI5351_CLK2, 1);
si5351.set_freq((freq + (interfreq * 1000ULL)) * 100ULL, SI5351_CLK2);

に書き換えます。

なお、R909-VFO スケッチでは、書き方が異なります。
ENA、ENB 部分の書き換えは同じですが、CH2 の書き換えは1280行目ぐらいのところにある部分の

// Si5351a set up at 118.1+21.4=139.5MHz
void si5351_init(void){
    cmd_si5351(183,0b10010010); // CL=8pF
    cmd_si5351(16,0x80);      // Disable CLK0
    cmd_si5351(17,0x80);      // Disable CLK1
    set_freq(100000000);      // 100MHz
    cmd_si5351(177,0xA0);     // Reset PLL_A  
    cmd_si5351(16,0x4F);      // Enable CLK0 (MS0=Integer Mode, Source=PLL_A) 
//    cmd_si5351(17,0x4F);      // Enable CLK1 (MS1=Integer Mode, Source=PLL_A) 
}

を下のように書き換えます。

// Si5351a set up at 118.1+21.4=139.5MHz
void si5351_init(void){
    cmd_si5351(183,0b10010010); // CL=8pF
    cmd_si5351(16,0x80);      // Disable CLK0
    cmd_si5351(17,0x80);      // Disable CLK1
    cmd_si5351(18,0x80);      // Disable CLK2
    set_freq(100000000);      // 100MHz
    cmd_si5351(177,0xA0);     // Reset PLL_A  
    cmd_si5351(18,0x4F);      // Enable CLK2 (MS0=Integer Mode, Source=PLL_A) 
//    cmd_si5351(16,0x4F);      // Enable CLK0 (MS0=Integer Mode, Source=PLL_A) 
//    cmd_si5351(17,0x4F);      // Enable CLK1 (MS1=Integer Mode, Source=PLL_A) 
}

動作確認

良い感じに完成したので動作確認を行います。
まず、リチウムイオン電池を内蔵して電源スイッチを入れます。
問題なく電池で動作します。

ちなみに動作時の消費電流は 29 mA でした。使用した 18650 リチウム充電池は実測値で 1000 mAh 以上の容量はあったので、充電池でも十分使用可能です。

次にスイッチの動作を確認します。(動作は「Changed to KPA-5351 sketch」スケッチを例にしています。)

・ノブを右に回すと周波数が増加し、左に回すと減少します。
・ノブを押し込むと、周波数のステップが 1 Hz、1 kHz、10 kHz、100 kHz、1MHz に切り替わります。
・SW1、SW2 を押すと、プリセットした周波数に切り替わります。

各周波数での波形

スイッチ操作は問題ないので、出力波形を見てみます。

最低周波数(10 kHz)
キレイな波形が出ています。
なお、Si5351 は機能的には 2.5 kHz から使えるようですが、このスケッチの最低周波数は 10 kHz からです。

100 kHz

1 MHz

10 MHz

50 MHz

100 MHz

225 MHz(最大です。)

ついでに、使用しているオシロスコープ(SDS804x HD)は、FFT 機能が付いているので、発信周波数周辺の周波数分布を見てみます。見てみた周波数は 10 MHz です。
スペアナではないので参考程度ですが、発信周波数近くはキレイな感じでした。

周波数の調整

なお、Si5351 に搭載されている基準オシレータ(25 MHz)のズレが、直接、出力周波数のズレになりますが、修正はスケッチ内の値を変更します。
スケッチの27行目の値(38300)を変更します。

#define XT_CAL_F 38300

出力周波数を 10 MHz に設定して、差を求めます。
値を増やすと周波数が下がり、値を減らすと周波数が上がるので何度かのトライが必要です。

やってみましょう。
現在、R909-VFO 信号発生器を 10 Mhz に設定したときのオシロスコープの周波数測定は 9.999846 MHz で安定しています。
前回、ルビジウムの 10 MHz を入れたときの値が 10.00009 MHz だったので、この値に合わせてみます。

上の解説では「XT_CAL_F 38300」の値を減らすと周波数が上昇すると書いてあったので、試しに「300」 減らして「38000」にしてみます。

結果は、9.999852 MHz となりました。
その差は 6 Hz ですね。
38000 -((10000090 – 9999852) x 50) = 26100 でやってみます。

あれ?計算間違ったかな。
結果は、9.999971 MHz です。120 Hz ほど足りません。
最終的に、14500 にしたら欲しかった周波数(10.00009 MHz)になりました。
計算どおりには行かないようです。

まとめ

nobcha さんが公開されている R909-VFO を組み立ててみました。
準備されたプリント基板に必要な部品を半田付けするだけなので、簡単に完成させることが出来ました。

また、表面パネルは基板製作メーカにオーダーした物なので、出来上がりが市販品のようにキレイです。

電源は充電式なので、狭い机の上の実験でも邪魔になりません。

最高な使い心地の信号発生器の製作データを公開して頂いた nobcha さん、ありがとうございます。

コメント

  1. nobcha より:

    こんばんは、R909-VFOを組み立て、レポートいただきありがとうございました。

    積めの足りないところがあり、面倒をおかけしました。

    オリジナルのスケッチですが、ご指摘を受け、オリジナルのスケッチを改修しました。周波数較正設定は少し改良しました。EEPROMに記憶するのも売りの一つかと思っています。
    https://github.com/Nobcha/R909-VFO/blob/main/R909-VFO_UNIV0307.ino

    説明書の中に操作法を入れましたので、参考に願います。
    https://github.com/Nobcha/R909-VFO/blob/main/R909%E3%83%BCVFO_Manual_ja_1.pdf

  2. パオさん より:

    nobcha さん
    コメントありがとうございます。
    作者の方から連絡いただき感激です!

    オリジナルの R909-VFO スケッチを確認次第、記事の内容を修正しておきます。
    (周波数校正が簡単に出来ると、便利さ数段アップですね。)