2014年6月24日 星期二

Arduino 蓋革計數器

 先解釋一下上圖好了,盒子內有Arduino Pro,一個i2C 1602LCD,蓋格管的電路板,SBM-20蓋格管
左邊的是PocketGeiger,拿來和Arduino蓋格計數器做比較


蓋革管是一種可以檢測輻射線的管子,通一個高壓電之後,如果有輻射線(看管子可以檢測哪幾種)進到管中,會電離內部的氣體,造成瞬間的導通,在另一端產生脈衝的信號,
蓋格計數器就是紀錄這些事件的次數,算出來當下的Count per minute (CPM)每分鐘事件數,就可以利用簡單的式子換算成輻射強度(uSv/h)
現在用的是SBM-20,還算滿普遍的蓋革管,便宜好用XD,可以檢測Beta和Gamma射線

我用http://brohogan.blogspot.tw/2010/02/geiger-counter.html這個人的電路圖,Layout出蓋革計數器最主要的電路板,重點就是,記得用CMOS的555(LM555 or TLC555),NE555是不能用的..Orz
我去光華買的時候到處都找不到QQ,有一家問完LM555拿NE555給我,最後乾脆去RS買TLC555,一個13塊還可以免運費,超棒的

另外就是校正的問題了,基本上這個電路板會產生400v的高壓,但是電流非常非常少,我被電到的感覺沒有Nixie的200v升壓板來的麻.但這也造成再測量電壓的時候需要考慮電表的內電阻,
首先就是先查出來或是量出來電表的內電阻是多少,我自己的電表是10M,
然後量輸出的電壓,量完之後,因為上圖的電路在末端還有兩個共5.7M的電阻,電路圖如下:
Vin是電路板的供應電壓,Vout是電表的電壓,Ra是5.7M歐姆,Rb是電表的內電阻,由此就可以算出來實際的Vin是多少了,蓋革管的電壓太高的話一下子就會故障的

這支SBM-20的建議電壓是400V,調整電路圖的R7就可以了

我自己送洗的電路板長的如下XD,對了,蓋革管千萬別用焊接的,這樣會讓他損壞,用兩個保險絲的Holder剛剛好(我買的是20mm直徑)

接下來就是利用Arduino的外部中斷(INT),當蓋革管有事件時,電路會輸出一的低電壓的脈衝,需要注意的是這張電路板的INT接上Arduino之後,需要一個Pullup才能正常運作
程式就簡單了,架構就是讓每一次INT腳的電壓下降的時候,讓計數器+1
等到一段時間之後計算輸出CPM,再利用下圖的公式計算uSv/h,需要注意的是每一種管子的常數都不一樣,SBM-20的話就用175
程式如下:


#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x20,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

const int alpha = 175;
long count = 0;
long countPerMinute = 0;

void setup()  { 
  lcd.init();                    
  lcd.backlight();
  lcd.print("Sbm-20");
  digitalWrite(2,HIGH);
  attachInterrupt(0,countPulse,FALLING); 
  
  
  Serial.begin(9600); 

}

void loop()  { 
  
  delay(15000); 
  countPerMinute = 4*count; 
  float uSv = float(countPerMinute) / float(alpha);
  char charBuf[15];
  String uSvv = dtostrf(uSv, 5, 3, charBuf);

  Serial.println(countPerMinute,DEC);

  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("CPM:");
  lcd.print(countPerMinute,DEC);
   lcd.setCursor(0,1);
  lcd.print("uSv/h:");
  lcd.print(uSvv);
  count=0;                  
}


void countPulse(){
  detachInterrupt(0);
  count++; 
  digitalWrite(13, HIGH);
  while(digitalRead(2)==0){
  }
  digitalWrite(13, LOW);
  attachInterrupt(0,countPulse,FALLING);
}

不知道為甚麼,這電路做出來有種老儀器老電路的感覺,不知道是不是因為電阻直立看起來滿密集的關係.

沒有留言:

張貼留言