Pull to refresh
Selectel
IT-инфраструктура для бизнеса

Самоделка — полная…: ПХМ-1 из пластика и кремния

Reading time8 min
Views32K
Источник

ПХМ-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», то можно увидеть альтернативную версию прибора с экраном вместо измерительной головки.

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

Tags:
Hubs:
Total votes 55: ↑51 and ↓4+63
Comments27

Articles

Information

Website
slc.tl
Registered
Founded
Employees
1,001–5,000 employees
Location
Россия
Representative
Влад Ефименко