2015年12月24日木曜日

Arduino Dip_Meter

Arduino nanoを使って、周波数カウンターとレベルメータの機能を持たせたディップメータ。秋月のクリアケースに収納し、ケース加工を最小限にした。周波数調整は、アクリル板を回す構造とし、アナログ感覚の操作性を目論んだ。まだコイルを作ってないが、動作範囲1-60MHz。
また、ディップが浅い問題があり、プログラム改修で対応したいと思っている。 
USB接続が出来る様、側面に穴あけ加工した。この事で、プログラムのメンテナンスが容易になった。 
カウンターは、1/10プリスケーラにより、60MHz程の周波数を測定。 

基板サイズ 80x86 



















Program

Arduinoの周波数カウンターサンプルを使用し、13.2MHz基準周波数でキャリブレーションしている。ただ、Arduinoボードの個体差(クロック)があるので、要調整。


/////////////////////////////////////////////////////////////////////////////////
//  Frequency counters and level meter
//
//    Copyright(C)2015.JA2GQP.All rights reserved.
//
//                                                  2015/12/22
//                                                  JA2GQP
//-----------------------------------------------------------------------------
// Arduino Frequency Counter Library
// http://interface.khm.de/index.php/lab/interfaces-advanced/arduino-frequency-counter-library/
//
/////////////////////////////////////////////////////////////////////////////////

#include <LiquidCrystal.h>
#include <FreqCounter.h>

#define LCDCOLS 16

LiquidCrystal lcd(8, 7,  6, 4, 3, 2);

long int frq;
double cal;

byte one[8] = {                                   // Special character 1
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
};

byte two[8] = {                                   // Special character 2
  B10100,
  B10100,
  B10100,
  B10100,
  B10100,
  B10100,
  B10100,
};

byte three[8] = {                                 // Special character 3
  B10101,
  B10101,
  B10101,
  B10101,
  B10101,
  B10101,
  B10101,
};

//
//-------------------------------------------- Setup proc ---------------------------------------------------------------------
//

void setup() {
   cal = 13.2 / 13.2799;                          // Calibrat frequency
  lcd.begin(LCDCOLS, 2);
  lcd.clear();
 
  lcd.createChar(1, one);
  lcd.createChar(2, two);
  lcd.createChar(3, three);
 
  analogReference(DEFAULT);

  delay(200);
}


//
//-------------------------------------------- Main Loop ---------------------------------------------------------------------
//

void loop() {
  int v;
  static unsigned long t = 0;
 
  FreqCounter::f_comp = 8;                        // Set compensation to 12
  FreqCounter::start(100);                        // Start counting with gatetime of 100ms
  while (FreqCounter::f_ready == 0);              // wait until counter ready
  frq = FreqCounter::f_freq;                      // read result

  lcd.clear();                                       // clear screen(cursol 0,0)
  lcd.print(frq * cal / 10000);                   // Frequency display
  lcd.print("MHz");

  v = analogRead(0);                              // Anarog data get
  printbar(v,16);                                  // Bar display for 16 column

  lcd.setCursor(10, 0);                           // Analog Volt display
  lcd.print(5.0/1023*v);                          // Voltage display
  lcd.print("V");
  delay(80);

}


//
//-------------------------------------------- Bar display for line2 ----------------------------------------------------------
//

void printbar(int ad_value, int disp_digit) {
  int p;
  int s;
  int i;
  int bar;
  int res;
  int bar_value;
 
  bar = disp_digit * 3;
  res = 1023.0 / bar + 0.5;
  bar_value = (float)ad_value / res + 0.5;
  p = bar_value / 3;
  s = bar_value % 3;
  lcd.setCursor(0, 1);

  for (i = 0; i < p; i++)
    lcd.write(3);

  if (s)
    lcd.write(s);
    else
      lcd.print(' ');

  for (i = 0; i < LCDCOLS - p - 1; i++)
    lcd.print(' ');
}