nobcha23の日記

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

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);
}
-------------------------------------------------------------

 

色々ARDUINO基板

色々なARDUINO基板をつないで実験しています。UNO,MEGA2560,ティビディーノ(UNO互換)です。
I/O点数が増えた時のことを考えて、ARDUINO MEGA2560R3を入手。
始めつないだ時にはなぜか、USBを認識しなかったんですが、おかしいなと入れ替えたりしていると無事に動きました。

f:id:nobcha23:20200710202359j:plain

3種類そろった


互換ボードのチビディーノと言うのはProlific USB-to-Serialのため、うまく動かなかったんですが、もう一度WEBをみて、次を実行。

 

WEBによると。pl2303driverPL2303_0508デバイスドライバ単体をダウンロードする。解凍しておいておく。


①つないだら自動DLされるドライバ(最新)をコントロールパネル、デバイスマネージャーの「ポート (COM と LPT)」「Prolific USB-to-Serial Comm Port(COM**)」を指定して「ドライバーの更新」で古いドライバに入れ替えをする。


②更新するドライバ指定をコンピューター上にして、D/Lした古いドライバを指定します。

 

このデバイスドライバ入れ替えでチビディーノがWIN10で動きました。とは言ってもプログラムダウンロードがうまくいかない場合もありますが・・。


ここで、せっかくなので、何か治具プログラムでも作ろかうかと思い、i2cアドレススキャンのスケッチを作ってみました。スケッチの中にも書いたWEBからの引用です。参考まで。


i2cLCDをつないでいますので、どうしても自分LCDのアドレス0x3Eは表示されてしまいます。

 

‐―――――――――――――――――――――――――――――――――――――――
// i2c_scanner display on i2cLCD address 0x3E
//
//
// This very simple sketch scans the I2C-bus for devices.
// If a device is found, it is reported to the Arduino serial monitor.
// Version 5, March 28, 2013
// アドレスは7-bit(127d)まで。拡張アドレスは扱わず
// https://playground.arduino.cc/Main/I2cScanner/

#include <Wire.h>
#include <skI2CLCDlib.h>

#define led_pin 13
//lcd instance
skI2CLCDlib LCD(0x3E, 16); // LCDのi2cアドレス、画面カラム数16文字

void setup()
{
Wire.begin();
Serial.begin(9600);
Serial.println("\ni2c Scanner");
pinMode(led_pin, OUTPUT);

// LCDモジュールの初期化処理
// ICON OFF,コントラスト(0-63),VDD=5Vで使う
LCD.Init(LCD_NOT_ICON,32,LCD_VDD5V) ; //5Vへ変更20200612
// 書き込む
LCD.SetCursor(0,0) ; // 表示位置を1行目1列[00H]に設定
LCD.Puts("i2c address scan") ; // [00H]から書込まれる(表示する)
LCD.SetCursor(0,1) ; // 表示位置を2行目1列[40H]に設定
LCD.Puts(" i2cLCDv1.0 ") ; // [40H]から書込まれる(表示する)

}


void loop()
{
byte error, address;
int nDevices;
int led_status;
char charbuf[6];

Serial.println("i2c Scanning start");
digitalWrite(led_pin, led_status);
led_status++;
delay(2000);

LCD.SetCursor(0,0) ; // 表示位置を1行目1列[00H]に設定
LCD.Puts("i2c Scan test ") ; //

LCD.SetCursor(0,1) ; // 表示位置を2行目1列[40H]に設定
LCD.Puts("ADR:") ; // LCDへは2アドレスまで表示できる

nDevices = 0;
for(address = 1; address < 127; address++ )
{
// このスケッチではWIRE関数の
// Write.endTransmisstion へのデバイスからの
// ACK応答有り無し戻り値(有り:0)をみています
Wire.beginTransmission(address);
error = Wire.endTransmission();

if (error == 0)
{
Serial.print("i2c device found at address 0x");
if (address<16) Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");

sprintf(charbuf, "%02X", address );
LCD.Puts("0x") ;
LCD.Puts(charbuf) ;
LCD.Puts(",") ;

nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16) Serial.print("0");
Serial.println(address,HEX);
}
}

if (nDevices == 0)
{
Serial.println("No i2c devices found\n");
LCD.Puts("No devices found") ;
}
else{
Serial.println("done\n");
LCD.Puts("done ");
}

delay(3000); // 5秒待ってまた再開
}

―――――――――――――――――――――――――――――――

 

f:id:nobcha23:20200714220737j:plain

i2cLCD

アドレススキャンで、LCDのアドレスを検出しました。

 

rover.ebay.com

www.banggood.com

LCメーターのARDUINO移植するには周波数カウンタ機能が必要

ARDUINOを久しぶりに触ったので、何か達成感のある試作に取り組むこととにしました。 I would like to try a cirtain trial to be used Arduino.

 

以前LCメーターをPICで作りましたが、これをARDUINOに移植しようかと考えています。 There is just idea to make up LC meter which I tried ever.

LCメーターのポイントは
1.フランクリン発振器でLC回路の発振をさせる。周波数を観測する。

2.基準コンデンサによるキャリブレーションの後、被測定LあるいはCをタンク回路に追加し発振させ、周波数を観測する。リレーによるLC切り替えが必要。

3. 基準回路発振周波数と被測定L/C追加後の発振周波数を基準Cの3つの数値からLあるいはCの値を求める連立方程式を解く。

I shall list up the LC meter principle which I made up along with the franclin oscilator method.

1. To make up the Franclin oscilator circuit. To check the frequency for it.

2. At first, caliblation oscillation by standard capacitor and secondly putting the test part on to measure the frequency.

3. To resolve the corelational equations from the two frequencies and the standard capacitor value.

 


以上のような原理からARDUINO移植にはまずは周波数カウンタが必要となります。

そこで、Arudinoで周波数カウンターを作れないかと考えググってみましたら、ありました。

To make the LC meter up in the Arduino world, I should utilize the frequency counter on it. There are many examples in the Arduion world.

Arudinoらしくライブラリがいくつか存在しています。感謝感謝!そのうち取り扱いが易しそうな次のライブラリーを引用します。

I adopted the easy one as below.

サンプルコード(FreqCount_2017-0207-001-ok)

日本ではこちらの方で先輩が引用されています。
Arudinoで周波数カウンター① Arudino
実験 2017/02/0720:02 - -


また、LCメーターでは表示にi2c液晶を使おうと思っています。i2c液晶関数ではprintf機能がないので、標準関数sprintf()でバイナリーを文字列変換しました。

 

それで次のようなスケッチで動きました。

The sketch is as below.

>|| はてなダイアリーのつもりではてな記法で書いてしまいました。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
// 2020.06.25 次のライブラリーを参照しました。ご協力感謝します。
// サンプルコード(FreqCount_2017-0207-001-ok)
// "http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-frequency-counter-library/"

#include <FreqCounter.h>
#include <Wire.h>
#include <skI2CLCDlib.h>

int pinLed = 3; // Gate点滅LEDのポート
int LED_Stat = 1; // Gate点滅LEDの状態

//lcd instance
skI2CLCDlib LCD(0x3E, 16); // LCDのi2cアドレス、画面カラム数16文字

void setup() {
Serial.begin(9600); // connect to the serial port
Serial.println("Frequency Counter");
pinMode(pinLed, OUTPUT);
// LCDモジュールの初期化処理
// ICON OFF,コントラスト(0-63),VDD=5Vで使う
LCD.Init(LCD_NOT_ICON,32,LCD_VDD5V) ; //5Vへ変更20200612
// 書き込む
LCD.SetCursor(0,0) ; // 表示位置を1行目1列[00H]に設定
LCD.Puts("FrequencyCounter") ; // [00H]から書込まれる(表示する)
LCD.SetCursor(0,1) ; // 表示位置を2行目1列[40H]に設定
LCD.Puts(" i2cLCDv1.0 ") ; // [40H]から書込まれる(表示する)

}

long int freq;
unsigned char charbuf[10]; // sprintf関数変換時に使う文字配列

void loop() {
FreqCounter::f_comp = 8; // Set compensation to 12
FreqCounter::start(1000); // Start counting with gatetime of 100ms
while (FreqCounter::f_ready == 0); // wait until counter ready
freq = FreqCounter::f_freq; // read result
Serial.print("Freq: "); // print result
Serial.print(freq); // print result
Serial.println("Hz"); // print result

// Print the proper amount of spaces to make it look pretty
LCD.SetCursor(0,1);
if (freq < 100)
LCD.Puts(" ");
else if (freq < 10000)
LCD.Puts(" ");
else if (freq < 1000000)
LCD.Puts(" ");
else
LCD.Puts(" ");

// As there is no service of print at i2cLCD lib, so
// we shall use sprintf function
sprintf(charbuf, "%ld", freq);
LCD.Puts(charbuf);
LCD.Puts(" Hz ");


delay(20);
LED_Stat=!LED_Stat;
digitalWrite(pinLed, LED_Stat); // blink Led
}

||<

 

 

まずはコンパイルして黙ってそのまま動かすと60Hzでました。電源ノイズ拾って表示してくれています。 To catch the power line noise, it shows as 60 helz.

(後で気が付いてpinmodeでINPUT_PULLUPにしたら、電源ノイズ拾わなくなりました。)Lately I set pinmode of INPUT_PULLUP, I can reject the power line noise.

 

f:id:nobcha23:20200625172009j:plain

ハムノイズ拾って60Hzカウント表示

何か信号源無いかと探したら、DSO068デジタルオシロテスト信号出力を思いつきました。これを利用しました。

To test the more higher frequency, I used DSO068 for test signal oscillator.

次のように動きました。ARDUINOカウンタでは100kHz出力が2%ぐらい低くなります。これはARDUINOカウンタの問題か、DSO068出力なのかを別のTXCO基準カウンタで今度調べてみることにします。 

f:id:nobcha23:20200625172147j:plain

DSO068のテスト信号を拾ってみる

 

ここまでくると、次はフランクリン発振回路部分の配線が必要となりました。74HCU04で行くか、LM311で行くかちょっと検討してから試作します。

At this time I'm wondering to use 74HCU04 or LM311 for the franclin oscillator.

 

---------------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

 

---------------LCメーター基板作成 2021年12月現在----

nobcha23.hatenablog.com

I'm introducing my LC meter on YOUTUBE.

www.youtube.com