산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
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 옴
× 1

필요한 도구 및 기계

3D 프린터(일반)

앱 및 온라인 서비스

오토데스크 퓨전 360
Arduino IDE
CURA
클릭 차트
EasyEDA
프리징

이 프로젝트 정보

이 프로젝트는 뱅굿에서 기성품 가이거 계수기 키트를 구입한 후 시작되었습니다.

아이디어는 이 키트를 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단계:가이거 계수기 어셈블리 만들기

다음 자료가 사용되었습니다:

<울>
  • 아두이노 나노 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
  • 마이크로 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 옴 1
  • 전자 디자인

    가이거 계수기 키트의 전자 설계는 다음 회로도에 나와 있습니다.

    전체 가이거 카운터 설정의 회로도는 다음과 같습니다.

    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밀리초 경과 후:

    <울>
  • 정수 Counts가 다시 0으로 설정됨
  • 배열 COUNTS [ ]는 지난 1000밀리초 동안 측정된 카운트 수로 채워집니다.
  • 지난 10초 동안의 총 카운트 수는 COUNTS [ ] 배열의 모든 숫자를 더하고 6을 곱하여 계산되어 디스플레이에 CPM 값을 표시합니다.
  • μSv/hr로 표시되는 등가선량은 CPM 값을 151(문헌에서 볼 수 있는 값)로 나누어 계산합니다.
  • 컬러 OLED 디스플레이에서 지난 1초의 Counts 값을 기반으로 빨간색 막대가 표시되므로 실제로 CPS 값(Counts Per Second)을 표시합니다.
  • 가이거 계수기에 대한 완전한 ARDUINO 스케치는 약 150줄의 코드로 구성됩니다. 전체 목록은 이 튜토리얼의 일부로 포함되어 있으며 ARDUINO 코드(9장 참조)는 충분한 양의 주석과 함께 제공됩니다.

    <섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

    코드

    <울>
  • Geiger_Counter.ino
  • Geiger_Counter.ino아두이노
    Arduino Nano에서 실행되는 가이거 계수기를 위한 ARDUINO 스케치:
    /********* 이 프로젝트는 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++; }

    맞춤형 부품 및 인클로저

    0,96인치 OLED 디스플레이용 3D 프린팅 하우징 display_geiger_rev04_v2_bsLHSDvTUU.3mfFusion 360으로 만든 하우징, 상단과 하단으로 구성: geiger_counter_housing_top__bottom_rev04_v1_cvCIwkO13j.obj3D stl 파일

    회로도

    이 다이어그램은 전자 장치의 설정을 보여줍니다.

    제조공정

    1. Arduino로 DIY 가장 간단한 IV9 Numitron 시계
    2. MPU-6050을 사용한 Arduino 자이로스코프 게임
    3. Arduino 디지털 주사위
    4. Arduino 게임 컨트롤러
    5. Arduino로 코인 억셉터 제어
    6. 수제 16x8 매트릭스의 Arduino Nano 테트리스 게임
    7. Bluetooth가 탑재된 Arduino로 LED 제어!
    8. Arduino Nano:조이스틱으로 2개의 스테퍼 모터 제어
    9. 맞춤형 Geiger Muller 계수기
    10. 픽셀 체이서 게임