nobcha23の日記

PICマイコンやArduinoを使う電子回路遊びを紹介します

nano VNAの情報(RFWorld No.52)

昔の職場関係のFACEBOOK情報を見ていたら、nano VNAを買ったという書き込みがありました。負けないように使いこなさないといけません。nano VNAと一緒に詳しい説明が掲載された雑誌も買ったということで、それがRF World No.52 11月号でした。この間からnano VNAのアプリマニュアルで使いこなせていなかったので、遅まきながらRF World No.52 11月号を買いにグランフロント紀伊国屋さんまで自転車で行きました。


ところが、残念売り切れ。ググったらLUKUA蔦屋が近いので、行ったら、ありましたね。

 

現在エアバンドレシーバーのプリアンプを作ってるんですが、フロントエンドに入れた極小寸法フィルタの調整作業の参考にしたいと思います。

 

 

f:id:nobcha23:20201113220926j:plain

RF World#52

 

Arduino+Si5351aで実験用周波数源を作ります I assembles local oscilator source by using Arduino and Si5351a break out PCb.

中華製エアバンドレシーバーキットの製作と改造を進めています。安定化のためデジタル局発を追加、更に中間周波数フィルタを狭帯域Xtalフィルタに替え、飛行機と管制官の無線通信が安定して、待ち受けモニターできるようになりました。期待通りの出来上がりです。このキットの製作やデジタル化局発は色々な方のブログなどを参考に作りました。みなさんから情報をいただいたことに感謝いたします。

 I had completed digital local oscillator made by Si5351a with Arduino control. This one brings very stable operation on airband receiver to monitor nearest airport.

 

さて、この発振器を実験用周波数源として利用、いろいろな実験をしてみたいと思います。ところが、一号機はArduino UNO互換基板(LCD IF付き)を使い、更に受信機セットに組み込んでしまいました。狭いところでPCとつながないといけないので、ソフト改造デバッグ実験をやるのが大変です。また一号機で使ったArduino UNO互換基板はProfillic贋物USBシリアルを使っているようなので、WIN10最新ドライバ自動ダウンロードに引っ掛かると古いドライバへ入れ替えが必要となり、動かすまでが大変です。

 I would like to divert this LO to the other purpose by remodeling so I assembled again same one by using popular Arduino parts.

 

そこで、この際別に実験用のセットをまとめることにしました。実験用セット構成ですが、Arduino UNOを使います。そしてUNOの上にROBOTのLCD&KEYシールドをかぶせ、キーとLCDを準備します。キー種類判定はA0電圧判定。A1(D15)、A2(D16)はロータリーエンコーダーに接続、A3は受信機からのAGC電圧接続、A4,A5ポートはi2cのSDA,SCLとして使い、AdafruitsのSi5351aブレイクアウトボードにつなぎます。

 If you trace my trial, you shall prepare Arduino UNO, Adafruits Si5351a break out PCB, D1 Robot LCD&KEY shield Rotary encoder, and AC adapter. Please refer the block diagam below in details.

 

f:id:nobcha23:20201027205911j:plain

UNO+Si5351a+RE+

先に紹介した組み込み受信機局発のスケッチをLCDポート変更し動きました。局発信号出力を取り出し、周波数カウンタでモニターしている実験しているところです。配線が空中なので、ケースに入れることを考えてみます。

また、A3(AGC)端子がオープンなので、ノイズ拾ってSいっぱい振っています。 As A3 terminal is open, it is effected by noize from outside and S-meter is full.

f:id:nobcha23:20201027210038j:plain

IF設定なので、10.7MHzシフトしているのを周波数カウンタで確認

回路構成は次になります。 The block diagram of circuit is below.

f:id:nobcha23:20201028165148j:plain

Block diagram


 

また、スケッチは次です。
And please refer Arduino sketch.

 

 

---------------------------追記 2023.08.23―---------

Arduino制御でSi5351aモジュールを使い、OLED表示の高周波信号発生器が派生的にできました。ロータリーエンコーダーとスイッチが付いて、表示は1602でも可能になってます。スケッチはCesarSoundさんのものを流用改造しました。

nobcha23.hatenablog.com

nobcha23.hatenablog.com

OLED表示コンパクト基板

 

ARDUINOをATMEGA328に書き込み、LCメーターをスタンドアロンで動かした

目次:

「ARDUINOのローダが壊れた」

「ARDUINOのローダの書き込み」

「ATMEGA単体でARDIUNOを動かしLCメータを作りました」

「ARDIUNOでのLCメータで低インダクタンスコイルを測ってみました」

 

      「ARDUINOのローダが壊れた」--LCメーターのシールドができ、さらにATMEGAに書き込んでスタンドアロンで動作するようにしました。ところが、ARDUINO互換ボード(ちびでぃーの)のUSBシリアルチップの表面実装はんだ付け不良があったらしく(数年前に買ったときに一度は気が付き再半田したが、他にもはんだが付いていなかったピンがあったらしい)今回それが原因でスケッチ書き込み時におかしくなりローダが壊れてしまった様です。

 

 

     「ARDUINOのローダの書き込み」--修復するために、ARDUINO UNOを使ってローダを書き込もうとしました。WEBにたくさん情報があり、参考にすればなんとかなると思ったのは甘かったです。対応の時期や、ARDUINOバージョンで対応法は少しづつ違うみたいで、各種真似をしましたが、簡単に書き込めませんでした。しょうがなく、秋月でローダ付きATMEGA買いましたが、そのチップのローダも壊れてしまいました。


その後いろいろ調べて分かりましたが、ローダが書き込めなかった理由は、初めには単純な配線間違い設定間違い等もあり、結局次の点を解消すると書き込めました。参考になった各種WEB情報に感謝します。

 

1.ARDUINO UNOに書き込み機スケッチ(ISR)を書いて、as ISRで書き込みにして、指定された配線でローダ被書き込みATMEGAにつなぐ。


2.被書き込みARDUINOに書き込むARDUINOはPro miniシリーズを選ぶ。


3.DSR-Reset端子間に0.1μFのコンデンサを入れる。(これはUSBシリアルに関係するのかも)

 

このやり方により、ローダ壊れたATMEGA2個、もともとローダなしのATMEGA2個に書き込みを行い、3個まで書き込み成功しました。残る一個は色々と手を尽くしても書き込めないので諦めました。

 

 

     「ATMEGA単体でARDIUNOを動かし、LCメータを作りました」--これでATMEGA328へARDUINO移植でき、これにLCメータースケッチを書き込み、ATMEGA328搭載したLCメーターがスタンドアロンで動くようになりました。早速、手近にあったお菓子の缶に入れてみました。(ちょっとやっつけ工作で見た目いまいちですが)

回路図はこちら

nobcha23.hatenablog.comARDUINOのスケッチはこちら。

nobcha23.hatenablog.com

LCメーターON ARDIUNOでは周波数カウンタのゲートタイムを長くし周波数の値を大きくとったので精度はどうなのかは別にして、小さなインダクタンスまで計算できます。また、先の書き込みでもありましたようにsprintf関数の件は避け、nH表示をすることにしましたので、中波、短波領域で使用するようなコイルのインダクタンスも論理的に測れるのではないかと期待できるところまで来ました。

(PICで作るLCメータはこちら。)

 

 

     「ARDIUNOでのLCメータで低インダクタンスコイルを測ってみました」--そこで、今回トロイダルコア、フェライトコア、空芯コイルを測ってみました。

まずはコア壁に青・青ドットが付いているトロイダルコアへ3ターンです。μSはアミドン#1よりは高そうです。

f:id:nobcha23:20200823173440j:plain

トロイダルコア測る

次にフェライトトロイダル1ターンです。#43材だとしたら、納得の値です。

f:id:nobcha23:20200823173620j:plain

フェライト

更に空芯コイルΦ4x5ターンです。

f:id:nobcha23:20200823173719j:plain

空芯コイル

 

「次やりたいこと」--次にはこのメーターでインダクターを測りながら、エアバンド用フロントエンドフィルタAMPなどを作ってみようかと思っております。

このエントリーをはてなブックマークに追加

 

 

 

---------------LCメーターの試作 2021年10月現在----
1. PICマイコンを使用 PIC16F88,PIC16F648A,PIC16F1827などを使用。LM311、74HCU04、PIC内蔵コンパレータでフランクリン発振器を構成。
http://chitose6thplant.web.fc2.com/pic16f/648_lcm2.htm

http://chitose6thplant.web.fc2.com/pic16f/88_lcm.htm

2. Arduinoを使用。74HCU04でフランクリン発振器を構成。
nobcha23.hatenablog.com

 

www.youtube.com

 

LCメータ―シールドの回路図をKiCADで書きました

以前、プリント基板CADと言うとEAGLEとか、手軽には水魚堂さんのMBEなどを使っておりました。数年前からトラ技でKiCADが推薦され始め、一度使ってみようと思って、トラ技特集号(2018年7月)を買って温めておりました。今回COVID-19”Stay Home"もあり、連休中に家に籠ってKiCADを立ち上げることができました。と言ってもSPICEはまだです。


さて、フランクリン発振を使うLCメータ回路をARDIUNOのシールドにし、スケッチを描きました。

一旦は水魚堂さんのBsCHで回路は書いたのですが、今回KiCADでエントリーしてみました。

f:id:nobcha23:20200726214857j:plain

KiCADでスケマチック


この回路基板はデバッグ実験時にはARDUINO UNOへかぶせて使い、ちゃんと動き出したらATMEGA328をICソケットに移し基板単体で動くことを計画しています。

 

で、実験状況ですが、ARDUINO UNOの上にのせたときはちゃんと動きましたが、今回ATMEGAを移したら動きません。おかしいなと思ってオシロとか周波数カウンタを動員し調べたら、水晶が発振していませんでした。原因究明しようにも簡単に水晶を取り外し交換できないので、もう一個を別の場所に実装したら無事動き出しました。

 

コアにワンターンしたコイルを測りました。

f:id:nobcha23:20200726215145j:plain

コアにワンターンで200nH

 

C言語の使い方不慣れで、Lポジションで10uH以下になったときのsprinf()の小数点表示がうまく動きません。少数点表示はあきらめ、100uH以下ではnH表示としました。HF回路のタンク回路用コイルは数十nHぐらいなので、使えるかなと思って低インダクタンス測定を試してみました。そのため、フランクリン発振器の基準L/Cを500pF/22uHにし、発振周波数が1.5MHzぐらいとします。ARDUINO周波数カウンタの上限4MHzにはまだ余裕があるところです。浮遊容量、インダクタンスは数pF、数nHあるはずなので、ちゃんとした金属ケースに入れ、フランクリン発振回路関係部の配線をもっとシビアにすれば測定値は信じてよいのかもしれません。

 

 

ところで、このフランクリン発振器利用のLCメーターですが、原理を考えたのは東ドイツの方だということです。1988年に初出とあります。

LCMのスケッチ書きました

l以前にPIC16F88+74HCU04PIC16F648A内蔵コンパレータPIC16F1927内蔵コンパレータなどで作ったフランクリン発振器を使うLCメーターを試作しました。結構実験時に活躍しています。

さて、今回はArduino周波数カウンタ応用でLCメーターシールド組立て、スケッチ書きます。こんな具合で進行中。

1.サンハヤトUB-ARD03ユニバーサル基板にLCMシールド+ATMEGA328ソケットを組み立てた。切り替えスイッチとか、リレーなどの実体配線図を描いてみました。

 

f:id:nobcha23:20200719151319j:plain

スイッチなどの実体配線

2.組み立てOKなのか、ARDUINO UNOの上にのせて、5V供給し、フランクリン発振器の動作を確かめた。

今回ステップは、周波数カウンタで三つの周波数、周波数1(基本LCで発振)、周波数2(リレーで基準Cを並列追加して発振)、被試験L(直列をスイッチで選択))か被試験C(並列をスイッチで)入れた周波数3を取得し測定値を表示するスケッチの試作です。

 ――トラブル発生―――
floatの測定結果をSerial.println( test_value);では4.22uHと出力してくれるが、sprintf( charbuf, "%8.2f", (test_value ));では?uHとなります。原因究明できず。
―――――――――――

あきらめて、通常はxxxxxxuHで100uH以下ではxxxxxxnHで出力することにしました。

試しに精密フィルムコンを測ってみました。結構良い値が出ています。

f:id:nobcha23:20200719151622j:plain

精密フィルムコンデンサーを測ってみる


―――――スケッチは次の通り―――――

http://chitose6thplant.web.fc2.com/arduino/lcm/sketch_jul17a_lcm_rev2.pdf

----------------------------------------------------------

 

今回のフランクリン発振器のLCは470マイクロF、22マイクロHで、プログラムでもnH結果表示を出すようにしたので、自分で巻いた空芯コイルのインダクタンスも表示出来ます。精度は?ですが。

 

 

LCメーターシールドを作ります(bschで回路図書いてPaaS使いユニバーサル基板配線を考えました)

さて、数年ぶりに、いやもっとかも、ARDUINO掘り出し、以前PICマイコンで作った回路をARDUINOへと移し替えようとしています。


まずは周波数カウンタ動きました。割り込みを使う方のスケッチはちょっとうまくいきません。割り込みはロータリースイッチの方で動いたので、周波数カウンタは割り込み使わずでいきます。それよりもARDUINOwire関数使って、簡単にi2cが使いこなせたので、si5351aを使ったデジタル発振器を作る方へと進みます。スイッチどうするか迷ってます。LCDスイッチシールドのアナログポート接続スイッチだとスケッチ書きやすいので、1ポートで済むこの方式にするかどうか迷っています。


その前に周波数カウンタを応用するLCメーターを手掛けてみました。

 

こんな塩梅でLCMシールド方式→さらにATMEGAワンチップ化進めます。

1.サンハヤトのUB-ARD03ユニバーサル基板にLCMシールド+ATMEGA328ソケットを組み立てることにします。(ATMEGA328は秋月電商のArduinoブート入りを使用)

2.回路図は次です。74HCU04でフランクリン発振器を形成し、5Vリレー、2回路双極スイッチなどで構成します。

3.試作実験時はATMEGAなしで、ARDUINO UNOにかぶせ、うまくいったら、ICソケット付きArduinoにて、ブートローダ付きATMEGAへスケッチを書き込んで独立させます。

f:id:nobcha23:20200714202214j:plain

LCMシールドの回路図

水魚堂の回路図エディタを使用させていただきました。

 

基板実装図は次です。必ずしも実装図通りではないですが、参考にして配線しました。

f:id:nobcha23:20200714202340j:plain

ユニバーサル基板配線

Parts Arrange Support System(プリント基板エディタ)PaaSを利用させていただきました。

 

2.組み立てOKなのか、ARDUINO UNOの上にのせて、5V供給し、フランクリン発振器の動作を確かめます。ATMEGAICソケットの使用するピンをARDUINO UNOにつなぐためパッチします。

f:id:nobcha23:20200714202717j:plain

フランクリン発振器は無事動作


タンク回路用LCと基準用Cは定数検討実験のためソケット実装にしました。4.7μH,1000pFを実装したので、周波数高く、2MHz以上となりました。ARDUINO周波数カウンタは4MHzぐらいまで対応できるので、何とかカウントできました。

次にスイッチをLポジションにして1mHインダクタ直列で発振。

f:id:nobcha23:20200714203003j:plain

1mHを直列で発振


さて、次なるステップは、周波数カウンタで周波数1(基本LCで発振)、周波数2(リレーで基準Cを並列追加して発振)、被試験L(直列をスイッチで選択))か被試験C(並列をスイッチで)入れて周波数3を取得するシーケンスです。


三つの周波数を取得すると、そこから連立方程式を解いて、LとCを算出するスケッチを描かないといけません。ちょっとお待ちください。

さらにその後にはATMEGA328Pにブートローダーを書きこみ、今回作成ユニバーサル基板だけで動くようにします。

 

 

--------------------その後2023.09.05--------------------------

KiCADを使いだし、Arduino nanoとi2cLCDを組み合わせた回路

で基板を作りました。

www.youtube.com

ARDUINOへsi5351aをつないで10Mhz出してみました

中国製エアバンドレシーバーキット改造で、局発のデジタル化(アルディーノでもっと簡単に手掛けられないか)と中間周波数フィルタを替えての狭帯域化が残っています。


今回アルディーノの再勉強を行い、やっとsi5351a接続まで来ました。

1.先に報告の通り、ロータリーエンコーダーを割り込みで受けるスケッチを実験。

2.先に報告の通り、アルディーノでi2c液晶使いi2cスキャンを手掛けました。i2cのポートを動かした。

f:id:nobcha23:20200714220737j:plain

i2cアドレススキャンno

確かにつながっているi2cLCDのアドレスが引っ掛かりました。

 

3.次にアルディーノ互換ボードチビィディーノ付属LCDコネクタ(4ビット並列接続)でi2cスキャンを動かす。(今となってはUNO互換中国製ボードの方が安くなってしまいましたが、このボードはATMEGAがDIPでICコネクタに入っている点は今後の試作で役に立つかもしれません)

4.チビィディーノに用意したi2cのポートに秋月電子で買ったsi5351aブレークアウト基板を接続。i2cスキャン確認。0x60。

f:id:nobcha23:20151230075826j:plain

ARDUINO互換基板上のLCDコネクタとi2C引き出し

f:id:nobcha23:20200712113625j:plain

0x60がでました

 

5.JH7UBCのWEBサイトからスケッチを流用させていただき、10Mhzを設定、発振させました。周波数カウンタは秋月12.8MHzTCXO基準です。6pF負荷だと周波数が低めでしたので、8pFに変更しました。

f:id:nobcha23:20200712113722j:plain

10MHzでました

 

 

続いてロータリースイッチでの周波数設定(この間実験した割り込み利用ロータリースイッチ制御のマージ)、EEPROMメモリー制御が課題です。


今回の10Mhz設定・発振スケッチは次です。

------------------------参考スケッチ---------------------------------
// SiI5351a 10MHz OSCILLATION
//
// Si5351_ADDR = 0x60
//
// Thanks jh7ubc FOR YOUR giving INFORMATION
// http://jh7ubc.web.fc2.com/arduino/ex1_10MHz.png
// load:8pF 9.9999MhZ
//
// i2cLCD address 0x3E
// LCD on chibiduino with lcd(5,6,9,10,11,12);
//
// SCL:A5,SDA:A4
// 20200711 ok
//
//

#include <Wire.h>

// Thanks Kimura "http://zattouka.net/GarageHouse/micon/Arduino/LCD/I2CLCD.htm"
#include <skI2CLCDlib.h>   

/* ChibiDuino2 LCD sample
* SETUP: (Hitachi HD44780 compatable LCD)
* +5V LCD Vdd pin 2 >>> Gnd LCD Vss pin 1, and R/W pin 5
* LCD RS pin 4 to D5 >>> LCD Enable pin 6 to D6
* LCD D4 pin 11 to D9 >>> LCD D5 pin 12 to D10
* LCD D6 pin 13 to D11 >>> LCD D7 pin 14 to D12
* 10K pot: - ends to +5V and Gnd, wiper to LCD VO pin (pin 3)
*/

#include <LiquidCrystal.h> // Sure 8x2 LCD works with this lib

#define led_pin 13

//lcd instance
skI2CLCDlib LCD(0x3E, 16); // LCDのi2cアドレス、画面カラム数16文字
// instanciate the library and pass pins for (RS, Enable, D4, D5, D6, D7)
LiquidCrystal lcd(5,6,9,10,11,12);

// Si5351a ADDRESS
const byte Si5351_ADDR = 0x60;

void PLLA_set()
{
Si5351_write(26,0); //MSNA_P3[15:8]
Si5351_write(27,1); //MSNA_P3[7:0]
Si5351_write(28,0); //MSNA_P1[17:16]
Si5351_write(29,0b00001110); //MSNA_P1[15:8]
Si5351_write(30,0); //MSNA_P1[7:0]
Si5351_write(31,0); //MSNA_P3[19:16]MSNA_P2[19:16]
Si5351_write(32,0); //MSNA_P2[15:8]
Si5351_write(33,0); //MSNA_P2[7:0]
}


void MS0_set(){
Si5351_write(42,0); //MS0_P3[15:8]
Si5351_write(43,1); //MS0_P3[7:0]
Si5351_write(44,0); //MS0_P1[17:16]
Si5351_write(45,0b00100110); //MS0_P1[15:8]
Si5351_write(46,0); //MS0_P1[7:0]
Si5351_write(47,0); //MS0_P3[19:16]MS0_P2[19:16]
Si5351_write(48,0); //MS0_P2[15:8]
Si5351_write(49,0); //MS0_P2[7:0]
}


void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("\nSi5351a 10MhZ");
pinMode(led_pin, OUTPUT);

// i2c LCDモジュールの初期化処理
// ICON OFF,コントラスト(0-63),VDD=5Vで使う
LCD.Init(LCD_NOT_ICON,32,LCD_VDD5V) ; //5Vへ変更

// 書き込む
LCD.SetCursor(0,0) ; // 表示位置を1行目1列[00H]に設定
LCD.Puts("\nSi5351a 10MhZ ") ; // [00H]から書込まれる(表示する)
LCD.SetCursor(0,1) ; // 表示位置を2行目1列[40H]に設定
LCD.Puts(" 10MhZ v1.0 ") ; // [40H]から書込まれる(表示する)

// 並列接続LCD
lcd.begin(2,8); // set lib for display size (8x2)
lcd.clear(); // clear the screen
lcd.setCursor(0,0) ; // 表示位置を1行目1列[00H]に設定
lcd.print("\nSi5351a 10MhZ ") ; // [00H]から書込まれる(表示する)
lcd.setCursor(0,1) ; // 表示位置を2行目1列[40H]に設定
lcd.print(" 10MhZ v1.0 ") ; // [40H]から書込まれる(表示する)

// Si5351a set up
Si5351_write(3,0xFF); //Disable Output
Si5351_write(16,0x80); //CLOCK0 Power down
Si5351_write(183,0x80); // 8pF
PLLA_set();
MS0_set();
Si5351_write(177,0xA0); //Reset PLLA and PLLB
Si5351_write(16,0x4F); //CLOCK0 Power up 8mA
Si5351_write(3,0xFE); //Enable CLOCK0
}

void Si5351_write(byte Reg , byte Data) // REG write sequence
{
Wire.beginTransmission(Si5351_ADDR); // Start condition
Wire.write(Reg); // Reg select
Wire.write(Data); // Data,
Wire.endTransmission(); // stop condition
}

void loop()
{
boolean led_status;
Serial.println("Si5351a 10Mhz");
digitalWrite(led_pin, led_status);
led_status = !led_status ;
delay(2000);
}
-------------------------------------------------------------