Источник

ПХМ-1 — вымышленный прибор из лаборатории Доктора Дью. Он предназначен для измерения качества присланных «самоделок» по линейной шкале. Очевидно, что это реквизит для съемок, тем не менее, устройство можно использовать в качестве шутки во многих областях, в том числе в IT.

Пошаговых инструкций по созданию ПХМ-1 не нашлось — пришлось писать самому.

История


Доктор Дью — эксцентричный, недовольный «самоделками» других блогеров образ Евгения Матвеева. Доктор жестко критикует и изредка хвалит «лайфхаки, упрощающие жизнь», демонстрируя их несостоятельность или непрактичность. В первых выпусках оценка качества рассматриваемых решений была субъективна, но вскоре Доктор решил сделать шоу более «научным».

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

В выпуске от 17 ноября 2019 года в кадре впервые появляется ПХМ-1 — прибор для измерения качества самоделок по линейной шкале от 0 до 250. Изначально это были проценты «антикачества» самоделки. Аббревиатура ПХМ содержит непечатные слова, поэтому оставлю ее без расшифровки. Дам лишь подсказку: «П» значит «полная».

У прибора есть народное название — ПолуляХМетр. Альтернатива родилась из-за единиц измерения на приборе — полуляхи. Доктор Дью сделал много обзоров самоделок блогера Александра Полуляха, и в честь него была названа единица измерения.

ПХМ-1 до сих пор используется практически в каждом выпуске. Этот прибор находится в состоянии суперпозиции: с одной стороны он выглядит достаточно простым, а с другой — попытка повторить прибор своими руками может стать настоящим вызовом в различных областях. Кроме того, в лучших традициях Доктора мы внесем в конструкцию несколько улучшений.

Реверс-инжиниринг


ПХМ-1 изнутри. Источник

Как я уже отмечал, пошаговых инструкций по созданию ПХМ-1 нет, однако на YouTube есть видео Вячеслава Чистова, где демонстрируется прибор. По времени публикации (16 ноября 2019 года) и уникальности видео можно утверждать, что Вячеслав является автором ПХМ-1. Это видео раскрывает внутренности прибора, а при внимательном изучении комментариев можно найти исходный код логики прибора.

Итак, беглым взглядом обнаруживаются следующие детали:

  • Arduino — точная модель неизвестна, но Nano или Pro Mini похожи по размерам;
  • потенциометр для «крутилки» — у меня 1 кОм;
  • источник питания — зависит от входного напряжения используемого микроконтроллера, на видео аккумулятор от старого телефона;
  • контроллер заряда — если необходим;
  • кнопка PBS-15B схема OFF-(ON);
  • измерительная головка серии M4206;
  • подстроечный резистор — для калибровки показаний измерительной головки;
  • источник звука — точная модель не принципиальна, у меня нашелся динамик 8 Ом;
  • светодиод — точную модель не установить, но внешне походят на мощные светодиоды компании arlight;
  • корпус распечатан на FDM 3D-принтере.

Сложнее всего было найти измерительную головку М4206, так как они давно сняты с производства. Мне удалось купить с рук микроамперметр 0-100 μA, датированный октябрем 1969 года.

Детали найдены, осталось разработать корпус.

Любим экспериментировать с пользой и пишем об этом. Читайте также:

Как быстро и за адекватные деньги поднять систему резервного копирования;
Как создать телеграм-бота для точного предсказывания погоды.

Корпус


Смоделированный в TinkerCAD корпус ПХМ-1

При воссоздании корпуса я вдохновлялся видео от создателя ПХМ-1 и несколькими выпусками Доктора Дью.

Объект в 3D-редакторах я моделировал впервые. Реальных размеров прибора у меня не было. Пришлось сделать пару прототипов из картона и термоклея, чтобы определить примерный размер ПХМ-1.

В качестве 3D-редактора я использовал TinkerCAD. Это было не лучшее решение, потому что скругление углов в этом редакторе — сложная задача. Более того, большое количество скруглений приводило к подтормаживанию интерфейса редактора и некорректному отображению объектов. Впрочем, это не так важно, потому что у меня не хватило навыков сделать такие же закругленные края, как в оригинале.

Я позволил себе некоторую вольность и добавил отсек для батареек вместо выреза под контроллер зарядки. Впрочем, его можно не устанавливать, поместив крышку в отверстие. Обратите внимание, что в проекте подразумевается идеальная точность. При печати наплавлением крышку стоит уменьшить на 1 мм с каждой стороны.

Ссылка на проект →

Две версии корпуса ПХМ-1: толстая скругленная и тонкая с батарейным отсеком

Печать производилась красным PETG-пластиком на стекле на скорости 30 мм/c. Половинки прибора печатались отдельно, надписью вверх. Для хорошего прилипания я использовал «юбку» и специальный клей. Саппорты не использовал. Это привело к тому, что первый внутренний слой боковой стороны провисал во время печати. Тем не менее, привести в порядок внутреннюю часть можно ацетоном или любой жидкостью, которая плавит соответствующий тип пластика.

Нежелание использовать саппорты было субъективным. Маленькие опоры плохо прилипали и, отрываясь, портили печать, а большие опоры, на мой взгляд, требовали больше работы для их удаления. Проще было расположить модель так, чтобы «провисания» были минимальны.

Я напечатал две версии корпуса:

  • с толстыми стенками в 5 мм и скруглениями углов;
  • с тонкими стенками и батарейным отсеком.

Оба варианта при печати «поплыли»: углы рукоятки при печати «взлетели» — в результате две половинки совмещаются не полностью. К сожалению, на данный момент у меня нет доступа к 3D-принтеру, чтобы исправить ошибки.

Вернемся к электронике.

Простая начинка


Я пролистал комментарии к видео и нашел оригинальный исходный код. Далее приведен код с восстановленной структурой и удаленными нецензурными выражениями.

Оригинальный исходный код (орфография и пунктуация сохранены)
void setup() {//тут всякая ненужная хрень
  int pol;
  int x;
  int sound;

  pinMode(5, OUTPUT); //тута тоже трогдать ненадо ничё
}

void loop() {
  int val = analogRead(A0)/4;
  randomSeed(analogRead(1));

  if (val<10){ //минимальное положение крутилки для запуска автопоиска ...
    for (int i=0; i < 50; i++){ //как долго ищем ..., 50 циклов сканирования
      int x = random(500);
      x = random(10, 512); //тут идёт генерация случайных чисел
      tone (2,x); //выводим писк случайным числом
      delay(50);
      analogWrite(5, x/2); // и выводим на стрелку (от 10 до 255) случайным образом
    }
  }
  else{


    for (int i=0; i < val; i++){ //сдесь происходит ручная установка ...
      analogWrite(5, i); //отклоняем стрелку до нужного положения
      tone (2,(i+150)*2); //и одновременно повышаем тон(переменная I+150*2 меняем цифры меняем высоту тона)
      delay(2);
    };
  }

  //дальше ... с длительностью писка и ожидания следующего цикла измерений
  delay(3000);
  noTone(2);
  delay(2000);
}



Из этого кода становится понятным следующее:

  1. Значение полуляхов, которое показывает прибор, выбирается «крутилкой», то есть потенциометром. Для чтения используется 10-битный аналогово-цифровой преобразователь (АЦП).
  2. При значении около нуля включается режим случайной генерации результата.
  3. Для отображения на аналоговом приборе используется широтно-импульсная модуляция.

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

Схема простого ПХМ-1 в TinkerCAD

Ссылка на проект →

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

Малое сопротивление динамика может привести к повреждению микроконтроллера. Рекомендуется добавить резистор или изменить способ включения динамика через транзистор.

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

И вот, ПХМ-1 готов, но остается ощущение, что платформа Arduino слишком мощная для такого прибора…

Сложная схема


Схема в системе моделирования Proteus

В ПХМ-1 на Arduino не было вызова: код готов, схема сделана навесным монтажом. Хотелось чего-нибудь посложнее. Так у меня появилась идея сделать логику ПХМ-1 на печатной плате с максимальной утилизацией вычислительной мощности микроконтроллера.

После небольшого анализа доступных микроконтроллеров выбор пал на ATTiny13:

  • 1 килобайт памяти программы;
  • 64 байта EEPROM;
  • 2 ШИМ-канала, реализованные на 1 таймере;
  • 10-битный АЦП.

В отличие от Arduino, у «голого» микроконтроллера нет обвязки, которая упрощает жизнь, в частности:

  • функции rand();
  • преобразователя напряжения (при снижении заряда источника питания показания прибора будут ниже ожидаемого);
  • функций analogWrite() и tone() — этим нужно заниматься самостоятельно через таймер.

Рассмотрим по порядку.

Генерация случайных чисел


Как и в случае с Arduino, АЦП позволяет считывать 10 бит информации, при этом два младших бита отбрасываются для повышения точности. Мы можем использовать один младший бит в качестве источника случайной величины. Однако такой генератор часто давал приближенные значения, поэтому я придумал «изящное архитектурное решение» в виде генерации трех чисел с последующим применением операции XOR.

unsigned char _rand(void) {
  unsigned char rnd = 0, i;
  for(i = 0; i < 8; i++) { 
    rnd <<=1;
    rnd |= (read_adc(POT, REF_INTERNAL) & 1); // POT – ножка потенциометра
  }                       
  return rnd;
}

inline unsigned char rand(void) {
  return (_rand() ^ _rand()) ^ _rand();
}

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

К счастью или сожалению, в симуляциях этот способ не работает из-за идеальности симуляции.

Работа при разных напряжениях


Следующая хитрая задача — уметь показывать правильные значения при разных напряжениях источника питания. Микроконтроллер ATTiny13 работает в диапазоне 2.7–5.5 вольт, хотя на практике выдерживает и 9 вольт.

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

  • добавить в схему делитель напряжения;
  • «откалибровать» микроконтроллер перед началом использования.

У микроконтроллера есть внутреннее опорное напряжение — 1.1 вольт. Используя делитель напряжения 1:4 и АЦП, умеющий читать до 1.1 вольта, можно вычислить текущее напряжение источника питания. Это позволит сформировать ШИМ-сигнал, выдаваемый на измерительную головку.

Чтобы этот способ работал, необходимо «откалибровать» микроконтроллер: подать питание из «доверенного» источника, например, из лабораторного блока питания. Подаем напряжение 3 вольта и сохраняем в EEPROM значение, прочитанное с ADC. Далее при запуске рабочей программы считывается значение из EEPROM и проводятся вычисления.

Рассмотрим на примере. При калибровке напряжение 3.0 вольта. После делителя напряжение равно 0.6 вольт. АЦП видит это значение как 614. Допустим, микроконтроллер работает от трех ААА-батареек по 1.5 вольта. После делителя напряжение составляет 0.9 вольт, АЦП выдает значение 922. Производим расчет:

3.0 * (922 / 614) = 4.5 (В)

Также при калибровке регулируется подстроечный резистор таким образом, чтобы при 3 вольтах стрелка измерительной головки отклонялась на 100%. Далее используем текущее напряжение при формировании ШИМ-сигнала.

ШИМ


Широтно-импульсная модуляция используется сразу для двух органов вывода: динамика и измерительной головки. Для вывода использовался один таймер, обработчик которого вызывается каждые 10 микросекунд.

В обработчике в явном виде назначается 0 или 1 каждой ноге.

#define SOUND PORTB.0
#define METER PORTB.1

interrupt [TIM0_COMPA] void timer0_compa_isr(void)
{
#if SETUP==0
  meter_it++; 
  if(meter_it >= METER_GOLD_MAX) {
    meter_it = 0;
  }    
  if(meter_it < meter_set) {
    METER = 1;
  } else {
    METER = 0;
  }

  if (sound_on) {
    sound_it++;
    if(sound_it >= sound_set) {
      sound_it = 0;
      SOUND ^= 1;   
    }
  } else {
    SOUND=0;
  }                 
#endif
}

Для звука важна стабильная частота, а для измерительной головки — доля времени, когда на соответствующей ножке логическая единица.

Печатная плата


Разводка DIP-версии платы

Для разводки я использовал программу Sprint Layout 6.0. На плате видны важные архитектурные элементы:

  1. делитель напряжения из двух резисторов с сопротивлениями 1:4,
  2. резистор и три отверстия для выводов потенциометра;
  3. резистор и подстроечный резистор перед выводами на измерительную головку;
  4. резистор на линии с динамиком;
  5. конденсатор на питании микроконтроллера.

Отдельно были сделаны выводы для кнопки и светодиода на передней части прибора, несмотря на то, что эти детали проще сделать навесным монтажом.

DIP-плата и компоненты

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

Демонстрация



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

Полный исходный код и файлы разводки схем можно найти на GitHub.

Заключение


Мне так и не удалось сделать ПХМ-1, в точности как у Доктора, но сам процесс создания был увлекательным. Если поискать в YouTube по запросу «ПХМ-2», то можно увидеть альтернативную версию прибора с экраном вместо измерительной головки.

Текущую версию прибора можно собрать как есть, а можно улучшать в физическом и программном планах.

Комментарии (26)


  1. bordakovskiy
    21.12.2021 13:48
    +1

    я всё думаю... selectel, доктор дюь, пхм.
    у selectel есть какие то проблемы?


    1. Firemoon Автор
      21.12.2021 14:05
      +10

      Это высокоточное оборудование в будущем будет помогать нашим коллегам на испанских барахолках. Но это не точно.

      P.S. Никаких проблем не наблюдаем.


      1. bordakovskiy
        21.12.2021 14:36
        +1

        Я бы всё же прибегнул к помощи доктора для колибровки!


        1. dragonnur
          22.12.2021 14:32

          Зачем Доктора на кол-то сразу?


  1. COKPOWEHEU
    21.12.2021 14:14
    +3

    Осталось померить свежеизготовленным прибором ваш же код. Полуляхов 100 — 150 показать должен.
    Конструкции вида PORTB.1, волшебный рандом (что помешало найти нормальную реализацию, а в качестве зерна надавать шумов с АЦП?), фоматирование кода без отступов (или это волшебный редактор Хабра сожрал?), отсутствие комментариев.

    #define SOUND PORTB.0
    SOUND ^= 1; 

    Этот кусок тоже тоже прекрасен. Захотите повесить пищалку на другой вывод, поменяете дефайн — а оно не заработает.


    1. Dpal
      22.12.2021 10:38

      Добавить к этому "Корпус немного поплыл при печати, поэтому две половинки просто приложены друг к другу." и показания прибора увеличатся. :)

      Но статья мне все равно понравилась. )


      1. COKPOWEHEU
        22.12.2021 11:00
        +2

        Да корпус-то видно что времянка. Полоски от 3Д-печали это вообще несерьезно. Оригинал сделан «под СССР», из характерного красного пластика, с рельефным номером, не удивлюсь если там даже надпись «ц. 35 коп.» найдется.
        Но тут не представляю как это повторить в домашних условиях.


  1. asmodeusta
    21.12.2021 17:41
    +1

    А вы тоже читали статью с голосом Доктора в качестве диктора?


    1. bordakovskiy
      21.12.2021 17:44
      +7

      хаха!

      Единственное, что автор упустил

      ЗДРАААСССССССССЬЬ

      ну вы поняли


  1. x8973
    21.12.2021 17:54
    +9

    Несколько лет назад делал на ролевку по Сталкеру показометр "ХЗ-метр", который с легкой руки одного из игроков стал называться ДП-1 (Детектор лиц нетрадиционной сексуальной ориентации). Взял AtMega8, ультразвуковой дальномер HC-SR04, индикатор на TM1637, и пьезопищалку ЗП-5. Суть была в том, что чем ближе был ближайший предмет, тем чаще оно пищало и тем большие цифры показывало на дисплее. Таким образом обыгрывалось то, что любой предмет, на который наводился "прибор", "фонил HZ-излучением". Сейчас "прибор" благополучно подарен команде "ученых" для использования на играх в качестве интерактивного антуражного предмета, осталась только одна фотография.


  1. Squoworode
    21.12.2021 18:34
    +9

    Имея один ПХМ, можно ПХметрировать всё что угодно, кроме самого ПХМ.

    Имея два ПХМ, можно ПХметрировать абсолютно всё.


  1. altervision
    21.12.2021 19:21

    Вы же понимаете, что по всем канонам ваша самоделка - полная ... ? ;) Но почему-то работает ...


  1. 027
    21.12.2021 19:58

    Матвеев, это тебя. ©


  1. engine9
    22.12.2021 00:32
    +7

    Забавно, я как-то ради стёба тоже эскизировал стационарный полуляхометр.


    1. dragonnur
      22.12.2021 14:34
      +2

      Спасибо за идею: вместо Вкл и Выкл в моей версии будет "Е.анёт" и "Не должно" :)


      1. engine9
        23.12.2021 00:51

        С выводом высоковольтного генератора на сам тумблер?


        1. dragonnur
          23.12.2021 08:01

          Это будет опцией :)


  1. beerchaser
    22.12.2021 04:58
    +1

    Следующий челендж - пхм на рассыпухе. генератор например на ne555, интегратор на оу с выходом на измерительную головку. пищалка на пьезике. мах значения частот задать резисторами(тривиально). случайные значения - варианты сходу: термистор, фотосопротивление. :)


    1. engine9
      22.12.2021 11:52
      +1

      И обязательно на германиевых МПшках военной приёмки, иначе не канон!


  1. K1804
    22.12.2021 05:23

    Хм, сделайте мензуру Зоили Изпитал для определения наивероятнейшего количества читателей условной статьи на Хабре.


  1. UA3USY
    22.12.2021 10:46
    +3

    Привет автору статьи!) Я Чистов, автор прибора. если нужные исходники прибора и 3д модель пиши ))


    1. COKPOWEHEU
      22.12.2021 11:02
      +2

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


      1. UA3USY
        22.12.2021 11:04
        +2

        всё делалось из того что валялось на столе. корпус рисовал и печатал друг. у меня тогда 3д принтера не было . для желающих оригинальный корпус тут https://disk.yandex.ru/d/flKGSJ3HHjNWBg


  1. atepaevm
    22.12.2021 11:47
    +2

    Автор - молодец, очень нравятся его статьи, одна годнота


  1. Ommonick
    22.12.2021 13:27
    +1

    Немного оффтоп, но думаю это видео с Дью достойно зависнуть тут:
    https://www.youtube.com/watch?v=blPFDWEMRDU


  1. UA3USY
    22.12.2021 16:48
    +7

    Пожалуй стоит дополнить статью моим комментарием как автора прибора. Прибор создавался из того что валялось на столе, за исключением корпуса .  Корпус моделировал и печатал товарищ Иван Черноусов из Москвы. У него и опыта больше и принтер был . В качестве процессора использован ардуиноподобный программатор esc lincer, для авиамоделей. Подарили кучку их использовал как аналог ардуино нано с 2 портами выхода)) . Миллиамперметр- это был вольтметр переменного тока до 250 вольт. Выкинул потроха оставив только головку. Динамик высокоомный от какой то телефонной трубки. Подбирал для получения максимальной громкости без унч. На камеру конечно звук слабоват, но в реале слышно нормально. Батарея от телефона, плата зарядки, и светодиод тут всё вроде понятно. Кнопка от старых электро- счётчиков. Крутилка переменного резистора выточена из дюральки и отфрезерована. Сделана была ранее для пробы и тоже валялась на столе. Её и поставил. Всё собрал за 1-2 вечера. Допиливая корпус по месту. Не программист и код писал чтоб лишь бы заработало . оно даже заработало. исходники и корпус доступен по ссылке https://disk.yandex.ru/d/18BSGZLeu1EU7A

    крутилко
    крутилко
    Начинко
    Начинко