Началось всё грустно. У меня в очередной раз сдохла Дельта. Это, честно говоря, уже не смешно. Это переходит все разумные границы. Но тем не менее… Она сдохла… На этот раз — блок питания отключил все розетки в квартире, выбив автомат. Проверка показала, что в нём пробило силовой биполярный транзистор. Причём транзистор — огого какой. 150 ваттный. У нас в Радиодеталях продаются только максимум 100 ваттные. В общем, пока ищу подходящий транзистор (или пару, если не точно такой, а совместимый), вместо штатного блока питания было решено поставить ATX блок от обычного компьютера.
В наше время, когда видеокарты — одна мощнее другой, у блоков питания чуть ли не основной веткой стала линия +12 вольт, так что этот абзац пригодится не всем. Но у меня нет свободных современных ATX блоков, есть только 10-15 летней давности. В те времена ветка +12 вольт была чуть ли не вторичной. Поэтому первый блок при проверке показал неприятные результаты. Вроде, крутой, фирменный (ThermalTake, ещё тех времён), 480 ваттный. По маркировке, по крайней мере. Просто когда шёл прогрев стола и сопла одновременно, линия +12 вольт просела до 9.5 вольт, а линия +5 — взлетела до 6.5 (в компьютерных блоках используется групповая стабилизация, так что это — нормальное явление). Пришлось его отставить в сторону. Кто его знает, какие там конденсаторы на пятивольтовой линии стоят. Ещё окажутся на 6.3 вольта… Да и просадка до девяти — это круто. Другой блок был 500-ватный. PowerMan (тоже ещё тех времён, когда это имя что-то значило). У этого просадка была всего на 0.2 вольта, а линия +5 — наоборот, выросла на 0.2 вольта. Но на проводах просадка была нехилая, поэтому пришлось припаяться старыми проводами от принтера напрямую к плате, а не использовать штатные разъёмы. Но то — мелочи. Лишь бы всё работало.
Ну, а раз около принтера нарисовался блок питания ATX — я решил осуществить свою давнюю мечту, заставив принтер самостоятельно выключаться по окончании печати. Чтобы если на ночь оставил печать — он бы сам заглох. Да и вообще, зря что ли у блока сделана функция выключения?
Смотрим исходники «прошивки». Нас интересует команда M81
Смотрим её код
thermalManager.disable_all_heaters();
stepper.finish_and_disable();
…
#elif HAS_POWER_SWITCH
OUT_WRITE(PS_ON_PIN, PS_ON_ASLEEP);
powersupply_on = false;
#endif
Отлично. Осталось найти, что это за порт PS_ON_PIN и что это за константа PS_ON_ASLEEP.
Моя плата, которая шла с Дельтой, совместима с RAMPS 1.4. Смотрим файл pins_RAMPS.h
К сожалению, эквивалента Ардуиновской ножки D12 на моей плате нет. Долго рыская, нашёл ножку D49. Меняю строку на
Перед тем, как искать засылаемую в порт константу, подумаем, как подключить ножку к ATX источнику. Логичнее всего — напрямую. Но не спешите!
Беда номер раз: Если мы подключим её напрямую, то кто её взведёт в активное состояние? Придётся городить питание от линии +5SB (Standby — дежурное напряжение) на разъём USB, чтобы через неё питался процессор, который всё будет включать. То есть, процессор всё время будет работать. И ещё он будет питаться от дежурки… Но о ней — чуть ниже.
Вторая проблема — это то, что линия включения подтянута всё на ту же линию дежурного напряжения. Чего я к дежурке прицепился? Ооооо! Кто ремонтировал ATX блоки питания (а я их ремонтировал), тот знает про волшебный электролитический конденсатор. Он подсыхает, его ёмкость уходит, система идёт вразнос, напряжение на выходе трансформатора дежурного напряжения — растёт. И у нас повышенное напряжение пойдёт в процессор AtMega. И сожжёт его! Причём пойдёт и по питанию, и через этот порт. Оно нам надо? Само собой, блоки питания так дохнут не часто, но я этот эффект последний раз наблюдал буквально на прошлой неделе. Хотя, предыдущий раз — лет 5 назад. Но закон Мерфи никто не отменял (сказал я, грустно глядя на то, как часто мрёт моя Дельта), так что лучше подстраховаться. В общем, вы как хотите, а я на дежурное напряжение завязываться не стал, а вытащил из ближайшей дохлой мышки первый попавшийся NPN транзистор и сделал вот такую схемку:
Кнопка SB1 используется для первоначального включения принтера. Следует подержать её подольше, чтобы программа дошла до функции включения. Тогда транзистор VT1 откроется и начнёт удерживать блок питания во включённом состоянии постоянно.
Теперь та самая константа, которая шлётся в порт. Она объявлена в файле Conditionals_post.h.
#define POWER_SUPPLY 1
#endif
#if (POWER_SUPPLY == 1) // 1 = ATX
#define PS_ON_AWAKE LOW
#define PS_ON_ASLEEP HIGH
#elif (POWER_SUPPLY == 2) // 2 = X-Box 360 203W
#define PS_ON_AWAKE HIGH
#define PS_ON_ASLEEP LOW
#endif
При выбранной мною схеме, включать нужно единицей, а выключать нулём. Ну что, в выделенной красным строке меняем 1 на 2? Как бы не так! Не поможет. И виной тому строка, выделенная синим. Дело в том, что константа уже объявлена! Так что менять следует именно первичное объявление в файле Configuration.h. Единицу на двойку меняем именно в этом файле
Ну вот. Осталось сделать скрипт выключения. Вставляем M81? Нет, нет и ещё раз нет! В этом случае, мы остановим вентилятор, охлаждающий термобарьер, на горячем хотэнде. Термобарьер прогреется, пластик в нём — расширится. И при следующем включении, его может заклинить. Сначала следует дождаться остывания хотэнда. Для этого есть замечательная команда M109 Rxxx. При таком варианте, принтер будет дожидаться не только нагрева, но и охлаждения хотэнда до заданной температуры. Поэтому в скрипт окончания печати добавляем строки:
M81 ; Switch power off
Запускаем пробную печать… Получаем подставочку для паяльника TS100 и подтверждение, что механизм работает.
Заключение
Даже выход принтера из строя, можно обратить себе на пользу. В частности, выход из строя блока питания и вынужденную замену его на ATX, можно использовать для добавления в принтер функции автоматического отключения по окончании печати. Вся необходимая функциональность в «прошивке» Mаrlin для этого уже имеется. Следует только произвести тонкую её настройку.
Комментариев нет