Для демонстрации стимпанковского косплея понадобилась дымомашина (ну какой же стимпанк без дыма?), но на месте выступления ее не оказалось. Недолго думая, решил сделать свою маленькую дымомашину, с терморегулированием, дистанционным управлением (применялся контроллер ESP-12E) и батарейным питанием. За основу взял уже описывавшуюся дымелку с измерением температуры, но немного усложнил схему для улучшения характеристик.
Самым сложным элементом оказалось изготовление спирали и системы подачи смеси глицерина с пропиленгликолем. После пары экспериментов, остановился на шестивитковой спирали диаметром примерно 12 мм, намотанной из «косички», свитой из 7 титановых жил 0.29 диаметром. Вообще, лучше было бы взять более толстый провод и обойтись без «косички», но под рукой был ограниченный выбор материалов. Получившаяся спираль имеет сопротивление около половины ома, что дает теоретическую мощность для 12 вольт в 240 ватт (на деле — мощность нагрева будет меньше, из-за необходимости удержания температуры на отметке в 210-230 градусов).
Вообще была идея сделать нагреватель в виде заполненной машинным маслом медной трубки со спиралью внутри, что бы гарантировало практически полную равномерность нагрева и позволило бы сделать гораздо более мощный нагреватель, но под рукой не оказалось нужных материалов.
С подачей жидкости пришлось повозиться, так как она должна быть, с одной стороны, непрерывной и равномерной, а с другой — еще и не слишком обильной. Под рукой была водяная помпа, которая не имела регулировки подачи, поэтому остановился на следующей конструкции — перфорированная силиконовая трубка диаметром 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)
ссылка на оригинал статьи https://geektimes.ru/post/282986/
Добавить комментарий