亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

带有 Arduino Nano 的手持盖革计数器

组件和用品

Arduino Nano R3
× 1
现成的盖革计数器套件
× 1
0.96" OLED 彩色显示屏 96 * 64
× 1
微型 USB 充电器板
× 1
3.7v 4000mAh 受保护的可充电 18650 锂离子电池
× 1
晶体管 BC547
× 1
BUZZER -12MM
× 1
电阻 1k ohm
× 1

必要的工具和机器

3D 打印机(通用)

应用和在线服务

Autodesk Fusion 360
Arduino IDE
CURA
ClickCharts
EasyEDA
Fritzing

关于这个项目

这个项目是在我从 Banggood 购买现成的盖革计数器套件后开始的。

这个想法是把这个套件放在一个 3D 打印的外壳中,这样完整的工作盖革计数器集就可以手持了。最终结果如下图所示:

第一步:系统设计

手持盖革计数器的设计如下图所示:

盖革计数器配备 0.96 英寸彩色 OLED 显示屏,可使用简单的系数向用户通知测量的 CPM(每分钟电离事件检测率的测量值)以及以 µSv/hr 为单位的(计算)剂量当量151 可在文献中找到关于所使用的盖革-米勒 (GM) 管类型。

另见维基百科:https://en.wikipedia.org/wiki/Counts_per_minute

事实上,显示的 CPM 是通过测量每秒计数 (CPS) 并将这些测量值存储在涵盖过去十秒周期的数组中计算一分钟计数的结果。将过去 10 秒内的总计数乘以 6 即可获得 CPM 值。

过去一秒的计数数用于通过 OLED 显示屏上的条形图显示瞬时测量数。这在高计数率的情况下很有用,或者当手持式计数器在辐射源上移动时计数率发生快速变化。

盖革计数器由 18650 型锂离子电池供电,可通过微型 USB 插头充电。 Arduino Nano USB 端口也可用于软件更改。一个额外的蜂鸣器连接到盖革计数器板上,以增强转基因管中电离的声音。

盖革计数器的所有电子设备均内置于 3D 打印外壳中:

OLED 显示器放置在盖革计数器顶部的单独盒子中:

完全组装的版本:

第 2 步:制作盖革计数器组件

使用了以下材料:

  • Arduino NANO 1 https://store.arduino.cc/arduino-nano
  • 盖革计数器套件 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
  • 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
  • Micro USB 充电器板 18650 电池 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=英国
  • 3.7v 4000mAh 受保护的可充电 18650 锂离子电池 1 https://www.banggood.com/4PCS-MECO-3_7v-4000mAh-Protected-Rechargeable-18650-Li-ion-Battery-p-992723.html? rmmds=myorder&cur_warehouse=CN
  • 晶体管 BC547 1
  • 蜂鸣器 -12MM 1
  • 电阻 1k Ohm 1

电子设计

盖革计数器套件的电子设计如下图所示:

完整的盖革计数器设置电路图如下:

5V 电源由放置在微型 USB 充电器板上的可充电锂离子电池提供。 OLED 显示器的 3、3 V 取自该板。

用于使用 ARDUINO IDE 测试和构建软件的面包板设置如下图所示:

机电组装

所有机械和电子部件的组装如下图所示:

请注意,手持式盖革计数器没有任何电缆连接。

为了给 3、7V 锂离子电池充电,外壳上有一个单独的开口,用于(临时)连接微型 USB 插头。

额外的迷你 USB 连接可用于 Arduino Nano 的软件更新。

第 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 //the计算每千次展示费用值的时间为 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白色 0xFFFF
Adafruit_SSD1331 display =Adafruit_SSD1331(cs, dc, rst);
int Counts =0; //包含LOGtime内GM Tube事件数量的变量
unsigned long previousMillis=0; //存储前一次的变量
int AVGCPM =0; //包含固定移动窗口期间的浮动平均计数的变量
int TenSecCPM =0;
int units =0;
int tens =0;
int数百 =0;
int 千 =0;
float Sievert =0;
int COUNTS[10]; // 用于存储 10 个连续 1 秒周期内测量的脉冲量的数组
int t =0;
//////////////////设置下面的代码将在“开机”或复位后运行一次//////////////////
void setup() {
Serial. 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("%");
延迟(3000);
display.fillScreen(BLACK );
for(int x =0; x <10; x++) { //将数组中的所有数据 COUNTS 设为 0(数组位置从 0 到 10;
COUNTS[x] =0; //10个位置,持续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); // 清除显示器上的每千次展示费用值字段
display.setCursor(4,20);
display.setTextColor(RED);
display.setTextSize(2);
display .println(AVGCPM);
//Serial.print("AVGCPM =");串行打印(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);

Sievert =(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("数百 ="); Serial.println(hundreds);
千 =int ((1000*Sievert) - (1000*units) - (100*tens) - (10*hundreds)); //Serial.print("千="); 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); //填充显示器上​​的每千次展示费用指标字段

Counts =0;
}
}
//////////// ////循环结束//////////////////////////////////
//// ///////////////////////////以下是盖革计数器套件的脉冲数计数函数
void IMPULSE( )
{
计数++;
}

草图最重要的部分是中断函数,当测量到盖革计数器的 GM 管上的脉冲触发盖革计数器的 INT 输出时调用该函数(通过使其在短时间内处于低电平)。 INT信号连接到引脚D2(Arduino Nano的外部中断引脚INT0):

attachInterrupt(0, IMPULSE, FALLING); 

INT 信号将启动中断程序 IMPULSE() 以 1 增加 Counts:

void IMPULSE() {Counts++; } 

经过 1000 毫秒后:

  • 整数 Counts 被放回 0
  • 数组 COUNTS [ ] 填充了过去 1000 毫秒内测量的计数数
  • 过去 10 秒的总计数是通过将数组 COUNTS [ ] 中的所有数字相加并乘以 6 来计算的,以在显示屏上显示 CPM 值。
  • 以 µSv/hr 表示的剂量当量是通过将 CPM 值除以 151(文献中找到的值)计算得出的。
  • 在彩色 OLED 显示屏上,根据过去一秒的 Counts 值显示红色条,因此实际上呈现的是 CPS 值(每秒计数)

盖革计数器的完整 ARDUINO 草图包含大约 150 行代码。完整清单包含在本教程中,ARDUINO 代码(参见第 9 章)提供了大量注释。

代码

  • Geiger_Counter.ino
Geiger_Counter.inoArduino
在 Arduino Nano 上运行的盖革计数器的 ARDUINO 草图:
/********* 该项目由 Pierre Pennings 开发和制作(2019 年 12 月),该项目是关于使用一个现成的盖革计数器套件,在一个 3D 打印的手持式辐射探测器中,De 套件连接到一个 Arduino Nano,它计算 10 秒内来自盖革/穆勒管的脉冲数,然后显示平均 CPM(计数每分钟)在 96*64 OLED 彩色显示器上。测得的 CPM 也显示为每小时微西弗(简单的转换系数为 151) OLED 显示屏还显示瞬时测量的脉冲量(每秒),并在显示屏上将测量值显示为移动的红色条。 3D 打印外壳还包含 18650 离子锂电池(可充电),它为 Arduino Nano 和盖革计数器套件提供 5V 电源,为 OLED 显示器提供 3.3V 电源。一个通电开关和一个外部蜂鸣器完善了检测器。开机后,18650 电池的充电水平显示在彩色显示屏上。此代码在 GPL3+ 许可下获得许可。 *********/#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 //计算每千次展示费用值的 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 0xFFFFAdafruit_SSD1331 display =Adafruit_SSD1331(cs, dc, rst =//包含LOGtimeunsigned long previousMillis =0内的GM Tube事件数量的变量; //存储前一个时间的变量int AVGCPM =0; //包含固定移动窗口周期内的浮动平均计数的变量int TenSecCPM =0;int units =0;int tens =0;int数百 =0;int千 =0;float Sievert =0;int COUNTS[10]; // 用于存储 10 个连续 1 秒周期内测量的脉冲量的数组int t =0;////////////////// 后面的设置代码将在之后运行一次“开机”或复位后//////////////////void setup() { Serial.begin(115200);显示。开始(); display.fillScreen(黑色);浮动电池 =模拟读取(A3); //(橙色线)浮动 BattPerc =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("%");延迟(3000); display.fillScreen(黑色); 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);}//////////////////////接下来,将重复运行,直到“断电”或重置/////////void loop() { unsigned long 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 =");串行打印(AVGCPM); //Serial.print(" CPM ="); Serial.println (CPM); display.fillRect(45,38,50,10,BLACK); // 清除显示器上的 uSv/Hr 值字段 display.setCursor(45,38); display.setTextColor(绿色); display.setTextSize(1);西弗特 =(AVGCPM /151.0); //Serial.print(" Sievert ="); Serial.println (西弗特);单位 =整数(西弗特); //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("数百 ="); Serial.println(数百);千 =int ((1000*Sievert) - (1000*unit) - (100*tens) - (10*数百)); //Serial.print("千 ="); 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; }}//////////////// 循环结束////////////////////////// ///////////////////////////////////////以下为数数函数来自盖革计数器的脉冲 kitvoid IMPULSE() { Counts++; }

定制零件和外壳

0,96” OLED 显示器的 3D 打印外壳 display_geiger_rev04_v2_bsLHSDvTUU.3mfhousing 由 Fusion 360 制成,由顶部和底部组成: geiger_counter_housing_top__bottom_rev04_v1_cvCIwkO13j.obj3D stl 文件

示意图

此图显示了电子设备的设置:

制造工艺

  1. DIY 最简单的 IV9 Numitron 时钟与 Arduino
  2. Arduino Gyroscope Game with MPU-6050
  3. Arduino 数字骰子
  4. Arduino 游戏控制器
  5. 使用 Arduino 控制硬币接收器
  6. 自制 16x8 矩阵上的 Arduino Nano 俄罗斯方块游戏
  7. Arduino 带蓝牙控制 LED!
  8. Arduino Nano:使用操纵杆控制 2 个步进电机
  9. 可定制的盖革穆勒计数器
  10. 像素追逐游戏
  11. 带旋转编码器的DIY简易测量轮
  12. 带有 Arduino、Yaler 和 IFTTT 的物联网仪表