Самодельная дымомашина

в 12:03, , рубрики: arduino, DIY, diy или сделай сам, ESP-8266, дымомашина, Носимая электроника

Для демонстрации стимпанковского косплея понадобилась дымомашина (ну какой же стимпанк без дыма?), но на месте выступления ее не оказалось. Недолго думая, решил сделать свою маленькую дымомашину, с терморегулированием, дистанционным управлением (применялся контроллер 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.

Схема:

image

Фрагмент кода управления (довольно грубая регулировка, не хотелось возиться с 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)

Автор: vasimv

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js