Народная дозиметрия. Бюджетный детектор радиации своими руками

Введение в проект diy-дозиметра

Готов поспорить, что вы хоть раз задумывались о покупке дозиметра для бытовых целей — измерить уровень радиации дома, на прогулке или в путешествиях.

Сегодня мы соберем простой бюджетный дозиметр на базе wifi-контроллера ESP32 и платы RadSens. RadSens — готовый I2C-модуль для газоразрядного счетчика Гейгера-Мюллера. В качестве сенсора будет использована надежная и распространенная трубка СБМ20–1.  Впрочем, вместо нее к модулю можно подключить любую другую трубку — J305, M4011, СТС-5 и др.

Целью статьи является создание максимально подробной инструкции по сборке. Если повторить описанные шаги сможет самый юный инженер-дозиметрист — мы достигли успеха.

Но сначала, как принято, немного истории и теории…

DIY дозиметр на esp32DIY дозиметр на esp32

Матчасть по газоразрядным трубкам

История счётчика Гейгера-Мюллера

Принцип работы счетчика Гейгера был предложен в 1908 году немецким физиком Гансом Гейгером. Счетчик стал дальнейшим развитием уже известной ионизационной камеры, представлявшей собой конденсатор, наполненный газом. Конденсатор использовался Пьером Кюри для изучения электрических свойств газов.

Ханс Гейгер (слева) работал вместе с Эрнестом Резерфордом (справа) с 1907 по 1913 г.Ханс Гейгер (слева) работал вместе с Эрнестом Резерфордом (справа) с 1907 по 1913 г.

В 1925 году под началом Ханса Гейгера Вальтер Мюллер создаёт ещё несколько типов счётчиков с чувствительностью к каждому открытому на тот момент виду излучения, а именно для α-, β- и γ-излучения (нейтроны были открыты только в 1932 году).

Как показало время, надёжный, дешёвый и простой счетчик Гейгера-Мюллера остаётся одним из самых распространённых способов измерения уровня радиации как в быту, так и в промышленности.

Принцип работы трубки Гейгера-Мюллера

Принцип работы основан на эффекте ударной ионизации газа в межэлектродном пространстве под действием радиоактивных частиц.

Трубка состоит из герметичного баллона из металла или стекла, наполненного инертным газом или газовой смесью. Внутри баллона имеются катод и анод. Для облегчения возникновения электрического разряда в газовом баллоне создается пониженное давление. Электроды подключаются к источнику высокого напряжения постоянного тока через нагрузочный резистор, на котором формируются электрические импульсы при регистрации радиоактивных частиц.

Участок схемы со счётчиком Гейгера-МюллераУчасток схемы со счётчиком Гейгера-Мюллера

В исходном состоянии газовый промежуток между электродами имеет высокое сопротивление, и тока в цепи нет. Когда заряженная частица с высокой энергией сталкивается с элементами конструкции датчика (корпус, баллон, катод), она выбивает некоторое количество электронов, которые оказываются в промежутке между электродами. Под действием ускоряющего напряжения электроны устремляются к аноду. Процесс многократно повторяется, и количество электронов увеличивается, что приводит к разряду между катодом и анодом. В состоянии разряда промежуток в межэлектродном пространстве становится токопроводящим, что вызывает скачок тока в нагрузочном резисторе.

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

Компоненты для сборки дозиметра своими руками

Важнейшим критерием при выборе платы и комплектующих выступала стоимость используемых компонентов. Мы ставили задачу сделать дозиметр максимально бюджетным.

 Для создания дозиметра-радиометра были выбраны следующие компоненты:

  1. Модуль дозиметра — RadSens (от 3900 руб.)
    RadSens — готовый модуль в сборе с популярной трубкой СБМ-20. Не требует ничего кроме установки библиотеки в менеджере библиотек Arduino. Дозиметр готов к работе «из коробки».

  2. Плата ESP8266 / ESP32 (от 700 руб.)
    Модуль RadSens имеет интерфейс I2C, совместим с Arduino, esp, Raspberry. Но цены на ардуинки в последнее время совсем не радуют…

  3. OLED-экран диагональю 0.96» (от 300 руб.)
    Можно взять любой экран с I2C. Но OLED-экран позволяет добавлять простую анимацию и цветовую маркировку текущего уровня радиации.

  4. Модуль бузера (пищалки) для звуковой индикации импульсов (от 80 руб.)
    Бузер предназначен для звукового информирования пользователя, когда нет доступа к информации на экране.

  5. Кнопка-выключатель (от 60 руб.)

  6. Макетная плата 120×80 мм (от 130 руб.)
    Плата используется для удобного (эротичного) размещения и организации проводки между элементами.

Итоговая стоимость сборки — 5170 рублей.

Самый дешёвый дозиметр на маркетплейсе Ozon — 8700 рублей.

Пустая макетка как-бы намекает. Что и экран можно поставить поширше, и фичей побольше.Пустая макетка как-бы намекает. Что и экран можно поставить поширше, и фичей побольше.

Процесс сборки самодельного дозиметра

Необходимо произвести следующие шаги:

  1. Припаять к макетной плате элементы в желаемом положении

  2. Соединить все элементы по предложенной схеме

  3. Проверить правильность подключения сначала визуально, затем подключив ESP к USB

  4. Подключить библиотеку RadSens и плату ESP32 в Arduino IDE

  5. Добавить код в IDE и загрузить его

Шаг 1. Подключение

Для подключения нам потребуется припаять все элементы и соединить их.  Пины SDA и SCL на RadSens и OLED-экране требуется подключить к портам D22 (SCL) и D21 (SDA), они обмениваются данными по интерфейсу I2C, важно их не перепутать. Остальное подключить согласно схеме на рисунке.

Распиновка ESP32Распиновка ESP32Схема подключенияСхема подключения

На фото один из вариантов компоновки дозиметра.

40c2ae0833f1a8ef22752d4d78bd5a06.jpg

Шаг 2. Подключение библиотек RadSens, ESP32, GyverOLED

Подключение расширения для плат в Arduino IDE для платы ESP32 осуществляется следующим образом:
Arduino → Инструменты → Плата → Менеджер плат → Написать «ESP32» в поисковой строке.

6d137d4aceec9848a425041747c84803.png

После установки необходимо в пункте »Плата» указать »ESP32 Dev module».

5d0a483dff887217f24162d172fa3ec3.png

Далее необходимо выбрать необходимую нам плату. Для этого переходим во вкладку »Инструменты», выбираем раздел »Плата», далее выбираем »ESP32 Dev Module» в подразделе »ESP32 Arduino».

a5d65ea9a10b2e545db0cb0f25b644bb.png

Готово! Перейдем к установке библиотеки.

Для установки библиотеки RadSens необходимо проделать почти такую же операцию:
Arduino → Скетч → Подключить библиотеку → Управлять библиотеками → Написать «RadSens» в поисковой строке.

c8b633b1f4886bffe968da0c4d128b39.png73cba49044f347e4c62a95816e791294.png

Далее необходимо установить библиотеку GyverOLED в менеджере библиотек тем же путём.

663def5c910dc288c6c96f4f5af93e3c.jpg

Теперь мы готовы переходить к программированию.

Шаг 3. Код

Код был написан с использованием библиотеки для OLED от Алекса Гавера. Она проста в изучении и поддерживает вывод русского языка без дополнительных манипуляций. Допустимо использовать U8G2, Adafruit или любой удобную вам библиотеку.

Кодик тут

// Подключаем необходимые библиотеки
#include   // Библиотека RadSens
#include         // I2C-библиотека
#include    // Библиотека для OLED Gyver'а идеально подойдёт для понимания методики работы с OLED-экраном, к тому же тут сразу есть русский шрифт
#define buz 18   // Устанавливаем управляющий пин пьезоизлучателя. Если вы выбрали другой управляющий пин - замените значение

GyverOLED oled;   // Инициализируем OLED-экран
ClimateGuard_RadSens1v2 radSens(RS_DEFAULT_I2C_ADDRESS);   // Инициализируем RadSens

uint32_t timer_cnt; // Таймер опроса интенсивности излучения и импульсов для OLED-экрана
uint32_t timer_imp; // Таймер опроса импульсов для пьезоизлучателя
uint32_t timer_oled; // таймер обновления дисплея

float dynval;  // Переменная для динамического значения интенсивности
float statval; // Переменная для статического значения интенсивности
uint32_t impval;  // Переменная для кол-ва импульсов
uint32_t pulsesPrev;  // Переменная, содержащая кол-во импульсов за прошлый цикл

void setup() {
  pinMode(buz, OUTPUT);  // Инициализируем пьезоизлучатель как получатель данных
  ledcSetup(1, 500, 8); // Инициализируем ШИМ (только для ESP, для Arduino это необходимо стереть)
  ledcAttachPin(buz, 1); // Задаём пин вывода пьезоизлучателя для ШИМа (только для ESP, для Arduino это необходимо стереть)
  oled.init();           // Инициализируем OLED в коде
  oled.flipV(1);         // Я перевернул экран для удобства
  oled.flipH(1);         // Для нормального отображения после переворота нужно инвертировать текст по горизонтали
  oled.clear();
  oled.setScale(2);      // Устанавливаем размер шрифта
  radSens.radSens_init();
  oled.clear();
  radSens.setSensitivity(105);     // Задаем чувствительность трубки (если вы заменили СБМ-20 на другую - проверьте чувствительность в документации и измените значение в скобках)
  int16_t sensval = radSens.getSensitivity();
  oled.setCursor(10, 2);
  oled.print("Чувствит:");
  oled.setCursor(42, 4);
  oled.print(sensval);
  delay(4000);
  oled.clear();
  pulsesPrev = radSens.getNumberOfPulses(); //Обнуляем значение перед началом работы пьезоизлучателя для предотвращения длинных тресков
}

void beep(int deltime) {     // Функция, описывающая время и частоту пищания пьезоизлучателя
  ledcWriteTone(1, 500);  // Включаем на частоте 500 Гц
  delay(3);
  ledcWriteTone(1, 0);   // Выключаем
  delay(deltime);
}
/*
  void beep(int deltime){
    tone(buz, 500, deltime)
  }                                            та же функция для Arduino */

void loop() {

  if (millis() - timer_imp > 250) {  // Функция, создающая "треск" пьезоизлучателя
    timer_imp = millis();
    int pulses = radSens.getNumberOfPulses();
    if (pulses > pulsesPrev) {
      for (int i = 0; i < (pulses - pulsesPrev); i++) {
        beep(30);  // Вы можете изменить параметр, если хотите, чтобы интервал между тресками был больше или меньше
      }
      pulsesPrev = pulses;
    }
  }

  if (millis() - timer_cnt > 1000) {      // Записываем в объявленные глобальные переменные необходимые значения
    timer_cnt = millis();
    dynval = radSens.getRadIntensyDyanmic(); 
    statval = radSens.getRadIntensyStatic();
    impval = radSens.getNumberOfPulses();
  }

  if (millis() - timer_oled > 1000) {  //Записываем переменные в строки и выводим их на OLED-экран
    timer_oled = millis();
    String dynint = "Дин: ";
    dynint += dynval;
    String statint = "Ст:  ";
    statint += statval;
    String nimp = "Имп: ";
    nimp += impval;
    oled.setCursor(0, 1);
    oled.print(dynint);
    oled.setCursor(0, 3);
    oled.print(statint);
    oled.setCursor(0, 5);
    oled.print(nimp);
  }
}

Тестирование самодельного дозиметра

Сегодня нами был рассмотрен самый бюджетный вариант дозиметра-радиометра. Добавив фантазии, мы заказали прозрачные пластины из оргстекла, чтобы сделать прибор более удобным и наглядным. Для проверки работы был использован сульфат калия из ближайших хозтоваров. Удобрение богато радиоактивным изотопом калием-40, активно испускающим бета-излучение.

Показатели естественного фона и при поднесении сульфата калияПоказатели естественного фона и при поднесении сульфата калия

Стандартный уровень радиации в помещении — 15–20 мкР/ч. При прямом контакте сульфат калия получаем 32–39 мкР/ч, что вдвое выше нормы.

В качестве заключения

Несмотря на всю эстетическую привлекательность, проект является сугубо домашним и предназначен, в большей части, для измерения порошков, предметов старины и прочих вещей, непонятным образом попавших в ваш дом :)

В рамках следующего материала постараемся разработать портативный и многофункциональный дозиметр с возможностью вывода информации (графиков, минимумов, максимумов) на экран и выгрузкой статистики в мобильное приложение на Блинке.

2462bd423456e05083eabe8b4625e059.png

А какие возможности в следующей версии DIY-дозиметра хотели бы видеть вы? Оставляйте свои предложения в комментариях!

Благодарности

Команда инженеров передает приветы и благодарности соавтору и стажеру Илье Радченко за долгие часы возни с железкой и кодом, мастерской Барсуки с МЭЛЗ за стеклышки, а также магазину Duino и лично @CyberBot за любезно предоставленные компоненты.

Ну и конечно крепко обнимаем сообщество Хабра за уделенное время и интерес к электронике и DIY. Нас мало — держимся, надеваем тельняшки.

© Habrahabr.ru