제조공정
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
|
| ||||
| ||||
| ||||
| ||||
| ||||
|
이 프로젝트는 뱅굿에서 기성품 가이거 계수기 키트를 구입한 후 시작되었습니다.
아이디어는 이 키트를 3D 인쇄 하우징에 넣어 작동하는 가이거 계수기 세트를 손에 들고 다닐 수 있도록 하는 것이었습니다. 최종 결과는 아래와 같습니다.
1단계:시스템 설계
휴대용 가이거 계수기의 디자인은 아래 다이어그램에 나와 있습니다.
가이거 계수기에는 0.96인치 컬러 OLED 디스플레이가 장착되어 있어 사용자에게 측정된 CPM(분당 이온화 이벤트 감지율의 측정값)과 μSv/hr 단위의 (계산된) 선량당량을 간단한 계수를 사용하여 알려줍니다. 151개 중 사용된 Geiger-Müller(GM) 튜브 유형에 대한 문헌에서 찾을 수 있습니다.
Wikipedia 참조:https://en.wikipedia.org/wiki/Counts_per_minute
실제로 표시된 CPM은 CPS(초당 카운트)를 측정하고 지난 10초 기간을 포함하는 어레이에 이러한 측정값을 저장하여 1분 동안 카운트를 계산한 결과입니다. 지난 10초 동안의 총 카운트 수에 6을 곱하여 CPM 값을 얻습니다.
과거 1초 동안의 카운트 수는 OLED 디스플레이에 막대 그래프를 통해 순간 측정 수를 표시하는 데 사용됩니다. 이것은 높은 계수율의 경우 또는 휴대용 계수기가 방사선원 위로 이동할 때 계수율의 급격한 변화가 발생할 때 유용합니다.
가이거 계수기는 마이크로 USB 플러그를 통해 충전할 수 있는 리튬 이온 배터리 유형 18650으로 구동됩니다. 소프트웨어 변경을 위해 Arduino Nano USB 포트에도 액세스할 수 있습니다. 추가 부저가 가이거 카운터 보드에 연결되어 GM 튜브의 이온화 사운드를 향상시킵니다.
가이거 계수기의 모든 전자 장치는 3D 인쇄 하우징에 내장되어 있습니다.
OLED 디스플레이는 가이거 계수기 상단의 별도 상자에 넣어집니다.
완전히 조립된 버전:
2단계:가이거 계수기 어셈블리 만들기
다음 자료가 사용되었습니다:
<울>
전자 디자인
가이거 계수기 키트의 전자 설계는 다음 회로도에 나와 있습니다.
전체 가이거 카운터 설정의 회로도는 다음과 같습니다.
5V 전원은 마이크로 USB 충전기 보드에 있는 충전식 리튬 이온 배터리에서 공급됩니다. OLED 디스플레이용 3, 3V는 이 보드에서 가져옵니다.
다음 그림은 ARDUINO IDE로 소프트웨어를 테스트하고 빌드하는 데 사용되는 브레드보드 설정을 보여줍니다.
기계 및 전기 조립
모든 기계 및 전자 부품의 조립은 아래 그림과 같습니다.
휴대용 가이거 계수기에는 케이블 연결이 없습니다.
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 0x#FFE0 WHITE 0xFFFF
Adafruit_SSD1331 디스플레이 =Adafruit_SSD1331(cs, dc, rst);
int 개수 =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;
///////////////////설정 다음 코드는 "전원 켜기" 후 또는 RESET///////////////////
void setup() {
Serial. begin(115200);
display.begin();
display.fillScreen(BLACK);
floatBattery =analogRead(A3); //(주황색 선)
floatBattPerc =100 * (Battery/770);
//Serial.print("배터리 값 ="); 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(검정색 );
for(int x =0; x <10; x++) { //배열 COUNTS의 모든 데이터를 0으로 둡니다(배열 위치는 0에서 10까지 실행,
COUNTS[x] =0; //10초 동안 10개의 위치
}
attachInterrupt(0, IMPULSE, FALLING); //인터럽트 루틴 IMPULSE를 시작하기 위해 핀 D2/INT0에 외부 인터럽트를 정의합니다(녹색 선 )
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초");
display.setCursor(50,12);
display.print("창");
display.setCursor(4, 38);
display.setTextSize(1);
display.setTextColor(GREEN);
display.print("uSv/hr");
디스플레이. drawRect(0,48, 96, 16, 노란색);
}
//////////////////// //////뒤에 나오는 루프 코드는 "전원 끄기" 또는 RESET/////////
void loop()
{
unsignedlong까지 반복적으로 실행됩니다. currentMillis=millis();
if(currentMillis - previousMillis>LOGtime)
{
previousMillis =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(" 시버트 =");Serial.println(시버트);
단위 =int(시버트); //Serial.print("단위 ="); Serial.println(단위);
십 =int ((10*시버트) - (10*단위)); //Serial.print("수십 ="); Serial.println(수);
수백 =int ((100*시버트) - (100*단위) - (10* 십)); //Serial.print("백 ="); Serial.println(백);
천 =int ((1000*시버트) - (1000*단위) - (100*십) - (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;
}
}
////////////// ////LOOP의 끝//////////////////////////////////////
//// ////////////////////////////이하 가이거 카운터 키트에서 임펄스 수를 계산하는 기능을 따릅니다.
void IMPULSE( )
{
카운트++;
}
스케치의 가장 중요한 부분은 가이거 계수기의 INT 출력을 트리거하는 가이거 계수기의 GM 튜브에 대한 임펄스가 측정될 때 호출되는 인터럽트 기능입니다(짧은 기간 동안 LOW로 설정). INT 신호는 핀 D2(Arduino Nano의 외부 인터럽트 핀 INT0)에 연결됩니다.
attachInterrupt(0, IMPULSE, FALLING);
INT 신호는 인터럽트 루틴 IMPULSE()를 시작하여 1로 카운트를 증가시킵니다:
void IMPULSE() {Counts++; }코드>
1000밀리초 경과 후:
<울>가이거 계수기에 대한 완전한 ARDUINO 스케치는 약 150줄의 코드로 구성됩니다. 전체 목록은 이 튜토리얼의 일부로 포함되어 있으며 ARDUINO 코드(9장 참조)는 충분한 양의 주석과 함께 제공됩니다.
섹션> <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">/********* 이 프로젝트는 Pierre Pennings(2019년 12월)에 의해 개발 및 제작되었습니다. 이 프로젝트는 다음을 사용하여 휴대용 가이거 계수기를 만드는 것입니다. 기성품 가이거 계수기 키트, 3D 인쇄된 휴대용 방사선 검출기의 De 키트는 10초 동안 가이거/뮬러 튜브의 임펄스 수를 계산한 다음 평균 CPM(Counts Per 분) 96*64 OLED 컬러 디스플레이에서. 측정된 CPM은 또한 시간당 마이크로 시버트(단순 변환 계수 151)로 표시됩니다. OLED 디스플레이는 또한 순간적으로 측정된 충격량(초당)을 표시하고 측정값을 디스플레이에 움직이는 빨간색 막대로 표시합니다. 3D 인쇄된 하우징에는 Arduino Nano와 가이거 카운터 키트에 5V 전원을 제공하고 OLED 디스플레이에 3.3V를 공급하는 18650-Ion 리튬 배터리(충전식)도 포함되어 있습니다. 전원이 켜진 스위치와 외부 신호음이 감지기를 완성합니다. 전원을 켜면 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 //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 0xFFFFAdafruit_SSD1331 디스플레이 =Adafruit_SSD1331,Count(cs,); //LOGtimeunsigned long previousMillis =0 내의 GM Tube 이벤트 수를 포함하는 변수; //이전 시간을 저장하기 위한 변수int AVGCPM =0; //고정된 이동 창 기간 동안의 부동 평균 카운트 수를 포함하는 변수int TenSecCPM =0;int units =0;int tens =0;int 백 =0;int Thousand =0;float Sievert =0;int COUNTS[10]; // 10개의 연속 1초 주기로 측정된 충격량을 저장하기 위한 배열int t =0;/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 다음 설정 코드, "전원 켜기" 또는 RESET 후//////////////////void setup() { Serial.begin(115200); display.begin(); display.fillScreen(검정); 부동 배터리 =analogRead(A3); //(주황색 선) float BattPerc =100 * (Battery/770); //Serial.print("배터리 값 ="); Serial.println(배터리); Serial.print("배터리 퍼센트 ="); Serial.println(BattPerc); display.setCursor(4,4); display.setTextSize(2); display.setTextColor(자홍색); 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까지 실행됩니다. 초 } 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 초"); display.setCursor(50,12); display.print("창"); display.setCursor(4,38); display.setTextSize(1); display.setTextColor(GREEN); display.print(" uSv/hr"); display.drawRect(0,48, 96, 16, YELLOW);}//////////////////////// 루프 코드 다음은 "전원 끄기" 또는 RESET/////////void 루프() { unsigned long currentMillis =millis(); if(currentMillis - previousMillis> LOGtime) { previousMillis =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(빨간색); 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(녹색); display.setTextSize(1); 시버트 =(AVGCPM /151.0); //Serial.print(" 시버트 ="); Serial.println(시버트); 단위 =int(시버트); //Serial.print("단위 ="); Serial.println(단위); 수십 =int ((10*시버트) - (10*단위)); //Serial.print("수십 ="); Serial.println(십); 수백 =int ((100*시버트) - (100*단위) - (10* 십)); //Serial.print("백 ="); Serial.println(수백); 천 =int ((1000*시버트) - (1000*단위) - (100*십) - (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++; }
제조공정
구성품 및 소모품 Arduino Nano R3 × 1 LED 매트릭스 × 1 포토 저항기 × 1 브레드보드(일반) × 1 DS3231 × 1 앱 및 온라인 서비스 Arduino IDE 이 프로젝트 정보 몇 미터 떨어진 방의 시계 디스플레이를 읽으려면 이러한 LED 매트릭스 디스플레이가 필요합니다. 좋은 가격에 4셀 디스플레이를 구입한 후 Hackster에서 사용 가능한 프로젝트를
구성품 및 소모품 Arduino UNO × 1 DHT11 온도 및 습도 센서(4핀) × 1 Adafruit RGB 백라이트 LCD - 16x2 × 1 저항 10k 옴 × 1 파워 뱅크 × 1 SparkFun 푸시버튼 스위치 12mm × 1 USB-A-B 케이블 × 1 점퍼 와이어(일반) × 1 브레드보드(일반) × 1 이 프로젝트 정보