発振回路を作らないと先へ進めないのでAD9850モジュール2枚とArduino nanoを使って1枚基板に乗せてみました。
この基板には125MHzのクロック回路も搭載しています、つまりDDSモジュールについている怪しげなクロックモジュールは取り外して別途用意したクリスタルを使った5次オーバートーンの発振回路からクロックを供給しています
最近までファンクションジェネレータからの信号で受信テストをしていましたが、時間が経つにつれ自作欲も低下し、このまま放置し途中で投げ出してしまいそうになったので気分転換のつもりで発振回路を作りました。
何から書くと良いのか整理もしていないので思い出した順に書いていこうと思います
あー そういえば もともとこの4BANDトランシーバを作り始めたきっかけはFT-901のVFOを使って云々などと言っておりましたが、結局プリミックス型で進めると回路規模があまりにも大きくなりすぎるため、今回はローカル信号とBFOはともにAD9850モジュールから供給することにしました。
以前にユニバーサル基板で似たようなものを作った時に手抜き過ぎたため電源ラインに激しくノイズが乗った状態を経験しているので、今回は迷わず専用に両面基板を用意しクリーンな電源ラインを目指しました。
ザックリですが簡単に紹介させていただきます。
Arduino nano とAd9850モジュール2枚は載せていない状態での画像です
各ユニットと5次の発振回路には独立した電源から供給しています
必要電圧は三端子レギュレータを使っていてTO-220型だと意外に放熱が面倒なのでSMDのTO-252型を使っています、こうすることで放熱は基板で行っています
ただし125MHzのクロック発振回路だけはたいした電流量ではないのでTO-92型のものを使いました。
あとで回路図を載せますが、upc1651の電源はAD9850モジュールからもらうようにしています
AD9850モジュールのクロックを取り外すと「付いたままでも目視できます」4つの穴がありクロック信号・グランド・電源・STの4つの端子に繋がっています、まあ これは見たままですね
その穴を使って、最短で配線ができるように、このクロックモジュールの位置に合わせて親基板側に対応するランドを設けました。親基板側には画像のとおりupc1651を取り付けています、パスコン等は親基板の裏側にチップコンデンサを取り付けるようにしています。実際に結線するのは4穴のうち3穴だけ(ST端子は未使用)です。
ちなみにこの親基板とArduinoやAd9850のユニットはソケットにしていません、連結用にピンヘッダーは利用しましたが直接半田付けしていて手軽に交換するとかは無しです、ソケット式にすると背が高くなるのがすごく嫌いなのと故障でもないのに取り外す理由は無いからです、取り付けたものが不良品だったり故障した時は取り外しますけど、そこらの処理は慣れているので簡単な事です。
Arduinoのスケッチをどうするか決めずに始めたため、経験的に困らないように配線は決めて結線しています。プログラム的に好きにすればいいさって感じです。
そうは言っても、とりあえず信号源として試したいので、ネットで検索してみたらJA2GQPさんのDual_DDSの記事にあったので、最初は何も考えずコピってスケッチを組み込んでみました、それはDual_DDS対応でLCD用に書かれているのですが一通り動かしてみると機能的に自分の求めるものでは無いと思ったのでアレンジしなおして目的にあったものに作り替え中です。
余計な世話とは思いますがJA2GQPさんもそこで書かれていますが古いArduino IDEでないとエラーしますから最近のバージョンに合わせてvoid setup内の「 lcd.init(); 」の記述は「 lcd.begin();」に変更してください、そうすると最新のArduino IDE ver2.3系でも問題なくコンパイルできます。
スケッチ改造中ですが部分的には使えるようにしているので、この状態で毎日7メガを受信して楽しんでいます、それが次の画像です、バラック状態ですが今度はケースに入れるのも面倒くさがりの虫が湧いてきてウジウジしています。
画像向かって右端のロータリーエンコーダは光学式ですAmazonで買いました2200円くらいだったかな600パルスの仕様です。
20文字x4行(2004型)のLCDは老眼の自分には有難いのですが、いやになるほど無駄に大きいので1.3インチの128×64型OLEDに変更しています、画像で分かりにくいですがOLEDの最下段あたりにSメータを表示するようにしていてバーグラフを表示させています、なにやら受信しているのでメータは7つくらい振れています。
OLEDをArduino nanoで使うと数分程度でフリーズします、状況(ハード的な作り方とかスケッチの構成)によってはフリーズしないかもしれません。ですが本機はフリーズ(シリアル出力でモニターしてみたらloopが停止するがそれぞれの処理に問題は見つからない)して困りました、この原因をみつけるまで1週間くらい悩み試行錯誤の連続でした。
そして、試したのがI2Cの速度変更です、
SSD1306のI2Cに関する部分をライブリーから探して確認すると15MHzを超えるクロックで動作するマイコンの時は最大の400KHzで動作をし、そうでなければ100KHz動作になるようです
loop内の処理は全く異常が発見できず所定の動作をしているのでI2Cの設定に最後の望みをかけてみました、スケッチに下記の2行を追記してみたところフリーズしなくなりました。
void setup内の2行がその対策用です
Wire.begin();
Wire.setClock(10000L); //これが一番調子いいみたい
このWireメソッドでクロックを10KHz指定したら良好な動作をするようになりました。
SSD1306のライブリーを見るとアレコレ書いてありますが、そこを変更すると他の機器を作るときに面倒なことになるのでスケッチ内で対処した方がトラブル防止になります。
ただ、テストしてみて思うのは本当に10KHz動作になっているのかは疑問ですがオシロで計測する気もなく結果オーライということで済ませています。
続いてメインダイアル用エンコーダの件
ロータリーエンコーダで600パルスだとIC-7300と同じでダイアル1回転で6KHz変化します
ところが大きなダイアルツマミではないため、操作がとてもデリケートです、目先の対策として今は4分の1に減速(ソフト的に)して使っています、そしてステップを切り替えるのも面倒なので最初から10Hzステップ固定とし加速機能を付けることでスケッチからstepの切り替え機能も削除しています。
これはArduinoの残りI/Oが少ないため1本でも多く余裕を持たせたい理由(別の目的でI/Oが足りない)もあります。
今回の局発系発振回路は次の通りです
回路図はこんな感じです、だれが考えてもこんなものではないでしょうか
5次オーバートーン発振回路はJA9TTTさんの記事を参考にさせていただきました、1つの発振回路からT1の2次側はリンクコイルで取り出していますが、そこは2回巻きでセンターをグランドに落として各upc1651には1ターンのリンクコイル出力としています。
オリジナルの回路では発振回路とupc1651の接続には0.01uFが使われていますが、オシロで波形を見るとオーバードライブ気味だったので47pF(C23とC24)で結合しています。
ここの125MHz発振回路のあたりだけ抜き出すと上記のとおりです
T1はコアからの線を直接基板に半田付けしないで7kコイルの土台部分を利用して交換調整しやすいようにしました、この時の様子は次の画像のとおりです
赤色のトリマーコンデンサのそばにコアがあって、そのコアの下が7kタイプの土台部分です、不要なところはヤスリで削って平にしてコアを乗せています。
バラックで予備実験をしこんなのでOKなのを確認しています、1次側5ターンは全周ではなくこんな幅で巻いています
そして離れていますが2次側は2ターンでセンターをアースに落としています。
分かるかな、1次と2次が離れていますがトロイダルコアの磁束のループ内なので気にしなくていいです。
この基板を作った後で好奇心から電源ラインへの高周波の漏れを見たら0.01uFのパスコンは思ったほど効いてくれないと思いました、あらかじめ基板内での配線長が予測できていたのでC7とC21で足りるかと思ったけどT1のコールド側(C21接続点)をオシロで見たら125MHzの信号が50mVくらい出ているので基板の裏に1000pFのチップコンを追加したら20mV程度に下がりました、そこからはFBを通しているので更に低下しパスコンとして良好な結果を得ています、もしかするとコンデンサの種類によってパスコンの効きも違うと思いますから自分の作ったものに限りこんな事なんだろうと思います。
ただ、追加したチップコンは有っても無くても全体の動作には影響していません(C18の同調点は変化しましたが)、気持ちの問題だけです。
AD9850の出力について
モジュールの回路図をネットで探して比較してみると部品番号は多少異なることもありますが、概ね回路図自体は同じか似たようなもので参考にはなりました。
ですが、たまたま今回使ったAD9850モジュールのLPF付き側の出力は他の手持ちのモジュールと異なりLPFの出力側に入っている抵抗は200Ωではなくて1kΩになっています、入り口側は200Ωです。
そのため1kΩは取り付けたままにしています、そして50Ω出力が欲しいので4対1の簡易なトランスを入れています。
小さなメガネコアに適当にバイファイラ巻きをしましたが、巻いている最中に毎度のことで雑念が入るため何回巻いたか分からなくなり、それぞれDDSの出力に使っていますが巻き数が違うせいか50Ω終端で測ってみたら数十mVpp程度の差が付きました。片方は420mVppくらいあるのですが他方は360mVppくらいです、DDS出力はどちらも同じであることは事前に確認しているのでトランスの巻き方で差が出てしまったようです。
動作上NJM1496Dへの信号は400mVpp辺りが良好な気がするのでちょうどよかったかもです
BFO出力として360mVppの方のユニットを接続しています、NJM1496Dの動作点の都合で500mVppはちょっと大きすぎて300mVppから400mVppのあたりがいい感じな復調音に聞こえるのでここも結果オーライということです。
Arduino nanoとunoはちょっと違うみたい
どうして今まで気づかなかったのか、今回手っ取り早くJA2GQPさんが作られたスケッチをそのまま使ってみましたが、正直言うと所定の動作はしませんでした。
もともとUNO用に書かれているのでnanoで動かないのは無し寄りの有りなのかな程度に思っています。
UNOとnanoでは決定的に違うことが1つあり、全体では2つの問題がありました。ただしこれはJA2GQPさんを非難しているのではなくて自分の知識不足からくる思い込みからの問題ですので誤解しないように。
軽い方の問題はnanoは処理能力が低いのかもしれません、症状としてはロータリエンコーダを回すと指定したステップでの変化は絶望的で、なぜか1Hz台のところまでランダムに変化するのときちんと指定したステップに対応する変化でもなく表示周波数がぐちゃぐちゃになる感じです、これはスケッチを少しだけ変更して処理を軽くすると正常に動作するようになりました。
致命的な問題はI/OピンのD13です、オリジナルではここをLにすると送信です
pinMode(SW_TX,INPUT_PULLUP);となっていて当然の指定です「const byte SW_TX = 13; のところでSW_TXがD13に割り当てられています」
UNOはOKみたいですがnanoはなぜかこのD13は特別なもののようでして、調べてみると基板内で別の用途に使われているようでデジタル出力には使えると思いますが入力に使うのは要注意と考えられます
そのためD13を入力に使って、しかもプルアップすると希望する動作をしない事が分かりました。
この状態でD13の電圧を測ると5Vあるはずが1.76Vしかないのです、少なくとも2.6VくらいあったらHの判定なのでこのトラブルには気付かなかったと思います
最初は不良品でも買ったのかと思いましたがどのnanoでも同様な結果であることから調べてみて仕様なのだと知りました。
つまりD13を入力ピンとしてプルアップしてもHLの判定には使えないのです、オリジナルのままnanoで動かすと起動と同時にL判定です、そのため送信モードで起動するため周波数も変更できないし初期化だろうが何だろうがロックされた状態になるのです(ここらはスケッチ通り動作でD13がLowで送信となります)。
解決するのは簡単でD13をこの用途では使わないようにするだけでOKです、余っているデジタルピンにでも振り替えれば解決します。
この件も最初理由がわからなくて、人様のをパクって使ってみた結果なので自力解決するのに半日費やしてしまいました。
以前にも書いたことがありますがワシはArduinoのスケッチとか全く知らないし分からないのでトラブルに遭遇するとマジで大変なんです、相談相手は全くいないので根気よく目の前のスケッチを見て何をしているんだろうから始まるので対応に時間がかかってしまいます。
とりあえず盆休みに入るのでつづきはまたこんど
コメント