[recovery mode] Самодельная дымомашина
Для демонстрации стимпанковского косплея понадобилась дымомашина (ну какой же стимпанк без дыма?), но на месте выступления ее не оказалось. Недолго думая, решил сделать свою маленькую дымомашину, с терморегулированием, дистанционным управлением (применялся контроллер ESP-12E) и батарейным питанием. За основу взял уже описывавшуюся дымелку с измерением температуры, но немного усложнил схему для улучшения характеристик.
Самым сложным элементом оказалось изготовление спирали и системы подачи смеси глицерина с пропиленгликолем. После пары экспериментов, остановился на шестивитковой спирали диаметром примерно 12 мм, намотанной из «косички», свитой из 7 титановых жил 0.29 диаметром. Вообще, лучше было бы взять более толстый провод и обойтись без «косички», но под рукой был ограниченный выбор материалов. Получившаяся спираль имеет сопротивление около половины ома, что дает теоретическую мощность для 12 вольт в 240 ватт (на деле — мощность нагрева будет меньше, из-за необходимости удержания температуры на отметке в 210–230 градусов).
Провод спирали после свивания в косичку и намотки (мотать надо на трубку меньшего диаметра, так как титан очень упруг) лучше промыть и прокалить (подавая 12 вольт с батареи до красного каления, чтобы устранить попавшие органические загрязнения (жир с пальцев и тому подобное).
Вообще была идея сделать нагреватель в виде заполненной машинным маслом медной трубки со спиралью внутри, что бы гарантировало практически полную равномерность нагрева и позволило бы сделать гораздо более мощный нагреватель, но под рукой не оказалось нужных материалов.
С подачей жидкости пришлось повозиться, так как она должна быть, с одной стороны, непрерывной и равномерной, а с другой — еще и не слишком обильной. Под рукой была водяная помпа, которая не имела регулировки подачи, поэтому остановился на следующей конструкции — перфорированная силиконовая трубка диаметром 5 мм (полтора десятка отверстий сверлом 1.2 мм), обмотанная ватой, поверх которой и располагается спираль. Так как помпа гонит гораздо больше жидкости, чем вытекает через вату — конец трубки идет в тот же самый резервуар, откуда помпа забирает состав. Сам резервуар представляет из себя напечатанную на принтере чернильницу-непроливайку, которая находится под собственно спиралью и, ко всему прочему — собирает капли жидкости, которые с нее стекают.
Надо сказать, что неплотное прилегание спирали к вате (или даже просто слишком длинные выводы у спирали, которые не контактируют с жидкостью) приводят к неравномерному нагреву, что вызывает запах гари и дело может даже закончиться возгоранием. Из-за этого невозможно делать слишком большую или длинную спираль, ограничивая мощность. Поэтому методика была такой — поверх дырявого участка трубки наматывается прямоугольник ваты (в магазинах для вейперов она в таком виде и продается), затем полученный ватный цилиндр с трубкой внутри — вкручивается в спираль, как по резьбе.
В качестве вентилятора взял 12-вольтовую турбину, которую hobbyking как-то продавал за сущие копейки. Помпа — водяная китайская (из-за того что она была расчитана на 6 вольт, пришлось добавить еще dc-dc преобразователь на LM2596), подключена параллельно вентилятору. Питается машинка от 3S Li-Pol батареи 2.6 Ампер-часа с рейтингом 40C.
Схема:
Фрагмент кода управления (довольно грубая регулировка, не хотелось возиться с PID-контроллером и его настройкой), функцию pulse_heat_coil () вызываем с нужным промежутком для нагрева (рекомендуется в 10–20 миллисекунд). Для более точной регулировки — нужен как минимум второй АЦП (для одновременного измерения напряжения батареи) и отдельный от wifi контроллер (как в описанных мною модах для вейпинга на stm32 и arduino mini pro). Вентилятор с помпой лучше включать за несколько секунд до нагревателя и выключать через десяток секунд после, во избежание неприятных инцидентов.
// Measure coil resistance (and put it into coil_input)
#define TEST_RESISTOR 25
#define HALF_PULSE_RANGE 1.6
#define STOP_PULSE_RANGE 1.7
float coil_input_zero = 0.001;
float coil_input_zero, batt_input, coil_resist;
void measure_coil() {
// Measure battery voltage (only possible when heater on)
if (digitalRead(HEATER) == HIGH)
batt_input = analogRead(A0);
// Turn off heater
analogWrite(HEATER, 0);
digitalWrite(HEATER, LOW);
delayMicroseconds(10);
digitalWrite(TESTPIN, HIGH);
delayMicroseconds(10);
coil_input = analogRead(A0);
digitalWrite(TESTPIN, LOW);
delayMicroseconds(10);
if (coil_input_zero == 0.001)
coil_input_zero = coil_input;
coil_resist = TEST_RESISTOR * ((float) coil_input / (float) batt_input - 1);
} // void measure_coil()
// Make coil heating pulse with thermocontrol
void pulse_heat_coil(int pulse_delay) {
float curr = (float) coil_input / (float) coil_input_zero;
if ((coil_input < 1023) && (curr < STOP_PULSE_RANGE)) {
if (curr > HALF_PULSE_RANGE)
analogWrite(HEATER, PWMRANGE / 2);
else
analogWrite(HEATER, PWMRANGE-1);
delay(pulse_delay - 1);
} else {
analogWrite(HEATER, 0);
digitalWrite(HEATER, LOW);
delay(pulse_delay - 1);
}
delayMicroseconds(50);
measure_coil();
} // void pulse_heat_coil(int pulse_delay)