Дозиметр на Ардуино и СБТ-11

Тема в разделе "Флудилка", создана пользователем CYITEP_BAC9I, 10 фев 2018.

  1. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Здравствуйте всем. Планирую начать новую опупею с дозиметром. Самодельных дозиметров воз и маленькая тележка схем. На сбм-20 люди уже отработали технологию. И можно просто повторить. Но я хочу сделать дозиметр на датчике СБТ-11. С ним уже интереснее, но много нюансов. Люди делали на нем дозиметры но на голой Атмеге.

    http://vrtp.ru/index.php?act=categories&CODE=article&article=3552

    Прошивки есть но в .ino их никто переводить не будет. Поэтому попробую написать скетч сам. (с возможными вставками кода других авторов).

    За основу по питанию хочу взять этот проект http://srukami.inf.ua/ardos.html
    [​IMG]

    Но поскольку у меня нет 3.3 Ардуин, буду делать на 5 вольтовой. Вот и думаю нужно ли менять номиналы резисторов для нормально работы транзисторов кт315. Питание для повышающего трансформатора планирую брать непосредственно с литий ионного аккумулятора 18650. (так как перещитывать обмотки для питания 5в очень лениво. В крайнем случае шимом подкорректирую) Думаю резисторы для транзистора подающего шим сигнал на трансформатор можно оставить как они есть

    Подключить датчик планирую так
    [​IMG]
    Считывание будет с обоих катодов на пины 2 и 3.

    Самое сложное для меня выбрать алгоритм регистрации и подсчета импульсов.

    Сильно не вникая пробежался по основным способам которые использовали авторы в самодельных дозиметрах.

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

    2 (так мною и не понятый) каждые 500 мкс происходит проверка пинов на наличие сигнала. Потом отдельно считается сколько раз в секунду пришел положительный ответ с пина

    3 запуск счетчика импульсов прерывание по сигналу на пине (у меня их 2). потом отдельно считается сколько импульсов было в секунду.

    Самый интересный но за мудрёный способ

    Алгоритм усреднения таков: каждую секунду отображается сумма импульсов, накопленных за последние 36сек, поделенная на 2, результат = мкр/ч. Если количество импульсов, зарегистрированных за время, меньшее чем 36 сек, будет равно 20, то вычисление значения фона производится по формуле: 18/(36сек минус время, за которое накопились 20имп) = мкр/ч.
    и такое обновление происходит каждую секунду, т.е. программа начинает складывать в цикле имп. по истечению 1 сек, проверка на больше или равно 20, если нет, то складываем с имп. за 2ю секунду, проверка на больше или равно 20, если нет, то 3ю и т.д., но если проверка на больше или равно 20 положительна, то применяется формула: 18/(36сек минус время, за которое накопились 20имп) = мкр/ч, а если так и не превысило значение 20, то цикл останавливается на 36й секунде и результат равен (имп. за 36 сек)/2 = мкр/ч.

    В принципе сама формула имп/сек*18 = мкр.ч


    Еще жалею что на одном из форумов читал что для СБТ-11 при повышении 250-300 имп/с нужно полученные значения умножать на 1.4 или 1.6. блин не записал что за форум а теперь не могу найти((( что этот датчик при определенном повышении фона начинает занижать показания и это нужно учитывать(хотя я надеюсь таких случае не будет)

    Теоретически код написать вполне смогу но вот с расчётом микрорентгенов полный завал. Да и радиометрию ради поделки не хочется изучать.

    На форуме как я понял некоторые делали дозиметры и поэтому прошу консультации.

    Можно ли так подключить датчик?

    Можно ли применить вышеуказанную схему для питания от 5в?

    Какой способ подсчета имп/с самый оптимальный с учетом того что сигнал будет приходить с 2х секций датчика?

    Пока все.

    Проект имеет обучающе прикладной характер.
    С уважением
     
    Последнее редактирование: 14 фев 2018
  2. timofeevvas

    timofeevvas Нерд

    Лучше третий способ. Прямые подсчеты нехороши тем, что можно импульс пропустить если МК задумается (а это обязательно будет если МК занят чем-то еще помимо подсчета). Другое дело как посчитать импульсы так чтобы, не было двойного подсчета.
    По поводу питания: сидел очень интересную схему повышающего преобразователя. Простая до жути. У человека работает, но сам не пробовал: http://theiopage.blogspot.ru/2012/09/simple-gm-tube-interfacing-to-arduino.html
     
    CYITEP_BAC9I нравится это.
  3. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    спасибо начну наверное писать потихоньку. единственно не понял в чем сакральный смысл 20 импульсов
    форум тот похоже загнулся давно и возможно придется самому додумывать
    тоже думал((( если сигнал идет на 1 пин то ничего страшного не случится они просто наложаться один на другой. а если сигнал одновременно с 2х датчиков пришел то не знаю даже как прерывания их отработают и что с ними делать дальше, или складывать, или считать как 1 импульс. блин видно за сложную задачу взялся(((
    Но будем пробовать
     
  4. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    ночер добрый. почитал литературку, хотел бросить это дело, сложновато это однако(((
    но в качестве объкта для саморазвития, буду пилить потихоньку. можно ли эту тему из флудилки пернести в Arduino&Shilds ? не уверен в успехе, но буду стараться довести до ума. с подсчетом импульсов сейчас думаю и консультируюсь.
    на данном этапе меня другое интересует. кто нибудь делал схемы с использованием PWM ардуино, для повышающего трансформатора с обратной связью. что то плохо гуглил но встретились лишь единичные примеры.
    кстати
    он как раз и использует пвм для накачки трансформатора, но только без обратной связи.
    если кто в курсе подскажите как правильно управлять частотой, в зависимости от данных с высоковольтной части трансформатора.
    Кстати нубский вопрос, можно ли измерить напряжение на выходе трасформатора просто полдключив щупы к выходу. или лучше резюк посадить ?
     
    Последнее редактирование: 11 фев 2018
  5. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    вечер добрый всем. начал потихоньку писать обработку импульсов с датчика. Как я и предполагал затычка выхдит когда срабатывают условия для 2х прерываний по спаду одновременно. Датчик юзать жалко поэтому написал что то типа симулятора датчика. на пины 4, 5 в случайном порядке подается напряжение которое с них подается на пины с прерываниями. и там уже обрабатывается. тут 2 варианта или я неправильно сделал симуляцию датчка (нужно чтобы в случайном порядке на пинах было 0 и 5 в). или действительно при одновременном срабатывании прерываний не идет прибавление счетчика частиц.
    [​IMG]
    Код (C++):
     #define detector_1 2 //первая часть датчика посажена на пин 2 прерывание 0
    #define detector_2 3 //вторая часть датчика посажена на пин 3 прерывание 1
    #define Gen_1   4 //пин генератор случайных импульсов для прерывания 0
    #define Gen_2   5  //пин генератор случайных импульсов для прерывания 1
    int check_sum_OUT =0; //контрольная сумма для выходного генератора
    int check_sum_IN =0; // контрольная сумма принятых импульсов

    int check_counter_1, check_counter_2 =0; //счетчик исходящих импульсов для прерываний 0бля1
    volatile int Count =0 ; //счетчик импульсов
    bool randGen_1; // генепратор случайнх значений
    bool randGen_2; // генератор случайных значений
    void setup() {
      // put your setup code here, to run once:
    attachInterrupt(0, Particle_counting_1, FALLING); //прерывание по спаду фронта
    attachInterrupt(1, Particle_counting_2, FALLING); //прерыванеие по спаду фронта
    Serial.begin(9600);
    pinMode(Gen_1, OUTPUT); //пины генератор импульсов на выход
    pinMode(Gen_2, OUTPUT);
    digitalWrite(Gen_1, 1); //подаем напряжение на пины
    digitalWrite(Gen_2, 1);
    }

    void loop() {
      // put your main code here, to run repeatedly:
    //Serial.println (Count);
    //Serial.println ("digitalRead(detector_1)");
    //Serial.println (digitalRead(detector_1));
    //Serial.println ("digitalRead(detector_2)");
    //Serial.println (digitalRead(detector_2));
    randGen_1 = random(0, 2); //случайное число от 0 до 1
    digitalWrite(Gen_1, randGen_1); //включаем или выключаем пин в зависимости от переменной randGen_1
    if(randGen_1 ==0); //счетчик о значений или спада фронта
    {
      check_counter_1++;
    }
    delay(1);
    randGen_2 = random(0, 2);
    digitalWrite(Gen_2, randGen_2);
    if(randGen_2 ==0);
    {
      check_counter_2++;
    }
    delay(1);

    check_sum_OUT =check_counter_1+check_counter_2; //контрольная сумма всех 0 положений пина
    check_sum_IN = Count;
    Serial.println ("check_sum_OUT");
    Serial.println (check_sum_OUT);
    Serial.println ("Count");
    Serial.println (Count);
      Serial.println ("digitalRead(detector_1)");
    Serial.println (randGen_1);
    Serial.println ("digitalRead(detector_2)");
    Serial.println (randGen_2);

    }

    void Particle_counting_1 ()
    {
    //  detachInterrupt(0); // закомментированная часть когда пытался сделать чтобы ничего кроме
    //прерываний не происходило
      Count++;
    // while(digitalRead(detector_1)==0){
      //}
    // attachInterrupt(0,Particle_counting_1,FALLING);
    }
    void Particle_counting_2 ()
    {
       // detachInterrupt(1);
      Count++;
      //while(digitalRead(detector_2)==0){
    // }
      //attachInterrupt(0,Particle_counting_2,FALLING);
    }
    в общем если коротко. подскажите как считать импульсы(работать с прерываниями), если сигналы пришли одновременно с 2х датчиков. Вероятность такого события очень высока
     
  6. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    продолжаю свой дневник). в моем симуляторе было много ошибок, но разобрался самостоятельно. Опытным путем выяснил что счетчик вполне корректно работает при одновременном событии на прерываниях. пошел пилить вычисление микроренгенов.
     
    Последнее редактирование: 13 фев 2018
  7. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Уже не надеюсь на ответ. но все же.
    подскажите пожалуйста как организовать код и вычисления что бы как можно меньше было задержек для приема сигналов.
    пока идея такая.
    Код (C++):
    void setup() {
    attachInterrupt(0, Particle_counting_1, FALLING);
    attachInterrupt(1, Particle_counting_2, FALLING);
    }

    void loop() {

    while(таймер  <1 секунды)
    {
      здесь идет только подсчет времени и  импульсов  основной первод в измеряемые единицы
      как только время по таймеру натикает 1 секунду
      передаем все данные в  цикл вывода данных на экран

    }
    while(цикл индикации на экран)
    {
      здесь происходит вывод данных на экран.
      А их будет довольно много. служебные вычисления
      такие как уровень батареи и тд
      как только прошлись по нему сразу же возвращаемся в цикл1
      miilis  на сколько я понял тикает в любом случае и при переходе в цикл
      измерений просто сделать перерасчет сколько за это время пришло импульсов
    }

    }
    void Particle_counting_1 ()
    {
       Count++;
    }
    void Particle_counting_2 ()
    {
      Count++;
    }
    Просьба профи. подскажите пожалуйста как грамотно организовать работу программы. чтоб основное рабочий ресурс МК был отдан измерению входящих сигналов и лиш что останется отводилось для работы с экранчиком.
    Я конечно и до этого допру рано или поздно. Но хотелось бы услышать мнение опытных людей, как поступать в таких случаях. теоретически хочу вытянуть ресурс мк для регистрации до 17600 импульсов в секунду (по крайней мере хочется так)
     
  8. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Спасибо всем за помощь. И до этого додумался (или думаю что додумался) . все вычисления будут происходить раз в секунду по таймеру. думаю в пол секунды должен уложиться со всеми процессами. Затем флаг запрета всех операций, кроме подсчета импульсов. и снова до начала следующей секунды.
    Наверное задам впрос крайний раз(, и закруглюсь на этом, видно сильно специфические вопросы или неправильно спрашиваю. что ни у кого нет ответов. Хотя могли сильно сократь время по поиску решений.
    Кстати много ли можно выиграть тактов МК если кнопки управления меню и работой прибора посадить на прерывания? Чтоб он не проверял в каждом цикле digitalRead?
    и специфический вопрос. сильно ли влияет на количество тактов (Времени) вывод картинок на лсд дисплей типа Нокия 5110.
    думаю отказаться от украшательств в виде значка заряда батареи, значков радиации и всяких плюшек, в пользу оптимизации и сокращения времени исполнения кода.
     
  9. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    продолжаю свой дневник, вдруг кому полезными будут мои изыски, да и инфу удобнее хранить вне компа, всегда под рукой. только что закончил гонять дуню. бодро регистрирует на 1 пин до 15000 спадов фронта сигнала в секунду. 16000 имп/сек уже начинуются пропуски в среднем теряется 50 -80 импульсов. предел 16100 имп/сек. мне такой скорости регистрации хватит выше крыши)))
    в преводе на характеристики датчика около 350 микрорентген/ сек, для дозиметра бытового назначения это весьма неплохо)))
     
    Последнее редактирование: 14 фев 2018
  10. ostrov

    ostrov Гуру

    Как вариант, сделать для каждого датчика отдельный контроллер, который будет только и делать что считать импульсы и скидывать регулярно результат на главный МК. Резко увеличить производительность можно используя STM32f103, он шустрее раз в 10, при этом дешев и поддерживается IDE.
     
    CYITEP_BAC9I и Сусемьбек нравится это.
  11. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Спасибо большое. точно STM32!!!!!!!!!! по всем параметрам подходит!!!
     
  12. timofeevvas

    timofeevvas Нерд

    STM32, если я не ошибаюсь, почти не переваривают 5В. Это 3.3В МК. Некоторые модели толерантны к 5-ти вольтам, но надо быть аккуратным.
    Р.S. Это на случай использования дополнительной периферии.
     
    CYITEP_BAC9I нравится это.
  13. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    здравствуйте всем! посколько тема жива еще. Подскажите пожалуйста кто работал с библиотекой
    Adafruit_GFX.h , как самым простым способос сделать чтобы при прелистывании пунктов меню, активный( тот который выбран в данный момент менял способ отображения. с черного текста на белом фоне , на белые буквы на черном фоне. везде в описании только такие команды встречаются
    • setContrast(50) - задает контраст дисплея
    • setTextSize(1) - размер шрифта
    • setTextColor(WHITE) - цвет текста WHITE и BLACK
    • setCursor(x, y) - устанавливает координаты, куда будет печататься текст
    • println("Text") - печать текста
    • drawCircle(20, 20, 5, BLACK); - рисует круг
    • drawRect(10, 10, 20, 20, BLACK); - рисует прямоугольник
    • drawTriangle(10, 10, 20, 10, 20, 20, BLACK); - рисует триугольник
    • drawLine(0, 0, 20, 20, BLACK); - рисует линию
    • drawPixel(10, 10, BLACK); - рисует один пиксель (точка)
    • drawBitmap(0, 0, smileBmp, 84, 44, BLACK); - рисует изображение из массива bmp файла
    • clearDisplay() - очищает дисплей
    в данном случае мне не лень изучать, просто времени немного на мое хобби остается , а сделать еще очень много нужно. (дня 3 только потратил на алгоритм подсчета импульсов. код получился строк 70 зато аналогов такого алгоритма подсчета импульсов еще не встречал))). не пропускает ни одного импулса). теперь ваяю меню.
    пока что делаю так. при выборе пункта меню меняю цвет отображения на белый + черный прямоугольник в ту же область. но это очень неудобно и громоздко. чую что есть более простой способ. + встречал в скетчах что то похожее на команды форматирования, типа центр , лефт райт. но в описании библиотеки что то не встретил таких команд.
    Если коротко. подскажите как инвертировать отображение текста, белый текст на черном фоне, максимально простым способом для этой библиотеки.
    [​IMG]
     
    Последнее редактирование: 16 фев 2018 в 11:58
  14. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Да ничего страшного, у меня всего 400 вольт на датчике:) (шутка).
    STM для данного проекта вообще, то что доктор прописал. не надо конвертора уровней на экранчик, питать от 18650 еще проще, а перед входными пинами поставить резюки и все норм даже номиналы перещитывать не придется. Другое дело что у меня ее нет сейчас , заказал конечно (причем выбрал продавца с наилучшей репутацией) Поэтому пока пишу кот для Дуни, максимально спартанский и куций.
    к тому же на дуне я хоть и с костылями но освоил низкоуровневое программирование. А на СТМ подозреваю все это знания никуда не канают.
     
  15. timofeevvas

    timofeevvas Нерд

    Не совсем. Вот тут лежит годная (на мой взгляд) как заставить работать СТМ32 из под Ардуино ИДЕ. То есть: пишешь код как на Дуню - оно это превращает в работоспособную прошивку для СТМ. Цена такого костыля - более тяжелые прошивки, но для несложных проектов это не имеет большого значения, благо памяти завались.
     
    CYITEP_BAC9I нравится это.