Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Contador Geiger portátil com Arduino Nano

Componentes e suprimentos

Arduino Nano R3
× 1
Kit de contagem Geiger pronto para uso
× 1
0,96 "Tela OLED colorida 96 * 64
× 1
placa do carregador micro USB
× 1
3.7v 4000mAh Bateria de íon-lítio recarregável protegida 18650
× 1
Transistor BC547
× 1
BUZZER -12MM
× 1
Resistor 1k ohm
× 1

Ferramentas e máquinas necessárias

Impressora 3D (genérica)

Aplicativos e serviços online

Autodesk Fusion 360
Arduino IDE
CURA
ClickCharts
EasyEDA
Fritzing

Sobre este projeto


Este projeto começou depois que comprei um kit de contador Geiger pronto para uso na Banggood.

A ideia era colocar este kit em uma caixa impressa em 3D para que o conjunto completo de contadores Geiger pudesse ser usado na mão. O resultado final é mostrado abaixo:





Etapa 1:Design do sistema


O design do contador portátil Geiger é mostrado no diagrama abaixo:

O contador Geiger é equipado com um display OLED colorido de 0,96 polegadas, que informa o usuário sobre o CPM medido (medida da taxa de detecção de eventos de ionização por minuto), bem como o equivalente de dose (calculado) em µSv / h usando um fator simples de 151 que pode ser encontrada na literatura para o tipo de tubo Geiger-Müller (GM) usado.

Veja também Wikipedia:https://en.wikipedia.org/wiki/Counts_per_minute

Na verdade, o CPM exibido é o resultado de um cálculo de contagens para um minuto, medindo as contagens por segundo (CPS) e armazenando essas medições em uma matriz que cobre o período de dez segundos anteriores. O número total de contagens nos últimos 10 segundos é multiplicado por 6 para obter o valor de CPM.

O número de contagens no último segundo é usado para exibir o número momentâneo de medições por meio de um gráfico de barras no display OLED. Isso é útil no caso de altas taxas de contagem ou quando mudanças rápidas na taxa de contagem ocorrem quando o contador portátil é movido sobre uma fonte de radiação.

O contador Geiger é alimentado por uma bateria de íon-lítio tipo 18650, que pode ser carregada por meio de um plugue micro-USB. A porta USB do Arduino Nano também pode ser acessada para alterações de software. Uma campainha extra é conectada à placa do contador Geiger para aumentar o som das ionizações no tubo GM.

Todos os eletrônicos para o contador Geiger são construídos na caixa impressa em 3D:

O display OLED é colocado em uma caixa separada na parte superior do contador Geiger:

A versão totalmente montada:





Etapa 2:fazer o conjunto do contador Geiger


Os seguintes materiais são usados:
  • Arduino NANO 1 https://store.arduino.cc/arduino-nano
  • Geiger Counter Kit 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 "Tela OLED colorida 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
  • Placa de carregamento Micro USB 18650 Bateria 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
  • Bateria de íon-lítio protegida recarregável 18650 de 3,7v 4000mAh 1 https://www.banggood.com/4PCS-MECO-3_7v-4000mAh-Protected-Rechargeable-18650-Li-ion-Battery-p-992723.html? rmmds =myorder &cur_warehouse =CN
  • Transistor BC547 1
  • BUZZER -12MM 1
  • Resistor 1k Ohm 1





O Design Eletrônico


O design eletrônico do kit do contador Geiger é mostrado no seguinte diagrama de circuito:

O diagrama de circuito da configuração completa do Contador Geiger é o seguinte:

A alimentação de 5 V é fornecida por uma bateria recarregável de íons de lítio colocada em uma placa de carregamento micro USB. O 3, 3 V para o display OLED é retirado desta placa.

A configuração da placa de ensaio usada para testar e construir o software com o ARDUINO IDE é mostrada na imagem a seguir:





Montagem Mecânica e Elétrica


A montagem de todas as partes mecânicas e eletrônicas é mostrada nas fotos abaixo:

Observe que o contador Geiger portátil não possui nenhuma conexão de cabo.

Para carregar a bateria de íon de lítio de 3,7 V, há uma abertura separada na caixa para conectar (temporariamente) um plugue micro USB.

Uma conexão mini USB adicional está disponível para atualizações de software do Arduino Nano.





Etapa 3:o design do software


O fluxograma a seguir mostra o design geral do software do Contador Geiger:

As visualizações no display OLED de 0, 96 "são:

O esboço completo do Arduino está listado abaixo:
  #include  
#include
#include
// Conexões para o display OLED
#define sclk 13 // SCL (fio azul)
#define mosi 11 // SDA (fio branco)
#define cs 10 // CS (fio cinza)
#define rst 9 / / RES (fio verde)
#define DC 8 // DC (fio amarelo)
#define LOGtime 1000 // Tempo de registro em milissegundos (1 segundo)
#define Minuto 60000 // o período de 1 minuto para calcular os valores de CPM
#define show endWrite
#define clear () fillScreen (0)
// Definições de cor
#define BLACK 0x0000
#define AZUL 0x001F
#define VERMELHO 0xF800
#define VERDE 0x07E0
#define CIANO 0x07FF
#define MAGENTA 0xF81F
#define AMARELO 0xFFE0
#define WHITE 0xFFFF
Adafruit_SSD1331 display =Adafruit_SSD1331 (cs, dc, rst);
int Contagens =0; // variável contendo o número de eventos GM Tube dentro do LOGtime
unsigned long previousMillis =0; // variável para armazenar o tempo anterior
int AVGCPM =0; // variável contendo o número médio flutuante de contas ao longo de um período de janela móvel fixo
int TenSecCPM =0;
int unidades =0;
int dezenas =0;
int centenas =0;
int milhares =0;
flutuante Sievert =0;
int CONTAGENS [10]; // array para armazenar as quantidades medidas de impulsos em 10 períodos consecutivos de 1 segundo
int t =0;
//////////////////// a configuração o código a seguir, será executado uma vez após "Ligar" ou após um RESET ///////////////////
void setup () {
Serial. begin (115200);
display.begin ();
display.fillScreen (BLACK);

floatBattery =analogRead (A3); // (fio laranja)
floatBattPerc =100 * (Bateria / 770);

//Serial.print("battery value ="); Serial.println (bateria); Serial.print ("porcentagem da bateria ="); Serial.println (BattPerc);
display.setCursor (4,4);
display.setTextSize (2);
display.setTextColor (MAGENTA);
display.println ( "Bateria");
display.setCursor (4,24);
display.print (int (BattPerc)); display.print ("."); display.print (int ((10 * BattPerc) - (10 * int (BattPerc)))); display.print ("%");
atraso (3000);
display.fillScreen (PRETO );
for (int x =0; x <10; x ++) {// colocar todos os dados no Array COUNTS em 0 (as posições do array são executadas de 0 a 10;
COUNTS [x] =0; // 10 posições cobrindo um período de 10 segundos
}

attachInterrupt (0, IMPULSO, FALLING); // define o pino de interrupção externa D2 / INT0 para iniciar a rotina de interrupção IMPULSO (fio verde )

display.drawRect (0,0,96,64, BRANCO);
display.setCursor (4,4);
display.setTextColor (RED);
display.setTextSize (2);
display.print ("CPM");
display.setCursor (50,4);
display.setTextSize (1);
display.print ("10 seg");
display.setCursor (50,12);
display.print ("janela");

display.setCursor (4, 38);
display.setTextSize (1);
display.setTextColor (GREEN);
display.print ("uSv / hr");

display. drawRect (0,48, 96, 16, AMARELO);
}
//////////////////// ////// o código de loop que se segue, será executado repetidamente até "Power Off" ou um RESET /////////
loop void ()
{
unsignedlong currentMillis =millis ();
if (currentMillis - previousMillis> LOGtime)
{
previousMillis =currentMillis;
COUNTS [t] =Count;
para (int y =0; y <10; y ++) {// adicionar todos os dados no Array COUNTS juntos
TenSecCPM =TenSecCPM + COUNTS [y]; // e calcular o CPM médio móvel em um período de 10 segundos
}
AVGCPM =6 * TenSecCPM;
TenSecCPM =0;
t ++;
if (t> 9) {t =0;}

//Serial.print ("CONTAGEM"); Serial.print (t); Serial.print ("="); Serial.println (CONTAGEM [t]);
display.fillRect (4,20,90,17, PRETO); // limpar o campo do valor CPM no display
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, PRETO); // limpar o campo de valor uSv / Hr no display
display.setCursor (45,38);
display.setTextColor (GREEN);
display.setTextSize (1);

Sievert =(AVGCPM /151.0); //Serial.print ("Sievert ="); Serial.println (Sievert);
unidades =int (Sievert); //Serial.print ("unidades ="); Serial.println (unidades);
dezenas =int ((10 * Sievert) - (10 * unidades)); //Serial.print ("tens ="); Serial.println (dezenas);
centenas =int ((100 * Sievert) - (100 * unidades) - (10 * dezenas)); //Serial.print ("centenas ="); Serial.println (centenas);
milhares =int ((1000 * Sievert) - (1000 * unidades) - (100 * dezenas) - (10 * centenas)); //Serial.print ("milhares ="); Serial.println (milhares);
display.print (unidades); display.print ("."); display.print (dezenas); display.print (centenas); display.println (milhares);

display.fillRect (1,49,94,14, PRETO); // limpa o campo do indicador CPM no display
display.fillRect (1,49, Contagens, 14, VERMELHO); // preencher o campo do indicador de CPM no display

Contagens =0;
}
}
////////////// //// END ofLOOP ////////////////////////////////////
//// ///////////////////////////////// A seguir segue a Função para contar o número de impulsos do kit Contador Geiger
void IMPULSE ( )
{
Contagens ++;
}

A parte mais importante do esboço é a função de interrupção que é chamada quando um impulso no tubo GM do Contador Geiger é medido e aciona a saída INT do Geigercounter (tornando-o BAIXO por um curto período). O sinal INT é conectado ao pino D2 (o pino de interrupção externa INT0 do Arduino Nano):
  attachInterrupt (0, IMPULSE, FALLING);  

O sinal INT iniciará a rotina de interrupção IMPULSE () para aumentar as contagens com 1:
  void IMPULSE () {Contagens ++; }  

Após o lapso de 1000 milissegundos:
  • as contagens inteiras são colocadas de volta a 0
  • a matriz COUNTS [] é preenchida com o número de contagens medidas durante os últimos 1000 milissegundos
  • o número total de contagens nos últimos 10 segundos é calculado somando todos os números da matriz CONTAGEM [] e multiplicado por 6 para apresentar o valor de CPM no visor.
  • O equivalente de dose expresso em µSv / hr é calculado pela divisão do valor CPM com151 (um valor que é encontrado na literatura).
  • No display OLED colorido, uma barra vermelha é mostrada com base no valor das contagens no último segundo, portanto, de fato, apresenta o valor CPS (contagens por segundo)

O esboço ARDUINO completo para o contador Geiger compreende cerca de 150 linhas de código. A lista completa está incluída como parte deste tutorial, o código ARDUINO (consulte o capítulo 9) é fornecido com uma ampla quantidade de comentários.

Código

  • Geiger_Counter.ino
Geiger_Counter.ino Arduino
ARDUINO Sketch para o Geiger Counter rodando em um Arduino Nano:
 / ********* Este projeto foi desenvolvido e produzido por Pierre Pennings (dezembro de 2019). Este projeto é sobre como fazer um Geiger Counter portátil usando um kit Contador Geiger pronto para uso, em um detector de radiação portátil impresso em 3D, o De kit é conectado a um Arduino Nano que conta o número de impulsos do tubo Geiger / Muller em um período de 10 segundos e exibe o CPM médio (contagens por Minuto) em um display OLED colorido de 96 * 64. O CPM medido também é exibido como micro Sievert por hora (com um fator de conversão simples de 151). O display OLED também exibe a quantidade medida momentânea de impulsos (por segundo) e exibe as medições como uma barra vermelha móvel no visor. A caixa impressa em 3D contém também a bateria de lítio 18650-Ion (recarregável) que fornece energia de 5V para o Arduino Nano, bem como o kit Contador Geiger e 3,3V para o display OLED. Um botão liga / desliga e um sinal sonoro externo completam o detector. Ao ligar, o nível de carga da bateria 18650 é mostrado no visor colorido. Este código está licenciado sob a licença GPL3 +. ********* / # include  #include  #include  // Conexões para o display OLED # define sclk 13 // SCL (fio azul) # definir mosi 11 // SDA (fio branco) #define cs 10 // CS (fio cinza) #define rst 9 // RES (fio verde) #define dc 8 // DC (fio amarelo) #define LOGtime 1000 // Logging tempo em milissegundos (1 segundo) # define Minuto 60000 // o período de 1 minuto para calcular os valores CPM # define show endWrite # define clear () fillScreen (0) // Definições de cor # 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); int Contagens =0; // variável contendo o número de eventos GM Tube dentro do LOGtimeunsigned long previousMillis =0; // variável para armazenar o tempo anteriorint AVGCPM =0; // variável contendo o número médio flutuante de contagens ao longo de uma janela móvel fixa períodoint TenSecCPM =0; int unidades =0; int dezenas =0; int centenas =0; int milhares =0; float Sievert =0; int CONTAGENS [10]; // array para armazenar as quantidades medidas de impulsos em 10 períodos consecutivos de 1 segundoint t =0; ////////////////////// o código de configuração que segue, será executado uma vez depois "Ligar" ou após RESET /////////////////// void setup () {Serial.begin (115200); display.begin (); display.fillScreen (BLACK); flutuação da bateria =analogRead (A3); // (fio laranja) float BattPerc =100 * (Bateria / 770); //Serial.print ("valor da bateria ="); Serial.println (bateria); Serial.print ("porcentagem da bateria ="); Serial.println (BattPerc); display.setCursor (4,4); display.setTextSize (2); display.setTextColor (MAGENTA); display.println ("Bateria"); display.setCursor (4,24); display.print (int (BattPerc)); display.print ("."); display.print (int ((10 * BattPerc) - (10 * int (BattPerc)))); display.print ("%"); atraso (3000); display.fillScreen (BLACK); for (int x =0; x <10; x ++) {// colocar todos os dados no Array COUNTS em 0 (as posições do array vão de 0 a 10; COUNTS [x] =0; // 10 posições cobrindo um período de 10 segundos} attachInterrupt (0, IMPULSE, FALLING); // definir interrupção externa no pino D2 / INT0 para iniciar a rotina de interrupção IMPULSE (fio verde) 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 (" janela "); display.setCursor (4,38); display.setTextSize (1); display.setTextColor (GREEN); display.print (" uSv / hr "); display.drawRect (0,48, 96, 16, AMARELO);} //////////////////////////// o código de loop que segue, será executado repetidamente até "Desligar" ou um RESET ///////// loop void () {unsigned long currentMillis =millis (); if (currentMillis - previousMillis> LOGtime) {previousMillis =currentMillis; COUNTS [ t] =contagens; para (int y =0; y <10; y ++) {// adicionar todos os dados no Array COUNTS juntos TenSecCPM =TenSecCPM + COUNTS [y]; // e calcular o CPM médio contínuo em um período de 10 segundos} AVGCPM =6 * TenSecCPM; TenSecCPM =0; t ++; if (t> 9) {t =0;} //Serial.print ("CONTAGEM"); Serial.print (t); Serial.print ("="); Serial.println (CONTAGEM [t]); display.fillRect (4,20,90,17, PRETO); // limpar o campo de valor de CPM no display 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, PRETO); // limpar o campo de valor uSv / Hr no display display.setCursor (45,38); display.setTextColor (GREEN); display.setTextSize (1); Sievert =(AVGCPM /151.0); //Serial.print ("Sievert ="); Serial.println (Sievert); unidades =int (Sievert); //Serial.print ("unidades ="); Serial.println (unidades); dezenas =int ((10 * Sievert) - (10 * unidades)); //Serial.print ("tens ="); Serial.println (dezenas); centenas =int ((100 * Sievert) - (100 * unidades) - (10 * dezenas)); //Serial.print ("centenas ="); Serial.println (centenas); milhares =int ((1000 * Sievert) - (1000 * unidades) - (100 * dezenas) - (10 * centenas)); //Serial.print ("milhares ="); Serial.println (milhares); display.print (unidades); display.print ("."); display.print (dezenas); display.print (centenas); display.println (milhares); display.fillRect (1,49,94,14, PRETO); // limpa o campo do indicador CPM no display display.fillRect (1,49, Counts, 14, RED); // preencher o campo do indicador CPM no display Counts =0; }} //////////////////// END of LOOP ///////////////////////////// ////////////////////////////////////////////// A seguir segue a Função de contagem do número de impulsos do Contador Geiger kitvoid IMPULSE () {Contagens ++; } 

Peças personalizadas e gabinetes

Caixa impressa em 3D para o display OLED de 0,96 ” display_geiger_rev04_v2_bsLHSDvTUU.3mfhousing feito com Fusion 360, consistindo em uma parte superior e inferior: geiger_counter_housing_top__bottom_rev04_v1_cvCIwkO13j.obj3D arquivo stl

Esquemas

Este diagrama mostra a configuração da eletrônica:

Processo de manufatura

  1. DIY mais simples relógio IV9 Numitron com Arduino
  2. Jogo Arduino Gyroscope com MPU-6050
  3. Dados digitais Arduino
  4. Controlador de jogo Arduino
  5. Aceitar moeda de controle com Arduino
  6. Jogo Arduino Nano Tetris em Matriz 16x8 caseira
  7. Arduino com Bluetooth para controlar um LED!
  8. Arduino Nano:Controle 2 motores de passo com joystick
  9. Contador Geiger Muller personalizável
  10. Jogo Pixel Chaser