ポケットガイガー(Type1)ロガー完成と感度調整 ノ巻
ブレッドボード上に作った回路を、シールドボードに半田付けする。
4端子のジャックは2.54mmのピンではないので、足をはんだ付けで固定することに。多少の配線漏れでハマるも、なんとかガイガーカウンターの出力を拾えるようになり、定期的に測定するようにソフトのほうに着手した。タイマーはMsTimer2というライブラリでタイマー割り込みが使えるようなので、これを使うことにした。
サンプルを見ながらやれば簡単にできてしまう。ただ、一度に20分とか指定しようとするとmsオーダーでカウントしているため、intの範囲を超えていると怒られるので1秒単位の割り込みとして、その中でカウンタを持たせた。
これで1分間単位で測れるようにして、測定値を見てみるとそれなりにカウントされているみたい。
このカウント値をある係数で割ってやればuSv/hになる。ではその係数は?と調べたらポケットガイガーでもTypeによって値が異なる。type5の値ではとてつもない値になる。値はどうするか?答えは簡単で、iPhoneアプリの設定値にこれが記載されている。デフォルト値として10.3700となっているので、この値を使用している。
この状態でいつものアトムレンズ(Super-Takumar 50/1.4)で測定してみると、iPhone比で4倍くらいの数値となっている。まずは割り込みのトリガーが"CHANGE"となっているのを”FALLING"として方エッジのみ拾うようにする。さらにコンパレータに設置している半固定抵抗の値を変えてみる。5kΩが初期値だが、さらに大きめの8kΩあたりでiPhoneと同等になった。
オシロが無いので想像だが、ノイズを拾わないように高めの電圧で拾うようにして改善したのかもしれない。
以前に作成したLCD+SDシールドも割り込み端子とかぶらないように修正しており、ポケットガイガーシールドの上にスタックさせた。これでLCDに最終測定値(uSv/h)を、各回の測定値はSDのログファイルに記録する。というところも、サンプルアプリであっさり出来てしまった。
測定値の正確さはともかく、ログファイルを見ていて、時刻も要るかな?とおもったが、ArduinoにはRTCがなく、外付けするか内蔵タイマに刻ませるかになる。内蔵タイマ方式の場合現在時刻の設定が必要で、EtherシールドでNTP(RaspberryPi相当?)ができなければ、シリアル経由で設定するようだ。DateTimeというライブラリがあるが、古いもののようでTimeライブラリが正しいようだ。しかしこちらもサンプルアプリのビルドが通らず。。。
どうもライブラリをインストールしたときのフォルダ構成がよくなかったらしく(一段深くTimeフォルダ以下に展開した)インストールしなおしたら動いた。(ただし、BYTEを使うな、Serial.writeを使えというのは出る)
シリアル経由で時刻設定できればよさそうだが、USB電源供給だと抜いてしまうと時刻設定が消えてしまう罠…
4端子のジャックは2.54mmのピンではないので、足をはんだ付けで固定することに。多少の配線漏れでハマるも、なんとかガイガーカウンターの出力を拾えるようになり、定期的に測定するようにソフトのほうに着手した。タイマーはMsTimer2というライブラリでタイマー割り込みが使えるようなので、これを使うことにした。
サンプルを見ながらやれば簡単にできてしまう。ただ、一度に20分とか指定しようとするとmsオーダーでカウントしているため、intの範囲を超えていると怒られるので1秒単位の割り込みとして、その中でカウンタを持たせた。
これで1分間単位で測れるようにして、測定値を見てみるとそれなりにカウントされているみたい。
このカウント値をある係数で割ってやればuSv/hになる。ではその係数は?と調べたらポケットガイガーでもTypeによって値が異なる。type5の値ではとてつもない値になる。値はどうするか?答えは簡単で、iPhoneアプリの設定値にこれが記載されている。デフォルト値として10.3700となっているので、この値を使用している。
この状態でいつものアトムレンズ(Super-Takumar 50/1.4)で測定してみると、iPhone比で4倍くらいの数値となっている。まずは割り込みのトリガーが"CHANGE"となっているのを”FALLING"として方エッジのみ拾うようにする。さらにコンパレータに設置している半固定抵抗の値を変えてみる。5kΩが初期値だが、さらに大きめの8kΩあたりでiPhoneと同等になった。
オシロが無いので想像だが、ノイズを拾わないように高めの電圧で拾うようにして改善したのかもしれない。
以前に作成したLCD+SDシールドも割り込み端子とかぶらないように修正しており、ポケットガイガーシールドの上にスタックさせた。これでLCDに最終測定値(uSv/h)を、各回の測定値はSDのログファイルに記録する。というところも、サンプルアプリであっさり出来てしまった。
測定値の正確さはともかく、ログファイルを見ていて、時刻も要るかな?とおもったが、ArduinoにはRTCがなく、外付けするか内蔵タイマに刻ませるかになる。内蔵タイマ方式の場合現在時刻の設定が必要で、EtherシールドでNTP(RaspberryPi相当?)ができなければ、シリアル経由で設定するようだ。DateTimeというライブラリがあるが、古いもののようでTimeライブラリが正しいようだ。しかしこちらもサンプルアプリのビルドが通らず。。。
どうもライブラリをインストールしたときのフォルダ構成がよくなかったらしく(一段深くTimeフォルダ以下に展開した)インストールしなおしたら動いた。(ただし、BYTEを使うな、Serial.writeを使えというのは出る)
シリアル経由で時刻設定できればよさそうだが、USB電源供給だと抜いてしまうと時刻設定が消えてしまう罠…
α700 + Minolta AF100mm MACRO F2.8
#include <mstimer2.h>
#include <liquidcrystal.h>
#include <sd.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
// change this to match your SD shield or module;
const int chipSelect = 10;    
#define MEATUSURE_INTERVAL 1 //min.
#define POCKET_GEIGER_COEFFICIENT 10.3700  //type1の係数(cpm->uSv/h)
int count;
int interval;
char mesg[128];
void setup()
{
  // set up the LCD's number of columns and rows: 
  lcd.begin(8, 2);
  lcd.setCursor(2, 1);
  lcd.print(" mSv/h");
  attachInterrupt(0, countup, RISING);      // P-Geiger割り込み設定
  Serial.begin(9600);      //シリアル設定 9600bps
  Serial.println("Start Geiger."); 
  count = 0;
  interval = 0;
  MsTimer2::set(1000, calc); // 20min period
  MsTimer2::start();
  Serial.print("\nInitializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin 
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output 
  // or the SD library functions will not work. 
  pinMode(10, OUTPUT);     // change this to 53 on a mega
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    return;
  }
  Serial.println("card initialized.");
    // open the file. note that only one file can be open at a time,
    // so you have to close this one before opening another.
    File dataFile = SD.open("datalog.txt", FILE_WRITE);
    // if the file is available, write to it:
    if (dataFile) {
      dataFile.println("Start Geiger.");
      dataFile.close();
    }  
    else {
      Serial.println("error opening datalog.txt");
    } 
}
void loop()
{
}
void calc() {
  float cpm;
  char cpmstr[64];
  float usvh;
  char usvhstr[64];
  interval++;
  if (interval >= MEATUSURE_INTERVAL*60) {
    cpm = count / MEATUSURE_INTERVAL;
    usvh = cpm / POCKET_GEIGER_COEFFICIENT;
    dtostrf(cpm,5,2,cpmstr);
    dtostrf(usvh,7,4,usvhstr);
    sprintf(mesg, "%s[cpm], %s[uSv/h]", cpmstr, usvhstr);
    Serial.println(mesg);
    // open the file. note that only one file can be open at a time,
    // so you have to close this one before opening another.
    File dataFile = SD.open("datalog.txt", FILE_WRITE);
    // if the file is available, write to it:
    if (dataFile) {
      dataFile.println(mesg);
      dataFile.close();
    }  
    else {
      Serial.println("error opening datalog.txt");
    } 
    lcd.setCursor(0, 0);
    lcd.print(usvhstr);
    count=0;
    interval=0;
  }
}
void countup()
{
  count++;
}

コメント
コメントを投稿