RSS блога
Подписка
Рукоятка паяльного фена и постройка станции на ее базе
- Цена: $10.35
- Перейти в магазин
Обзор ручки фена, подходящей к огромному количеству станций (858D, 8586, 8858, 852, 878, 952, 853), а так же постройка простой самодельной станции на ее основе.
Порой, монтаж без фена весьма затруднен или вообще невозможен и, столкнувшись в очередной раз с корпусом TQFP, я решился. За приобретение готового изделия говорила экономия времени, за постройку самодела – интерес и возможность полной кастомизации под свои нужды. Вопрос экономии тут весьма спорный, впрочем, в конце постараемся посчитать.
На AliExpress была выбрана и заказана ручка с набором из 5 сопел по принципу дешевле – лучше. Также, был заказан разъем GX16-8. Стоило сразу заказать и рукоятку, но она была заказана уже после постройки фена и все еще прорывается ко мне сквозь дебри нашей почты. Итак, что же мы получили:
Ручка выполнена из достаточно крепкого пластика, все провода выведены через переходную планку. Качество насадок спорное – сами по себе они вполне пригодны, но держатся на рукоятке не слишком крепко. Нужно накернить чуть сильнее уже имеющиеся углубления в насадках и проблема решена.
Турбина рассчитана на напряжение 24 В, потребляет ток 0.25 А.
Сам нагреватель обернут в стеклоткань (очень жесткую на изгиб) и вставлен в металлический наконечник ручки.
На конце нагревателя размещена термопара, тип скорее всего K (возможно, J). Сопротивление нагревателя в холодном виде 76 Ом, что дает нам мощность меньше 700 Вт. От наконечника выведен провод корпуса. На одной из половин корпуса находятся щели для забора воздуха турбиной. Я не знаю, конструктивная это особенность и задумка или просто косяк, но ребра жесткости на внутренней поверхности ручек закрывают эти щели почти наполовину.
Я не стал ломать голову и убрал лишний пластик.
Длина кабеля от рукоятки до части, где общая изоляция уже снята – ровно 100 см. Схема рукоятки:
Для создания контроллера станции первоначально я планировал использовать готовую Arduino Nano, но затем жадность и отсутствие лишнего места в будущем корпусе натолкнули на мысль поставить внутрь устройства МК Atmega328P-PU с минимальной обвязкой.
В качестве элемента индикации был взят популярный дисплей от Nokia 5110, в качестве элемента управления – роторный энкодер с кнопкой. Для питания турбины из закромов был взят старый импульсный блок питания от сканера, который имеет дежурный режим (около 7 В) и рабочий (24 В). Он же питает и контроллер через простой линейный стабилизатор LM7805 в корпусе TO-220. Потребляемый МК и дисплеем ток незначителен, и после установки небольшого алюминиевого радиатора на стабилизатор его нагрев не превысил 40 градусов. Питание нагревателя осуществляется симистором BTA12-600 (замечу, что он тут явно избыточен), который управляется МК через оптопару MOC3041M со встроенной схемой детекции перехода через ноль. Это, в совокупности со снабберной цепью, позволяет минимизировать уровень помех от переключения симистора. Выход термопары усиливается крайне простым и популярным ОУ LM358. Управление потоком воздуха осуществляется посредством мосфета IRLZ44N и ШИМ сигнала с МК. Такой же мосфет управляет переключением блока питания из дежурного режима в рабочий. Когда рукоятка фена снята с подставки, осуществляется нагрев потока воздуха до установленной температуры, турбина работает в соответствии с установленным потоком воздуха. После установки рукоятки в подставку нагрев прекращается, а турбина работает в режиме 50% в течении двух минут, после чего отключается и МК переводит блок питания в дежурный режим, выход из которого осуществляется при поднятии рукоятки с подставки. Режим работы станции отображается на дисплее рядом со значением установленной температуры латинской буквой (H – в данный момент осуществляемся нагрев, B – рукоятка в подставке, S — станция перешла в дежурный режим). Если использовать блок питания без дежурного режима, то транзистор T1, резисторы R8 и R9 можно исключить.
Вся схема была опробована на макетке, после чего была изготовлена нормальная печатная плата, часть схемы, отвечающая за коммутирование сетевого напряжения, была вынесена на отдельную плату.
В качестве корпуса был использован пластиковый корпус Gainta G1034B с внешними размерами 151х90х53.2 мм. В передней части были изготовлены отверстия под дисплей, энкодер и разъем GX16-8, в задней под сетевой кабель и тумблер. Дисплей, энкодер и плата коммутации сетевого напряжения подключаются к основной через цанговые PLS разъемы с шагом 2.54 мм.
Сразу после постройки станция показывает нам значения напряжения на АЦП МК вместо температуры горячего воздуха, и ее нужно откалибровать. Для этого собираем «стенд» из собственно станции и прибора, которым будем измерять температуру.
Я не знаю реальных погрешностей прибора, и сразу укажу, что по факту мы не получим превосходной точности, и в той или иной степени показания нашей станции будут «попугаями». Но мне не нужна была точность до десятых долей градуса, а нужна была именно стабильность. Измерять мы будем температуру воздуха перед самым выходом из рукоятки, зафиксировав термопару прибора по которому производится калибровка. По факту, используя различные насадки, мы будем получать разную температуру воздуха на выходе из них, но этот недостаток присущ абсолютно всем фенам.
По результатам измерений мы получаем графики зависимости реальной температуры от показаний. Для каждого значения потока воздуха – свой график, то есть 8 графиков (от 30 до 100 % с интервалом в 10 %). Дело в том, что на такой длине провода на вход LM358 поступает существенная наводка от питания турбины, и ее значение нелинейно зависит от коэффициента заполнения ШИМ. Удобно результаты заносить сразу в Excel и использовать построение диаграмм с отображением формулы. Для каждого значения ШИМ мы получим формулу вида Y=K*X+A, где K — мультипликативный коэффициент, который записывается в массив значений K (для 30% это 0-ой член массива, для 40% 1-ый и так далее), а A — аддитивный коэффициент, записывающийся в скетч по тому же принципу с округлением до целого числа. Так мы сразу получаем два массива по 8 значений, которые и заносим в скетч с последующей загрузкой обновленной прошивки.
После этого мы получаем вполне пригодный для работы фен с установкой температуры в диапазоне 0 – 500 °С с шагом в 10 °С и установкой потока воздуха в диапазоне 30-100 % с шагом в 10 %. Диапазоны и шаг можно откорректировать в скетче.
Для подсчета экономической целесообразности подсчитаем затраты:
Рукоятка — 607,89 руб.
Подставка рукоятки – 267,83 руб.
Корпус – 160 руб.
Контроллер AtMega328P-PU – 90,08 руб.
ОУ LM358 (99,27 руб. за 20 шт.) – 4,96 руб.
Оптопара MOC3041M – 24 руб.
Энкодер – 40,53 руб.
Экран – 109,70 руб.
Разъем GX16-8 — 82,23 руб.
Кварц (96,92 руб. за 10 шт.) – 9,69 руб.
Мосфет IRLZ44N (102,79 за 10 шт., понадобилось 2 шт.) – 20,56 руб.
Симистор BTA12-600 (148,02 за 10 шт.) – 14,80 руб.
Плата FR4 размером 10x7 см (211,45 руб. за 5 шт.) – 42,29 руб.
Тумблер сетевой, разъем сетевой – около 100 руб.
СМД резисторы, конденсаторы, термоусадка, провода, термоклей и прочие расходники – еще около 100 руб.
Итого: 1674,56 руб.
Цены указаны на момент покупки оффлайн или заказа с учетом стоимости доставки. С одной стороны, это снижает стоимость (ведь никто вам не продаст всего 1 кварц за 9,69 руб.), с другой стороны почти все заказы содержали не одну позицию мелочевки, и на самом деле реальная стоимость доставки для каждой конкретной мелочи получается меньше.
UPD: Действительно, в подсчете не учтена стоимость блока питания, так как я использовал доставшийся бесплатно. За дешевый блок питания на напряжение 24 В и ток около 1 А придется выложить в районе 300 рублей, и общий бюджет упрется в сумму около 2 000 рублей.
Эта стоимость соответствует самому нижнему ценовому диапазону на фены и, можно сказать, что экономически постройка фена самому обоснованна. Однако, стоит учитывать количество потраченного времени на создание схемы, написание скетча, исполнение это «в металле» и последующее допиливание.
Файлы:
Основная плата
Плата коммутации
Библиотеки
Скетч прошивки
В схему, скетч и печатную плату периодически вносятся изменения на основе выявленных недостатков от меня самого и других людей, собравших фен. Прошу отнестись с пониманием, наиболее полные и функциональные варианты доступны по ссылке на google-диск.
Порой, монтаж без фена весьма затруднен или вообще невозможен и, столкнувшись в очередной раз с корпусом TQFP, я решился. За приобретение готового изделия говорила экономия времени, за постройку самодела – интерес и возможность полной кастомизации под свои нужды. Вопрос экономии тут весьма спорный, впрочем, в конце постараемся посчитать.
На AliExpress была выбрана и заказана ручка с набором из 5 сопел по принципу дешевле – лучше. Также, был заказан разъем GX16-8. Стоило сразу заказать и рукоятку, но она была заказана уже после постройки фена и все еще прорывается ко мне сквозь дебри нашей почты. Итак, что же мы получили:
Ручка выполнена из достаточно крепкого пластика, все провода выведены через переходную планку. Качество насадок спорное – сами по себе они вполне пригодны, но держатся на рукоятке не слишком крепко. Нужно накернить чуть сильнее уже имеющиеся углубления в насадках и проблема решена.
Турбина рассчитана на напряжение 24 В, потребляет ток 0.25 А.
Сам нагреватель обернут в стеклоткань (очень жесткую на изгиб) и вставлен в металлический наконечник ручки.
На конце нагревателя размещена термопара, тип скорее всего K (возможно, J). Сопротивление нагревателя в холодном виде 76 Ом, что дает нам мощность меньше 700 Вт. От наконечника выведен провод корпуса. На одной из половин корпуса находятся щели для забора воздуха турбиной. Я не знаю, конструктивная это особенность и задумка или просто косяк, но ребра жесткости на внутренней поверхности ручек закрывают эти щели почти наполовину.
Я не стал ломать голову и убрал лишний пластик.
Длина кабеля от рукоятки до части, где общая изоляция уже снята – ровно 100 см. Схема рукоятки:
Для создания контроллера станции первоначально я планировал использовать готовую Arduino Nano, но затем жадность и отсутствие лишнего места в будущем корпусе натолкнули на мысль поставить внутрь устройства МК Atmega328P-PU с минимальной обвязкой.
В качестве элемента индикации был взят популярный дисплей от Nokia 5110, в качестве элемента управления – роторный энкодер с кнопкой. Для питания турбины из закромов был взят старый импульсный блок питания от сканера, который имеет дежурный режим (около 7 В) и рабочий (24 В). Он же питает и контроллер через простой линейный стабилизатор LM7805 в корпусе TO-220. Потребляемый МК и дисплеем ток незначителен, и после установки небольшого алюминиевого радиатора на стабилизатор его нагрев не превысил 40 градусов. Питание нагревателя осуществляется симистором BTA12-600 (замечу, что он тут явно избыточен), который управляется МК через оптопару MOC3041M со встроенной схемой детекции перехода через ноль. Это, в совокупности со снабберной цепью, позволяет минимизировать уровень помех от переключения симистора. Выход термопары усиливается крайне простым и популярным ОУ LM358. Управление потоком воздуха осуществляется посредством мосфета IRLZ44N и ШИМ сигнала с МК. Такой же мосфет управляет переключением блока питания из дежурного режима в рабочий. Когда рукоятка фена снята с подставки, осуществляется нагрев потока воздуха до установленной температуры, турбина работает в соответствии с установленным потоком воздуха. После установки рукоятки в подставку нагрев прекращается, а турбина работает в режиме 50% в течении двух минут, после чего отключается и МК переводит блок питания в дежурный режим, выход из которого осуществляется при поднятии рукоятки с подставки. Режим работы станции отображается на дисплее рядом со значением установленной температуры латинской буквой (H – в данный момент осуществляемся нагрев, B – рукоятка в подставке, S — станция перешла в дежурный режим). Если использовать блок питания без дежурного режима, то транзистор T1, резисторы R8 и R9 можно исключить.
Скетч
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <Encoder.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 8); // Определяем пины для подключения дисплея
Encoder myEnc(2, 3); // Определяем пины для подключения энкодера
int encButton = 9; // Определяем пин для подключения кнопки энкодера
int pinPWM = 10; // Определяем пин для управления скорость вращения турбины
int pinSSR = 13; // Определяем пин для управления коммутацией нагревателя
int pinOn = 12; // Определяем пин для управления включением блока питания из дежурного режима
int pinBase = 11; // Определяем пин для подключения геркона
static const unsigned char PROGMEM logo_bmp[] = // Рисуем каркас меню
{ B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11110000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B10000000, B00000000, B10000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00000000, B00010000,
B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11111111, B11110000
};
static const unsigned char PROGMEM cursor_bmp[] = // Рисуем курсор
{ B11111111, B11111111,
B10000000, B00000000,
B10000000, B00000000,
B10000000, B00000000,
B10000000, B10000000,
B10000000, B11100000,
B10000000, B11111000,
B10111111, B11111110,
B10000000, B11111000,
B10000000, B11100000,
B10000000, B10000000,
B10000000, B00000000,
B10000000, B00000000,
B11111111, B11111111
};
float realTemp = 0; // Реальное значение температуры
int setTemp = 100; // Установленное значение температуры
byte realPWM = 0; // Реальное значение оборотов турбины
byte setPWM = 50; // Установленное значение оборотов турбины
byte indexPWM = 0; // Индекс для выбора правильных коэффициентов пересчета температуры
int realTempArray[100]; // Массив для усреднения значения температуры при измерениях
unsigned long summTemp = 0; // Сумма данных массива
int averTemp = 0; // Усредненная температура
int minTemp = 0; // Минимальное значение температуры для станции
int maxTemp = 500; // Максимальное значение температуры для станции
byte minPWM = 30; // Минимальное значение оборотов турбины
byte maxPWM = 100; // Максимальное значение оборотов турбины
long timeCurrent = 0; // Таймер для хранения текущего времени
long timeMenu = 0; // Таймер для управления меню
long timeMeasurement = 0; // Таймер для управления циклами измерений
long timeSleep = 0; // Таймер для управления уходом в сон
long oldPosition = 0; // Переменная для чтения данных с энкодера
long newPosition = 0; // Переменная для чтения данных с энкодера
bool selectMenu = LOW; // Выбранное меню
bool flagEnc = LOW; // Флаг для устранения дребезга при вращении энкодера
bool flagEncButton = LOW; // Флаг для устранения дребезга при нажатии энкодера
bool flagBase = HIGH; // Флаг положения ручки в подставке
bool flagSleep = HIGH; // Флаг состояния сна
bool heat = LOW; // Флаг нагрева
int hysteresis = 3; // Температурный гистерезис
float K[8] = {0.500, 0.528, 0.528, 0.535, 0.535, 0.522, 0.505, 0.492}; // Мультипликативный коэффициент подсчета температуры
int A[8] = {36, 31, 32, 28, 23, 22, 22, 15}; // Аддитивный коэффициент подсчета температуры
void setup() {
TCCR1B = TCCR1B & 0b11111000 | 0x02; // Устанавливаем частоту ШИМ на 10 выводе как 3906.25 Гц
pinMode(A1, INPUT); // Определяем аналоговый пин A1 на ввод (выход ОУ)
pinMode(encButton, INPUT); // Определяем пин encButton на ввод
pinMode(pinBase, INPUT); // Определяем пин pinBase на ввод
pinMode(pinPWM, OUTPUT); // Определяем пин pinPWM на вывод
pinMode(pinSSR, OUTPUT); // Определяем пин pinSSR на вывод
pinMode(pinOn, OUTPUT); // Определяем пин pinOn на вывод
digitalWrite(pinOn, HIGH); // Подаем на пин включения высокий уровень TTL (переводим блок питания из дежурного режима в рабочий)
display.begin();
display.setContrast(50);
display.display();
}
void loop() {
flagBase = !digitalRead(pinBase); // Получаем состояния пина pinBase
timeCurrent = millis(); // Получаем текущее время
if ((timeCurrent - timeMeasurement) >= 100) { // Если с прошлого измерения прошло больше 100 мсек
heat = LOW; // Выключаем нагрев
digitalWrite(pinSSR, heat); // Отправляем на вывод состояние нагрева
delay(50); // Ждем 50 мсек (для исключения влияния помех от симистора)
summTemp = 0; // Обнуляем сумму
for (byte i = 0; i <= 99; i++) { // И повторяем 100 раз цикл
realTemp = analogRead(A1); // Считываем значение на A1
realTempArray[i] = realTemp; // Записываем в массив показаний
summTemp = summTemp + realTempArray[i]; // Складываем все элементы массива
}
averTemp = round(summTemp / 100); // Подсчитываем среднее арифметическое
indexPWM = realPWM / 10 - 3; // Вычисляем индекс коэффициентов пересчета показаний в температуру
realTemp = round(K[indexPWM] * averTemp + A[indexPWM]); // Вычисляем реальное значение температуры
timeMeasurement = millis(); // Записываем время проведения измерения
}
if (flagBase == LOW) { // Если ручка не в подставке
digitalWrite(pinOn, HIGH); // Включаем блок питания из дежурного режима в рабочий
flagSleep = LOW; // Устанавливаем флаг сна в низкий уровень
analogWrite(pinPWM, map(setPWM, 30, 100, 76, 255)); // Выводим ШИМ на pinPWM
realPWM = setPWM; // Приравниваем реальное значение PWM установленному
if (setTemp > realTemp + hysteresis ) { // Если установленная температуры выше чем сумма реальной и гистерезиса
heat = HIGH; // Включаем нагрев
}
if (setTemp < realTemp) { // Если установленная температура меньше реальной
heat = LOW; // Выключаем нагрев
}
digitalWrite(pinSSR, heat); // Отправляем на вывод состояние нагрева
timeSleep = millis(); // Записываем последнее время, когда ручка не в подставке
}
else { // Если ручка в подставке
heat = LOW; // Выключаем нагрев
digitalWrite(pinSSR, heat); // Отправляем на вывод состояние нагрева
if (((timeCurrent - timeSleep) <= 120000) && (flagSleep == LOW)) { // Если прошло меньше 120 секунд с последнего раза, когда ручка была не в подставке и станция не в режиме сна
analogWrite(pinPWM, 128); // Выводим ШИМ с заполнением 50% на pinPWM
realPWM = 50; // Записываем в реальное значение ШИМ 50
}
else { // Иначе
digitalWrite(pinPWM, LOW); // Отключаем турбину
realPWM = 0; // Записываем в реальное значение ШИМ 0
digitalWrite(pinOn, LOW); // Переводим блок питания в дежурный режим
flagSleep = HIGH; // Записываем в флаг сна высокое значение TTL
}
}
display.clearDisplay(); // Очищаем дисплей
display.drawBitmap(0, 0, logo_bmp, 84, 48, BLACK); // Рисуем каркас меню
display.setTextColor(BLACK); // Устанавливаем цвет текста
display.setTextSize(2); // Устанавливаем размер текста
display.setCursor(13, 3); // Устанавливаем координаты курсора
display.println(realTemp, 0); // Выводим значение реальной температуры
display.setCursor(56, 0); // Устанавливаем координаты курсора
display.println("o"); // Отрисовываем знак градуса
display.setCursor(67, 3); // Устанавливаем координаты курсора
display.println("C"); // Отрисовываем "C"
display.setTextSize(1); // Устанавливаем размер текста
display.setCursor(22, 24); // Устанавливаем координаты курсора
display.println(setTemp); // Выводим значение установленной температуры
display.setCursor(46, 21); // Устанавливаем координаты курсора
display.println("o"); // Отрисовываем знак градуса
display.setCursor(52, 24); // Устанавливаем координаты курсора
display.println("C"); // Отрисовываем "C"
display.setCursor(70, 24); // Устанавливаем координаты курсора
if (heat == HIGH) { // Если нагрев включен
display.println("H"); // Отрисовываем "H"
}
if (flagBase == HIGH) { // Если ручка в подставке
if (flagSleep == LOW) { // Если станция не в режиме сна
display.println("B"); // Отрисовываем "B"
}
else { // Если станция в режиме сна
display.println("S"); // Отрисовываем "S"
}
}
display.setCursor(20, 37); // Устанавливаем координаты курсора
display.print(realPWM); // Выводим значение реальных оборотов турбины
display.print("/"); // Отрисовываем "/"
display.print(setPWM); // Выводим значение установленных оборотов турбины
display.print(" %"); // Отрисовываем " %"
if (selectMenu == 0) { // Если выбран 0-ой пункт меню
display.drawBitmap(0, 21, cursor_bmp, 16, 14, BLACK); // Отрисовываем курсор напротив значения установленной температуры
}
else { // Иначе
display.drawBitmap(0, 34, cursor_bmp, 16, 14, BLACK); // Отрисовываем курсор напротив значения оборотов турбины
}
display.display(); // Отображаем все на дисплее
newPosition = myEnc.read(); // Читаем позицию энкодера
if (flagEnc == LOW) { // Если флаг энкодера в низком уровне
bool buttonState = digitalRead(encButton); // Читаем в переменную buttonState значение с кнопки энкодера
if (buttonState == 0) { // Если это низкий уровень (кнопка нажата)
if (flagEncButton == HIGH) { // Если флаг кнопки энкодера в высоком уровне
selectMenu = !selectMenu; // Выбираем следующий пункт меню
flagEnc = HIGH; // Устанавливаем флаг энкодера в высокий уровень
timeMenu = millis(); // Записываем время, когда трогали меню
flagEncButton = LOW; // Устанавливаем флаг кнопки энкодера в низкий уровень
}
else { // Если флаг кнопки энкодера в низком уровне
flagEncButton = HIGH; // Устанавливаем его в высокий уровень
}
}
else { // Если это высокий уровень (кнопка не нажата)
flagEncButton = LOW; // Устанавливаем флаг кнопки энкодера в низкий уровень
}
if (newPosition != oldPosition) { // Если позиция энкодера изменилась
flagEnc = HIGH; // Устанавливаем флаг энкодера в высокий уровень
timeMenu = millis(); // Записываем время, когда трогали меню
if (newPosition > oldPosition) { // Если новая позиция энкодера больше предыдущей
if (selectMenu == 0 && setTemp < maxTemp) { // Если выбран пункт меню 0 и температура меньше максимальной
setTemp = setTemp + 10; // Увеличиваем температуру на 10
}
if (selectMenu == 1 && setPWM < maxPWM) { // Если выбран пункт меню 1 и обороты меньше максимальных
setPWM = setPWM + 10; // Увеличиваем обороты на 10
}
}
if (newPosition < oldPosition) { // Если новая позиция меньше предыдущей
if (selectMenu == 0 && setTemp > minTemp) { // Если выбран пункт меню 0 и температура больше минимальной
setTemp = setTemp - 10; // Уменьшаем температуру на 10
}
if (selectMenu == 1 && setPWM > minPWM) { // Если выбран пункт меню 1 и обороты больше минимальных
setPWM = setPWM - 10; // Уменьшаем обороты на 10
}
}
}
}
if ((timeCurrent - timeMenu) >= 250) { // Если прошло больше 250 мсек с момента, как трогали меню
flagEnc = LOW; // Устанавливаем флаг энкодера в низкий уровень
oldPosition = newPosition; // Сохраняем позицию энкодера
}
}
Вся схема была опробована на макетке, после чего была изготовлена нормальная печатная плата, часть схемы, отвечающая за коммутирование сетевого напряжения, была вынесена на отдельную плату.
В качестве корпуса был использован пластиковый корпус Gainta G1034B с внешними размерами 151х90х53.2 мм. В передней части были изготовлены отверстия под дисплей, энкодер и разъем GX16-8, в задней под сетевой кабель и тумблер. Дисплей, энкодер и плата коммутации сетевого напряжения подключаются к основной через цанговые PLS разъемы с шагом 2.54 мм.
Сразу после постройки станция показывает нам значения напряжения на АЦП МК вместо температуры горячего воздуха, и ее нужно откалибровать. Для этого собираем «стенд» из собственно станции и прибора, которым будем измерять температуру.
Я не знаю реальных погрешностей прибора, и сразу укажу, что по факту мы не получим превосходной точности, и в той или иной степени показания нашей станции будут «попугаями». Но мне не нужна была точность до десятых долей градуса, а нужна была именно стабильность. Измерять мы будем температуру воздуха перед самым выходом из рукоятки, зафиксировав термопару прибора по которому производится калибровка. По факту, используя различные насадки, мы будем получать разную температуру воздуха на выходе из них, но этот недостаток присущ абсолютно всем фенам.
По результатам измерений мы получаем графики зависимости реальной температуры от показаний. Для каждого значения потока воздуха – свой график, то есть 8 графиков (от 30 до 100 % с интервалом в 10 %). Дело в том, что на такой длине провода на вход LM358 поступает существенная наводка от питания турбины, и ее значение нелинейно зависит от коэффициента заполнения ШИМ. Удобно результаты заносить сразу в Excel и использовать построение диаграмм с отображением формулы. Для каждого значения ШИМ мы получим формулу вида Y=K*X+A, где K — мультипликативный коэффициент, который записывается в массив значений K (для 30% это 0-ой член массива, для 40% 1-ый и так далее), а A — аддитивный коэффициент, записывающийся в скетч по тому же принципу с округлением до целого числа. Так мы сразу получаем два массива по 8 значений, которые и заносим в скетч с последующей загрузкой обновленной прошивки.
После этого мы получаем вполне пригодный для работы фен с установкой температуры в диапазоне 0 – 500 °С с шагом в 10 °С и установкой потока воздуха в диапазоне 30-100 % с шагом в 10 %. Диапазоны и шаг можно откорректировать в скетче.
Для подсчета экономической целесообразности подсчитаем затраты:
Рукоятка — 607,89 руб.
Подставка рукоятки – 267,83 руб.
Корпус – 160 руб.
Контроллер AtMega328P-PU – 90,08 руб.
ОУ LM358 (99,27 руб. за 20 шт.) – 4,96 руб.
Оптопара MOC3041M – 24 руб.
Энкодер – 40,53 руб.
Экран – 109,70 руб.
Разъем GX16-8 — 82,23 руб.
Кварц (96,92 руб. за 10 шт.) – 9,69 руб.
Мосфет IRLZ44N (102,79 за 10 шт., понадобилось 2 шт.) – 20,56 руб.
Симистор BTA12-600 (148,02 за 10 шт.) – 14,80 руб.
Плата FR4 размером 10x7 см (211,45 руб. за 5 шт.) – 42,29 руб.
Тумблер сетевой, разъем сетевой – около 100 руб.
СМД резисторы, конденсаторы, термоусадка, провода, термоклей и прочие расходники – еще около 100 руб.
Итого: 1674,56 руб.
Цены указаны на момент покупки оффлайн или заказа с учетом стоимости доставки. С одной стороны, это снижает стоимость (ведь никто вам не продаст всего 1 кварц за 9,69 руб.), с другой стороны почти все заказы содержали не одну позицию мелочевки, и на самом деле реальная стоимость доставки для каждой конкретной мелочи получается меньше.
UPD: Действительно, в подсчете не учтена стоимость блока питания, так как я использовал доставшийся бесплатно. За дешевый блок питания на напряжение 24 В и ток около 1 А придется выложить в районе 300 рублей, и общий бюджет упрется в сумму около 2 000 рублей.
Эта стоимость соответствует самому нижнему ценовому диапазону на фены и, можно сказать, что экономически постройка фена самому обоснованна. Однако, стоит учитывать количество потраченного времени на создание схемы, написание скетча, исполнение это «в металле» и последующее допиливание.
Файлы:
Основная плата
Плата коммутации
Библиотеки
Скетч прошивки
В схему, скетч и печатную плату периодически вносятся изменения на основе выявленных недостатков от меня самого и других людей, собравших фен. Прошу отнестись с пониманием, наиболее полные и функциональные варианты доступны по ссылке на google-диск.
+228 |
18925
117
|
Самые обсуждаемые обзоры
+73 |
3651
145
|
+53 |
3845
69
|
+34 |
2925
55
|
Все что надо — в наличии — и турбинка, и нагреватель…
Сколько на фен STM'ок с AMOLED'ами ни навесь, кроме красивостей дополнительных плюшек не получишь.
А тут гармоничное решение.
В экономической части обзора отсутствует стоимость блока питания, так что экономическая целесообразность в этом продукте отсутствует напрочь.
Прошу прощения, а нет ли ошибки с расположением R15?
А так давольно красиво и бюджетно получитесь.
Молодец! :)
Если бы у меня не было покупной станции, собрал бы по этому обзору себе.
Вентилятор, кстати, присутствует далеко не во всяком газотурбинном двигателе, и если он присутствует, то большая часть воздуха, проходящего через вентилятор в двигатель вообще не попадает.
На что было справедливо замечено, что
Каким боком к этому относится Ваше
?
И вы немного путаете последовательность комментов.
Сразу не заметил наличие выключателя на входе устройства (по схеме его нет, а на фото такой ракурс, что кажется, что это какое другое устройство). Хочу сказать, что выключатель тут обязателен! (Посмотрите видео про возгорание паяльных станций Lukey.) Идея проста — в выключенном состоянии идет высоковольтная помеха из сети и пробивает симистор. Включается нагреватель фена, но без турбины. Нагреватель разогревается до «красна», плавится и загорается пластмасса. И ни один автомат или УЗО этому процессу помешать не смогут — ведь 700 Вт вполне себе нормальная нагрузка.
Насчет помех на входе ОУ — вы, вероятно, правы, но добавить 2 массива по 8 значений в скетч мне тоже было совсем не сложно.
А вот терморезистор — это строго наоборот. Большое сопротивление, никакого ЭДС.
(попробовал)
Завтра ещё раз перечитаю на свежую голову.
видимо пришла пора продавать люкей852. давно паяю Т12, держал его только ради фена
И еще я как-то не понял по схеме где у вас фаза разрывается? Я что-то… вообще туплю дико… Можно суть конденсатора C9 и резистора R17?
И ниже камрад спросил по поводу библы для энкодера. Я бы тоже поинтересовался.
теперь следите за руками:
— точность MAX31855 в диапазоне -200°C..+700°C всего ±2°C и скорее всего чип может и больше (мои догадки) просто точность любой К-термопары как раз и есть ±2°C и точнее делать смысла нет
— шаг измерения температуры термопары 0.25°C. выше смысла нет, см пункт первый
— MAX31855 имеет компенсацию холодного спая. у автора ее нет. стоит температуре в корпусе фена подняться выше комнатной, а она подымется. все его калибровки и температура поплывут.
— с наводками у нее проблем меньше
так что вполне себе решение и замена архаичному оу.
А так заказал одну на попробовать. Спасибо.
Термопара показывает не абсолютное значение температуры, а разницу температур между холодным и горячим спаем.
Вот для того и ставят.
Это с паяльником вполне одного энкодера хватит. А тут и воздух и температуру. Сам делал подобное, но продал. Сейчас осталось ОУ дождаться и буду новый собирать. Хотел с сенсорным экраном, интерфейс нарисовал, на макетку загрузил, потыкал и понял что это так же не удобно как и один энкодер…
Есть PCINT1-XX. Есть прерывание по таймеру. Почему нужно использовать именно INT1-2 не понятно.
а второе прерывание вешать на только на ОДНУ ногу втрого эткода и дочитывать значение второй ноги втрого энкодера после срабатывания прерывания.
даже библиотеку для этого написал, где это можно легко реализовать — elchupanibrei.livejournal.com/29025.html
Аналогично платке для т12.
Уже 1.5 года лежит такой фен, все ждал подходящую схему.
А здесь все хотелки и сразу, даже печатка и исходник прошивки…
Огромное спасибо автору.
Дорого, но… хавают )
Спасибо — отличный проект!!!
И еще вопрос — обязательно использовать 40амперный мосфет? Он же управляет вентиляторов только?.. Подойдут менее мощные, с материнки например?
К слову довольно удобно подобный результат можно получить в бесплатном Graph.
Теперь знаю чем займусь в ближайшее время. С той разницей, что есть жменька семисегментников, сдвиговых регистров и потенциометров 10К. Цена вопроса 556 рублей заказать фен (у этого же продавца есть лот с платной доставкой в Россию :-) дешевле получается).
Еще раз спасибо!
— на странице продавца в описании лота и в комментах, если я правильно понял, есть версии 12в и 24в.
есть какие то преимущества?, 12-ти вольтовый БП проще подобрать.
— за что отвечает uint32_t currentFrequency;?
— переменная pars дважды обнуляется и больше ни где не используется. Я правильно понял, что она использовалась при подборе количества выборок для усреднения и сейчас не нужна?
— по поводу динамической индикации, боюсь Вы правы, в лупе есть задержка для подавления помех, тем более я хотел их два приспособить. Впрочем есть дисплей от телефона 3110. Но он на 3,3в, или на Вашем шилде есть преобразователи уровней?
— как я понял в качестве опорного для АЦП используется Vcc. Но 7805 может выдавать от 4,8 до 5,2 в. Или коэффициенты компенсируют все возможные погрешности?
-у меня в наличии МОС 3036. Нужно ли менять параметры R13, R3?
— ОУ нет. Покупать такой же или посоветуете другой?
uint32_t currentFrequency, так же как и переменная pars, действительно просто занимают пару байт памяти. Первая осталась по ошибке от родственного проекта на дисплее, вторая использовалась для усреднений. Я подправил, спасибо.
На шилде дисплея преобразователя уровней нет. Я пока не сталкивался с проблемами по поводу толерантности дисплея 5110, рассчитанного на 3.3 В логику с 5 вольтовой логикой. Может мне просто везло.
Да, в качестве опорного напряжения для АЦП используется Vcc. Можно использовать внутренний 1.1 В, уменьшив примерно в 4 раза коэффициент усиления ОУ, но я бы не сказал что он намного стабильнее.
3063 аналог этой оптопары, так же имеет встроенную детекцию перехода через ноль как и вся серия 304X и 306X.
Если ОУ нет, то LM358 отличный вариант для покупки, это самый дешевый ОУ, который есть везде. Из популярного есть еще TL072, он дороже и лучше, но для этого применения разницы нет.
И просто и защита присутствует и релейное управление, все по феншую. Дешево и безопасно )))
А что такое релейное управление?
Плюс хочу пид контроль… Да много что хочу )
Я ж говорю реализаций вагон.
И экран… Хочу большой 12864. Но может и маленький такой. Олед не хочу. Он убер мелкий. У меня есть парочка. Один в более или менее пользовании на минидельте. Не удобно. Слишком мелкое все.
Пид контроль и большой экран все хотят, хотя… ))
Кстати у Олега как раз на энкодере, хотя кто то требует кнопки )))
Я бы не сказал что реализаций именно фена так уж много, по мне так всего то несколько проектов и уж тем более на Атмеге.
Реле, имеется ввиду управление защитой через реле, тиристоры и иже с ними, слишком это все пожароопасно, зато безопасно, ну и что бы контроль нуля, тут же (при всем уважение к автору), в данной схеме защита отсутствует вовсе и при пробитии тиристора, фен уйдет в неконтролируемый нагрев со всеми вытекающими… ) )) Все исключительно ИМХО
Не факт что его пробьет на кз. 50/50. Да и как уже сказал выше… Плюс я хочу бипер. На новой плате на паяльник такая тема удобная. Включил и даже не смотришь на экран, чисто бик. Можно паять. Хотя и Т12 и и так ждать надо 5 секунд.
1. по паспорту 7805 на входе держит не более 18 вольт, можно заменить на любой импульсный.
2. блок питания 24+3 — блок от принтера Canon(k30292), 24+3 — 850ма.
3. Контроллер заменяем Arduino mini — размеры минимальны, цена меньше в разы по сравнению с изготовлением платы.
4. MOC3041M, IRLZ44N и дисплей — есть готовые платы на али.
Таким образом, всё что указано можно заказать в виде конструктора и собрать в любой корпус, в течении 30 минут.
Первый попавшийся даташит
Input Voltage (VO = 5V to 18V) 35 V
Немного её переделал для полной запитки от 24VDC.
Остальное просто распечатал.
Сделал шаг 1%, при 65% перестает крутиться моторчик, может шкалу сделать с учетом этого? Ставил при испытании
analogWrite(pinPWM, map(setPWM, 30, 100, 76, 255));.
Без изменения частоты ШИМ двигатель включается при оборотах 20%, напряжение тестером 5,9в.Решил оставить без изменения частоты ШИМ.
При выключении изменен алгоритм, теперь пока температура не падает до 20 градусов, турбина дует на100%.
drive.google.com/open?id=1kIVslnNhh_wwUYiPS6cWZgkMM5ohE07Z
и затем снять показания, получить нужные коэффициенты в Exel, внести их в скетч и перепрошиться.
Меняете калибровочные коэффициенты K (мультипликативный) и A (аддитивный), прошиваете — меняются показания. Чтобы из Exel получить первоначальные коэффициенты, нужно изначально в прошивке задать их равными 1 и 0
и уже потом полученные показания забить в Exel и получить их истинные значения. Они в свою очередь будут зависеть от коэффициента усиления ОУ.