ArduinoNanoを搭載したハンドヘルドガイガーカウンター
コンポーネントと消耗品
> |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
必要なツールとマシン
> |
|
アプリとオンラインサービス
> |
| |||
| ||||
| ||||
| ||||
| ||||
|
このプロジェクトについて
このプロジェクトは、Banggoodから既製のガイガーカウンターキットを購入した後に始まりました。
<図>アイデアは、このキットを3D印刷されたハウジングに入れて、完全に機能するガイガーカウンターセットを手持ちできるようにすることでした。最終結果を以下に示します。
<図>
ステップ1:システム設計
ハンドヘルドガイガーカウンターの設計を次の図に示します。
<図>ガイガーカウンターには0.96インチのカラーOLEDディスプレイが装備されており、測定されたCPM(1分あたりのイオン化イベントの検出率の測定値)と、単純な係数を使用したµSv / hrでの(計算された)線量当量についてユーザーに通知します。使用されているガイガーミュラー(GM)管のタイプに関する文献に記載されている151個のうち。
ウィキペディアも参照してください:https://en.wikipedia.org/wiki/Counts_per_minute
実際、表示されるCPMは、1秒あたりのカウント(CPS)を測定し、これらの測定値を過去10秒間をカバーする配列に格納することにより、1分間のカウントを計算した結果です。この過去10秒間のカウントの総数に、6を掛けて、CPM値を取得します。
過去1秒間のカウント数は、OLEDディスプレイの棒グラフを介して瞬間的な測定数を表示するために使用されます。これは、カウント率が高い場合、またはハンドヘルドカウンターを放射線源の上に移動したときにカウント率が急激に変化する場合に役立ちます。
ガイガーカウンターは、マイクロUSBプラグを介して充電できるリチウムイオンバッテリータイプ18650を搭載しています。 Arduino Nano USBポートは、ソフトウェアの変更にもアクセスできます。ガイガーカウンターボードに追加のブザーを接続して、GM管内のイオン化の音を強調します。
ガイガーカウンターのすべての電子機器は、3Dプリントされたハウジングに組み込まれています:
<図>OLEDディスプレイは、ガイガーカウンターの上部にある別のボックスに配置されます:
<図>完全に組み立てられたバージョン:
<図>
ステップ2:ガイガーカウンターアセンブリを作成する
次の材料が使用されています:
- Arduino NANO 1 https://store.arduino.cc/arduino-nano
- ガイガーカウンターキット1https://uk.banggood.com/Assembled-DIY-Geiger-Counter-Kit-Module-Miller-Tube-GM-Tube-Nuclear-Radiation-Detector-p-1136883.html?rmmds =search&cur_warehouse =CN
- 0.96 "OLEDカラーディスプレイ96 * 64 1 https://www.banggood.com/0_95-Inch-7pin-Full-Color-65K-Color-SSD1331-SPI-OLED-Display-For-Arduino-p- 1068167.html?rmmds =search&cur_warehouse =CN
- マイクロUSB充電器ボード18650バッテリー1https://www.banggood.com/5pcs-ESP32S-ESP32-0_5A-Micro-USB-Charger-Board-18650-Battery-Charging-Shield-p-1398716.html? rmmds =myorder&cur_warehouse =UK
- 3.7v4000mAh保護された充電式18650リチウムイオン電池1https://www.banggood.com/4PCS-MECO-3_7v-4000mAh-Protected-Rechargeable-18650-Li-ion-Battery-p-992723.html? rmmds =myorder&cur_warehouse =CN
- トランジスタBC5471
- ブザー-12MM1
- 抵抗1kオーム1
電子設計
ガイガーカウンターキットの電子設計を次の回路図に示します。
<図>ガイガーカウンターの完全なセットアップの回路図は次のとおりです。
<図>5Vの電力は、マイクロUSB充電器ボードに配置された充電式リチウムイオン電池から供給されます。 OLEDディスプレイの3、3Vはこのボードから取得されます。
ARDUINOIDEを使用してソフトウェアをテストおよび構築するために使用されるブレッドボードのセットアップを次の図に示します。
<図> <図>
機械的および電気的アセンブリ
すべての機械部品と電子部品の組み立てを下の写真に示します:
<図>ハンドヘルドガイガーカウンターにはケーブル接続がないことに注意してください。
3、7Vリチウムイオンバッテリーを充電するために、マイクロUSBプラグを(一時的に)接続するための独立した開口部がハウジングにあります。
Arduino Nanoのソフトウェアアップデートには、追加のミニUSB接続を利用できます。
ステップ3:ソフトウェア設計
次のフローチャートは、ガイガーカウンターの一般的なソフトウェア設計を示しています。
<図>0、96インチOLEDディスプレイのビューは次のとおりです。
<図>完全なArduinoスケッチを以下に示します:
#include
#include
#include
// OLEDディスプレイの接続
#define sclk 13 // SCL(青いワイヤー)
#define mosi 11 // SDA(白いワイヤー)
#define cs 10 // CS(灰色のワイヤー)
#define rst 9 / / RES(緑色の線)
#define dc 8 // DC(黄色の線)
#define LOGtime 1000 //ミリ秒単位のロギング時間(1秒)
#define Minute 60000 // CPM値を計算するための1分間
#define show endWrite
#define clear()fillScreen(0)
//色の定義
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WHITE 0xFFFF
Adafruit_SSD1331 display =Adafruit_SSD1331(cs、dc、rst);
int Counts =0; // LOGtime内のGMチューブイベントの数を含む変数
unsigned long previousMillis =0; //前回を保存するための変数
int AVGCPM =0; //固定移動ウィンド期間中の浮動平均カウント数を含む変数
int TenSecCPM =0;
int units =0;
int tens =0;
int 100s =0;
int千千=0;
float Sievert =0;
int COUNTS [10]; //測定されたインパルス量を10個の連続する1秒間に保存するための配列
int t =0;
////////////////////セットアップ次のコードは、「電源オン」後またはRESET ///////////////////
void setup(){
シリアルの後に1回実行されます。 begin(115200);
display.begin();
display.fillScreen(BLACK);
floatBattery =analogRead(A3); //(オレンジ色のワイヤー)
floatBattPerc =100 *(Battery / 770);
//Serial.print("battery value ="); Serial.println(バッテリー); Serial.print( "バッテリーのパーセンテージ="); Serial.println(BattPerc);
display.setCursor(4,4);
display.setTextSize(2);
display.setTextColor(MAGENTA);
display.println( "バッテリー");
display.setCursor(4,24);
display.print(int(BattPerc)); display.print( "。"); display.print(int((10 * BattPerc)-(10 * int(BattPerc)))); display.print( "%");
delay(3000);
display.fillScreen(BLACK );
for(int x =0; x <10; x ++){//配列COUNTS内のすべてのデータを0に設定します(配列positionsrunは0から10;
COUNTS [x] =0; // 10秒の期間をカバーする位置
}
attachInterrupt(0、IMPULSE、FALLING); //外部割り込みピンD2 / INT0を定義して、割り込みルーチンIMPULSE(緑色のワイヤー)を開始します)
display.drawRect(0,0,96,64、WHITE);
display.setCursor(4,4);
display.setTextColor(RED);
display.setTextSize(2);
display.print( "CPM");
display.setCursor(50,4);
display.setTextSize(1);
display.print( "10 sec");
display.setCursor(50,12);
display.print( "window");
display.setCursor(4、 38);
display.setTextSize(1);
display.setTextColor(GREEN);
display.print( "uSv / hr");
display。 drawRect(0,48、96、16、YELLOW);
}
///////////////// ///////次のループコードは、「電源オフ」またはRESET /////////
void loop()
{
まで繰り返し実行されますunsignedlong currentMillis =millis();
if(currentMillis --previousMillis> LOGtime)
{
previousMillis =currentMillis;
COUNTS [t] =Counts;
for(int y =0; y <10; y ++){//配列COUNTS内のすべてのデータを一緒に追加します
TenSecCPM =TenSecCPM + COUNTS [y]; //そして10秒間の移動平均CPMを計算します
}
AVGCPM =6 * TenSecCPM;
TenSecCPM =0;
t ++;
if(t> 9){t =0;}
//Serial.print( "COUNTS"); Serial.print(t); Serial.print( "="); Serial.println(COUNTS [t]);
display.fillRect(4,20,90,17、BLACK); //ディスプレイのCPM値フィールドをクリアします
display.setCursor(4,20);
display.setTextColor(RED);
display.setTextSize(2);
display .println(AVGCPM);
//Serial.print( "AVGCPM ="); Serial.print(AVGCPM); //Serial.print( "CPM ="); Serial.println(CPM);
display.fillRect(45,38,50,10、BLACK); //ディスプレイのuSv / Hr値フィールドをクリアします
display.setCursor(45,38);
display.setTextColor(GREEN);
display.setTextSize(1);
シーベルト=(AVGCPM /151.0); //Serial.print( "Sievert ="); Serial.println(Sievert);
units =int(Sievert); //Serial.print( "units ="); Serial.println(units);
tens =int((10 * Sievert)-(10 * units)); //Serial.print( "tens ="); Serial.println(tens);
百=int((100 * Sievert)-(100 * units)-(10 * tens)); //Serial.print( "hundreds ="); Serial.println(hundreds);
千=int((1000 * Sievert)-(1000 * units)-(100 * tens)-(10 * 100)); //Serial.print( "thousands ="); Serial.println(千);
display.print(単位); display.print( "。"); display.print(数十); display.print(数百); display.println(数千);
display.fillRect(1,49,94,14、BLACK); //ディスプレイのCPMインジケーターフィールドをクリアします
display.fillRect(1,49、Counts、14、RED); //ディスプレイのCPMインジケーターフィールドに入力します
Counts =0;
}
}
////////////// //// END ofLOOP ////////////////////////////////////
//// /////////////////////////////以下はガイガーカウンターキットのインパルス数をカウントする関数です
void IMPULSE( )
{
カウント++;
}
スケッチの最も重要な部分は、ガイガーカウンターのGMチューブのインパルスが測定されたときに呼び出される割り込み関数であり、ガイガーカウンターのINT出力をトリガーします(短時間LOWにすることによって)。 INT信号はピンD2(Arduino Nanoの外部割り込みピンINT0)に接続されています:
attachInterrupt(0、IMPULSE、FALLING);
INT信号は、割り込みルーチンIMPULSE()を開始して、カウントを1で増やします。
void IMPULSE(){Counts ++; }
1000ミリ秒経過後:
- 整数のカウントは0に戻されます
- 配列COUNTS []には、過去1000ミリ秒の間に測定されたカウント数が入力されます
- 過去10秒間のカウントの総数は、配列COUNTS []のすべての数値を加算し、6を掛けて、ディスプレイにCPM値を表示することによって計算されます。
- µSv / hrで表される線量当量は、CPM値を151(文献に記載されている値)で割って計算されます。
- カラーOLEDディスプレイでは、過去1秒間のカウント値に基づいて赤いバーが表示されるため、実際にはCPS値(カウント/秒)が表示されます
ガイガーカウンターの完全なARDUINOスケッチは、約150行のコードで構成されています。完全なリストはこのチュートリアルの一部として含まれており、ARDUINOコード(第9章を参照)には十分な量のコメントが含まれています。
コード
- Geiger_Counter.ino
Geiger_Counter.ino Arduino
Arduino Nanoで実行されるガイガーカウンターのARDUINOスケッチ:/ *********このプロジェクトは、Pierre Pennings(2019年12月)によって開発および作成されました。このプロジェクトは、を使用してハンドヘルドガイガーカウンターを作成することについてです。既製のガイガーカウンターキット、3D印刷されたハンドヘルド放射検出器で、DeキットはArduino Nanoに接続され、10秒間にガイガー/ミュラー管からのインパルスの数をカウントし、平均CPM(Counts Per分)96 * 64OLEDカラーディスプレイ。測定されたCPMは、1時間あたりのマイクロシーベルト(単純な変換係数151)としても表示されます。OLEDディスプレイは、瞬間的に測定されたインパルス量(1秒あたり)も表示し、測定値を移動する赤いバーとしてディスプレイに表示します。 3D印刷されたハウジングには、Arduino Nanoに5Vの電力を供給する18650イオンリチウム電池(充電式)、ガイガーカウンターキット、およびOLEDディスプレイ用の3.3Vも含まれています。電源オンスイッチと外部ブザーが検出器を完成させます。電源を入れると、18650バッテリーの充電レベルがカラーディスプレイに表示されます。このコードは、GPL3 +ライセンスの下でライセンスされています。 ********* /#include#include #include // OLEDディスプレイの接続#definesclk 13 // SCL(青いワイヤー)# define mosi 11 // SDA(白い線)#define cs 10 // CS(灰色の線)#definerst 9 // RES(緑の線)#definedc 8 // DC(黄色の線)#defineLOGtime 1000 //ロギングミリ秒単位の時間(1秒)#define Minute 60000 // CPM値を計算するための1分の期間#defineshow endWrite#define clear()fillScreen(0)//色の定義#defineBLACK 0x0000#define BLUE 0x001F#define赤0xF800#define GREEN 0x07E0#define CYAN 0x07FF#define MAGENTA 0xF81F#define YELLOW 0xFFE0 #define WHITE 0xFFFFAdafruit_SSD1331 display =Adafruit_SSD1331(cs、dc、rst); int Counts =0; // LOGtime内のGMチューブイベントの数を含む変数unsignedlong previousMillis =0; //前のtimeintを保存するための変数AVGCPM =0; //固定移動ウィンドウ期間の浮動平均カウント数を含む変数intTenSecCPM =0; int units =0; int tens =0; int 100s =0; int 1000 =0; float Sievert =0; int COUNTS [10]; //測定されたインパルス量を10回の連続した1秒間に保存するための配列intt =0; ////////////////////次のセットアップコードは、 「電源オン」またはリセット後/////////////////// void setup(){Serial.begin(115200); display.begin(); display.fillScreen(BLACK); floatバッテリー=analogRead(A3); //(オレンジ色のワイヤー)float BattPerc =100 *(バッテリー/ 770); //Serial.print( "battery value ="); Serial.println(バッテリー); Serial.print( "バッテリーのパーセンテージ="); Serial.println(BattPerc); display.setCursor(4,4); display.setTextSize(2); display.setTextColor(MAGENTA); display.println( "Battery"); display.setCursor(4,24); display.print(int(BattPerc)); display.print( "。"); display.print(int((10 * BattPerc)-(10 * int(BattPerc)))); display.print( "%"); delay(3000); display.fillScreen(BLACK); for(int x =0; x <10; x ++){//配列COUNTS内のすべてのデータを0に設定します(配列位置は0から10まで実行されます; COUNTS [x] =0; // 10位置は10の期間をカバーしますseconds} attachInterrupt(0、IMPULSE、FALLING); //ピンD2 / INT0で外部割り込みを定義して、割り込みルーチンIMPULSE(緑色の線)を開始しますdisplay.drawRect(0,0,96,64、WHITE); display.setCursor( 4,4); display.setTextColor(RED); display.setTextSize(2); display.print( "CPM"); display.setCursor(50,4); display.setTextSize(1); display.print( "10 sec "); display.setCursor(50,12); display.print(" window "); display.setCursor(4,38); display.setTextSize(1); display.setTextColor(GREEN); display.print(" uSv / hr "); display.drawRect(0,48、96、16、YELLOW);} ////////////////////////ループコード続いて、「電源オフ」またはRESET ///////// void loop(){unsigned long currentMillis =millis(); if(currentMillis-previousMillis> LOGtime){previousMiまで繰り返し実行されますllis =currentMillis; COUNTS [t] =カウント; for(int y =0; y <10; y ++){//配列COUNTS内のすべてのデータを一緒に追加しますTenSecCPM =TenSecCPM + COUNTS [y]; //そして10秒間の移動平均CPMを計算します} AVGCPM =6 * TenSecCPM; TenSecCPM =0; t ++; if(t> 9){t =0;} //Serial.print( "COUNTS"); Serial.print(t); Serial.print( "="); Serial.println(COUNTS [t]); display.fillRect(4,20,90,17、BLACK); //ディスプレイのCPM値フィールドをクリアしますdisplay.setCursor(4,20); display.setTextColor(RED); display.setTextSize(2); display.println(AVGCPM); //Serial.print( "AVGCPM ="); Serial.print(AVGCPM); //Serial.print( "CPM ="); Serial.println(CPM); display.fillRect(45,38,50,10、BLACK); //ディスプレイのuSv / Hr値フィールドをクリアしますdisplay.setCursor(45,38); display.setTextColor(GREEN); display.setTextSize(1);シーベルト=(AVGCPM /151.0); //Serial.print( "Sievert ="); Serial.println(シーベルト);単位=int(シーベルト); //Serial.print( "units ="); Serial.println(単位); tens =int((10 * Sievert)-(10 * units)); //Serial.print( "tens ="); Serial.println(数十);数百=int((100 * Sievert)-(100 * units)-(10 * tens)); //Serial.print( "hundreds ="); Serial.println(数百);千=int((1000 * Sievert)-(1000 * units)-(100 * tens)-(10 * 100)); //Serial.print( "thousands ="); Serial.println(数千); display.print(単位); display.print( "。"); display.print(数十); display.print(数百); display.println(数千); display.fillRect(1,49,94,14、BLACK); //ディスプレイのCPMインジケーターフィールドをクリアしますdisplay.fillRect(1,49、Counts、14、RED); //ディスプレイのCPMインジケーターフィールドに入力しますCounts =0; }} //////////////////ループの終了/////////////////////////// //////////////////////////////////////////以下は、数を数えるための関数に従いますガイガーカウンターからのインパルスの数kitvoidIMPULSE(){カウント++; }
カスタムパーツとエンクロージャー
0,96インチOLEDディスプレイ用の3Dプリントハウジング 回路図
この図は、電子機器のセットアップを示しています。製造プロセス
- Arduinoを使用したDIYの最もシンプルなIV9Numitron時計
- MPU-6050を搭載したArduinoジャイロスコープゲーム
- Arduino Digital Dice
- Arduinoゲームコントローラー
- Arduinoでコインアクセプターを制御する
- 自家製16x8マトリックス上のArduinoNanoTetrisゲーム
- LEDを制御するBluetoothを搭載したArduino!
- Arduino Nano:ジョイスティックで2つのステッピングモーターを制御
- カスタマイズ可能なガイガーミュラーカウンター
- ピクセルチェイサーゲーム
- ロータリーエンコーダー付きDIYシンプル測定ホイール