Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Портативный счетчик Гейгера с Arduino Nano

Компоненты и расходные материалы

Arduino Nano R3
× 1
Готовый комплект счетчика Гейгера
× 1
0.96 "цветной OLED-дисплей 96 * 64
× 1
зарядная плата micro USB
× 1
3,7 В, 4000 мАч, защищенная литий-ионная аккумуляторная батарея 18650
× 1
Транзистор BC547
× 1
ЗУММЕР -12ММ
× 1
Резистор 1 кОм
× 1

Необходимые инструменты и машины

3D-принтер (общий)

Приложения и онлайн-сервисы

Autodesk Fusion 360
IDE Arduino
CURA
ClickCharts
EasyEDA
Фритзинг

Об этом проекте

Этот проект начался после того, как я купил готовый комплект счетчика Гейгера в Banggood.

Идея заключалась в том, чтобы поместить этот набор в корпус, напечатанный на 3D-принтере, чтобы весь рабочий набор счетчиков Гейгера можно было переносить в портативном режиме. Окончательный результат показан ниже:

Шаг 1. Проектирование системы

Конструкция портативного счетчика Гейгера показана на схеме ниже:

Счетчик Гейгера оснащен 0,96-дюймовым цветным OLED-дисплеем, который информирует пользователя об измеренном CPM (мера скорости обнаружения событий ионизации в минуту), а также (рассчитанном) эквиваленте дозы в мкЗв / час с использованием простого коэффициента. из 151, которые можно найти в литературе по используемому типу трубки Гейгера-Мюллера (GM).

См. Также Википедию:https://en.wikipedia.org/wiki/Counts_per_minute

Фактически, отображаемая цена за тысячу показов является результатом вычисления количества отсчетов за одну минуту путем измерения количества отсчетов в секунду (CPS) и сохранения этих измерений в массиве, охватывающем период последних десяти секунд. Общее количество отсчетов за последние 10 секунд умножается на 6, чтобы получить значение CPM.

Количество отсчетов за последнюю секунду используется для отображения текущего количества измерений в виде гистограммы на OLED-дисплее. Это полезно в случае высоких скоростей счета или когда скорость счета быстро меняется, когда портативный счетчик перемещается над источником излучения.

Счетчик Гейгера питается от литий-ионного аккумулятора типа 18650, который можно заряжать через разъем micro-USB. Порт Arduino Nano USB также доступен для изменения программного обеспечения. К плате счетчика Гейгера подключен дополнительный зуммер для усиления звука ионизации в трубке GM.

Вся электроника для счетчика Гейгера встроена в корпус, напечатанный на 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,7 В, 4000 мАч 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
  • ЗУММЕР -12ММ 1
  • Резистор 1 кОм 1

Электронный дизайн

Электронная конструкция комплекта счетчика Гейгера показана на следующей принципиальной схеме:

Принципиальная схема полной установки счетчика Гейгера выглядит следующим образом:

Питание 5 В поступает от перезаряжаемой литий-ионной батареи, размещенной в плате зарядного устройства Micro USB. 3,3 В для OLED-дисплея взяты с этой платы.

Макетная плата, используемая для тестирования и сборки программного обеспечения с помощью ARDUINO IDE, показана на следующем рисунке:

Механическая и электрическая сборка

Сборка всех механических и электронных частей показана на рисунках ниже:

Обратите внимание, что портативный счетчик Гейгера не имеет кабельных соединений.

Для зарядки литий-ионного аккумулятора 3,7 В в корпусе есть отдельное отверстие для (временного) подключения разъема micro USB.

Для обновлений программного обеспечения Arduino Nano доступно дополнительное соединение mini-USB.

Шаг 3. Разработка программного обеспечения

На следующей блок-схеме показан общий дизайн программного обеспечения счетчика Гейгера:

На OLED-дисплее с диагональю 0,96 дюйма отображаются следующие изображения:

Полный эскиз 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 // период в 1 минуту для расчета значений CPM
#define show endWrite
#define clear () fillScreen (0)
// Определения цвета
#define BLACK 0x0000
#define СИНИЙ 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define CYAN 0x07FF
#define MAGENTA 0xF81F
#define ЖЕЛТЫЙ 0xFFE0
#define БЕЛЫЙ 0xFFFF
Adafruit_SSD1331 display =Adafruit_SSD1331 (cs, dc, rst);
int Counts =0; // переменная, содержащая количество событий GM Tube за время LOGtime
unsigned long previousMillis =0; // переменная для сохранения предыдущего времени
int AVGCPM =0; // переменная, содержащая плавающее среднее число счетчиков за фиксированный период движения Windo
int TenSecCPM =0;
int units =0;
int Tentens =0;
int 100 =0;
int тысяч =0;
float Sievert =0;
int COUNTS [10]; // массив для хранения измеренных значений импульсов в 10 последовательных периодах по 1 секунде
int t =0;
//////////////////// Настройка следующий код будет запускаться один раз после "Power On" или после СБРОСА ///////////////////
void setup () {
Serial. begin (115200);
display.begin ();
display.fillScreen (ЧЕРНЫЙ);

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 ("%");
delay (3000);
display.fillScreen (ЧЕРНЫЙ );
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, БЕЛЫЙ);
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, ЖЕЛТЫЙ);
}
////////////////// ////// следующий за ним код цикла будет повторяться до тех пор, пока не будет выполнен "Power Off" или RESET /////////
void loop ()
{
unsignedlong currentMillis =millis ();
if (currentMillis - previousMillis> LOGtime)
{
previousMillis =currentMillis;
COUNTS [t] =Counts;
for (int y =0; у <10; y ++) {// складываем все данные в массив COUNTS вместе
TenSecCPM =TenSecCPM + COUNTS [y]; // и вычисляем скользящую среднюю цену за тысячу показов за 10 секунд
}
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, ЧЕРНЫЙ); // очищаем поле значения 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, ЧЕРНЫЙ); // очищаем поле значения uSv / Hr на дисплее
display.setCursor (45,38);
display.setTextColor (GREEN);
display.setTextSize (1);

Зиверт =(AVGCPM /151.0); //Serial.print ("Sievert ="); Serial.println (Sievert);
units =int (Sievert); //Serial.print ("units ="); Serial.println (единицы);
tens =int ((10 * Sievert) - (10 * units)); //Serial.print ("tens ="); Serial.println (десятки);
сотни =int ((100 * зиверт) - (100 * единицы) - (10 * десятки)); //Serial.print ("сотни ="); Serial.println (сотни);
тысяч =int ((1000 * зиверт) - (1000 * единиц) - (100 * десятки) - (10 * сотни)); //Serial.print ("sizes ="); Serial.println (тысячи);
display.print (единицы); display.print ("."); display.print (десятки); display.print (сотни); display.println (тысячи);

display.fillRect (1,49,94,14, ЧЕРНЫЙ); // очищаем поле индикатора CPM на дисплее
display.fillRect (1,49, Counts, 14, RED); // заполняем поле индикатора CPM на дисплее

Counts =0;
}
}
////////////// //// КОНЕЦ ПЕТЛИ ////////////////////////////////////
//// ///////////////////////////// Здесь и далее следует функция для подсчета количества импульсов от набора счетчика Гейгера
void IMPULSE ( )
{
Считает ++;
}

Самая важная часть скетча - функция прерывания, которая вызывается, когда измеряется импульс на трубке GM счетчика Гейгера, который запускает выход INT счетчика Гейгера (делая его НИЗКОМ на короткое время). Сигнал INT подключен к выводу D2 (вывод внешнего прерывания INT0 Arduino Nano):

  attachInterrupt (0, ИМПУЛЬС, ПАДЕНИЕ);  

Сигнал INT запустит процедуру обработки прерывания IMPULSE () для увеличения количества счетчиков на 1:

  void IMPULSE () {Считает ++; }  

По прошествии 1000 миллисекунд:

  • целое число Counts возвращается к 0
  • массив COUNTS [] заполняется количеством отсчетов, измеренных за последние 1000 миллисекунд.
  • общее количество отсчетов за последние 10 секунд рассчитывается путем сложения всех чисел из массива COUNTS [] и умножения на 6 для отображения значения CPM на дисплее.
  • Эквивалент дозы, выраженный в мкЗв / час, рассчитывается путем деления значения CPM на 151 (значение, которое можно найти в литературе).
  • На цветном OLED-дисплее отображается красная полоса в зависимости от значения Counts за последнюю секунду, поэтому фактически отображается значение CPS (Counts Per Second).

Полный набросок ARDUINO для счетчика Гейгера состоит примерно из 150 строк кода. Полный список включен в это руководство, код ARDUINO (см. Главу 9) снабжен большим количеством комментариев.

Код

  • Geiger_Counter.ino
Geiger_Counter.ino Arduino
Эскиз ARDUINO для счетчика Гейгера, работающего на Arduino Nano:
 / ********* Этот проект был разработан и произведен Пьером Пеннингсом (декабрь 2019 г.). Этот проект посвящен созданию портативного счетчика Гейгера с использованием готовый комплект счетчика Гейгера в портативном детекторе излучения, напечатанном на 3D-принтере, комплект De подключен к Arduino Nano, который подсчитывает количество импульсов от трубки Гейгера / Мюллера за период 10 секунд, а затем отображает среднюю CPM (количество импульсов в минуту). Минуту) на цветном OLED-дисплее 96 * 64. Измеренная CPM также отображается в микрозивертах в час (с простым коэффициентом преобразования 151). OLED-дисплей также отображает мгновенное измеренное количество импульсов (в секунду) и отображает измерения в виде движущейся красной полосы на дисплее. Корпус, напечатанный на 3D-принтере, также содержит литиевую батарею 18650-Ion (перезаряжаемую), которая обеспечивает питание 5 В для Arduino Nano, а также комплект счетчика Гейгера и 3,3 В для OLED-дисплея. Детектор дополняют выключатель питания и внешний звуковой сигнал. После включения уровень заряда аккумулятора 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 минуту для расчета значений CPM #define show endWrite #define clear () fillScreen (0) // Определения цвета # define BLACK 0x0000 #define BLUE 0x001F # define КРАСНЫЙ 0xF800 # определить ЗЕЛЕНЫЙ 0x07E0 # определить CYAN 0x07FF # определить ЖЕЛТЫЙ 0xFFE0 # определить БЕЛЫЙ 0xFFFFAdafruit_SSD1331 display =Adafruit_SSD1331 (cs, dc, rst); int Counts =0; // переменная, содержащая количество событий GM Tube в LOGtimeunsigned long previousMillis =0; // переменная для хранения предыдущего времени int AVGCPM =0; // переменная, содержащая плавающее среднее число отсчетов за фиксированный период скользящего окна int TenSecCPM =0; int units =0; int tens =0; int 100 =0; intousand =0; float Sievert =0; int COUNTS [10]; // массив для хранения измеренных количеств импульсов за 10 последовательных периодов по 1 секунде int t =0; //////////////////// Код настройки, который следует, будет запускаться один раз после "Power On" или после СБРОСА /////////////////// void setup () {Serial.begin (115200); display.begin (); display.fillScreen (ЧЕРНЫЙ); float Battery =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 (интервал (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 секунды} 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, ЖЕЛТЫЙ);} //////////////////////// код цикла, следует, будет выполняться неоднократно до тех пор, пока "Power Off" или "СБРОС" не будет. ///////// void loop () {unsigned long currentMillis =millis (); if (currentMillis - previousMillis> LOGtime) {previousMillis =currentMillis; COUNTS [ t] =Количество; для (int y =0; y <10; y ++) {// складываем все данные в массив COUNTS вместе TenSecCPM =TenSecCPM + COUNTS [y]; // и вычисляем скользящую среднюю цену за тысячу показов за 10 секунд} AVGCPM =6 * TenSecCPM; TenSecCPM =0; t ++; if (t> 9) {t =0;} //Serial.print ("COUNTS"); Серийный принт (т); Serial.print ("="); Serial.println (COUNTS [t]); display.fillRect (4,20,90,17, ЧЕРНЫЙ); // очищаем поле значения 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, ЧЕРНЫЙ); // очищаем поле значения uSv / Hr на дисплее display.setCursor (45,38); display.setTextColor (ЗЕЛЕНЫЙ); display.setTextSize (1); Зиверт =(AVGCPM /151.0); //Serial.print ("Sievert ="); Serial.println (Зиверт); units =int (зиверт); //Serial.print ("units ="); Serial.println (единицы); десятки =int ((10 * зиверт) - (10 * единиц)); //Serial.print ("tens ="); Serial.println (десятки); сотни =int ((100 * зиверт) - (100 * единиц) - (10 * десятки)); //Serial.print ("сотни ="); Serial.println (сотни); тысяч =int ((1000 * зиверт) - (1000 * единиц) - (100 * десятки) - (10 * сотни)); //Serial.print ("sizes ="); Serial.println (в тысячах); display.print (единицы); display.print ("."); display.print (десятки); display.print (сотни); display.println (тысячи); display.fillRect (1,49,94,14, ЧЕРНЫЙ); // очищаем поле индикатора CPM на дисплее display.fillRect (1,49, Counts, 14, RED); // заполняем поле индикатора CPM на дисплее Counts =0; }} ////////////////// КОНЕЦ ПЕТЛИ /////////////////////////// ////////////////////////////////////////// Здесь и далее следует функция для подсчета числа импульсов от набора счетчика Гейгера IMPULSE () {Counts ++; } 

Изготовленные на заказ детали и корпуса

Напечатанный на 3D-принтере корпус для 0,96-дюймового OLED-дисплея display_geiger_rev04_v2_bsLHSDvTUU.3mfhousing из Fusion 360, состоящий из верхней и нижней части: geiger_counter_housing_top__bottom_rev04_v1_cvCIwkO13j.obj3D stl-файл

Схема

На этой схеме показана установка электроники:

Производственный процесс

  1. Самодельные простейшие часы Numitron IV9 с Arduino
  2. Игра с гироскопом Arduino с MPU-6050
  3. Цифровые игральные кости Arduino
  4. Игровой контроллер Arduino
  5. Управление монетоприемником с помощью Arduino
  6. Игра Arduino Nano Tetris на самодельной матрице 16x8
  7. Arduino с Bluetooth для управления светодиодом!
  8. Arduino Nano:управление двумя шаговыми двигателями с помощью джойстика
  9. Настраиваемый счетчик Гейгера-Мюллера
  10. Игра Pixel Chaser