01.01.2021

Дозиметр "Нанит" - лечим параною после экскурсии в Чернобыль

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

    После просмотра всех вариантов мне осталось сделать выбор, найти датчик и взяться за изготовление (вариант покупки я сразу-же отбросил из-за стоимости). Критериями выбора у меня была миниатюрность, легко доставаемая элементная база, желательно на AVR и с исходными кодами. Под все эти критерии подошел "Нанит". Самым сложным было - найти миниатюрный датчик СБМ-10, или СБМ-21. После долгих поисков по интернету был приобретен СБМ-21 (он почти в 2 раза менее чувствительный чем СБМ-10, и менее точный), а после сборки я решил поменять датчик на СБМ-10, но цена в одном месте которое я нашел - превышала стоимость готового дозиметра.

    Схему дозиметра я приложу в файлах, ну и она есть в оригинальной статье, ничего в схемотехническом плане я не менял.

    Следующей проблемой было найти кольцо 8x3x2 600НН для трансформатора. Для начала я решил пересмотреть запасы китайских колец с энергосберегаек и другой техники - все они оказались из распыленного железа, и не подходили, но поехав на радио рынок за деталями я без труда нашел необходимое кольцо. Далее был поиск дисплея - я решил взять от Nokia 1202 в местном магазине запчастей (ранее у них брал этот дисплей на RLC-метр), он оказался чуть больше рекомендуемого в статье Nokia 2660/2760, но не требовал специального разъема, и у него нет проблем с питанием подсветки (светодиод один). Корпус и пример разводки платы я взял у RSG, но плату пришлось переделать под контроллер в TQFP, датчик углубить в плату, транзистор накачки я применил IRLML2502, конденсаторы умножителя - 47nF 630V, конденсатор C9 взял высоковольтный на 2kV, и установил со стороны дисплея. Дисплей под корпус Z-47 пришлось немного сточить по бокам, под кнопки, защитную пленку дисплея (взял с какой-то упаковки), батарею (LP(SR)401235P - 3.7V, 120mAh) и пищалку в корпусе пришлось сделать фрезеровку (на сверлильном станке торцевой фрезой), корпус обрезать по высоте (общая толщина получилась 13 мм). Лак для изоляции трансформатора и HV части дозиметра я применил АК-113 (что под рукой было).

    Вот что из этого всего вышло:

    Но в данной статье я хотел описать не то как я "повторил" (с учетом всех изменений) готовую конструкцию, а о доработке ПО дозиметра. Предыдущая статья - Оптимизируем код компилятора AVR Studio 4 до уровня 6-й студии появилась благодаря данному дозиметру, по причине большого объема прошивки (для СБМ-21 занимала 100% памяти), и небольшой разницы оптимизации кода в разных студиях. Если опустить то что код написан на Си, у меня естественно возник вопрос - на что ушло 8 Кб памяти контроллера (даже шрифт в EEPROM поселили)? Данное устройство всего-лишь считает импульсы, и выводит замеры на дисплей, даже с учетом шрифта. С одной стороны виноват сам язык программирования (на асм переписывать у меня не было никакого желания, да и надо было разбираться в математике на Си), с другой стороны - надо учитывать самые простые вещи, такие как прерывания (если есть возможность - убрать код с вектора прерывания, и использовать пустое прерывание EMPTY_INTERRUPT (ADC_vect)), часто повторяющиеся части кода можно свести в функции (я в Си вообще не пишу, но оптимизацией программ на иногда занимаюсь, заглядывая в ассемблерный листинг), формулы расчета желательно писать целиком, а не разбивать на куски (возможно так совпало), совместить инициализацию портов контроллера (не разбивать настройку одного порта на несколько строк), ну и т.д. (типа убрать все ненужное)). Вины разработчика в большом размере кода - никакой нет, каждый пишет как может, и не заметит то что заметит в коде другой человек, да и для этого необходимо потратить много времени.

    Можно долго обсуждать конкретные приемы оптимизации, и в интернете по этому поводу есть много интересных статей, но оптимизация кода этого дозиметра это всего-лишь необходимая мера для освобождения места для усовершенствований. Для данных операций я выбрал последнюю прошивку (Nanit v2 ATmega88PA, дальше проект начал развиваться в ATmega168 и 328), в которой автор поменял алгоритм расчета уровня радиации, и изменил размер графика, метод вывода, и расположение дополнительной информации - для датчика с большой чувствительностью большой график с линиями двойной толщины - это нормально, но у нас мелкое устройство с мелким датчиком, да и после опроса знакомых - никому не понравилось отсутствие часов и заряда (их можно было пролистать в нижней строке, но это не удобно), и было принято решение - вернуть стиль отображения первой версии прошивки.

    Идей по усовершенствованию прошивки у меня было много, но ресурсов контроллера хватило лишь на некоторые (а так хотелось сделать график суточного уровня фона), а именно:
  • добавил выбор типа графического интерфейса при компиляции (#define OLD_DRAW - маленький график, и две строки под ним);
  • добавил отрисовку графика узкими одинарными линиями (#define G_2_LINE - если закомментировать, но для СИ-19 и СБМ-20 в графике только широкие линии, из-за размера массива);
  • добавил вариант с возможностью выбора типа датчика СБМ-10/СБМ-21 через настройки (#define COUNTER_D M_SEL) - на это ушла вся освободившаяся память (в последней версии прошивки переключать можно без перезагрузки);
  • нормализовал сигнал при включении (выхода из спящего режима);
  • включение выключившейся подсветки по первой кнопке без переключения отображаемого пункта (очень раздражало перелистывание пунктов для включения подсветки);
  • увеличил диапазон регулировки контрастности;
  • подправил единицы измерения;
  • изменил уровни напряжений батареи (Li-Ion);
  • вернул вывод напряжения батареи в вольтах, вместо милливольт (оптимизировал пересчет);
  • добавил округление при индикации мР (раньше при фоне 1900 мкР дозиметр показывал максимальный уровень - 1 мР);
  • отключил оперативный пересчет показаний при резкой смене фона (вызывал глюки при изменении фона, и не давал считать).
    Основной задачей для меня было добавление выбора датчика, так как я собирался заменить датчик на СБМ-10, а для этого необходимо было перекомпилировать прошивку, подпаивать провода программатора, прошивать другую прошивку, а теперь - просто заменить датчик, переключить его в настройках, перезагрузить дозиметр, и все!

    Как и сказал MadOrc (автор этого устройства) -  возможно это последнее обновление прошивки, памяти в контроллере больше не осталось, да и добавлять уже просто нечего. Данную версию прошивки я тестировал некоторое время, проходил флюорографию и рентген с этим дозиметром - все работает.

    То из-за чего я начал собирать этот девайс - Чернобыльские вещи наконец-то прошли дозиметрический контроль, и на мое удивление - ничего не фонит, а если и фонило (только обувь, и 30-40мкР против 20мкР естественного фона - это мелочи) - хватило простого удаления пыли, или стирки, да и мы сами ни капельки после поездки не фонили, хотя проезжали места где в машине фон был под 700мкР.

    Про нашу поездку можно почитать на Turantino's Blog - Chernobyl Trip.
Есть еще видео с нашей поездки снятое мной на камеру Mobius, и смонтированное Turantino, но оно скоро должно будет появится в серии статей Chernobyl Trip.

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

    Архив обновлен последней версией прошивки. Тестирование еще ведется, но в архиве - последняя актуальная версия.

    Тестирование закончено, источник радиации получен в личное пользование, прошивка допилена (изменения я дополнив вверху статьи), архив обновлен.

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

    Ну и как всегда, исходники, схема, фото для версии на ATmega88PA - Nanit_v2.1_1202.zip.

    Обновил прошивку дозиметра!
    Убрал глюки с подсчетом дозы, сделал более красивый вывод значений дозы, оптимизировал код, внес мелкие исправления.
    Обновленные исходники с прошивкой на ATmega88PA - Nanit_v2.3_1202.zip

9 комментариев:

  1. На флюрке схватили больше чем за экскурсию в Припять.

    ОтветитьУдалить
  2. http://turantino.blogspot.com/2015/04/chernobyl-trip-part-1.html - дописал.

    ОтветитьУдалить
  3. Здравствуйте автор, у вас может быть схема простого дозиметра для смб-10,то есть без микроконтроллеров и PIC контроллеров, а самая что ни на есть простая, если таковая изыщется то прошу вас отправьте мне её на адрес:vladimir880@gmail.com С уважением Владимир.

    ОтветитьУдалить
  4. https://turantino.blogspot.com/2020/09/back-to-chernobyl.html

    ОтветитьУдалить
  5. Добрый день, скажите где именно вы купили 8x3x2 600НН для трансформатора. Я тоже из Харькова. Если можно на почту onatskiy.sergey@gmail.com

    ОтветитьУдалить
  6. unsigned int sbm[50]/[110]/[112]/[142];
    +
    for (unsigned char f=0; f<143; f++) sbm[f]=0;

    ОтветитьУдалить
  7. ...

    #elif (COUNTER_D == SI19)
    // sbm[50] -> high cell sbm[49]
    for(unsigned char i=50; i>0; i--)

    ...

    #elif (COUNTER_D == SBM20)
    // sbm[50] -> high cell sbm[49]
    for(unsigned char i=50;i>0;i--)

    ...

    if (counter == SBM10) m=109;
    else m=139; // SI19, SBM20, SBM21_2 - SIZE(sbm[]) < 139
    for(unsigned char i=m;i>0;i--)

    ...

    #elif (COUNTER_D == M_SEL)
    if (counter==SBM10)
    { // SBM10
    }
    else
    { // SBM21 ??? manual select only [SBM10 | SBM21]

    ...

    ОтветитьУдалить