Источник
ПХМ-1 — вымышленный прибор из лаборатории Доктора Дью. Он предназначен для измерения качества присланных «самоделок» по линейной шкале. Очевидно, что это реквизит для съемок, тем не менее, устройство можно использовать в качестве шутки во многих областях, в том числе в IT.
Пошаговых инструкций по созданию ПХМ-1 не нашлось — пришлось писать самому.
Доктор Дью — эксцентричный, недовольный «самоделками» других блогеров образ Евгения Матвеева. Доктор жестко критикует и изредка хвалит «лайфхаки, упрощающие жизнь», демонстрируя их несостоятельность или непрактичность. В первых выпусках оценка качества рассматриваемых решений была субъективна, но вскоре Доктор решил сделать шоу более «научным».
Доктор Дью с болгаркой для труднодоступных мест. Источник
В выпуске от 17 ноября 2019 года в кадре впервые появляется ПХМ-1 — прибор для измерения качества самоделок по линейной шкале от 0 до 250. Изначально это были проценты «антикачества» самоделки. Аббревиатура ПХМ содержит непечатные слова, поэтому оставлю ее без расшифровки. Дам лишь подсказку: «П» значит «полная».
У прибора есть народное название — ПолуляХМетр. Альтернатива родилась из-за единиц измерения на приборе — полуляхи. Доктор Дью сделал много обзоров самоделок блогера Александра Полуляха, и в честь него была названа единица измерения.
ПХМ-1 до сих пор используется практически в каждом выпуске. Этот прибор находится в состоянии суперпозиции: с одной стороны он выглядит достаточно простым, а с другой — попытка повторить прибор своими руками может стать настоящим вызовом в различных областях. Кроме того, в лучших традициях Доктора мы внесем в конструкцию несколько улучшений.
ПХМ-1 изнутри. Источник
Как я уже отмечал, пошаговых инструкций по созданию ПХМ-1 нет, однако на YouTube есть видео Вячеслава Чистова, где демонстрируется прибор. По времени публикации (16 ноября 2019 года) и уникальности видео можно утверждать, что Вячеслав является автором ПХМ-1. Это видео раскрывает внутренности прибора, а при внимательном изучении комментариев можно найти исходный код логики прибора.
Итак, беглым взглядом обнаруживаются следующие детали:
Сложнее всего было найти измерительную головку М4206, так как они давно сняты с производства. Мне удалось купить с рук микроамперметр 0-100 μA, датированный октябрем 1969 года.
Детали найдены, осталось разработать корпус.
Смоделированный в TinkerCAD корпус ПХМ-1
При воссоздании корпуса я вдохновлялся видео от создателя ПХМ-1 и несколькими выпусками Доктора Дью.
Объект в 3D-редакторах я моделировал впервые. Реальных размеров прибора у меня не было. Пришлось сделать пару прототипов из картона и термоклея, чтобы определить примерный размер ПХМ-1.
В качестве 3D-редактора я использовал TinkerCAD. Это было не лучшее решение, потому что скругление углов в этом редакторе — сложная задача. Более того, большое количество скруглений приводило к подтормаживанию интерфейса редактора и некорректному отображению объектов. Впрочем, это не так важно, потому что у меня не хватило навыков сделать такие же закругленные края, как в оригинале.
Ссылка на проект →
Две версии корпуса ПХМ-1: толстая скругленная и тонкая с батарейным отсеком
Печать производилась красным PETG-пластиком на стекле на скорости 30 мм/c. Половинки прибора печатались отдельно, надписью вверх. Для хорошего прилипания я использовал «юбку» и специальный клей. Саппорты не использовал. Это привело к тому, что первый внутренний слой боковой стороны провисал во время печати. Тем не менее, привести в порядок внутреннюю часть можно ацетоном или любой жидкостью, которая плавит соответствующий тип пластика.
Я напечатал две версии корпуса:
Оба варианта при печати «поплыли»: углы рукоятки при печати «взлетели» — в результате две половинки совмещаются не полностью. К сожалению, на данный момент у меня нет доступа к 3D-принтеру, чтобы исправить ошибки.
Вернемся к электронике.
Я пролистал комментарии к видео и нашел оригинальный исходный код. Далее приведен код с восстановленной структурой и удаленными нецензурными выражениями.
Из этого кода становится понятным следующее:
Схема простого ПХМ-1 в TinkerCAD
Ссылка на проект →
Несмотря на кажущуюся простоту, этот код требует модификаций в зависимости от используемой модели Arduino. Важно, чтобы выводы на измерительную головку и на динамик были на разных таймерах.
Многие симуляции подразумевают, что у микроконтроллера всегда есть питание. В нашей схеме это не так. Между источником питания и микроконтроллером стоит кнопка, которая в нормальном состоянии размыкает сеть. Таким образом, при нажатии кнопки микроконтроллер включается, показывает Х полуляхов, и кнопку можно отпускать.
И вот, ПХМ-1 готов, но остается ощущение, что платформа Arduino слишком мощная для такого прибора…
Схема в системе моделирования Proteus
В ПХМ-1 на Arduino не было вызова: код готов, схема сделана навесным монтажом. Хотелось чего-нибудь посложнее. Так у меня появилась идея сделать логику ПХМ-1 на печатной плате с максимальной утилизацией вычислительной мощности микроконтроллера.
После небольшого анализа доступных микроконтроллеров выбор пал на ATTiny13:
В отличие от Arduino, у «голого» микроконтроллера нет обвязки, которая упрощает жизнь, в частности:
Рассмотрим по порядку.
Как и в случае с Arduino, АЦП позволяет считывать 10 бит информации, при этом два младших бита отбрасываются для повышения точности. Мы можем использовать один младший бит в качестве источника случайной величины. Однако такой генератор часто давал приближенные значения, поэтому я придумал «изящное архитектурное решение» в виде генерации трех чисел с последующим применением операции XOR.
Так как вращение потенциометра влияет на показания, удобнее всего снимать показания именно с его линии. Однако режим случайных показаний находится около нуля, а потенциометр в крайнем левом положении имеет нулевое сопротивление и АЦП будет стабильно выдавать одинаковые значения. Чтобы этого избежать, в цепь последовательно включается резистор.
К счастью или сожалению, в симуляциях этот способ не работает из-за идеальности симуляции.
Следующая хитрая задача — уметь показывать правильные значения при разных напряжениях источника питания. Микроконтроллер 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 каждой ноге.
Для звука важна стабильная частота, а для измерительной головки — доля времени, когда на соответствующей ножке логическая единица.
Разводка DIP-версии платы
Для разводки я использовал программу Sprint Layout 6.0. На плате видны важные архитектурные элементы:
Отдельно были сделаны выводы для кнопки и светодиода на передней части прибора, несмотря на то, что эти детали проще сделать навесным монтажом.
DIP-плата и компоненты
Процесс создания платы объяснять не буду, в интернете достаточно технологий разной скорости и качества.
Корпус немного поплыл при печати, поэтому две половинки просто приложены друг к другу. Тем не менее, устройство полностью выполняет возложенные на него обязанности.
Полный исходный код и файлы разводки схем можно найти на GitHub.
Мне так и не удалось сделать ПХМ-1, в точности как у Доктора, но сам процесс создания был увлекательным. Если поискать в YouTube по запросу «ПХМ-2», то можно увидеть альтернативную версию прибора с экраном вместо измерительной головки.
Текущую версию прибора можно собрать как есть, а можно улучшать в физическом и программном планах.
ПХМ-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);
}
Из этого кода становится понятным следующее:
- Значение полуляхов, которое показывает прибор, выбирается «крутилкой», то есть потенциометром. Для чтения используется 10-битный аналогово-цифровой преобразователь (АЦП).
- При значении около нуля включается режим случайной генерации результата.
- Для отображения на аналоговом приборе используется широтно-импульсная модуляция.
Хотя режим случайной генерации выглядит хорошо для шуток в домашних условиях, Доктор Дью использовал этот режим для обыгрывания ситуации «сошедшего с ума» прибора из-за различного звучания режимов.
Схема простого ПХМ-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:4,
- резистор и три отверстия для выводов потенциометра;
- резистор и подстроечный резистор перед выводами на измерительную головку;
- резистор на линии с динамиком;
- конденсатор на питании микроконтроллера.
Отдельно были сделаны выводы для кнопки и светодиода на передней части прибора, несмотря на то, что эти детали проще сделать навесным монтажом.
DIP-плата и компоненты
Процесс создания платы объяснять не буду, в интернете достаточно технологий разной скорости и качества.
Демонстрация
Корпус немного поплыл при печати, поэтому две половинки просто приложены друг к другу. Тем не менее, устройство полностью выполняет возложенные на него обязанности.
Полный исходный код и файлы разводки схем можно найти на GitHub.
Заключение
Мне так и не удалось сделать ПХМ-1, в точности как у Доктора, но сам процесс создания был увлекательным. Если поискать в YouTube по запросу «ПХМ-2», то можно увидеть альтернативную версию прибора с экраном вместо измерительной головки.
Текущую версию прибора можно собрать как есть, а можно улучшать в физическом и программном планах.