Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Handheld geigerteller met Arduino Nano

Componenten en benodigdheden

Arduino Nano R3
× 1
Kant-klare geigertellerset
× 1
0.96" OLED-kleurenscherm 96 * 64
× 1
micro-USB-opladerkaart
× 1
3.7v 4000mAh beschermde oplaadbare 18650 Li-ion batterij
× 1
Transistor BC547
× 1
BUZZER -12MM
× 1
Weerstand 1k ohm
× 1

Benodigde gereedschappen en machines

3D-printer (algemeen)

Apps en online services

Autodesk Fusion 360
Arduino IDE
CURA
ClickCharts
EasyEDA
Fritzing

Over dit project

Dit project begon nadat ik een kant-en-klare geigerteller-set van Banggood had gekocht.

Het idee was om deze kit in een 3D-geprinte behuizing te plaatsen, zodat de volledig werkende geigertellerset in de hand kon worden gehouden. Het eindresultaat wordt hieronder getoond:

Stap 1:Systeemontwerp

Het ontwerp van de draagbare geigerteller wordt weergegeven in het onderstaande diagram:

De geigerteller is uitgerust met een 0,96 inch OLED-kleurendisplay, dat de gebruiker informeert over de gemeten CPM (meting van de detectiesnelheid van ionisatiegebeurtenissen per minuut) en het (berekende) dosisequivalent in µSv/hr met behulp van een eenvoudige factor van 151 die in de literatuur kan worden gevonden voor het type Geiger-Müller (GM) buis dat wordt gebruikt.

Zie ook Wikipedia:https://en.wikipedia.org/wiki/Counts_per_minute

In feite is de weergegeven CPM het resultaat van een berekening van tellingen gedurende één minuut, door de tellingen per seconde (CPS) te meten en deze metingen op te slaan in een array die de afgelopen tien seconden beslaat. Het totale aantal tellingen van de afgelopen 10 seconden wordt vermenigvuldigd met 6 om de CPM-waarde te verkrijgen.

Het aantal tellingen van de afgelopen seconde wordt gebruikt om het huidige aantal metingen weer te geven via een staafdiagram op het OLED-display. Dit is handig bij hoge telsnelheden, of wanneer snelle veranderingen van de telsnelheid optreden wanneer de handteller over een stralingsbron wordt bewogen.

De Geigerteller wordt gevoed door een Li-ion batterij type 18650, die kan worden opgeladen via een micro-USB-stekker. De Arduino Nano USB-poort is ook toegankelijk voor softwarewijzigingen. Er is een extra zoemer aangesloten op het geigertellerbord om het geluid van de ionisaties in de GM-buis te versterken.

Alle elektronica voor de geigerteller is ingebouwd in de 3D-geprinte behuizing:

Het OLED-display wordt in een aparte doos bovenop de geigerteller geplaatst:

De volledig gemonteerde versie:

Stap 2:De geigerteller maken

De volgende materialen worden gebruikt:

  • Arduino NANO 1 https://store.arduino.cc/arduino-nano
  • Geigerteller Kit 1 https://nl.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-kleurendisplay 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-opladerbord 18650 Batterij 1 https://www.banggood.com/5pcs-ESP32S-ESP32-0_5A-Micro-USB-Charger-Board-18650-Battery-Charging-Shield-p-1398716.html? rmmds=mijnbestelling&cur_warehouse=VK
  • 3.7v 4000mAh beschermde oplaadbare 18650 Li-ion batterij 1 https://www.banggood.com/4PCS-MECO-3_7v-4000mAh-Protected-Rechargeable-18650-Li-ion-Battery-p-992723.html? rmmds=mijnbestelling&cur_warehouse=CN
  • Transistor BC547 1
  • ZOEMER -12MM 1
  • Weerstand 1k Ohm 1

Het elektronische ontwerp

Het elektronische ontwerp van de geigerteller-set wordt weergegeven in het volgende schakelschema:

Het schakelschema van de complete geigerteller-opstelling is als volgt:

De 5V stroom wordt geleverd door een oplaadbare Li-Ion batterij die in een Micro USB Charger Board is geplaatst. De 3, 3 V voor het OLED-scherm is afkomstig van dit bord.

De opstelling van het breadboard die wordt gebruikt voor het testen en bouwen van de software met de ARDUINO IDE, wordt weergegeven in de volgende afbeelding:

Mechanische en elektrische montage

De montage van alle mechanische en elektronische onderdelen wordt weergegeven in de onderstaande afbeeldingen:

Merk op dat de draagbare geigerteller geen kabelverbindingen heeft.

Voor het opladen van de 3,7V Li-ion accu is er een aparte opening in de behuizing voor het (tijdelijk) aansluiten van een micro-USB-stekker.

Voor software-updates van de Arduino Nano is een extra mini-USB-aansluiting beschikbaar.

Stap 3:Het softwareontwerp

Het volgende stroomschema toont het algemene softwareontwerp van de geigerteller:

De weergaven op het 0, 96” OLED-scherm zijn:

De volledige Arduino-schets staat hieronder:

#include 
#include
#include
//Aansluitingen voor het OLED-scherm
#define sclk 13 //SCL (blauwe draad)
#define mosi 11 //SDA (witte draad)
#define cs 10 //CS (grijze draad)
#define rst 9 / /RES (groene draad)
#define dc 8 //DC (gele draad)
#define LOGtime 1000 //Logtijd in milliseconden (1 seconde)
#define Minute 60000 //the periode van 1 minuut voor het berekenen van de CPM-waarden
#define show endWrite
#define clear() fillScreen(0)
// Kleurdefinities
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAAN 0x07FF
#define MAGENTA 0xF81F
#define YELLOW 0xFFE0
#define WIT 0xFFFF
Adafruit_SSD1331 display =Adafruit_SSD1331(cs, dc, rst);
int Counts =0; //variabele die het aantal GM Tube-gebeurtenissen bevat binnen de LOG-tijd
unsigned long previousMillis=0; //variabele voor het opslaan van de vorige tijd
int AVGCPM =0; //variabele die het zwevende gemiddelde aantal tellingen bevat over een vaste bewegende windo-periode
int TenSecCPM =0;
int units =0;
int tens =0;
int honderden =0;
int duizenden =0;
float Sievert =0;
int COUNTS[10]; // array voor het opslaan van de gemeten hoeveelheden impulsen in 10 opeenvolgende perioden van 1 seconde
int t =0;
////////////////////de setup code die volgt, wordt één keer uitgevoerd na "Power On" of na een RESET///////////////////
void setup() {
Serial. begin(115200);
display.begin();
display.fillScreen(ZWART);

floatBattery =analogRead(A3); //(oranje draad)
floatBattPerc =100 * (Batterij/770);

//Serial.print("battery value ="); Serial.println (batterij); Serial.print("batterijpercentage ="); Serial.println (BattPerc);
display.setCursor(4,4);
display.setTextSize(2);
display.setTextColor(MAGENTA);
display.println( "Batterij");
display.setCursor(4,24);
display.print (int (BattPerc)); display.print("."); display.print (int((10*BattPerc)-(10*int(BattPerc))));display.print(" %");
delay(3000);
display.fillScreen(ZWART );
for(int x =0; x <10; x++) { // zet alle gegevens in de array-COUNTS op 0 (array-posities lopen van 0 tot 10;
COUNTS [x] =0; //10 posities die een periode van 10 seconden beslaan
}

attachInterrupt(0, IMPULSE, FALLING); //definieer externe onderbreking op pin D2/INT0 om de onderbrekingsroutine IMPULSE te starten (groene draad )

display.drawRect(0,0,96,64,WIT);
display.setCursor(4,4);
display.setTextColor(ROOD);
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(GROEN);
display.print("uSv/hr");

display. drawRect(0,48, 96, 16, GEEL);
}
////////////////// //////de luscode die volgt, wordt herhaaldelijk uitgevoerd tot "Power Off" of een RESET/////////
void loop()
{
unsignedlong currentMillis=millis();
if(currentMillis - previousMillis>LOGtime)
{
previousMillis =currentMillis;
COUNTS[t] =Counts;
for (int y =0; y <10; y++) { // voeg alle gegevens in de array COUNTS samen toe
TenSecCPM =TenSecCPM + COUNTS [y]; //en bereken de voortschrijdende gemiddelde CPM over een periode van 10 seconden
}
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); // wis het CPM-waardeveld op het display
display.setCursor(4,20);
display.setTextColor(RED);
display.setTextSize(2);
display .println(AVGCPM);
//Serial.print ("AVGCPM ="); Seriële.afdruk (AVGCPM); //Serial.print ("CPM ="); Serial.println(CPM);
display.fillRect(45,38,50,10,ZWART); //wis het uSv/Hr-waardeveld op het display
display.setCursor(45,38);
display.setTextColor(GROEN);
display.setTextSize(1);

Sievert =(AVGCPM /151.0); //Serial.print ("Sievert =");Serial.println (Sievert);
units =int (Sievert); //Serial.print ("eenheden ="); Serial.println(eenheden);
tientallen =int ((10*Sievert) - (10*eenheden)); //Serial.print ("tientallen ="); Serial.println(tientallen);
honderden =int ((100*Sievert) - (100*eenheden) - (10* tientallen)); //Serial.print ("honderden ="); Serial.println(honderden);
duizenden =int ((1000*Sievert) - (1000*eenheden) - (100*tientallen) - (10*honderden)); //Serial.print ("duizenden ="); Serial.println (duizenden);
display.print (eenheden); display.print("."); display.print (tientallen); display.print (honderden);display.println (duizenden);

display.fillRect(1,49,94,14,BLACK); // wis het CPM-indicatorveld op het display
display.fillRect(1,49,Counts,14,RED); //vul het CPM-indicatorveld op het display

Counts =0;
}
}
////////////// ////EINDE van LOOP////////////////////////////////////
//// /////////////////////////////Hierna volgt de functie voor het tellen van het aantal impulsen van de geigerteller-kit
void IMPULSE( )
{
Tellingen++;
}

Het belangrijkste onderdeel van de schets is de interrupt-functie die wordt aangeroepen wanneer een impuls op de GM-buis van de geigerteller wordt gemeten die de INT-uitgang van de geigerteller activeert (door deze voor een korte periode LAAG te maken). Het INT-signaal wordt aangesloten op pin D2 (de externe interruptpin INT0 van de Arduino Nano):

attachInterrupt(0, IMPULSE, FALLING); 

Het INT-signaal zal de interruptroutine IMPULSE () starten om Counts te verhogen met 1:

void IMPULSE() {Counts++; } 

Na het verstrijken van 1000 milliseconden:

  • het gehele getal Counts wordt teruggezet naar 0
  • de array COUNTS [ ] is gevuld met het aantal counts dat de afgelopen 1000 milliseconden is gemeten
  • het totale aantal tellingen van de afgelopen 10 seconden wordt berekend door alle getallen uit de array COUNTS [ ] op te tellen en te vermenigvuldigen met 6 om de CPM-waarde op het scherm weer te geven.
  • Het dosisequivalent uitgedrukt in µSv/uur wordt berekend door de CPM-waarde te delen door 151 (een waarde die in de literatuur wordt gevonden).
  • Op het OLED-kleurenscherm wordt een rode balk weergegeven op basis van de waarde van het aantal counts in de afgelopen seconde, dus in feite de CPS-waarde (counts per second)

De volledige ARDUINO-schets voor de Geigerteller omvat ongeveer 150 regels code. De volledige lijst is opgenomen als onderdeel van deze tutorial, de ARDUINO-code (zie hoofdstuk 9) is voorzien van een ruime hoeveelheid commentaar.

Code

  • Geiger_Counter.ino
Geiger_Counter.inoArduino
ARDUINO-schets voor de geigerteller die draait op een Arduino Nano:
/********* Dit project is ontwikkeld en geproduceerd door Pierre Pennings (december 2019). Dit project gaat over het maken van een draagbare geigerteller met een kant en klare Geiger Counter kit, in een 3D geprinte handheld stralingsdetector, De kit is verbonden met een Arduino Nano die het aantal impulsen van de Geiger/Muller buis in een periode van 10 seconden telt en vervolgens de gemiddelde CPM (Counts Per Minute) op een 96*64 OLED-kleurendisplay. De gemeten CPM wordt ook weergegeven als micro Sievert per uur (met een eenvoudige conversiefactor van 151). Het OLED-display geeft ook het momentane gemeten aantal impulsen (per seconde) weer en geeft de metingen weer als een bewegende rode balk op het display. De 3D-geprinte behuizing bevat ook de 18650-Ion lithiumbatterij (oplaadbaar) die de Arduino Nano van 5V voorziet, evenals de Geigerteller-kit en 3,3V voor het OLED-display. Een power-on schakelaar en een externe pieper maken de detector compleet. Bij het inschakelen wordt het laadniveau van de 18650-batterij weergegeven op het kleurendisplay. Deze code is gelicentieerd onder de GPL3+-licentie. *********/#include #include #include  //Verbindingen voor het OLED-scherm#define sclk 13 //SCL (blauwe draad)# define mosi 11 //SDA (witte draad)#define cs 10 //CS (grijze draad)#define rst 9 //RES (groene draad)#define dc 8 //DC (gele draad)#define LOGtime 1000 //Logging tijd in milliseconden (1 seconde)#define Minute 60000 //de periode van 1 minuut voor het berekenen van de CPM-waarden#define show endWrite#define clear() fillScreen(0)// Kleurdefinities#define BLACK 0x0000#define BLUE 0x001F#define ROOD 0xF800#define GROEN 0x07E0#define CYAAN 0x07FF#define MAGENTA 0xF81F#define GEEL 0xFFE0 #define WIT 0xFFFFAdafruit_SSD1331 display =Adafruit_SSD1331(cs, dc, eerste);int Counts =0; //variabele die het aantal GM Tube-gebeurtenissen bevat binnen de LOGtimeunsigned lange previousMillis =0; //variabele voor het opslaan van de vorige timeint AVGCPM =0; //variabele met het zwevende gemiddelde aantal tellingen over een vaste bewegende vensterperiode. TenSecCPM =0;int units =0;int tientallen =0;int honderden =0;int duizendtallen =0;float Sievert =0;int COUNTS[10]; // array voor het opslaan van de gemeten hoeveelheden impulsen in 10 opeenvolgende perioden van 1 secondeint t =0;/////////////////////de setup-code die volgt, wordt daarna één keer uitgevoerd "Power On" of na een RESET///////////////////void setup() { Serial.begin(115200); weergave.begin(); display.fillScreen(ZWART); float Batterij =analoog lezen (A3); // (oranje draad) float BattPerc =100 * (batterij/770); //Serial.print ("batterijwaarde ="); Serial.println (batterij); Serial.print ("batterijpercentage ="); Serial.println (BattPerc); display.setCursor(4,4); display.setTextSize(2); display.setTextColor (MAGENTA); display.println("Batterij"); display.setCursor(4,24); display.print (int (BattPerc)); display.print("."); display.print (int((10*BattPerc)-(10*int(BattPerc)))); display.print(" %"); vertraging (3000); display.fillScreen(ZWART); for (int x =0; x <10; x++) {// zet alle gegevens in de array COUNTS op 0 (array-posities lopen van 0 tot 10; COUNTS [x] =0; //10 posities over een periode van 10 seconden} attachInterrupt(0, IMPULSE, FALLING); //definieer externe interrupt op pin D2/INT0 om de interruptroutine te starten IMPULSE (groene draad) display.drawRect (0,0,96,64,WHITE); display.setCursor( 4,4); display.setTextColor(ROOD); 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(GROEN); display.print(" uSv/hr"); display.drawRect(0,48, 96, 16, GEEL);}////////////////////////de luscode die volgt, zal herhaaldelijk worden uitgevoerd tot "Power Off" of een RESET/////////void loop() { unsigned long currentMillis =millis(); if(currentMillis - previousMillis> LOGtime) { previousMillis =currentMillis; COUNTS [ t] =telt; voor (int y =0; y <10; y++) { // voeg alle gegevens in de array COUNTS samen toe TenSecCPM =TenSecCPM + COUNTS [y]; //en bereken de voortschrijdende gemiddelde CPM over een periode van 10 seconden } 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,ZWART); // wis het CPM-waardeveld op het display display.setCursor (4,20); display.setTextColor(ROOD); display.setTextSize(2); display.println(AVGCPM); //Serial.print ("AVGCPM ="); Serieafdruk (AVGCPM); //Serial.print ("CPM ="); Seriële.println (CPM); display.fillRect(45,38,50,10,ZWART); // wis het uSv/Hr-waardeveld op het display display.setCursor (45,38); display.setTextColor (GROEN); display.setTextSize(1); Sievert =(AVGCPM /151.0); //Serial.print (" Sievert ="); Serial.println (Sievert); eenheden =int (Sievert); //Serial.print ("eenheden ="); Serial.println (eenheden); tientallen =int ((10*Sievert) - (10*eenheden)); //Serial.print ("tientallen ="); Serial.println (tientallen); honderden =int ((100*Sievert) - (100*eenheden) - (10* tientallen)); //Serial.print ("honderden ="); Serial.println (honderden); duizenden =int ((1000*Sievert) - (1000*eenheden) - (100*tientallen) - (10*honderden)); //Serial.print ("duizenden ="); Serial.println (duizenden); display.print (eenheden); display.print("."); display.print (tientallen); display.print (honderden); display.println (duizenden); display.fillRect(1,49,94,14,ZWART); // wis het CPM-indicatorveld op het display display.fillRect(1,49,Counts,14,RED); // vul het CPM-indicatorveld op het display Counts =0; }}//////////////////EINDE van LUS/////////////////////////// //////////////////////////////////////////Hierna volgt de functie voor het tellen van het getal van impulsen van Geiger Counter kitvoid IMPULSE() { Counts++; }

Aangepaste onderdelen en behuizingen

3D-geprinte behuizing voor het 0,96” OLED-scherm display_geiger_rev04_v2_bsLHSDvTUU.3mfbehuizing gemaakt met Fusion 360, bestaande uit een boven- en ondergedeelte: geiger_counter_housing_top__bottom_rev04_v1_cvCIwkO13j.obj3D stl-bestand

Schema's

Dit diagram toont de opstelling van de elektronica:

Productieproces

  1. DIY eenvoudigste IV9 Numitron-klok met Arduino
  2. Arduino-gyroscoopspel met MPU-6050
  3. Arduino digitale dobbelstenen
  4. Arduino-gamecontroller
  5. Bedien muntvangers met Arduino
  6. Arduino Nano Tetris-spel op zelfgemaakte 16x8 Matrix
  7. Arduino met Bluetooth om een ​​LED te bedienen!
  8. Arduino Nano:bedien 2 stappenmotoren met joystick
  9. Aanpasbare Geiger Muller-teller
  10. Pixel Chaser-game
  11. DIY eenvoudig meetwiel met roterende encoder