Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Penghitung Geiger Genggam dengan Arduino Nano

Komponen dan persediaan

Arduino Nano R3
× 1
Kit Penghitung Geiger siap pakai
× 1
0,96" Layar warna OLED 96 * 64
× 1
papan pengisi daya USB mikro
× 1
3.7v 4000mAh Dilindungi Baterai Li-ion 18650 Isi Ulang 18650
× 1
Transistor BC547
× 1
BUZZER -12MM
× 1
Resistor 1k ohm
× 1

Alat dan mesin yang diperlukan

Printer 3D (generik)

Aplikasi dan layanan online

Autodesk Fusion 360
Arduino IDE
CURA
ClickCharts
EasyEDA
Fritzing

Tentang proyek ini

Proyek ini dimulai setelah saya membeli kit penghitung Geiger yang sudah jadi dari Banggood.

Idenya adalah untuk menempatkan kit ini di rumah cetak 3D sehingga set penghitung Geiger yang berfungsi lengkap dapat dipegang dengan tangan. Hasil akhir ditunjukkan di bawah ini:

Langkah 1:Desain Sistem

Desain penghitung Geiger genggam ditunjukkan pada diagram di bawah ini:

Penghitung Geiger dilengkapi dengan layar OLED berwarna 0,96 inci, yang menginformasikan pengguna tentang CPM terukur (ukuran laju deteksi peristiwa ionisasi per menit) serta (dihitung) dosis yang setara dalam Sv/jam menggunakan faktor sederhana dari 151 yang dapat ditemukan dalam literatur untuk jenis tabung Geiger-Müller (GM) yang digunakan.

Lihat juga Wikipedia:https://en.wikipedia.org/wiki/Counts_per_minute

Sebenarnya CPM yang ditampilkan adalah hasil perhitungan hitungan selama satu menit, dengan mengukur hitungan per detik (CPS) dan menyimpan pengukuran ini dalam array yang mencakup periode sepuluh detik terakhir. Jumlah total hitungan selama periode 10 detik terakhir ini dikalikan dengan 6 untuk mendapatkan nilai CPM.

Jumlah hitungan selama satu detik terakhir digunakan untuk menampilkan jumlah pengukuran sesaat melalui grafik batang pada layar OLED. Ini berguna dalam kasus tingkat hitungan yang tinggi, atau ketika perubahan cepat dari tingkat hitungan terjadi ketika penghitung genggam dipindahkan di atas sumber radiasi.

Penghitung Geiger ditenagai oleh baterai Li-ion jenis 18650, yang dapat diisi melalui colokan micro-USB. Port USB Arduino Nano juga dapat diakses untuk perubahan perangkat lunak. Buzzer tambahan terhubung ke papan penghitung Geiger untuk meningkatkan suara ionisasi dalam tabung GM.

Semua elektronik untuk penghitung Geiger dibuat dalam wadah cetak 3D:

Layar OLED diletakkan di kotak terpisah di atas penghitung Geiger:

Versi lengkap:

Langkah 2:Membuat Rakitan Penghitung Geiger

Bahan-bahan berikut digunakan:

  • Arduino NANO 1 https://store.arduino.cc/arduino-nano
  • Kit Penghitung Geiger 1 https://uk.banggood.com/Assembled-DIY-Geiger-Counter-Kit-Module-Miller-Tube-GM-Tube-Nuclear-Radiation-Detector-p-1136883.html?rmmds =search&cur_warehouse=CN
  • Tampilan warna OLED 0,96" 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
  • Papan Pengisi Daya USB Mikro 18650 Baterai 1 https://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.7v 4000mAh Protected Rechargeable 18650 Baterai Li-ion 1 https://www.banggood.com/4PCS-MECO-3_7v-4000mAh-Protected-Rechargeable-18650-Li-ion-Battery-p-992723.html? rmmds=pesanan saya&cur_warehouse=CN
  • Transistor BC547 1
  • BUZZER -12MM 1
  • Resistor 1k Ohm 1

Desain Elektronik

Desain elektronik kit penghitung Geiger ditunjukkan dalam diagram rangkaian berikut:

Diagram rangkaian dari setup Geiger Counter lengkap adalah sebagai berikut:

Daya 5V disuplai dari baterai Li-Ion isi ulang yang ditempatkan di Papan Pengisi Daya USB Mikro. 3, 3 V untuk tampilan OLED diambil dari board ini.

Pengaturan breadboard yang digunakan untuk menguji dan membangun perangkat lunak dengan ARDUINO IDE, ditunjukkan pada gambar berikut:

Perakitan Mekanik dan Elektrikal

Perakitan semua bagian mekanik dan elektronik ditunjukkan pada gambar di bawah ini:

Perhatikan bahwa penghitung Geiger genggam tidak memiliki sambungan kabel.

Untuk mengisi daya baterai Li-ion 3,7V, ada lubang terpisah di wadahnya untuk (sementara) menyambungkan colokan USB mikro.

Koneksi USB mini tambahan tersedia untuk pembaruan perangkat lunak Arduino Nano.

Langkah 3:Desain Perangkat Lunak

Diagram alir berikut menunjukkan desain perangkat lunak umum Penghitung Geiger:

Tampilan pada layar OLED 0, 96”, adalah:

Sketsa Arduino lengkap tercantum di bawah ini:

#include 
#include
#include
//Koneksi untuk layar OLED
#define sclk 13 //SCL (kabel biru)
#define mosi 11 //SDA (kabel putih)
#define cs 10 //CS (kabel abu-abu)
#define rst 9 / /RES (kabel hijau)
#define dc 8 //DC (kabel kuning)
#define LOGtime 1000 //Waktu pencatatan dalam milidetik (1 detik)
#define Menit 60000 // periode 1 menit untuk menghitung nilai CPM
#define show endWrite
#define clear() fillScreen(0)
// Definisi warna
#define HITAM 0x0000
#define BIRU 0x001F
#define MERAH 0xF800
#define HIJAU 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define KUNING 0xFFE0
#define WHITE 0xFFFF
Adafruit_SSD1331 display =Adafruit_SSD1331(cs, dc, rst);
int Hitungan =0; //variabel yang berisi jumlah kejadian GM Tube dalam waktu LOG
tidak ditandatangani lama sebelumnyaMillis=0; //variabeluntuk menyimpan waktu sebelumnya
int AVGCPM =0; //variabel yang berisi jumlah rata-rata mengambang dari hitungan selama periode windo yang bergerak tetap
int TenSecCPM =0;
int unit =0;
int tens =0;
int ratusan =0;
int ribuan =0;
float Sievert =0;
int COUNTS[10]; // larik untuk menyimpan jumlah impuls yang terukur dalam 10 periode 1 detik berturut-turut
int t =0;
///////////////////pengaturan kode berikut, akan dijalankan sekali setelah "Power On" atau setelah RESET//////////////////
void setup() {
Serial. mulai(115200);
display.begin();
display.fillScreen(BLACK);

floatBattery =analogRead(A3); //(kabel oranye)
floatBattPerc =100 * (Battery/770);

//Serial.print("nilai baterai ="); Serial.println (Baterai); Serial.print("persentase baterai ="); Serial.println (BattPerc);
display.setCursor(4,4);
display.setTextSize(2);
display.setTextColor(MAGENTA);
display.println( "Baterai");
display.setCursor(4,24);
display.print (int (BattPerc)); tampilan.print("."); display.print (int((10*BattPerc)-(10*int(BattPerc)))));display.print(" %");
delay(3000);
display.fillScreen(HITAM );
for(int x =0; x <10; x++) { //memasukkan semua data ke dalam Array COUNTS to 0 (Posisi arrayrun dari 0 sampai 10;
COUNTS[x] =0; //10 posisi yang mencakup periode 10 detik
}

attachInterrupt(0, IMPULSE, FALLING); //menentukan pin interupsi eksternal D2/INT0 untuk memulai rutin interupsi IMPULSE (kabel hijau )

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 detik");
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, KUNING);
}
///////////////// //////kode loop berikut, akan berjalan berulang kali sampai "Matikan" atau RESET/////////
void loop()
{
unsignedlong currentMillis=milis();
if(currentMillis - sebelumnyaMillis>LOGtime)
{
sebelumnyaMillis =currentMillis;
COUNTS[t] =Hitungan;
untuk (int y =0; y <10; y++) { //menambahkan semua data dalam Array COUNTS bersama-sama
TenSecCPM =TenSecCPM + COUNTS[y]; //dan hitung BPS rata-rata bergulir selama periode 10 detik
}
AVGCPM =6* TenSecCPM;
TenSecCPM =0;
t++;
if (t> 9) { t =0;}

//Serial.print ("JUMLAH"); Serial.print(t);Serial.print (" =");Serial.println (JUMLAH[t]);
display.fillRect(4,20,90,17,BLACK); // kosongkan kolom nilai CPM pada tampilan
display.setCursor(4,20);
display.setTextColor(RED);
display.setTextSize(2);
display .println(AVGCPM);
//Serial.print("AVGCPM ="); Serial.print(AVGCPM); //Serial.print(" BPS ="); Serial.println(CPM);
display.fillRect(45,38,50,10,HITAM); //mengosongkan field nilai uSv/Hr pada tampilan
display.setCursor(45,38);
display.setTextColor(GREEN);
display.setTextSize(1);

Sievert =(AVGCPM /151.0); //Serial.print(" Sievert =");Serial.println (Sievert);
unit =int (Sievert); //Serial.print("satuan ="); Serial.println(satuan);
puluhan =int ((10*Sievert) - (10*satuan)); //Serial.print("puluhan ="); Serial.println(puluhan);
ratusan =int ((100*Sievert) - (100*unit) - (10* puluhan)); //Serial.print("ratusan ="); Serial.println(ratusan);
ribuan =int ((1000*Sievert) - (1000*unit) - (100*puluhan) - (10*ratusan)); //Serial.print("ribuan ="); Serial.println (ribuan);
display.print (satuan); tampilan.print("."); display.print (puluhan); display.print (ratusan);display.println (ribuan);

display.fillRect(1,49,94,14,HITAM); // kosongkan kolom indikator CPM pada tampilan
display.fillRect(1,49,Counts,14,RED); //isi kolom indikator CPM pada tampilan

Hitungan =0;
}
}
///////////// ////AKHIR LOOP///////////////////////////////////
//// /////////////////////////////Selanjutnya mengikuti Fungsi untuk menghitung jumlah impuls dari Geiger Counter kit
void IMPULSE( )
{
Hitungan++;
}

Bagian terpenting dari sketsa adalah fungsi interupsi yang dipanggil ketika impuls pada tabung GM dari Geiger Counter diukur yang memicu output INT dari Geigercounter (dengan membuatnya RENDAH untuk waktu yang singkat). Sinyal INT terhubung ke pin D2 (pin interupsi eksternal INT0 dari Arduino Nano):

attachInterrupt(0, IMPULSE, FALLING); 

Sinyal INT akan memulai IMPULSE rutin interupsi () untuk meningkatkan Hitungan dengan 1:

void IMPULSE() {Jumlah++; } 

Setelah selang waktu 1000 milidetik:

  • Jumlah bilangan bulat dikembalikan ke 0
  • array COUNTS [ ] diisi dengan jumlah hitungan yang diukur selama 1000 milidetik terakhir
  • jumlah total hitungan selama 10 detik terakhir dihitung dengan menambahkan semua angka dari larik COUNTS [ ] dan dikalikan 6 untuk menampilkan nilai CPM pada tampilan.
  • Ekivalen dosis yang dinyatakan dalam Sv/jam dihitung dengan pembagian nilai CPM dengan 151 (nilai yang ditemukan dalam literatur).
  • Pada layar OLED berwarna ditampilkan bar berwarna merah berdasarkan nilai Counts dalam satu detik terakhir, jadi sebenarnya menampilkan nilai CPS (Counts Per Second)

Sketsa ARDUINO lengkap untuk penghitung Geiger terdiri dari sekitar 150 baris kode. Daftar lengkap disertakan sebagai bagian dari tutorial ini, kode ARDUINO (lihat bab 9) dilengkapi dengan banyak komentar.

Kode

  • Geiger_Counter.ino
Geiger_Counter.inoArduino
Sketsa ARDUINO untuk Penghitung Geiger yang berjalan di Arduino Nano:
/********* Proyek ini telah dikembangkan dan diproduksi oleh Pierre Pennings (Desember 2019), Proyek ini adalah tentang membuat Penghitung Geiger genggam menggunakan kit Geiger Counter siap pakai, dalam detektor radiasi genggam cetak 3D, De kit terhubung ke Arduino Nano yang menghitung jumlah impuls dari tabung Geiger/Muller dalam jangka waktu 10 detik dan kemudian menampilkan rata-rata CPM (Counts Per Menit) pada layar warna OLED 96*64. CPM yang diukur juga ditampilkan sebagai Sievert mikro per Jam (dengan faktor konversi sederhana 151). Layar OLED juga menampilkan jumlah impuls yang diukur sesaat (per detik) dan menampilkan pengukuran sebagai batang merah yang bergerak di layar. Rumah cetak 3D juga berisi baterai Lithium 18650-Ion (dapat diisi ulang) yang menyediakan daya 5V ke Arduino Nano serta kit Penghitung Geiger dan 3,3V untuk tampilan OLED. Sebuah swith power-on dan pager eksternal melengkapi detektor. Saat dihidupkan, tingkat pengisian baterai 18650 ditampilkan pada layar berwarna. Kode ini dilisensikan di bawah lisensi GPL3+. *********/#include #include #include  //Koneksi untuk layar OLED#define sclk 13 //SCL (kabel biru)# define mosi 11 //SDA (kabel putih)#define cs 10 //CS (kabel abu-abu)#define rst 9 //RES (kabel hijau)#define dc 8 //DC (kabel kuning)#define LOGtime 1000 //Logging waktu dalam milidetik (1 detik)#define Minute 60000 //periode 1 menit untuk menghitung nilai CPM#define show endWrite#define clear() fillScreen(0)// Color definition#define BLACK 0x0000#define BLUE 0x001F#define MERAH 0xF800#menentukan HIJAU 0x07E0#menentukan CYAN 0x07FF#menentukan MAGENTA 0xF81F#menentukan KUNING 0xFFE0 #menentukan WHITE 0xFFFFAdafruit_SSD1331 tampilan =Adafruit_SSD1331(cs, dc, rst);int Hitungan =0; //variabel yang berisi jumlah kejadian GM Tube dalam LOGtimeunsigned long beforeMillis =0; //variabel untuk menyimpan waktu sebelumnyaint AVGCPM =0; //variabel yang berisi jumlah rata-rata mengambang dari hitungan selama periode jendela bergerak tetapint TenSecCPM =0;int unit =0;int puluhan =0;int ratusan =0;int ribuan =0;float Sievert =0;int COUNTS[10]; // larik untuk menyimpan jumlah impuls yang terukur dalam 10 periode 1 detik berturut-turutint t =0;///////////////////kode pengaturan berikut, akan dijalankan sekali setelahnya "Power On" atau setelah RESET//////////////////void setup() { Serial.begin(115200); tampilan.mulai(); display.fillScreen(HITAM); float Baterai =analogRead(A3); //(kabel oranye) float BattPerc =100 * (Baterai/770); //Serial.print("nilai baterai ="); Serial.println (Baterai); Serial.print("persentase baterai ="); Serial.println (BattPerc); display.setCursor(4,4); display.setTextSize(2); tampilan.setTextColor(MAGENTA); display.println("Baterai"); display.setCursor(4,24); display.print (int (BattPerc)); tampilan.print("."); display.print (int((10*BattPerc)-(10*int(BattPerc)))); tampilan.print("%"); penundaan(3000); display.fillScreen(HITAM); for (int x =0; x <10; x++) { //memasukkan semua data ke dalam Array COUNTS to 0 (Posisi array dijalankan dari 0 hingga 10; COUNTS[x] =0; //10 posisi yang mencakup periode 10 detik } attachInterrupt(0, IMPULSE, FALLING); //mendefinisikan interupsi eksternal pada pin D2/INT0 untuk memulai rutin interupsi IMPULSE (kabel hijau) 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, KUNING);}///////////////////////kode loop yang berikut, akan berjalan berulang kali sampai "Matikan" atau RESET/////////void loop() { unsigned long currentMillis =millis(); if(currentMillis - PreviousMillis> LOGtime) { PreviousMillis =currentMillis; COUNTS[ t] =Hitungan; untuk (int y =0; y <10; y++) { //menambahkan semua data dalam Array COUNTS bersama-sama TenSecCPM =TenSecCPM + COUNTS[y]; //dan hitung BPS rata-rata bergulir selama periode 10 detik } AVGCPM =6* TenSecCPM; TenSecCPM =0; t++; if (t> 9) { t =0;} //Serial.print ("JUMLAH"); Serial.print(t); Serial.print (" =");Serial.println (JUMLAH[t]); display.fillRect(4,20,90,17,HITAM); // kosongkan kolom nilai CPM pada tampilan display.setCursor(4,20); display.setTextColor(MERAH); display.setTextSize(2); display.println(AVGCPM); //Serial.print("AVGCPM ="); Serial.print (AVGCPM); //Serial.print(" BPS ="); Serial.println (CPM); display.fillRect(45,38,50,10,HITAM); // kosongkan kolom nilai uSv/Hr pada tampilan display.setCursor(45,38); display.setTextColor(HIJAU); tampilan.setTextSize(1); Sievert =(AVGCPM /151.0); //Serial.print("Sievert ="); Serial.println (Sievert); satuan =int (Sievert); //Serial.print("satuan ="); Serial.println (satuan); puluhan =int ((10*Sievert) - (10*unit)); //Serial.print("puluhan ="); Serial.println (puluhan); ratusan =int ((100*Sievert) - (100*unit) - (10* puluhan)); //Serial.print("ratusan ="); Serial.println (ratusan); ribuan =int ((1000*Sievert) - (1000*unit) - (100*puluhan) - (10*ratusan)); //Serial.print("ribuan ="); Serial.println (ribuan); display.print (satuan); tampilan.print("."); display.print (puluhan); display.print (ratusan); display.println (ribuan); display.fillRect(1,49,94,14,HITAM); // kosongkan kolom indikator CPM pada tampilan display.fillRect(1,49,Counts,14,RED); // isi kolom indikator CPM pada tampilan Counts =0; }}//////////////////END dari LOOP//////////////////////////////////////////// /////////////////////////////////////////Selanjutnya mengikuti Fungsi untuk menghitung angka impuls dari Geiger Counter kitvoid IMPULSE() { Hitungan++; }

Suku cadang dan penutup khusus

Rumah cetak 3D untuk layar OLED 0,96” display_geiger_rev04_v2_bsLHSDvTUU.3mfhousing dibuat dengan Fusion 360, terdiri dari bagian atas dan bawah: geiger_counter_housing_top__bottom_rev04_v1_cvCIwkO13j.obj3D file stl

Skema

Diagram ini menunjukkan pengaturan elektronik:

Proses manufaktur

  1. Jam IV9 Numitron DIY paling sederhana dengan Arduino
  2. Game Arduino Gyroscope dengan MPU-6050
  3. Arduino Digital Dice
  4. Pengontrol Game Arduino
  5. Kontrol Penerima Koin dengan Arduino
  6. Game Arduino Nano Tetris di Matriks 16x8 Buatan Sendiri
  7. Arduino dengan Bluetooth untuk Mengontrol LED!
  8. Arduino Nano:Kontrol 2 Motor Stepper Dengan Joystick
  9. Penghitung Geiger Muller yang Dapat Disesuaikan
  10. Game Pixel Chaser