2011/6/26(日)で液晶工房が閉店した。老舗パーツショップと違う品ぞろえでお気に入りのお店でした。
閉店セールで入手した「777円 基板」の覚書
いろいろなMPUに対応したブレイクアウトボードになってます。
全体像
http://iteadstudio.com/ の同じ商品のリンクを張ってみました。
[Bare PCB] STM32F103RB The Smallest System Dev Board
Schematic
BOM
[Bare PCB] STM32F103VB The Smallest System Dev Board
ENC28J60 Ethernet Module
Demo code for ENC28J60(Includes ATMega48, STM32,LPC2103 and 8051 demo)
Open-source TCP/IP stack -- available as an Arduino library
[Bare PCB] AT91SAM7S64 Minimum system bare board
Schemaitc
BOM
You can purchase the assembled one here
[Bare PCB] RS232 to TLL Adapter Board
MAX3232互換用
[Bare PCB] EPM240 CLPL development board
Schematic
BOM
EMP240 CPLD datasheet
Assembled board here
[Bare PCB] ALTERA FPGA CycloneII EP2C5T144 smallest system board
Schematic (pdf)
BOM (xls)
Altera CycloneII EP2C5T144 FPGA Mini Development Board
2011年6月27日月曜日
2011年6月12日日曜日
REGZA RD-BZ800のリモコンをVIZIO(TV)で使えるようにする(構想)
REGZA RD-BZ800のリモコンをVIZIO(TV)で使えるようにする。
普段はSONYの学習リモコンを使ってるのですが、これが妻に評判が悪い。
REGZAのリモコンを学習するにはボタン数が少ない。
シフト機能も使えるけどボタンの刻印が無いから、よく使わないボタン機能を忘れてしまう。
RD-BZ800のリモコンには
左上の青色文字部分がテレビコントロール部分
初代HDDレコーダーClipOnのアルミヘアライン仕上げのB&O風デザインリモコン。
このGUIがしっかりしてればこれだけのボタン数でかなりのこと出来るんだけどね...
アナログ放送が停波したら別用途に利用予定。IRRemoteライブラリをちょっと修正
Binary sketch size: 8816 bytes (of a 32256 byte maximum)
/*
* IRremote: IRrecvDump - dump details of IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/
/*
* IRremote: IRrecvDump - dump details of IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/
/*
Masahiko KANETAKA
kane4d@gmail.com
http://kane4d.blogspot.com/
Port MAP
D0 I RX
D1 O TX
D2
D3 O IR LED Drive
D4
D5
D6
D7 I IR Receiver module(PL-IRM1261)
D8
D9
D10
D11
D12
D13 O LED
*/
//#define DEBUG 1
//#define CORE_LED0_PIN 13
#define MAKER_CODE 0x8F700000
#define REMOTE_CMD(x) ( MAKER_CODE | x )
#include <IRremote.h>
int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
irrecv.blink13(true);
}
// based on Print::printNumber
void printHex64(unsigned long long n)
{
unsigned char buf[sizeof(unsigned long long) * 2];
unsigned long i = 0;
if (n == 0) {
Serial.print('0');
return;
}
while (n > 0) {
buf[i++] = n & 0xf;
n >>= 4;
}
for (; i > 0; i--) {
Serial.print((char) (buf[i - 1] < 10 ?
'0' + buf[i - 1] :
'A' + buf[i - 1] - 10));
}
}
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
// decode_results *results = (decode_results *)v
void dump(decode_results *results) {
int count = results->rawlen;
if (results->decode_type == UNKNOWN) {
Serial.print("Unknown encoding: ");
}
else if (results->decode_type == NEC) {
Serial.print("Decoded NEC: ");
irsend.sendNEC(results->decode_type, 32);
if (results->value == REPEAT){
//repeat code
irsend.sendNEC(REPEAT, 32);
}else if ((results->value & 0xFFFF0000) == MAKER_CODE){
irsend.sendNEC(results->decode_type, 32);
}
}
else if (results->decode_type == SONY) {
Serial.print("Decoded SONY: ");
switch(results->value){
case (0xA90):
Serial.print("Power ");
irsend.sendNEC(REMOTE_CMD(0x10EF), 32);
break;
case (0x490):
Serial.print("Vol.Up ");
irsend.sendNEC(REMOTE_CMD(0x40BF), 32);
break;
case (0xC90):
Serial.print("Vol.Down ");
irsend.sendNEC(REMOTE_CMD(0xC03F), 32);
break;
case (0x90):
Serial.print("CH.Up ");
irsend.sendNEC(REMOTE_CMD(0x00FF), 32);
break;
case (0x890):
Serial.print("CH.Down ");
irsend.sendNEC(REMOTE_CMD(0x807F), 32);
break;
case (0xA50):
Serial.print("InputSel ");
irsend.sendNEC(REMOTE_CMD(0x639C), 32);
break;
case (0x3AE9):
Serial.print("ChiAna ");
irsend.sendNEC(REMOTE_CMD(0xD42B), 32);
break;
case (0x26E9):
Serial.print("ChiDigi ");
irsend.sendNEC(REMOTE_CMD(0x847B), 32);
break;
case (0x1AE9):
Serial.print("BS110 ");
irsend.sendNEC(REMOTE_CMD(0x20DF), 32);
break;
case (0x6AE9):
Serial.print("CS110 ");
irsend.sendNEC(REMOTE_CMD(0xA05F), 32);
break;
}
}
else if (results->decode_type == RC5) {
Serial.print("Decoded RC5: ");
}
else if (results->decode_type == RC6) {
Serial.print("Decoded RC6: ");
}
printHex64(results->value);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
Serial.print("Raw (");
Serial.print(count, DEC);
Serial.print("): ");
for (int i = 0; i < count; i++) {
if ((i % 2) == 1) {
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else {
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println("");
}
void loop() {
if (irrecv.decode(&results)) {
dump(&results);
irrecv.resume(); // Receive the next value
}
}
普段はSONYの学習リモコンを使ってるのですが、これが妻に評判が悪い。
REGZAのリモコンを学習するにはボタン数が少ない。
シフト機能も使えるけどボタンの刻印が無いから、よく使わないボタン機能を忘れてしまう。
RD-BZ800のリモコンには
- テレビコントロールのプリセット値にVIZIOの項目が無い
- 機能別の独立したボタンが多すぎ
- シンプルリモコンがシンプルすぎ
左上の青色文字部分がテレビコントロール部分
IRremoteのサンプルプログラムIRrecvDumpをちょいと手直ししてリモコンコード変換機にしてます。
機能 | VIZIO TV | SONY TV | REGZA TV |
---|---|---|---|
電源 | 8F7010EF | A90(12bits) | 2FD48b7 |
Vol Up | 8F7040BF | 490 | 2FD58A7 |
Vol Down | 8F70C03F | C90 | 2FD7887 |
Ch Up | 8F7000FF | 90 | 2FDD821 |
Ch Down | 8F70807F | 890 | 2FDF807 |
入力切り替え | 8F70639C(HDMI) | A50 | 2FDF00F |
地上波アナログ | 8F7004FB | 3AE9(15bits) | 2FDDE21 |
地上波デジタル | 8F70847B | 26E9 | 2FD5EA1 |
BS110 | 8F7020DF | 1AE9 | 2FD3EC1 |
CS110 | 8F70A05F | 6AE9 | 2FDBE41 |
VIZIOのリモコン受光部はここ
初代HDDレコーダーClipOnのアルミヘアライン仕上げのB&O風デザインリモコン。
このGUIがしっかりしてればこれだけのボタン数でかなりのこと出来るんだけどね...
アナログ放送が停波したら別用途に利用予定。
- sendNECを実行すると受信機能が破壊される
- sendNECにリピート送信を追加
Binary sketch size: 8816 bytes (of a 32256 byte maximum)
/*
* IRremote: IRrecvDump - dump details of IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/
/*
* IRremote: IRrecvDump - dump details of IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
* Version 0.1 July, 2009
* Copyright 2009 Ken Shirriff
* http://arcfn.com
*/
/*
Masahiko KANETAKA
kane4d@gmail.com
http://kane4d.blogspot.com/
Port MAP
D0 I RX
D1 O TX
D2
D3 O IR LED Drive
D4
D5
D6
D7 I IR Receiver module(PL-IRM1261)
D8
D9
D10
D11
D12
D13 O LED
*/
//#define DEBUG 1
//#define CORE_LED0_PIN 13
#define MAKER_CODE 0x8F700000
#define REMOTE_CMD(x) ( MAKER_CODE | x )
#include <IRremote.h>
int RECV_PIN = 7;
IRrecv irrecv(RECV_PIN);
IRsend irsend;
decode_results results;
void setup()
{
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver
irrecv.blink13(true);
}
// based on Print::printNumber
void printHex64(unsigned long long n)
{
unsigned char buf[sizeof(unsigned long long) * 2];
unsigned long i = 0;
if (n == 0) {
Serial.print('0');
return;
}
while (n > 0) {
buf[i++] = n & 0xf;
n >>= 4;
}
for (; i > 0; i--) {
Serial.print((char) (buf[i - 1] < 10 ?
'0' + buf[i - 1] :
'A' + buf[i - 1] - 10));
}
}
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
// void * to work around compiler issue
//void dump(void *v) {
// decode_results *results = (decode_results *)v
void dump(decode_results *results) {
int count = results->rawlen;
if (results->decode_type == UNKNOWN) {
Serial.print("Unknown encoding: ");
}
else if (results->decode_type == NEC) {
Serial.print("Decoded NEC: ");
irsend.sendNEC(results->decode_type, 32);
if (results->value == REPEAT){
//repeat code
irsend.sendNEC(REPEAT, 32);
}else if ((results->value & 0xFFFF0000) == MAKER_CODE){
irsend.sendNEC(results->decode_type, 32);
}
}
else if (results->decode_type == SONY) {
Serial.print("Decoded SONY: ");
switch(results->value){
case (0xA90):
Serial.print("Power ");
irsend.sendNEC(REMOTE_CMD(0x10EF), 32);
break;
case (0x490):
Serial.print("Vol.Up ");
irsend.sendNEC(REMOTE_CMD(0x40BF), 32);
break;
case (0xC90):
Serial.print("Vol.Down ");
irsend.sendNEC(REMOTE_CMD(0xC03F), 32);
break;
case (0x90):
Serial.print("CH.Up ");
irsend.sendNEC(REMOTE_CMD(0x00FF), 32);
break;
case (0x890):
Serial.print("CH.Down ");
irsend.sendNEC(REMOTE_CMD(0x807F), 32);
break;
case (0xA50):
Serial.print("InputSel ");
irsend.sendNEC(REMOTE_CMD(0x639C), 32);
break;
case (0x3AE9):
Serial.print("ChiAna ");
irsend.sendNEC(REMOTE_CMD(0xD42B), 32);
break;
case (0x26E9):
Serial.print("ChiDigi ");
irsend.sendNEC(REMOTE_CMD(0x847B), 32);
break;
case (0x1AE9):
Serial.print("BS110 ");
irsend.sendNEC(REMOTE_CMD(0x20DF), 32);
break;
case (0x6AE9):
Serial.print("CS110 ");
irsend.sendNEC(REMOTE_CMD(0xA05F), 32);
break;
}
}
else if (results->decode_type == RC5) {
Serial.print("Decoded RC5: ");
}
else if (results->decode_type == RC6) {
Serial.print("Decoded RC6: ");
}
printHex64(results->value);
Serial.print(" (");
Serial.print(results->bits, DEC);
Serial.println(" bits)");
Serial.print("Raw (");
Serial.print(count, DEC);
Serial.print("): ");
for (int i = 0; i < count; i++) {
if ((i % 2) == 1) {
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else {
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println("");
}
void loop() {
if (irrecv.decode(&results)) {
dump(&results);
irrecv.resume(); // Receive the next value
}
}
腕時計電池の下調べ
2011年6月11日土曜日
腕時計の電池交換
腕時計をしなくなったのはいつごろからだろうか?
「電池の切れ目が縁の切れ目」
10気圧防水時計は時計屋さんで交換すると高いんですよねぇ。
そんな訳で動作しないが捨てられない時計が溜まってしまいました。
メタボの重たい腰を持ち上げて、この「Cooの腕時計」さんのサイトを参考に電池交換しました。
ダイビングするわけではないので、防水性能は自己責任ということで...
使用したボタン電池
基本方針
用意した道具は
です。
電池交換用にdealeXtreameで購入したバキューム式ピックアップツール($4.19)を使いました。
購入してから気づいたのですが、同じものでもっと安い($3.62)のが有ったんです。
吸盤は大中小の3種類付属。
今回は中サイズをチョイス
後部に使ってない吸盤を収納できます。
タンタルコンデンサの足にさして収納してます。
CASIO G-SHOCK PRT-401J(SR927 x 2)
ファーブル昆虫記の文庫本が同梱されてました。
ファーブルにちなんでバックライトがフンコロガシなんです。
ベルトの合成皮革部分が加水分解?して破損
安いSR927が見つからず今回は電池交換断念
CASIO G-SHOCK GT-000(CR2016)
G-SHOCKは圧電素子に接続するスプリング部分以外はゴムで保護されてる。
裏ぶたの注意書き
ゴムに付着した緑色のものは???
先の細いピンセットで留め金を外す。
嫌いなMAXELL電池が入っている。
未使用でサイババ状態になった古電池。
新しい電池をセットしてAC(All Clear)ジャンパーショートする。
このモデルはACの刻印が見にくい。
リセット後は製造年が表示されるのかな?
95年製
CASIO G-SHOCK DW-8800(CR2016)
何年も電池切れ状態だったけど電話帳は消えてませんでした。
CASIO G-SHOCK 裏ぶた未確認(CR2016)
これはMade in KOREAです。
SEIKO ALBA U.K.G GORI(CR2025)
裏ぶたには圧電素子と注意書きが付いてます。
一度も電池交換してないので純正電池が入ってました。
電池を吸着
あとは新しい電池を入れて、AC(All Clear)後ねじ止めで作業終了。
マジックテープのベルトが長いのでスキーウエアや手袋の上に装着できます。
ねじ止め式じゃない時計がまだあるけど、面倒なので後回しと云うことで...
「電池の切れ目が縁の切れ目」
10気圧防水時計は時計屋さんで交換すると高いんですよねぇ。
そんな訳で動作しないが捨てられない時計が溜まってしまいました。
メタボの重たい腰を持ち上げて、この「Cooの腕時計」さんのサイトを参考に電池交換しました。
ダイビングするわけではないので、防水性能は自己責任ということで...
使用したボタン電池
基本方針
- 裏ぶたの説明書きをよく読む
- AC端子の位置確認
- スプリングを紛失しないように注意
- 指紋を残さない
用意した道具は
です。
電池交換用にdealeXtreameで購入したバキューム式ピックアップツール($4.19)を使いました。
購入してから気づいたのですが、同じものでもっと安い($3.62)のが有ったんです。
吸盤は大中小の3種類付属。
今回は中サイズをチョイス
後部に使ってない吸盤を収納できます。
タンタルコンデンサの足にさして収納してます。
CASIO G-SHOCK PRT-401J(SR927 x 2)
ファーブル昆虫記の文庫本が同梱されてました。
ファーブルにちなんでバックライトがフンコロガシなんです。
ベルトの合成皮革部分が加水分解?して破損
安いSR927が見つからず今回は電池交換断念
CASIO G-SHOCK GT-000(CR2016)
G-SHOCKは圧電素子に接続するスプリング部分以外はゴムで保護されてる。
裏ぶたの注意書き
ゴムに付着した緑色のものは???
先の細いピンセットで留め金を外す。
嫌いなMAXELL電池が入っている。
未使用でサイババ状態になった古電池。
新しい電池をセットしてAC(All Clear)ジャンパーショートする。
このモデルはACの刻印が見にくい。
リセット後は製造年が表示されるのかな?
95年製
CASIO G-SHOCK DW-8800(CR2016)
何年も電池切れ状態だったけど電話帳は消えてませんでした。
CASIO G-SHOCK 裏ぶた未確認(CR2016)
これはMade in KOREAです。
SEIKO ALBA U.K.G GORI(CR2025)
この時計だけ分解写真付きです。
G-Shockは必ずゴムシートが入ってるけど、これには入ってないです。裏ぶたには圧電素子と注意書きが付いてます。
一度も電池交換してないので純正電池が入ってました。
電池を吸着
あとは新しい電池を入れて、AC(All Clear)後ねじ止めで作業終了。
マジックテープのベルトが長いのでスキーウエアや手袋の上に装着できます。
ねじ止め式じゃない時計がまだあるけど、面倒なので後回しと云うことで...
2011年6月6日月曜日
arduinoでLCメータを妄想してみる
morecat_labさんのtwitterでaruduinoの周波数カウンタのライブラリを知りました。
精度、安定度は不明ですが周波数から逆算するLCメータが作れるのでは? なんて考えました。
基本的考え方はtiny2313vでLCメータと同じでソフト部分だけ妄想してみました。
実数を使うとどれくらいメモリーを消費するか調べるために基本部分だけです。
コンパイルサイズは
Binary sketch size: 6406 bytes (of a 32256 byte maximum)
なので余裕です。
ハード部分は後日tiny2313vでLCメータを分解して再利用予定。
/*
Martin Nawrath KHM LAB3
Kunsthochschule f¸r Medien Kˆln
Academy of Media Arts
http://www.khm.de
http://interface.khm.de/index.php/labor/experimente/
*/
/*
Masahiko KANETAKA
kane4d@gmail.com
http://kane4d.blogspot.com/
Port MAP
D0 I RX
D1 O TX
D2
D3 I LC Mode SW (High: C, Low: L)
D4 I Zero Adjust Botton
D5 I Wave(Frequency)
D6 O LCD d7
D7 O LCD d6
D8 O LCD d5
D9 O LCD d4
D10 O LCD enable
D11 O LCD rs
D12 O Relay drive
D13 O LED
*/
#define USE_SERIAL
#define USE_LCD
#include <FreqCounter.h>
#ifdef USE_LCD
#include <LiquidCrystal.h>
#endif
double getfreq(unsigned int f_comp = 10, int gateTime = 100);
#ifdef USE_LCD
LiquidCrystal lcd(11, 10, 9, 8, 7, 6);
#endif
double frq1_r = 0.0F, frq2_r = 0.0F, frq3_r = 0.0F;
double val_r;
int cnt;
bool cal_bool = false;
#define pinLed (13)
#define pinRelay (12)
#define pinZeroAdjBtn (4)
// High: C, Low: L
#define pinLCModeSW (3)
#define DEFAULT_TRY_COUNT (3)
//1000pF + 100uH
#define CAL_CAP (1000.0F)
double getfreq(unsigned int f_comp, int gateTime)
{
double _frq_r = 0.0F;
FreqCounter::f_comp = f_comp; // Cal Value / Calibrate with professional Freq Counter
for(int i = 0; i < DEFAULT_TRY_COUNT; ++i){
FreqCounter::start(gateTime); // 100 ms Gate Time
while (FreqCounter::f_ready == 0) ;
_frq_r += FreqCounter::f_freq;
}
return _frq_r / DEFAULT_TRY_COUNT;
}
void setup() {
pinMode(pinLed, OUTPUT);
pinMode(pinRelay, OUTPUT);
pinMode(pinZeroAdjBtn, INPUT);
pinMode(pinLCModeSW, INPUT); // High: C, Low: L
#ifdef USE_SERIAL
Serial.begin(9600); // connect to the serial port
Serial.println("LC Meter v0.1");
#endif
#ifdef USE_LCD
lcd.clear();
#endif
//frq1_r = frq2_r = frq3_r = 0.0F;
}
void loop() {
if ( ! digitalRead(pinZeroAdjBtn) && ! cal_bool ){
//zero cal
digitalWrite(pinRelay, false);
delay(30);
frq1_r = getfreq();
digitalWrite(pinRelay, true);
delay(30);
frq2_r = getfreq();
digitalWrite(pinRelay, false);
cal_bool = true;
}else{
cal_bool = false;
if ( frq1_r > 0.0 && frq2_r > 0.0 ){
digitalWrite(pinRelay, false);
delay(30);
frq3_r = getfreq();
if (digitalRead(pinLCModeSW)){
//CALC_C
//val_r = CAL_CAP * ( (frq1_r / frq3_r) ^ 2 - 1.0 ) / ( (frq1_r / frq2_r) ^ 2 - 1.0 );
val_r = (frq1_r + frq3_r) / frq3_r;
val_r *= (frq1_r - frq3_r) / frq3_r;
val_r *= frq2_r / (frq1_r + frq2_r) ;
val_r *= frq2_r / (frq1_r - frq2_r) ;
val_r *= CAL_CAP;
}else{
//CALC_L
//val_r = CAL_C * ( (frq1_r / frq3_r) ^ 2 - 1.0 ) * ( (frq1_r / frq2_r) ^ 2 - 1.0 ) / CAL_CAP /( (2 * M_PI frq1_r)^2 );
val_r = (frq1_r + frq3_r) / frq3_r;
val_r *= (frq1_r - frq3_r) / frq3_r;
val_r *= (frq1_r + frq2_r) / frq2_r;
val_r *= (frq1_r - frq2_r) / frq2_r;
val_r /= CAL_CAP;
val_r /= 4 * M_PI * M_PI * frq1_r * frq1_r;
}
#ifdef USE_SERIAL
Serial.println(val_r);
#endif
#ifdef USE_SERIAL
lcd.println(val_r);
#endif
}
}
digitalWrite(pinLed,!digitalRead(pinLed)); // blink Led
}
精度、安定度は不明ですが周波数から逆算するLCメータが作れるのでは? なんて考えました。
基本的考え方はtiny2313vでLCメータと同じでソフト部分だけ妄想してみました。
実数を使うとどれくらいメモリーを消費するか調べるために基本部分だけです。
コンパイルサイズは
Binary sketch size: 6406 bytes (of a 32256 byte maximum)
なので余裕です。
ハード部分は後日tiny2313vでLCメータを分解して再利用予定。
/*
Martin Nawrath KHM LAB3
Kunsthochschule f¸r Medien Kˆln
Academy of Media Arts
http://www.khm.de
http://interface.khm.de/index.php/labor/experimente/
*/
/*
Masahiko KANETAKA
kane4d@gmail.com
http://kane4d.blogspot.com/
Port MAP
D0 I RX
D1 O TX
D2
D3 I LC Mode SW (High: C, Low: L)
D4 I Zero Adjust Botton
D5 I Wave(Frequency)
D6 O LCD d7
D7 O LCD d6
D8 O LCD d5
D9 O LCD d4
D10 O LCD enable
D11 O LCD rs
D12 O Relay drive
D13 O LED
*/
#define USE_SERIAL
#define USE_LCD
#include <FreqCounter.h>
#ifdef USE_LCD
#include <LiquidCrystal.h>
#endif
double getfreq(unsigned int f_comp = 10, int gateTime = 100);
#ifdef USE_LCD
LiquidCrystal lcd(11, 10, 9, 8, 7, 6);
#endif
double frq1_r = 0.0F, frq2_r = 0.0F, frq3_r = 0.0F;
double val_r;
int cnt;
bool cal_bool = false;
#define pinLed (13)
#define pinRelay (12)
#define pinZeroAdjBtn (4)
// High: C, Low: L
#define pinLCModeSW (3)
#define DEFAULT_TRY_COUNT (3)
//1000pF + 100uH
#define CAL_CAP (1000.0F)
double getfreq(unsigned int f_comp, int gateTime)
{
double _frq_r = 0.0F;
FreqCounter::f_comp = f_comp; // Cal Value / Calibrate with professional Freq Counter
for(int i = 0; i < DEFAULT_TRY_COUNT; ++i){
FreqCounter::start(gateTime); // 100 ms Gate Time
while (FreqCounter::f_ready == 0) ;
_frq_r += FreqCounter::f_freq;
}
return _frq_r / DEFAULT_TRY_COUNT;
}
void setup() {
pinMode(pinLed, OUTPUT);
pinMode(pinRelay, OUTPUT);
pinMode(pinZeroAdjBtn, INPUT);
pinMode(pinLCModeSW, INPUT); // High: C, Low: L
#ifdef USE_SERIAL
Serial.begin(9600); // connect to the serial port
Serial.println("LC Meter v0.1");
#endif
#ifdef USE_LCD
lcd.clear();
#endif
//frq1_r = frq2_r = frq3_r = 0.0F;
}
void loop() {
if ( ! digitalRead(pinZeroAdjBtn) && ! cal_bool ){
//zero cal
digitalWrite(pinRelay, false);
delay(30);
frq1_r = getfreq();
digitalWrite(pinRelay, true);
delay(30);
frq2_r = getfreq();
digitalWrite(pinRelay, false);
cal_bool = true;
}else{
cal_bool = false;
if ( frq1_r > 0.0 && frq2_r > 0.0 ){
digitalWrite(pinRelay, false);
delay(30);
frq3_r = getfreq();
if (digitalRead(pinLCModeSW)){
//CALC_C
//val_r = CAL_CAP * ( (frq1_r / frq3_r) ^ 2 - 1.0 ) / ( (frq1_r / frq2_r) ^ 2 - 1.0 );
val_r = (frq1_r + frq3_r) / frq3_r;
val_r *= (frq1_r - frq3_r) / frq3_r;
val_r *= frq2_r / (frq1_r + frq2_r) ;
val_r *= frq2_r / (frq1_r - frq2_r) ;
val_r *= CAL_CAP;
}else{
//CALC_L
//val_r = CAL_C * ( (frq1_r / frq3_r) ^ 2 - 1.0 ) * ( (frq1_r / frq2_r) ^ 2 - 1.0 ) / CAL_CAP /( (2 * M_PI frq1_r)^2 );
val_r = (frq1_r + frq3_r) / frq3_r;
val_r *= (frq1_r - frq3_r) / frq3_r;
val_r *= (frq1_r + frq2_r) / frq2_r;
val_r *= (frq1_r - frq2_r) / frq2_r;
val_r /= CAL_CAP;
val_r /= 4 * M_PI * M_PI * frq1_r * frq1_r;
}
#ifdef USE_SERIAL
Serial.println(val_r);
#endif
#ifdef USE_SERIAL
lcd.println(val_r);
#endif
}
}
digitalWrite(pinLed,!digitalRead(pinLed)); // blink Led
}
登録:
投稿 (Atom)