В статье описан самодельный прибор для измерения радиоактивности, определения координат ГЛОНАСС\GPS и обладающий каналом обмена по Wi-Fi. Также описаны программное обеспечение внутреннего микропроцессора и внешняя программа (Visual Basic) для приема, отображения данных и записи их в лог-файлы.
Я несколько последних лет занимаюсь в свободное от основной работы время конструированием и практическим изготовлением разнообразных устройств домашней автоматизации, управления и слежения за параметрами среды. Сейчас у меня имеется много свободного времени и я получил возможность описать сделанное.
Мои приборы подключаются в домашнюю сеть по Wi-Fi, в домашней сети живет бесшумная безвентиляторная управляющая машина с твердотельным диском. Эта машина выполняет фунции ядра системы, на ней работают программы сбора данных от разнообразных датчиков и программы управления внешними устройствами.
Задача, которую я хотел решить с помощью радиометра, я сформулировал так: «хочу иметь прибор, который будет измерять радиацию в общем смысле». Прибор должен показывать уровень естественного радиационного фона, реагировать на изменения этого фона, иметь пределы измерения не меньше примененного датчика и уметь передавать данные на внешний регистратор. Неплохо бы также иметь в приборе поисковую функцию: когда можно поводить прибором около «горячего пятна» и найти его по изменению показаний встроенных индикаторов. Неплохо бы так же иметь автономность по питанию на какое-то время, например походить по дачному участку и проверить, все ли в порядке.
Первый вопрос, который надо решить – какой датчик применить. Изучение материалов по вопросам измерения радиоактивности дало мне понимание, что оптимальный датчик для моей задачи – обыкновенный датчик Гейгера-Мюллера. Традиционно называть эти приборы «счетчиком Гейгера-Мюллера», хотя в реальности ничего они не считают, а выдают импульсы на каждую частицу, которая смогла запустить процесс лавинного пробоя в измерительной камере. Поэтому я употребляю термин «датчик». Их очень много, для разных целей. Мне хотелось, чтобы мой прибор был достаточно чувствителен к бета излучению, а не только к гамма. Широкораспространенные и дешевые (в диапазоне 200 — 1000 р) СБМ20 малочувствительны к бета излучению, у них нет окна, прозрачного для бета частиц. СБМ20 прежде всего чувствителен к гамма излучению, причем к достаточно мощному. Понятно почему – их делали для военных целей. Использование такого датчика в радиометре требует большого времени накопления данных для более-менее адекватного измерения естественного фона. Для СБМ20 это время обычно берут 46 секунд, при этом число накопленных импульсов равно текущему значению гамма фона в микрорентгенах в час. Но мне хотелось большей чувствительности к бета излучению. Я не рассчитывал на катаклизм, меня интересовало бытовое измерение малых значений. Если хочется быть готовым к катаклизму – можно поискать и купить какой-нибудь ДП5В с хранения, заменить в нем три конденсатора на хорошие пленочные и получить прибор в военном стиле, в зеленом ящике, дуракоупорный, пригодный для измерения радиации до 200 рентген в час в экстремальных условиях.
Отмечу также, что есть и другие методы регистрации заряженных частиц, например на основе сцинциляционных кристаллов и ФЭУ. Эти методы измерения позволяют измерять и распределение спектра мощности потока радиации, но для моей цели это избыточно и очень дорого.
Итак, мне нужен счетчик Гейгера-Мюллера с бета чувствительностью. К счастью у нас в России производятся эти датчики. Я выбрал датчики Бета. Их производит НПФ Консенсус. Определенную роль в решении купить именно такой датчик сыграло и весьма любезное и клиентское отношение сотрудников завода. Я мучил их глупыми чайниковскими вопросами и получил вполне адекватные ответы на них. Для покупки датчика мне пришлось съездить в Запрудню. Это около 100 км по Дмитровке, чуть не доезжая Дубны. Некоторую роль в принятии решения о поездке сыграло и желание посмотреть новые места :)
Выбранный мной датчик БЕТА-2 имеет слюдяное окно площадью 13.8 см2 и чувствителен к бета излучению.
Для работы ему надо 400в. Важный параметр датчика – время восстановления. Суть работы датчика – ионизация газа в камере при пролете заряженной частицы и последующий лавинный пробой, затем в дело вступают присадки в газе и гасят разряд. Датчику после гашения разряда требуется некоторое время для восстановления чувствительности. Это время ( термин «мертвое время») указано в характеристиках и для конкретно Бета-2 составляет 140 микросекунд минимум. Пересчет в частоту дает нам максимальную частоту импульсов от датчика в районе 8 кгц.
Скан паспорта:
Существуют два метода съема данных со счетчика Гейгера-Мюллера. Первый – последовательно с анодом ставится резистор в районе 10 мегаом и отрицательный импульс через конденсатор с емкостью в единицы пикофарад и рабочим напряжением около 500 вольт подается на схемы регистрации. Импульс пригоден для прямого управления КМОП входом микросхемы.
Второй – резистор ставится в цепи катода и на нем вырабатывается положительный импульс, подаваемый на базу транзистора. При таком включении не требуется высоковольтного конденсатора.
Штатный метод, рекомендуемый производителем – сигнал снимать с анода. Специалисты НПФ Консенсус не смогли ответить, почему такое включение правильное. Ответ я получил позже от автора преобразователя питания ПН400 –он считает, что большой катод окружает анод и играет роль экрана для анода и такое включение уменьшает помехи и число ложных срабатываний.
Принципиальная схема радиометра
Фото конструкции:
Сигнал с датчика через формирующие защитные цепи можно напрямую подавать на входы микропроцессора. Но я решил поставить дополнительный формирующий элемент на сдвоенном одновибраторе 564АГ1. Первый одновибратор формирует импульс длительностью 50 мкс, а второй –2,5 мс для подачи на светодиод. Светодиод служит индикатором срабатывания и позволяет искать горячую точку по интенсивности моргания диода. Изначально я хотел поставить два счетчика – один на бета, другой на гамма. Поэтому был применен двухканальный таймер и на выход первого канала одновибратора был поставлен индикаторный смд светодиод HL2.
После запуска первого канала я убедился, что Бета-2 прекрасно реагирует на естественный фон (1), стоимость второго датчика все же велика (2) и хотелось еще навигационный датчик поставить (3). Из этих трех причин и появилось решение изменить план, не ставить второй гамма датчик, а поставить навигационный датчик.
Поэтому SMD светодиод остался на месте, времязадающие цепи второго канала АГ1 были изменены (резистор увеличен с 2 к до 100 к) и выход второго канала был выведен на крупный яркий красный матовый светодиод на передней панели. Импульс длительностью 50 мкс виден вполне отчетливо, но импульс 2.5 мс виден великолепно:
Это аппаратное решение будет работать и при отказе Ардуино Нано, позволяя ориентироваться в обстановке по частоте мигания светодиода.
Звукового сопровождения срабатывания я не делал, поскольку основное применение прибора – измерение фоновой активности.
В качестве процессора радиометра я выбрал Ардуино Нано. Причины такого выбора – цена (200 р. из Китая), малый размер, огромное количество готовых решений и уже имевшийся опыт применения таких плат в самоделках. Основной вопрос был – хватит ли быстродействия процессора для обработки импульсов, быстро идущих друг за другом? Из изучения подобных приборов и описаний программ стало понятно, что подача импульсов от счетчика на вход процессора и программная отработка прерывания требует высокого быстродействия процессора и серьезных усилий по программированию. Однако к счастью примененный процессор обладает тремя таймерами-счетчиками, два из которых можно включить в режим счета внешних импульсов с внешней ножки процессора. Это радикально упрощает задачу. Достаточно в начале цикла измерения обнулить счетчик и в конце прочитать количество импульсов. Счет выполняется на аппаратном уровне, не требуя внимания процессора. Ресурс процессора можно использовать на обмен данными и отрисовку экрана прибора.
Алгоритм пересчета числа накопленных импульсов за определенное время основан на паспортной характеристике счетчика:
Чувствительность к 60 Со имп / мкР: 160 ÷ 240
Т.е. для расчета микрорентген в час надо знать число импульсов, временной интервал и чувствительность счетчика. Формула расчета для чувствительности 200 выглядит так:
R = CT / DELTA_T * 18
Где CT — число импульсов за интервал DELTA_T в секундах, а R – текущее значение радиации в микрорентгенах в час.
Желающие могут вывести формулу самостоятельно, это совсем несложно :)
Измерение радиоактивности – это измерение параметров стационарного случайного процесса. Случайный процесс характеризуется матожиданием и среднеквадратическим отлонением.Чем меньше СКО – тем точнее мы померяли параметры случайного процесса. СКО уменьшается до стационарного значения при увеличении числа импульсов. Т.е. чем точнее мы хотим результат – тем дольше мы должны производить измерение.
С практической точки зрения это означает, что для измерения фона и малых флюктуаций этого фона время измерения должно быть большим – пара минут. Если же мы хотим использовать прибор для поиска «горячей точки» – желательно время минимизировать.
Чтобы удовлетворить обоим требованиям я сделал адаптивный алгоритм измерения. Для этого в процессе счета импульсов скетч проверяет при каждом проходе содержимое счетчика и если оно более заранее заданной уставки (100) – то происходит досрочный выход из цикла. Если превышения нет – то счет импульсов идет до истечения времени в 120 секунд. Таким образом в режиме измерения фона измерение происходит 120 секунд, что дает СКО 1.3.
Скриншот программы Radiometer, измерение фоновых значений:
Если же обстановка резко меняется – счет заканчивается значительно раньше и показания как встроенного дисплея, так и внешнего приемника обновляются значительно быстрее. Уставка «100» выбрана из наблюдения за измерениями фона, за 2 минуты число импульсов обычно находится в диапазоне 50-80. При измерении активности компаса цикл счета составляет около 10 секунд, СКО при этом составляет 17,6:
Скриншот Radiometer, измерение радиоактивности старого компаса:
Вот этот компас:
Вот фото обычной обстановки, измеренный фон 11 мкр\ч, что для Москвы близко к норме.
Для питания счетчика Гейгера-Мюллера требуется источник стабильного напряжения 400 в.
Я воспользовался готовым преобразователем PN3-400-0.1M, купленным за 750 р. Преобразователи эти можно купить через ebay (поиск по «Geiger counter power supply module dosimeter NEW 1 HV 400V high voltage» или по «Adjustable HV high voltage supply module for geiger tube counter and dosimeter»).
Ждать не хотелось и я нашел автора изделия (оказалось – Подмосковье), он мне порекомендовал одного из своих представителей в Москве и мне его привезли на ближайшую станцию метро за наличный расчет. Проблем с изделием не было, заработал сразу и никаких вопросов не вызывает.
Я применил довольно большой корпус для прибора: Gainta 413, размером 150 на 80 на 30, купленный в Буром Медведе. Сначала я думал о двух счетчиках Гейгера-Мюллера – один для бета, второй для гамма. Можно было бы в одном цикле измерений получить данные сразу и по гамме и по бете отдельно. Место для второго счетчика предусматривалось над первым. Однако после запуска системы я увидел, что и с одним датчиком радиометр делает то, что я хотел – бодро реагирует на фоновое излучение, на старый компас, на хрустальные предметы, на сварочные электроды с торием и на мешок с калиевыми удобрениями. Поэтому от установки второго датчика на гамму я отказался и перешел к запасному плану – размещению Глонасс\GPS навигатора. Практическая польза мыслилась так – «горячую точку» нашел (например на даче), координаты записал, в МЧС передал для обеззараживания. В реальности просто было интересно попробовать повозиться с новой технологией.
Бета частицы характерны малой проникающей способностью. Даже лист бумаги – серьезное препятствие, не говоря уж о корпусе толщиной около 5 мм. Чтобы использовать все возможности датчика Бета 2 я предусмотрел открывающийся круглый лючок, чтобы дать прямой доступ бета излучению к датчику. Круглое отверстие в корпусе сделано ленточной круглой пилой по дереву. Крышка сделана по мотивам пусковой установки отечественных межконтинентальных баллистических ракет. С обратной стороны приделаны плоские ограничители из обломков канцелярского ножа, приведенные к прямоугольной форме на точиле. Для фиксации крышки использован магнитик из комплекта терминального клиента. В этом терминальном клиенте такие магнитики используются как ножки. При работе с магнитиком надо помнить, что точка Кюри этого сплава – менее 80 градусов Цельсия и перегрев приведет к утрате свойств.
Устройство нижней части корпуса с открывающейся крышкой для прохода бета частиц:
Датчик Бета-2 размещен на нижней плате в отверстии несколько больше диаметра счетчика. Под счетчиком установлены самоклеющиеся фетровые кружочки, выполняющие роль дистанционных прокладок между нижней поверхностью датчика и корпусом. Слюдяное окно датчика весьма тонкое, требует осторожного обращения. При окончательной сборке после отладки я выровнял датчик по отверстию в корпусе и термоклеем закрепил датчик.
Окошко надо открыть, если надо провести измерение активности или поиск слабого бета излучателя.
Для примера: старый компас со светящимся в темноте составом. С закрытой крышкой – 70 микрорентген в час. С открытой крышкой – 200 микрорентген в час.
Измерения радиоактивности хрустальной посуды:
Модуль навигации.
Сначала я нашел на ebay GPS\Glonass приемник на базе UBLOX7m. Выглядит этот прибор вот так:
Подключается просто – достаточно подать на него питание (+3,3в) и подключить по сериал стыку 3.3 в. Я использовал конвертор на базе FT232:
Фирменная программа позволяет поиграть с модулем – получить координаты места, посмотреть на спутники и т.д.
Скриншот программы ublox:
К сожалению, модуль хоть и может работать с Глонасс созвездием, но в усеченном варианте. Во-первых, модуль одноканальный – т.е. он может в конкретный момент времени работать только с одним созвездием. Переключение созвездия требует перезагрузки модуля. Во вторых, при включении Глонасс созвездия модуль перестает работать с данными со спутника дифференциальной коррекции.
Я же хотел, чтобы модуль мог работать одновременно и с Глонасс и с GPS. Модули такие есть, в частности ML8088 Питерской фирмы Навиа. К сожалению, я не нашел готового к применению модуля, пригодного для установки в самодельный прибор. На ML8088 существуют готовые приборы, но ни по цене, ни по размерам они не годились в мой прибор. И я решил сделать свой модуль :). Купил в DESSY.RU антенну B35-3556920-AMT03 [GPS/GLONASS] и модуль ML8088sЕ. Антенна нужна двухсистемная – у Глонасс и GPS немного отличающиеся частоты несущих.
По инструкции фирмы изготовителя антенны, она должна быть установлена на проводящем основании размером 7 на 7 см по центру. Это было очень удачно – квадрат 7 на 7 см точно размещался в моем корпусе. При проектировании глонасс модуля мне пришлось решить как присоединить антенну ко входу модуля ML8088. По мануалу надо использовать микрополосковую или копланарную линию с импедансом 50 ом. Такая линия требует достаточно точных по размерам проводящих полосок на текстолите. Сделать это моим любимым методом прорезывания дорожек на плате канцелярским ножом затруднительно. Тщательно обдумав ситуацию, я решил обойтись вообще без микрополосковой линии и подключить антенну непосредственно на вход приемника. В мануале написано – тем короче линия передачи от антенны до входа, тем лучше. Значит, нулевая длина – оптимальна. Разрабатывать плату пришлось соответственно от места установки антенны. Впрочем, при размере платы 7 на 7 см смещение микромодуля никаких проблем не вызывает.
Такая конструкция потребовала определенной последовательности монтажа элементов. Сначала надо было приклеить антенну, затем подогнать ML8088 так, чтобы ножка антенны вошла в углубление вывода 21 и прихватить ML8088 в таком положении. Затем разметить положение выводов ML8088, снять микромодуль, прорезать дорожки. И припаять ножки микросхемы, делая перерывы на охлаждение. К сожалению, я ошибся и не залудил углубление антенного вывода перед пайкой антенны. Пайка не получилась, система ловила пару спутников после часа работы… Обдумав ситуацию, я решил снять антенну, облудить вывод и припаять антенну назад. Сложность в том, что надо одновременно отклеивать антенну от основания и отпаивать вывод. Но мне повезло – диагноз «непропай» я поставил правильно и антенна отскочила от ножки, как только я чуть-чуть отклеил антенну от основания. Далее все получилось хорошо – залудил вывод, припаял антенну и система заработала как надо.
При разведении подключения антенны обязательно следует учесть требование из документации – земля антенны должна присоединяться к выводам 20 и 22 и более не иметь контакта с общей землей. Это надо для предотвращения образования земляных петель и снижения помехоустойчивости. Выводы 20 и 22 ML8088 соединены с землей внутри микромодуля.
Оказалось, что в заводской поставке в ML8088sE прошита фирмварь, не поддерживающая медленное мигание вывода «есть решение». Списался с производителем и получил новую прошивку и подробнейшие инструкции по перепрошивке. Сделал, все получилось.
Я хочу поблагодарить Владимира Осадчего (технический директор компании Навиа ), который любезно и терпеливо отвечал на мои вопросы.
Не получилось преобразовать сигнал «есть решение навигационной задачи (GNSS)». Это сигнал, который с частотой полгерца мигает, если модуль решил навигационную задачу и выдаваемые им данные верны. Амплитуда сигнала 1.8 вольта и нагрузочная способность этого выхода порядка 2 ма. Но схема из мануала (ML8088sE включение AppNote 1_1.pdf) не заработала.
Похоже – не хватало нагрузочной способности выхода на уверенное открывание транзистора. Эффект был странный – если система стартовала неправильно – на этом выходе генерировался сигнал достаточного уровня для управления схемой преобразования и контрольный светодиод радостно моргал морзянкой. А когда система стартовала правильно – то амплитуда сигнала была меньше и транзистор не открывался. По уверению разработчика сигнала должно хватать. Принес с балкона осциллограф и убедился – сигнал есть, но уровень низкий, всего 0.4 вольта… Владимир Осадчий назвал конкретную модель транзистора, который у него точно работает, но я пошел своим путем и применил очередной мусорный компаратор LM393 :). Второй канал этого компаратора я использовал для индикации сигнала PPS. Попутно я изменил параметры сигнала 1PPS, сделал сигнал длиной 200 мкс. Теперь имею комфортное ненавязчивое отображение функционирование системы коротким мыргом :).
Окончательный вариант модуля Глонасс\GPS выглядит вот так:
и в размещенным в корпусе:
Верхний неприсоединенный разъем предназначен для заливки прошивки в модуль.
Желтый прямоугольник из мягкого пластика – дистанционная прокладка, упирается в Бета-2 при закрывании корпуса.
Модуль ML8088sE имеет два канала обмена по сериал порту. По одному идут навигационные данные, по второму – отладочная информация или прошивка. По умолчанию каналы настроены на скорость 115200. Я переключил их на 57600. Пришлось сделать так из-за ограничений по скорости второго канала Wi-Fi модуля HI-LINK HLK-RM04. Подробно о нем несколько ниже.
Я использовал внешнюю бекап батарейку типа CR2032. С ней старт модуля происходит существенно быстрее, поскольку все необходимое для быстрого расчета позиций спутников и из захвата в режим слежения уже есть в памяти. В этом режиме сброс модуля обычно не требуется. Сброс нужен при первом включении или если модуль правильно не стартовал. Если модуль правильно не стартовал – светодиод наличия решения будет циклически повторять некий код. Сброс приводит модуль в нормальное состояние. В моем случае сброс требовался после перепайки деталей. Я реализовал два независимых механизма сброса модуля. Первый – обычная кнопка, утопленная в корпусе, чтобы не мешала и чтобы ее случайно не нажать. Второй – программный. При старте скетч ждет пять секунд, потом начинает принимать данные от ML8088sE. Если за интервал таймаута данных нет – скетч сбрасывает модуль отрицательным импульсом с вывода А0. Важно – при старте модуля нужно, чтобы вывод сброса был в высокоимпедансном третьем состоянии. Поэтому после выдачи команды сброса я перевожу выход A0 в режим ввода. Кнопка и вывод Ардуино соединены в режиме «монтажное или».
Обмен с внешним миром у моего прибора идет через модуль «HI-LINK HLK-RM04 Serial Port-Ethernet-Wi-Fi Adapter Module», которое представляет собой по сути мини-рутер с большими возможностями. Я его использую в режиме преобразователя сериал порта в Wi-Fi. У устройства имеется два порта, один может работать со скоростью до 115200, второй – до 57600. Глонасс навигатор подключен ко второму порту и поэтому скорость обмена ML8088 пришлось уменьшить до 57600. К сожалению, этот модуль приходит из Китая без внутренней антенны и настроенным на внешнюю антенну. На фото в магазине внутренняя чип-антенна есть. Мне пришлось купить внешние антенны типа ANT 2.4 ESG-2400-12 UFL-F в DESSY.RU и потребовать у DX соразмерного уменьшения цены. Аналогичные антенны есть и в DX, возможно стоит при покупке Wi-Fi модуля сразу их и заказывать. Я пробовал подключать к модулю две разные штыревые антенны от какого-то рутера и PCI карты – работает, но уровень сигнала примерно на 10 дб ниже по сравнению с плоской антенной. Плюс она намного удобнее при размещении внутри корпуса.
Wi-Fi модуль имеет выход 3.3 вольт от внутреннего стабилизатора. Его хватает для питания Glonass модуля ML8088sE.
Первый канал использован для работы с Ардуино. Данные, формируемые в программе Ардуино (от радиометра) поступают на первый канал Wi-Fi модуля и транслируются в домашнюю сеть. Их можно принимать любой программой типа PUTTY, которой можно соединиться по указанному IP адресу и порту. Навигатор подключен ко второму сериал порту. Данные от навигатора также поступают на сериал порт Ардуино, программа обрабатывает данные от навигатора и выводит их на экран.
Я исследовал вопрос о применении софт сериал порта, но решил, что надежно это работать не будет и потребует программирования с большими трудозатратами. Поэтому я придумал аппаратный хак :).
Сначала напомню, как устроена передача информация по последовательному порту. Сериал сигнал передается отрицательными перепадами от +5 в до 0. В исходном, неактивном состоянии сигнал имеет высокий уровень (+5в). Внутри Ардуино Нано сигнал с выхода FT232 передается на сериал вход ATMEGA328P через защитный резистор 1 килоом. Вот кусочек принципиальной схемы:
На верхней схеме показано соединение выводов RX и TX внутри платы Ардуино. Вывод RX Atmega328P прямо присоединен к ножке разъема Ардуино и одновременно через резистор 1к к выводу TX преобразователя USB-serial FT232RL. Это дает возможность передавать сериал дата на ножку разъема и сигнал будет поступать прямо на нужный вывод микропроцессора и правильно обрабатываться, если выходе FT232 находится высокий уровень. Это условие выполняется, когда компьютер ничего не посылает в Ардуино или Ардуино работает автономно без соединения с компьютером. В этом случае сериал вход Atmega328P оказывается фактически подтянутым к 5 вольтам через резистор 1 ком, как показано на нижней схеме. Чтобы не мешать штатной передаче данных от компьютера через FT232 – надо использовать передатчик с открытым коллектором и выводить его в закрытое состояние, когда надо обеспечить штатную работу сериал канала. У меня как раз было некоторое количество двухканальных компараторов типа LM393, имеющих выход типа открытый коллектор.
Сигнал с сериал порта Глонасс модуля передается через компаратор с выходом типа открытый коллектор. При сбросе процессора вывод А1 встает в третье состояние. Инвертирующий вход компаратора фактически присоединен к земле через резистор R11. На неинвертирующем входе компаратора присутствует положительное напряжение в диапазоне от 0.4 до 3.3 в. Выход компаратора находится в полностью закрытом состоянии и на работу Ардуино не влияет никак. Обмен микропроцессора с компьютером, загрузка скетча в память – все происходит как обычно. После запуска скетча вывод А1 переводится в режим выхода и на нем устанавливается высокий уровень +5 в. Напряжение на инвертирующем входе становится равным 1,65 в (половина от 3,3в). Компаратор начинает работать повторителем сериал сигнала от Глонасс модуля. Скетч читает данные из стандартного сериал порта и обрабатывает приходящие данные. При запуске загрузки скетча в Ардуино сначала FT232 генерирует сброс процессора, вывод A1 переходит в третье состояние, и выход компаратора уходит в закрытое состояние и перестает влиять на сериал вход Ардуино. Передача данных от Глонасс модуля прекращается и загрузка скетча происходит штатным образом.
Компаратор LM393 применен просто потому, что их было много в коробочке на столе, куда они попали после демонтажа с модулей датчиков газов. Естественно, что для реализации такого хака можно применить и другой логический элемент с выходом типа открытый коллектор или управляющий вход для перевода выхода в третье состояние.
Такой способ соединения информационных потоков называется «монтажное ИЛИ».
По второму каналу каналу Wi-Fi модуля организовано полноценное общение с модулем ML8088 для поставляемой Навиа программы Navia Viewer. Программа умеет общаться с модулем, подключенным по сериал порту. Я использовал программу Tibbo для организации виртуального сериал порта. Tibbo, в отличии от похожих программ, автоматически стартует и организует канал без необходимости ручного вмешательства. Я пробовал также Virtual serial port driver от HWGroup . Работает, но требует ручных манипуляций после запуска компьютера>, это неудобно.
Вот пара скриншотов:
Еще один скриншот, интересный наличием спутника дифференциальной коррекции, он в синем кружочке:
Я запускаю этот комплекс в виртуальной машине под управлением VMware workstation.
Из скриншотов видно, что TIBBO установил связь с 192.168.1.155:8081 и представил это как virtual serial port COM3. В Навиа ГЛОНАСС задан коммуникационный порт COM3 и все это хозяйство автоматически устойчиво взлетает при запуске виртуального компьютера.
Возможно, авторам Навиа ГЛОНАСС будет интересно доработать программу так, чтобы она напрямую могла общаться не только с сериал портом, но и с каналом TCPIP.
Примененый в устройстве дисплей был куплен на дилэкстриме за примерно 300 р. В дисплее использован контроллер ILI9341, о котором известно практически все, имеются библиотеки и обширный опыт использования. Единственная тонкость – питается дисплей от +5 вольт, а входы рассчитаны на 3.3в. Если напрямую соединить с Ардуино нано – работать не будет, но и не сгорит. Я использовал простейший конвертор 5 -> 3.3 -последовательно включенные резисторы 2.7 к. Сигнал MOSI резистора не требует – он идет от дисплея к процессору. Сигнал LED также не требует конверсии.
Для работы с дисплеем использована стандартная библиотека TFT v2 с незначительными доработками. В стандартной библиотеке вывод символа засвечивает нужные точки, но не стирает незасвеченные. Первый раз после стирания экрана все будет правильно, а второй и последующие – нет. Точки матрицы будут только включаться, но не выключаться и через десяток итераций на экране получится полностью засвеченный цветом символа прямоугольник. Я добавил в код библиотеки кусочек, который выводит фоновый цвет в неиспользуемые в символе точки.
Также пришлось изменить кусочки кода, отвечающие за дрыгание ногами RESET и CS. Библиотека рассчитана на использование выводов D4 и D5, а мне они были нужны для работы с таймерами. Поэтому выводы дисплея подключены к выводам D8 (Reset) и D9 (CS) и внесены следующие изменения в код:
Полный текст программы и измененные библиотеки можно взять тут
В окончательном варианте прибора задействован только счетчик T1, считающий импульсы с вывода D5. Вывод D4 остался незадействованым.
Поскольку прибор рассчитан на использование в режиме 24 на 7 – я принял меры против эффекта выгорания экрана. Все элементы, выводимые на экран, меняют цвет случайным образом и немного перемещаются по экрану тоже случайным образом. Не могу сказать, что это очень нужно для правильной работы, но программировать это было весело :)
Питается прибор через разъем мини усб на Ардуино. Внутренняя батарея не предусматривалась, а для обеспечения возможности работать автономно – например для проверки садового участка, куплен power bank емкостью 4000 мач. Измерения показали, что реальная емкость около 3000 мач, но и этой емкости хватает для работы радиометра в течении более 10 часов. Походить по даче хватит с избытком.
Для приема и обработки данных служит программа Radiometer, написанная на Visual Basic в среде Visual StudioExpress 2012.
Программа принимает данные от радиометра в фоновом потоке, отображает принятые данные в виде текста и графика:
В программе реализован механизм восстановления соединения в случае пропадания сигнала. Если канал упал и данных нет после истечения заданного таймаута — то программа закроет канал, почистит «хвосты» и опять откроет канал. И так будет делать, пока соединение не восстановится. В случае радиометра таймаут задан 3 минуты. Нормальный интервал поступления данных – 2 минуты. Программа правильно отрабатывает и отключение – включение передающего модуля, Wi-Fi точки доступа или любого связного оборудования по пути прохождения потока данных.
События открытия канала и закрытия пишутся в лог. Также отмечается событие запуска и остановки программы.
Данные и события отдельно пишутся в два отдельных текстовых файла.
По срабатыванию таймера 1 раз в 10 минут выполняется программа записи статистики в лог-файл.
По приходу данных из канала они помещаются в буфер и по достижению определенных условий этот буфер отправляется в программу обработки входных данных. В данной программе условие – последние байты строки равны vbCrLf (т.е.Hex(0D0A) они же символы «перевод каретки» «возврат строки»).
Подпрограмма обработки проверяет входную строку на формальную допустимость, используя механизм регулярных выражений. Если строка имеет недопустимый формат – об этом оставляется пометка в лог-файле. Если строка имеет допустимый формат – программа разделяет строку на элементы механизмом регулярных выражений, получая в результате массив элементов.
Дальнейшая обработка заключается в занесении нужных элементов в массивы типа «очередь FIFO» (QUEUE).
По массиву QUEUE рассчитывается максимум, минимум, среднее и СКО. Для расчета максимума, минимума и среднего использованы готовые методы объекта очередь. Расчет СКО сделан путем вывода элементов очереди в массив и обработки этого массива. Насколько я сумел понять из документации – можно сделать свой метод, но с наскока не получилось и я оставил это на будущее :).
Длина очереди выбрана равной 2400 элементов, что при интервале поступления данных в две минуты дает примерно 80 часов назад отображения фона радиоактивности.
Пик на графике – результат поднесения компаса.
Программу можно скачать тут
Описание скетча в Ардуино.
Блок –схема скетча:
Запуск программы
Инициализация дисплея
Инициализация таймера Т1, перевод его в режим счета импульсов от внешнего входа.
Инициализация сериал обмена на скорости 57600
Основной цикл скетча
Обнуление счетчика
Запоминание времени старта
Прием данных от сериал порта, поиск сообщения 1 («$GPRMC»)
Прием данных от сериал порта, поиск сообщения 2 («$GPGGA»)
Прием данных от сериал порта, поиск сообщения 3 («$GPVTG»)
Разбор и отображение данных от GLONASS\GPS
Отображение текущего состояния счетчика T1
Проверка условия окончания цикла – истекло время или счетчик насчитал более 100 импульсов
Фиксирование показаний счетчика и таймера
Расчет значения радиоактивности
Вывод на дисплей
Вывод в сериал канал
Описание вывода на встроенный дисплей.
Первая строка показывает число зарегистрированных импульсов в процессе измерения радиоактивности. Число меняется примерно раз секунду.
Вторая строка показывает рассчитанное значение радиоактивности в предыдущем цикле.
Следом идет блок из четырех строк. Это вывод информации от Глонасс\GPS модуля.
Первая строка – время UTC, дата, число спутников, данные от которых использованы в расчете решения, признак наличия решения (буква А или V)
095623 140514 08 A – 9:56:23 UTC 14/05/2014 8 спутников и решение есть.
Вторая строка широта и скорость в км\ч.
5545.13119 N означает 55 градусов 45.13119 минут северной широты
Третья строка долгота
03739.20397 E означает 37 градусов 39.20397 минут восточной долготы
Четвертая – скорость в милях в час, угол движения в градусах и высота в метрах.
Вывод ГЛОНАСС\GPS данных сделан упрощенно – просто выводятся части символьных строк без какого-либо преобразования.
Далее выводится максимальное значение радиоактивности за время наблюдения.
Бегущий график показывает изменение радиоактивности со временем. График автоматически подстраивается под максимальное значение в кольцевом буфере. При поднесении компаса получим такую картинку:
Буду рад ответить на вопросы.
Я несколько последних лет занимаюсь в свободное от основной работы время конструированием и практическим изготовлением разнообразных устройств домашней автоматизации, управления и слежения за параметрами среды. Сейчас у меня имеется много свободного времени и я получил возможность описать сделанное.
Мои приборы подключаются в домашнюю сеть по Wi-Fi, в домашней сети живет бесшумная безвентиляторная управляющая машина с твердотельным диском. Эта машина выполняет фунции ядра системы, на ней работают программы сбора данных от разнообразных датчиков и программы управления внешними устройствами.
Задача, которую я хотел решить с помощью радиометра, я сформулировал так: «хочу иметь прибор, который будет измерять радиацию в общем смысле». Прибор должен показывать уровень естественного радиационного фона, реагировать на изменения этого фона, иметь пределы измерения не меньше примененного датчика и уметь передавать данные на внешний регистратор. Неплохо бы также иметь в приборе поисковую функцию: когда можно поводить прибором около «горячего пятна» и найти его по изменению показаний встроенных индикаторов. Неплохо бы так же иметь автономность по питанию на какое-то время, например походить по дачному участку и проверить, все ли в порядке.
Первый вопрос, который надо решить – какой датчик применить. Изучение материалов по вопросам измерения радиоактивности дало мне понимание, что оптимальный датчик для моей задачи – обыкновенный датчик Гейгера-Мюллера. Традиционно называть эти приборы «счетчиком Гейгера-Мюллера», хотя в реальности ничего они не считают, а выдают импульсы на каждую частицу, которая смогла запустить процесс лавинного пробоя в измерительной камере. Поэтому я употребляю термин «датчик». Их очень много, для разных целей. Мне хотелось, чтобы мой прибор был достаточно чувствителен к бета излучению, а не только к гамма. Широкораспространенные и дешевые (в диапазоне 200 — 1000 р) СБМ20 малочувствительны к бета излучению, у них нет окна, прозрачного для бета частиц. СБМ20 прежде всего чувствителен к гамма излучению, причем к достаточно мощному. Понятно почему – их делали для военных целей. Использование такого датчика в радиометре требует большого времени накопления данных для более-менее адекватного измерения естественного фона. Для СБМ20 это время обычно берут 46 секунд, при этом число накопленных импульсов равно текущему значению гамма фона в микрорентгенах в час. Но мне хотелось большей чувствительности к бета излучению. Я не рассчитывал на катаклизм, меня интересовало бытовое измерение малых значений. Если хочется быть готовым к катаклизму – можно поискать и купить какой-нибудь ДП5В с хранения, заменить в нем три конденсатора на хорошие пленочные и получить прибор в военном стиле, в зеленом ящике, дуракоупорный, пригодный для измерения радиации до 200 рентген в час в экстремальных условиях.
Отмечу также, что есть и другие методы регистрации заряженных частиц, например на основе сцинциляционных кристаллов и ФЭУ. Эти методы измерения позволяют измерять и распределение спектра мощности потока радиации, но для моей цели это избыточно и очень дорого.
Итак, мне нужен счетчик Гейгера-Мюллера с бета чувствительностью. К счастью у нас в России производятся эти датчики. Я выбрал датчики Бета. Их производит НПФ Консенсус. Определенную роль в решении купить именно такой датчик сыграло и весьма любезное и клиентское отношение сотрудников завода. Я мучил их глупыми чайниковскими вопросами и получил вполне адекватные ответы на них. Для покупки датчика мне пришлось съездить в Запрудню. Это около 100 км по Дмитровке, чуть не доезжая Дубны. Некоторую роль в принятии решения о поездке сыграло и желание посмотреть новые места :)
Выбранный мной датчик БЕТА-2 имеет слюдяное окно площадью 13.8 см2 и чувствителен к бета излучению.
Для работы ему надо 400в. Важный параметр датчика – время восстановления. Суть работы датчика – ионизация газа в камере при пролете заряженной частицы и последующий лавинный пробой, затем в дело вступают присадки в газе и гасят разряд. Датчику после гашения разряда требуется некоторое время для восстановления чувствительности. Это время ( термин «мертвое время») указано в характеристиках и для конкретно Бета-2 составляет 140 микросекунд минимум. Пересчет в частоту дает нам максимальную частоту импульсов от датчика в районе 8 кгц.
Скан паспорта:
Существуют два метода съема данных со счетчика Гейгера-Мюллера. Первый – последовательно с анодом ставится резистор в районе 10 мегаом и отрицательный импульс через конденсатор с емкостью в единицы пикофарад и рабочим напряжением около 500 вольт подается на схемы регистрации. Импульс пригоден для прямого управления КМОП входом микросхемы.
Второй – резистор ставится в цепи катода и на нем вырабатывается положительный импульс, подаваемый на базу транзистора. При таком включении не требуется высоковольтного конденсатора.
Штатный метод, рекомендуемый производителем – сигнал снимать с анода. Специалисты НПФ Консенсус не смогли ответить, почему такое включение правильное. Ответ я получил позже от автора преобразователя питания ПН400 –он считает, что большой катод окружает анод и играет роль экрана для анода и такое включение уменьшает помехи и число ложных срабатываний.
Принципиальная схема радиометра
Фото конструкции:
Сигнал с датчика через формирующие защитные цепи можно напрямую подавать на входы микропроцессора. Но я решил поставить дополнительный формирующий элемент на сдвоенном одновибраторе 564АГ1. Первый одновибратор формирует импульс длительностью 50 мкс, а второй –2,5 мс для подачи на светодиод. Светодиод служит индикатором срабатывания и позволяет искать горячую точку по интенсивности моргания диода. Изначально я хотел поставить два счетчика – один на бета, другой на гамма. Поэтому был применен двухканальный таймер и на выход первого канала одновибратора был поставлен индикаторный смд светодиод HL2.
После запуска первого канала я убедился, что Бета-2 прекрасно реагирует на естественный фон (1), стоимость второго датчика все же велика (2) и хотелось еще навигационный датчик поставить (3). Из этих трех причин и появилось решение изменить план, не ставить второй гамма датчик, а поставить навигационный датчик.
Поэтому SMD светодиод остался на месте, времязадающие цепи второго канала АГ1 были изменены (резистор увеличен с 2 к до 100 к) и выход второго канала был выведен на крупный яркий красный матовый светодиод на передней панели. Импульс длительностью 50 мкс виден вполне отчетливо, но импульс 2.5 мс виден великолепно:
Это аппаратное решение будет работать и при отказе Ардуино Нано, позволяя ориентироваться в обстановке по частоте мигания светодиода.
Звукового сопровождения срабатывания я не делал, поскольку основное применение прибора – измерение фоновой активности.
В качестве процессора радиометра я выбрал Ардуино Нано. Причины такого выбора – цена (200 р. из Китая), малый размер, огромное количество готовых решений и уже имевшийся опыт применения таких плат в самоделках. Основной вопрос был – хватит ли быстродействия процессора для обработки импульсов, быстро идущих друг за другом? Из изучения подобных приборов и описаний программ стало понятно, что подача импульсов от счетчика на вход процессора и программная отработка прерывания требует высокого быстродействия процессора и серьезных усилий по программированию. Однако к счастью примененный процессор обладает тремя таймерами-счетчиками, два из которых можно включить в режим счета внешних импульсов с внешней ножки процессора. Это радикально упрощает задачу. Достаточно в начале цикла измерения обнулить счетчик и в конце прочитать количество импульсов. Счет выполняется на аппаратном уровне, не требуя внимания процессора. Ресурс процессора можно использовать на обмен данными и отрисовку экрана прибора.
Алгоритм пересчета числа накопленных импульсов за определенное время основан на паспортной характеристике счетчика:
Чувствительность к 60 Со имп / мкР: 160 ÷ 240
Т.е. для расчета микрорентген в час надо знать число импульсов, временной интервал и чувствительность счетчика. Формула расчета для чувствительности 200 выглядит так:
R = CT / DELTA_T * 18
Где CT — число импульсов за интервал DELTA_T в секундах, а R – текущее значение радиации в микрорентгенах в час.
Желающие могут вывести формулу самостоятельно, это совсем несложно :)
Измерение радиоактивности – это измерение параметров стационарного случайного процесса. Случайный процесс характеризуется матожиданием и среднеквадратическим отлонением.Чем меньше СКО – тем точнее мы померяли параметры случайного процесса. СКО уменьшается до стационарного значения при увеличении числа импульсов. Т.е. чем точнее мы хотим результат – тем дольше мы должны производить измерение.
С практической точки зрения это означает, что для измерения фона и малых флюктуаций этого фона время измерения должно быть большим – пара минут. Если же мы хотим использовать прибор для поиска «горячей точки» – желательно время минимизировать.
Чтобы удовлетворить обоим требованиям я сделал адаптивный алгоритм измерения. Для этого в процессе счета импульсов скетч проверяет при каждом проходе содержимое счетчика и если оно более заранее заданной уставки (100) – то происходит досрочный выход из цикла. Если превышения нет – то счет импульсов идет до истечения времени в 120 секунд. Таким образом в режиме измерения фона измерение происходит 120 секунд, что дает СКО 1.3.
Скриншот программы Radiometer, измерение фоновых значений:
Если же обстановка резко меняется – счет заканчивается значительно раньше и показания как встроенного дисплея, так и внешнего приемника обновляются значительно быстрее. Уставка «100» выбрана из наблюдения за измерениями фона, за 2 минуты число импульсов обычно находится в диапазоне 50-80. При измерении активности компаса цикл счета составляет около 10 секунд, СКО при этом составляет 17,6:
Скриншот Radiometer, измерение радиоактивности старого компаса:
Вот этот компас:
Вот фото обычной обстановки, измеренный фон 11 мкр\ч, что для Москвы близко к норме.
Для питания счетчика Гейгера-Мюллера требуется источник стабильного напряжения 400 в.
Я воспользовался готовым преобразователем PN3-400-0.1M, купленным за 750 р. Преобразователи эти можно купить через ebay (поиск по «Geiger counter power supply module dosimeter NEW 1 HV 400V high voltage» или по «Adjustable HV high voltage supply module for geiger tube counter and dosimeter»).
Ждать не хотелось и я нашел автора изделия (оказалось – Подмосковье), он мне порекомендовал одного из своих представителей в Москве и мне его привезли на ближайшую станцию метро за наличный расчет. Проблем с изделием не было, заработал сразу и никаких вопросов не вызывает.
Я применил довольно большой корпус для прибора: Gainta 413, размером 150 на 80 на 30, купленный в Буром Медведе. Сначала я думал о двух счетчиках Гейгера-Мюллера – один для бета, второй для гамма. Можно было бы в одном цикле измерений получить данные сразу и по гамме и по бете отдельно. Место для второго счетчика предусматривалось над первым. Однако после запуска системы я увидел, что и с одним датчиком радиометр делает то, что я хотел – бодро реагирует на фоновое излучение, на старый компас, на хрустальные предметы, на сварочные электроды с торием и на мешок с калиевыми удобрениями. Поэтому от установки второго датчика на гамму я отказался и перешел к запасному плану – размещению Глонасс\GPS навигатора. Практическая польза мыслилась так – «горячую точку» нашел (например на даче), координаты записал, в МЧС передал для обеззараживания. В реальности просто было интересно попробовать повозиться с новой технологией.
Бета частицы характерны малой проникающей способностью. Даже лист бумаги – серьезное препятствие, не говоря уж о корпусе толщиной около 5 мм. Чтобы использовать все возможности датчика Бета 2 я предусмотрел открывающийся круглый лючок, чтобы дать прямой доступ бета излучению к датчику. Круглое отверстие в корпусе сделано ленточной круглой пилой по дереву. Крышка сделана по мотивам пусковой установки отечественных межконтинентальных баллистических ракет. С обратной стороны приделаны плоские ограничители из обломков канцелярского ножа, приведенные к прямоугольной форме на точиле. Для фиксации крышки использован магнитик из комплекта терминального клиента. В этом терминальном клиенте такие магнитики используются как ножки. При работе с магнитиком надо помнить, что точка Кюри этого сплава – менее 80 градусов Цельсия и перегрев приведет к утрате свойств.
Устройство нижней части корпуса с открывающейся крышкой для прохода бета частиц:
Датчик Бета-2 размещен на нижней плате в отверстии несколько больше диаметра счетчика. Под счетчиком установлены самоклеющиеся фетровые кружочки, выполняющие роль дистанционных прокладок между нижней поверхностью датчика и корпусом. Слюдяное окно датчика весьма тонкое, требует осторожного обращения. При окончательной сборке после отладки я выровнял датчик по отверстию в корпусе и термоклеем закрепил датчик.
Окошко надо открыть, если надо провести измерение активности или поиск слабого бета излучателя.
Для примера: старый компас со светящимся в темноте составом. С закрытой крышкой – 70 микрорентген в час. С открытой крышкой – 200 микрорентген в час.
Измерения радиоактивности хрустальной посуды:
Модуль навигации.
Сначала я нашел на ebay GPS\Glonass приемник на базе UBLOX7m. Выглядит этот прибор вот так:
Подключается просто – достаточно подать на него питание (+3,3в) и подключить по сериал стыку 3.3 в. Я использовал конвертор на базе FT232:
Фирменная программа позволяет поиграть с модулем – получить координаты места, посмотреть на спутники и т.д.
Скриншот программы ublox:
К сожалению, модуль хоть и может работать с Глонасс созвездием, но в усеченном варианте. Во-первых, модуль одноканальный – т.е. он может в конкретный момент времени работать только с одним созвездием. Переключение созвездия требует перезагрузки модуля. Во вторых, при включении Глонасс созвездия модуль перестает работать с данными со спутника дифференциальной коррекции.
Я же хотел, чтобы модуль мог работать одновременно и с Глонасс и с GPS. Модули такие есть, в частности ML8088 Питерской фирмы Навиа. К сожалению, я не нашел готового к применению модуля, пригодного для установки в самодельный прибор. На ML8088 существуют готовые приборы, но ни по цене, ни по размерам они не годились в мой прибор. И я решил сделать свой модуль :). Купил в DESSY.RU антенну B35-3556920-AMT03 [GPS/GLONASS] и модуль ML8088sЕ. Антенна нужна двухсистемная – у Глонасс и GPS немного отличающиеся частоты несущих.
По инструкции фирмы изготовителя антенны, она должна быть установлена на проводящем основании размером 7 на 7 см по центру. Это было очень удачно – квадрат 7 на 7 см точно размещался в моем корпусе. При проектировании глонасс модуля мне пришлось решить как присоединить антенну ко входу модуля ML8088. По мануалу надо использовать микрополосковую или копланарную линию с импедансом 50 ом. Такая линия требует достаточно точных по размерам проводящих полосок на текстолите. Сделать это моим любимым методом прорезывания дорожек на плате канцелярским ножом затруднительно. Тщательно обдумав ситуацию, я решил обойтись вообще без микрополосковой линии и подключить антенну непосредственно на вход приемника. В мануале написано – тем короче линия передачи от антенны до входа, тем лучше. Значит, нулевая длина – оптимальна. Разрабатывать плату пришлось соответственно от места установки антенны. Впрочем, при размере платы 7 на 7 см смещение микромодуля никаких проблем не вызывает.
Такая конструкция потребовала определенной последовательности монтажа элементов. Сначала надо было приклеить антенну, затем подогнать ML8088 так, чтобы ножка антенны вошла в углубление вывода 21 и прихватить ML8088 в таком положении. Затем разметить положение выводов ML8088, снять микромодуль, прорезать дорожки. И припаять ножки микросхемы, делая перерывы на охлаждение. К сожалению, я ошибся и не залудил углубление антенного вывода перед пайкой антенны. Пайка не получилась, система ловила пару спутников после часа работы… Обдумав ситуацию, я решил снять антенну, облудить вывод и припаять антенну назад. Сложность в том, что надо одновременно отклеивать антенну от основания и отпаивать вывод. Но мне повезло – диагноз «непропай» я поставил правильно и антенна отскочила от ножки, как только я чуть-чуть отклеил антенну от основания. Далее все получилось хорошо – залудил вывод, припаял антенну и система заработала как надо.
При разведении подключения антенны обязательно следует учесть требование из документации – земля антенны должна присоединяться к выводам 20 и 22 и более не иметь контакта с общей землей. Это надо для предотвращения образования земляных петель и снижения помехоустойчивости. Выводы 20 и 22 ML8088 соединены с землей внутри микромодуля.
Оказалось, что в заводской поставке в ML8088sE прошита фирмварь, не поддерживающая медленное мигание вывода «есть решение». Списался с производителем и получил новую прошивку и подробнейшие инструкции по перепрошивке. Сделал, все получилось.
Я хочу поблагодарить Владимира Осадчего (технический директор компании Навиа ), который любезно и терпеливо отвечал на мои вопросы.
Не получилось преобразовать сигнал «есть решение навигационной задачи (GNSS)». Это сигнал, который с частотой полгерца мигает, если модуль решил навигационную задачу и выдаваемые им данные верны. Амплитуда сигнала 1.8 вольта и нагрузочная способность этого выхода порядка 2 ма. Но схема из мануала (ML8088sE включение AppNote 1_1.pdf) не заработала.
Похоже – не хватало нагрузочной способности выхода на уверенное открывание транзистора. Эффект был странный – если система стартовала неправильно – на этом выходе генерировался сигнал достаточного уровня для управления схемой преобразования и контрольный светодиод радостно моргал морзянкой. А когда система стартовала правильно – то амплитуда сигнала была меньше и транзистор не открывался. По уверению разработчика сигнала должно хватать. Принес с балкона осциллограф и убедился – сигнал есть, но уровень низкий, всего 0.4 вольта… Владимир Осадчий назвал конкретную модель транзистора, который у него точно работает, но я пошел своим путем и применил очередной мусорный компаратор LM393 :). Второй канал этого компаратора я использовал для индикации сигнала PPS. Попутно я изменил параметры сигнала 1PPS, сделал сигнал длиной 200 мкс. Теперь имею комфортное ненавязчивое отображение функционирование системы коротким мыргом :).
Окончательный вариант модуля Глонасс\GPS выглядит вот так:
и в размещенным в корпусе:
Верхний неприсоединенный разъем предназначен для заливки прошивки в модуль.
Желтый прямоугольник из мягкого пластика – дистанционная прокладка, упирается в Бета-2 при закрывании корпуса.
Модуль ML8088sE имеет два канала обмена по сериал порту. По одному идут навигационные данные, по второму – отладочная информация или прошивка. По умолчанию каналы настроены на скорость 115200. Я переключил их на 57600. Пришлось сделать так из-за ограничений по скорости второго канала Wi-Fi модуля HI-LINK HLK-RM04. Подробно о нем несколько ниже.
Я использовал внешнюю бекап батарейку типа CR2032. С ней старт модуля происходит существенно быстрее, поскольку все необходимое для быстрого расчета позиций спутников и из захвата в режим слежения уже есть в памяти. В этом режиме сброс модуля обычно не требуется. Сброс нужен при первом включении или если модуль правильно не стартовал. Если модуль правильно не стартовал – светодиод наличия решения будет циклически повторять некий код. Сброс приводит модуль в нормальное состояние. В моем случае сброс требовался после перепайки деталей. Я реализовал два независимых механизма сброса модуля. Первый – обычная кнопка, утопленная в корпусе, чтобы не мешала и чтобы ее случайно не нажать. Второй – программный. При старте скетч ждет пять секунд, потом начинает принимать данные от ML8088sE. Если за интервал таймаута данных нет – скетч сбрасывает модуль отрицательным импульсом с вывода А0. Важно – при старте модуля нужно, чтобы вывод сброса был в высокоимпедансном третьем состоянии. Поэтому после выдачи команды сброса я перевожу выход A0 в режим ввода. Кнопка и вывод Ардуино соединены в режиме «монтажное или».
Обмен с внешним миром у моего прибора идет через модуль «HI-LINK HLK-RM04 Serial Port-Ethernet-Wi-Fi Adapter Module», которое представляет собой по сути мини-рутер с большими возможностями. Я его использую в режиме преобразователя сериал порта в Wi-Fi. У устройства имеется два порта, один может работать со скоростью до 115200, второй – до 57600. Глонасс навигатор подключен ко второму порту и поэтому скорость обмена ML8088 пришлось уменьшить до 57600. К сожалению, этот модуль приходит из Китая без внутренней антенны и настроенным на внешнюю антенну. На фото в магазине внутренняя чип-антенна есть. Мне пришлось купить внешние антенны типа ANT 2.4 ESG-2400-12 UFL-F в DESSY.RU и потребовать у DX соразмерного уменьшения цены. Аналогичные антенны есть и в DX, возможно стоит при покупке Wi-Fi модуля сразу их и заказывать. Я пробовал подключать к модулю две разные штыревые антенны от какого-то рутера и PCI карты – работает, но уровень сигнала примерно на 10 дб ниже по сравнению с плоской антенной. Плюс она намного удобнее при размещении внутри корпуса.
Wi-Fi модуль имеет выход 3.3 вольт от внутреннего стабилизатора. Его хватает для питания Glonass модуля ML8088sE.
Первый канал использован для работы с Ардуино. Данные, формируемые в программе Ардуино (от радиометра) поступают на первый канал Wi-Fi модуля и транслируются в домашнюю сеть. Их можно принимать любой программой типа PUTTY, которой можно соединиться по указанному IP адресу и порту. Навигатор подключен ко второму сериал порту. Данные от навигатора также поступают на сериал порт Ардуино, программа обрабатывает данные от навигатора и выводит их на экран.
Я исследовал вопрос о применении софт сериал порта, но решил, что надежно это работать не будет и потребует программирования с большими трудозатратами. Поэтому я придумал аппаратный хак :).
Сначала напомню, как устроена передача информация по последовательному порту. Сериал сигнал передается отрицательными перепадами от +5 в до 0. В исходном, неактивном состоянии сигнал имеет высокий уровень (+5в). Внутри Ардуино Нано сигнал с выхода FT232 передается на сериал вход ATMEGA328P через защитный резистор 1 килоом. Вот кусочек принципиальной схемы:
На верхней схеме показано соединение выводов RX и TX внутри платы Ардуино. Вывод RX Atmega328P прямо присоединен к ножке разъема Ардуино и одновременно через резистор 1к к выводу TX преобразователя USB-serial FT232RL. Это дает возможность передавать сериал дата на ножку разъема и сигнал будет поступать прямо на нужный вывод микропроцессора и правильно обрабатываться, если выходе FT232 находится высокий уровень. Это условие выполняется, когда компьютер ничего не посылает в Ардуино или Ардуино работает автономно без соединения с компьютером. В этом случае сериал вход Atmega328P оказывается фактически подтянутым к 5 вольтам через резистор 1 ком, как показано на нижней схеме. Чтобы не мешать штатной передаче данных от компьютера через FT232 – надо использовать передатчик с открытым коллектором и выводить его в закрытое состояние, когда надо обеспечить штатную работу сериал канала. У меня как раз было некоторое количество двухканальных компараторов типа LM393, имеющих выход типа открытый коллектор.
Сигнал с сериал порта Глонасс модуля передается через компаратор с выходом типа открытый коллектор. При сбросе процессора вывод А1 встает в третье состояние. Инвертирующий вход компаратора фактически присоединен к земле через резистор R11. На неинвертирующем входе компаратора присутствует положительное напряжение в диапазоне от 0.4 до 3.3 в. Выход компаратора находится в полностью закрытом состоянии и на работу Ардуино не влияет никак. Обмен микропроцессора с компьютером, загрузка скетча в память – все происходит как обычно. После запуска скетча вывод А1 переводится в режим выхода и на нем устанавливается высокий уровень +5 в. Напряжение на инвертирующем входе становится равным 1,65 в (половина от 3,3в). Компаратор начинает работать повторителем сериал сигнала от Глонасс модуля. Скетч читает данные из стандартного сериал порта и обрабатывает приходящие данные. При запуске загрузки скетча в Ардуино сначала FT232 генерирует сброс процессора, вывод A1 переходит в третье состояние, и выход компаратора уходит в закрытое состояние и перестает влиять на сериал вход Ардуино. Передача данных от Глонасс модуля прекращается и загрузка скетча происходит штатным образом.
Компаратор LM393 применен просто потому, что их было много в коробочке на столе, куда они попали после демонтажа с модулей датчиков газов. Естественно, что для реализации такого хака можно применить и другой логический элемент с выходом типа открытый коллектор или управляющий вход для перевода выхода в третье состояние.
Такой способ соединения информационных потоков называется «монтажное ИЛИ».
По второму каналу каналу Wi-Fi модуля организовано полноценное общение с модулем ML8088 для поставляемой Навиа программы Navia Viewer. Программа умеет общаться с модулем, подключенным по сериал порту. Я использовал программу Tibbo для организации виртуального сериал порта. Tibbo, в отличии от похожих программ, автоматически стартует и организует канал без необходимости ручного вмешательства. Я пробовал также Virtual serial port driver от HWGroup . Работает, но требует ручных манипуляций после запуска компьютера>, это неудобно.
Вот пара скриншотов:
Еще один скриншот, интересный наличием спутника дифференциальной коррекции, он в синем кружочке:
Я запускаю этот комплекс в виртуальной машине под управлением VMware workstation.
Из скриншотов видно, что TIBBO установил связь с 192.168.1.155:8081 и представил это как virtual serial port COM3. В Навиа ГЛОНАСС задан коммуникационный порт COM3 и все это хозяйство автоматически устойчиво взлетает при запуске виртуального компьютера.
Возможно, авторам Навиа ГЛОНАСС будет интересно доработать программу так, чтобы она напрямую могла общаться не только с сериал портом, но и с каналом TCPIP.
Примененый в устройстве дисплей был куплен на дилэкстриме за примерно 300 р. В дисплее использован контроллер ILI9341, о котором известно практически все, имеются библиотеки и обширный опыт использования. Единственная тонкость – питается дисплей от +5 вольт, а входы рассчитаны на 3.3в. Если напрямую соединить с Ардуино нано – работать не будет, но и не сгорит. Я использовал простейший конвертор 5 -> 3.3 -последовательно включенные резисторы 2.7 к. Сигнал MOSI резистора не требует – он идет от дисплея к процессору. Сигнал LED также не требует конверсии.
Для работы с дисплеем использована стандартная библиотека TFT v2 с незначительными доработками. В стандартной библиотеке вывод символа засвечивает нужные точки, но не стирает незасвеченные. Первый раз после стирания экрана все будет правильно, а второй и последующие – нет. Точки матрицы будут только включаться, но не выключаться и через десяток итераций на экране получится полностью засвеченный цветом символа прямоугольник. Я добавил в код библиотеки кусочек, который выводит фоновый цвет в неиспользуемые в символе точки.
Изменения в коде библиотеки
old:
void TFT::drawChar( INT8U ascii, INT16U poX, INT16U poY,INT16U size, INT16U fgcolor)
{
if((ascii>=32)&&(ascii<=127))
{
;
}
else
{
ascii = '?'-32;
}
for (int i =0; i<FONT_X; i++ ) {
INT8U temp = pgm_read_byte(&simpleFont[ascii-0x20][i]);
for(INT8U f=0;f<8;f++)
{
if((temp>>f)&0x01)
{
fillRectangle(poX+i*size, poY+f*size, size, size, fgcolor);
}
}
}
}
new:
void TFT::drawChar( INT8U ascii, INT16U poX, INT16U poY,INT16U size, INT16U fgcolor)
{
if((ascii>=32)&&(ascii<=127))
{
;
}
else
{
ascii = '?'-32;
}
for (int i =0; i<FONT_X; i++ ) {
INT8U temp = pgm_read_byte(&simpleFont[ascii-0x20][i]);
for(INT8U f=0;f<8;f++)
{
if((temp>>f)&0x01)
{
fillRectangle(poX+i*size, poY+f*size, size, size, fgcolor);
}
else
{
fillRectangle(poX+i*size, poY+f*size, size, size, BLACK);
}
}
}
}
void TFT::drawChar( INT8U ascii, INT16U poX, INT16U poY,INT16U size, INT16U fgcolor)
{
if((ascii>=32)&&(ascii<=127))
{
;
}
else
{
ascii = '?'-32;
}
for (int i =0; i<FONT_X; i++ ) {
INT8U temp = pgm_read_byte(&simpleFont[ascii-0x20][i]);
for(INT8U f=0;f<8;f++)
{
if((temp>>f)&0x01)
{
fillRectangle(poX+i*size, poY+f*size, size, size, fgcolor);
}
}
}
}
new:
void TFT::drawChar( INT8U ascii, INT16U poX, INT16U poY,INT16U size, INT16U fgcolor)
{
if((ascii>=32)&&(ascii<=127))
{
;
}
else
{
ascii = '?'-32;
}
for (int i =0; i<FONT_X; i++ ) {
INT8U temp = pgm_read_byte(&simpleFont[ascii-0x20][i]);
for(INT8U f=0;f<8;f++)
{
if((temp>>f)&0x01)
{
fillRectangle(poX+i*size, poY+f*size, size, size, fgcolor);
}
else
{
fillRectangle(poX+i*size, poY+f*size, size, size, BLACK);
}
}
}
}
Также пришлось изменить кусочки кода, отвечающие за дрыгание ногами RESET и CS. Библиотека рассчитана на использование выводов D4 и D5, а мне они были нужны для работы с таймерами. Поэтому выводы дисплея подключены к выводам D8 (Reset) и D9 (CS) и внесены следующие изменения в код:
Изменения в коде библиотеки
old:
#define TFT_RST_LOW {DDRD |= 0x10;PORTD &=~ 0x10;} //Added by Vassilis Serasidis (18 Oct 2013)
#define TFT_RST_HIGH {DDRD |= 0x10;PORTD |= 0x10;} //Added by Vassilis Serasidis (18 Oct 2013)
#define TFT_CS_LOW {DDRD |= 0x20;PORTD &=~ 0x20;}
#define TFT_CS_HIGH {DDRD |= 0x20;PORTD |= 0x20;}
new:
#define TFT_RST_LOW {DDRB |= 0x01;PORTB &=~ 0x01;} //changed by Sergey Dronsky 26 dec 2013
#define TFT_RST_HIGH {DDRB |= 0x01;PORTB |= 0x01;} //changed by Sergey Dronsky 26 dec 2013
#define TFT_CS_LOW {DDRB |= 0x02;PORTB &=~ 0x02;} //changed by Sergey Dronsky 26 dec 2013
#define TFT_CS_HIGH {DDRB |= 0x02;PORTB |= 0x02;} //changed by Sergey Dronsky 26 dec 2013
#define TFT_RST_LOW {DDRD |= 0x10;PORTD &=~ 0x10;} //Added by Vassilis Serasidis (18 Oct 2013)
#define TFT_RST_HIGH {DDRD |= 0x10;PORTD |= 0x10;} //Added by Vassilis Serasidis (18 Oct 2013)
#define TFT_CS_LOW {DDRD |= 0x20;PORTD &=~ 0x20;}
#define TFT_CS_HIGH {DDRD |= 0x20;PORTD |= 0x20;}
new:
#define TFT_RST_LOW {DDRB |= 0x01;PORTB &=~ 0x01;} //changed by Sergey Dronsky 26 dec 2013
#define TFT_RST_HIGH {DDRB |= 0x01;PORTB |= 0x01;} //changed by Sergey Dronsky 26 dec 2013
#define TFT_CS_LOW {DDRB |= 0x02;PORTB &=~ 0x02;} //changed by Sergey Dronsky 26 dec 2013
#define TFT_CS_HIGH {DDRB |= 0x02;PORTB |= 0x02;} //changed by Sergey Dronsky 26 dec 2013
Полный текст программы и измененные библиотеки можно взять тут
В окончательном варианте прибора задействован только счетчик T1, считающий импульсы с вывода D5. Вывод D4 остался незадействованым.
Поскольку прибор рассчитан на использование в режиме 24 на 7 – я принял меры против эффекта выгорания экрана. Все элементы, выводимые на экран, меняют цвет случайным образом и немного перемещаются по экрану тоже случайным образом. Не могу сказать, что это очень нужно для правильной работы, но программировать это было весело :)
Питается прибор через разъем мини усб на Ардуино. Внутренняя батарея не предусматривалась, а для обеспечения возможности работать автономно – например для проверки садового участка, куплен power bank емкостью 4000 мач. Измерения показали, что реальная емкость около 3000 мач, но и этой емкости хватает для работы радиометра в течении более 10 часов. Походить по даче хватит с избытком.
Для приема и обработки данных служит программа Radiometer, написанная на Visual Basic в среде Visual StudioExpress 2012.
Программа принимает данные от радиометра в фоновом потоке, отображает принятые данные в виде текста и графика:
В программе реализован механизм восстановления соединения в случае пропадания сигнала. Если канал упал и данных нет после истечения заданного таймаута — то программа закроет канал, почистит «хвосты» и опять откроет канал. И так будет делать, пока соединение не восстановится. В случае радиометра таймаут задан 3 минуты. Нормальный интервал поступления данных – 2 минуты. Программа правильно отрабатывает и отключение – включение передающего модуля, Wi-Fi точки доступа или любого связного оборудования по пути прохождения потока данных.
События открытия канала и закрытия пишутся в лог. Также отмечается событие запуска и остановки программы.
Данные и события отдельно пишутся в два отдельных текстовых файла.
По срабатыванию таймера 1 раз в 10 минут выполняется программа записи статистики в лог-файл.
По приходу данных из канала они помещаются в буфер и по достижению определенных условий этот буфер отправляется в программу обработки входных данных. В данной программе условие – последние байты строки равны vbCrLf (т.е.Hex(0D0A) они же символы «перевод каретки» «возврат строки»).
Подпрограмма обработки проверяет входную строку на формальную допустимость, используя механизм регулярных выражений. Если строка имеет недопустимый формат – об этом оставляется пометка в лог-файле. Если строка имеет допустимый формат – программа разделяет строку на элементы механизмом регулярных выражений, получая в результате массив элементов.
Дальнейшая обработка заключается в занесении нужных элементов в массивы типа «очередь FIFO» (QUEUE).
По массиву QUEUE рассчитывается максимум, минимум, среднее и СКО. Для расчета максимума, минимума и среднего использованы готовые методы объекта очередь. Расчет СКО сделан путем вывода элементов очереди в массив и обработки этого массива. Насколько я сумел понять из документации – можно сделать свой метод, но с наскока не получилось и я оставил это на будущее :).
Длина очереди выбрана равной 2400 элементов, что при интервале поступления данных в две минуты дает примерно 80 часов назад отображения фона радиоактивности.
Пик на графике – результат поднесения компаса.
Программу можно скачать тут
Описание скетча в Ардуино.
Блок –схема скетча:
Запуск программы
Инициализация дисплея
Инициализация таймера Т1, перевод его в режим счета импульсов от внешнего входа.
Инициализация сериал обмена на скорости 57600
Основной цикл скетча
Обнуление счетчика
Запоминание времени старта
Прием данных от сериал порта, поиск сообщения 1 («$GPRMC»)
Прием данных от сериал порта, поиск сообщения 2 («$GPGGA»)
Прием данных от сериал порта, поиск сообщения 3 («$GPVTG»)
Разбор и отображение данных от GLONASS\GPS
Отображение текущего состояния счетчика T1
Проверка условия окончания цикла – истекло время или счетчик насчитал более 100 импульсов
Фиксирование показаний счетчика и таймера
Расчет значения радиоактивности
Вывод на дисплей
Вывод в сериал канал
Описание вывода на встроенный дисплей.
Первая строка показывает число зарегистрированных импульсов в процессе измерения радиоактивности. Число меняется примерно раз секунду.
Вторая строка показывает рассчитанное значение радиоактивности в предыдущем цикле.
Следом идет блок из четырех строк. Это вывод информации от Глонасс\GPS модуля.
Первая строка – время UTC, дата, число спутников, данные от которых использованы в расчете решения, признак наличия решения (буква А или V)
095623 140514 08 A – 9:56:23 UTC 14/05/2014 8 спутников и решение есть.
Вторая строка широта и скорость в км\ч.
5545.13119 N означает 55 градусов 45.13119 минут северной широты
Третья строка долгота
03739.20397 E означает 37 градусов 39.20397 минут восточной долготы
Четвертая – скорость в милях в час, угол движения в градусах и высота в метрах.
Вывод ГЛОНАСС\GPS данных сделан упрощенно – просто выводятся части символьных строк без какого-либо преобразования.
Далее выводится максимальное значение радиоактивности за время наблюдения.
Бегущий график показывает изменение радиоактивности со временем. График автоматически подстраивается под максимальное значение в кольцевом буфере. При поднесении компаса получим такую картинку:
Буду рад ответить на вопросы.