Паяльная станция своими руками на Arduino DIY

55
54646
arduino, паяльник, паяльная станция
Aliexpress WW
 Всем привет! Как-то я затронул тему паяльной станции на Arduino и сразу меня завалили вопросами (как?/где?/когда?). Учитывая массовость запросов, я решил создать обзор «Паяльная станция своими руками на Arduino DIY«.
 Почему Arduino? Ведь существует уйма контроллеров быстрее и дешевле. В таких случаях я обычно отвечаю: —Дёшево, практично, быстро.
  Действительно, ведь Arduino Pro Mini сейчас стоит 1,63$ за 1 шт (недавно прислали), а atmega8 стоит 1$ (оптовая цена). Получается, что плата Pro Mini с обвесом (кварц, конденсаторы, стабилизаторы) стоит не так-то и дорого, плюс, ко всему, экономит время.  Также время очень сильно экономит IDE-оболочка для Arduino, легко и быстро в ней справляется даже школьник. Учитывая популярность и дешевизну я решил собрать именно на Arduino.
Для создания паяльной станции нам первым делом нужна ручка паяльной станции, зачастую это китайские станции типа 907 A1322 939.
 Начнём
Характеристики ручки:

Напряжение: 24V DC
Мощность: 50W (60W)
Температура: 200℃~ 480℃

Для управления ручкой паяльника нам первым делом нужно снимать данные с датчика
температуры, в этом нам поможет LM358N. Эта схема уже работает у меня более 3-х лет безотказно.
arduino, паяльник, паяльная станция
 Далее нам нужно управлять(включать и выключать) нагревательный элемент паяльника, в этом на поможет импульсный транзистор IRFZ44. Его подключение очень
простое:
arduino, паяльник, паяльная станция
 Хочу обратить Ваше внимание на будущий режим работы нагревательного
элемента. Его мы будем включать в три этапа путём ШИМ-модуляции. При старте программы будет включаться почти максимальная мощность (скважность 90%), при приближении к заданной температуре мощность понижается (скважность 35-45%), и при минимальной разнице между текущей и заданной температуры мощность держится на минимуме (скважность 30-35%). Таким образом мы устраняем инерцию перегрева.
Повторюсь, паяльная станция стабильно
работает более 3-х лет, и термоэлемент не находится в постоянной предельной нагрузке
(что продлевает его жизнь). Все настройки в программе можно отредактировать.
 Подключать ручку нужно по схеме:
arduino, паяльник, паяльная станция
Обратите внимание, разъём на панели станции, а не на ручке.
Очень настаиваю: проверяйте ручки перед пуском, раскрутите и проверьте целостность нагревательного элемента, а также правильность распайки проводов на разъёме.
 Далее нам нужен контроллер. Для демонстрации я выбрал Arduino Uno – как самый популярный и удобный. Заметьте, что паяльную станцию я делаю блочной и это даёт возможность самому выбрать контроллер. Также нам нужны две кнопки подтянутые к +5В сопротивлениям 10кОм и 7-ми сегментный индикатор на три разряда. Выводы сегментов я подключил через сопротивления 100 Ом.

ANODES(CATHODES):
D1 — a
D2 — b
D3 — c
D4 — d
D5 — e
D6 — f
D7 — g
D0 — dp (точка)

CATHODES(ANODES):
D16 — cathode 3
D15 — cathode 2
D12 — cathode 1

 Хочу также заметить, что кнопку мы сажаем на аналоговые пин 3. И в программе я их опрашиваю как аналог. Кнопки подключены по принципу делителя напряжения(смотреть схему). При нажатии в «Низ» на A3 коротится 0-вой вывод -это значит что значение аналогового порта будет близко или равно нулю. Если нажать «Вверх» — то через сопротивления появится пол напряжения питания (5В/2 =2,5В  => значения порта около 512). В режиме покоя Значения порта A3 будет около 1023.  Все эти условия находятся в программе в блоке обозначенном «- Кнопки -«.
 Давайте посмотри что получилось:

arduino, паяльник, паяльная станция arduino, паяльник, паяльная станция arduino, паяльник, паяльная станция

 Вы можете заметить пустую панельку возле индикатора, это заготовка под LM358N, просто аналог KA358 показал плохие результаты в работе. Поэтому я воспользовался блоком термодатчиков на LM358N для паяльной станции с феном.
 Далее необходимо выбрать источник питания. Я взял блок питания от какого-то ноутбука на 22V 3А, его хватает с запасом. Потребление при старте паяльника 1,5 А а при поддержке температуры 0,5А. Поэтому выбирайте себе подходящий блок питания, желательно 24V DC 2A.
На фото выше видно жмут проводов и многих это пугает. Поймите, это демо, вариант под
любой контроллер, станцию можно собрать и компактно, к примеру:
arduino, паяльник, паяльная станция
 Это наглядный пример для реализации Вашего проекта паяльной станции. Видео, которое наглядно поможет понять Вам как собрать самому:
 Программу писал под версией Arduino IDE 1.5.2. Учтите всё
вышесказанное и сильно не критикуйте (программу пытался написать просто и доступно).

[spoiler title=» style=’default’ collapse_link=’true’]

/*
Arduino IDE 1.5.4
Паяльник на Arduino Pro Mini v0.4

Alex link
http://www.youtube.com/c/AlexLink-Free
http://vk.com/linklife
http://www.facebook.com/groups/Arduno.life/
// Пины еодключения индикаторов
ANODES(CATHODES):
D1 — a
D2 — b
D4 — c
D6 — d
D7 — e
D5 — f
D3 — g
D0 — dp (digital point) Я НЕ подключал — резерв… индикатора :)))

a1
********
* *
f * * b2
5 * g3 *
********
* *
e * * c4
7 * d6 *
******** # dp0

CATHODES(ANODES):
D16 — cathode 3
D15 — cathode 2
D12 — cathode 1
*/

// ————————————————————————————————
int indicator = 1; // 0 = Катод  1 = Анод  — Выбрать под Ваш индикатора !!!!

byte digits[] = {
B00001001,B11101011,B00110001,B10100001,B11000011,B10000101,B00000101,B11101001,B00000001,B10000001};

int digit_common_pins[]={16,15,12}; // пины для разрядов сегментов(при изменении убедитесь что Ваш порт не используется)
int refresh_delay = 5;
int count_delay = 1000; // COUNTING SECONDS IF count_delay = 1000
long actual_count_delay = 0;
long actual_refresh_delay = 0;
int increment = 0; //Стартовое значение на сегментах
int max_digits =3; // Кол-во знакомест
int current_digit=max_digits-1;
int increment_max = pow(10,max_digits);
// ————————————————— не изменять, это для Сегментов ————————————————

//——————— переменные паяльника ——————————
int knopka = 3; //Пин кнопки

int tin = 0; // Пин Датчика температуры IN Analog через LM358N
int pinpwm = 11;// порт нагревательного элемента(через транзистор)PWM

int tempust = 230; // установленная температура
int tempmin = 200; // минимальная температура
int tempmax = 480; // максимальная температура
int tempreal = 250; // переменная датчика текущей температуры
int temppwmmin = 40; // минимальное значение PWM нагревателя
int temppwmmax = 180; // максимальное значение PWM нагревателя
int temppwmreal = 0; // текущее значение PWM нагревателя
int airreal = 100; // стартовое значение PWM вентилятора(если нужно)

int temperror = -50; // разница температур(установленная — реальная)

int temprazn = 0; // переменная разницы температуры(установленная — текущая)

void setup(){

if(indicator == 0){ //Если вначале был выбран общий Катод
for(int i=0; i<10;i++){
digits[i] = ~ digits[i];
}
}

pinMode(pinpwm,OUTPUT); // Порт нагрузки(паяльника) настраиваем на выход
analogWrite(pinpwm, temppwmreal); //Вывод шим в нагрузку паяльника (выводим 0 — старт с выключеным паяльником- пока не опредилим состояние температуры)

// ————————————————— не изменять, это для Сегментов ————————————————
DDRD = B11111111;
for (int y=0;y<max_digits;y++)
{
pinMode(digit_common_pins[y],OUTPUT);
digitalWrite(digit_common_pins[y], LOW);
}
// ————————————————— не изменять, это для Сегментов ————————————————

}

void loop() {

show(increment); // Вывести значение переменной на экран(LED)

if (tempreal < tempust ){ // Если температура паяльника ниже установленной температуры то:

if ((tempust — tempreal) < 16 & (tempust — tempreal) > 6 ) // Проверяем разницу между у становленной температурой и текущей паяльника,
// Если разница меньше 10 градусов то
{
temppwmreal = 99; // Понижаем мощность нагрева (шим 0-255 мы делаем 99) — таким образом мы убираем инерцию перегрева
}
else if ((tempust — tempreal) < 7 & (tempust — tempreal) > 3)
{
temppwmreal = 80; // Понижаем мощность нагрева (шим 0-255 мы делаем 99) — таким образом мы убираем инерцию перегрева
}

else if ((tempust — tempreal) < 4 ) { temppwmreal = 45; // Понижаем мощность нагрева (шим 0-255 мы делаем 99) — таким образом мы убираем инерцию перегрева } else { temppwmreal = 230; // Иначе Подымаем мощность нагрева(шим 0-255 мы делаем 230) на максимум для быстрого нагрева до нужной температуры } analogWrite(pinpwm, temppwmreal); //Вывод в шим порт (на транзистор) значение мощности } else { //Иначе (если температура паяльника равняется или выше установленной) temppwmreal = 0; // Выключаем мощность нагрева (шим 0-255 мы делаем 0) — таким образом мы отключаем паяльник analogWrite(pinpwm, temppwmreal); //Вывод в шим порт (на транзистор) значение мощности } if(millis() — actual_count_delay > count_delay) // это для сегментов

{
actual_count_delay = millis();
// Здесь мы пишем нашу прогу по считыванию состояния кнопок (это место в счетчк не будет тормозить вывод на сегменты)

tempreal = analogRead(0);// считываем текущую температуру

tempreal=map(tempreal,-50,700,0,500); // нужно вычислить
increment=tempreal;

//———————————————————- Кнопки ————————————————————————-
if (analogRead(knopka) == 0) // Если нажата вниз кнопка то понизить температуру на 5
{
if( tempust <= tempmin || (tempust-5) <= tempmin ) { tempust= tempmin; increment = tempust; } else { tempust=tempust-5; increment = tempust; show(increment); // Вывести значение переменной на экран(LED) } } else if (analogRead(knopka) > 500 && analogRead(knopka) < 524 ) // Если нажата вверх кнопка то повысить температуру на 5 { tempust=tempust+5; if( tempust >=tempmax)
{
tempust= tempmax;
}
increment = tempust;
show(increment); // Вывести значение переменной на экран(LED)

}

}
}

void show(int value) { //——————————- подпрограмма для вывода на сегменты — лучше не изменять ———————————————
int digits_array[]={};
int y=0;
boolean empty_most_significant = true;

if(millis() — actual_refresh_delay >= refresh_delay)
{

for (int z=max_digits-1;z>=0;z—)
{

digits_array[z] = value / pow(10,z); //rounding down by converting from float to int

if(digits_array[z] != 0 ) empty_most_significant = false; // DON’T SHOW LEADING ZEROS

value = value — digits_array[z] * pow(10,z);

if(z==current_digit)
{
if(!empty_most_significant || z==0){ // DON’T SHOW LEADING ZEROS EXCEPT FOR THE LEAST SIGNIFICANT

PORTD = digits[digits_array[z]];
}
else
{
if(indicator == 0){ //Если вначале был выбран общий Катод
PORTD = B00000000;
}
else{
PORTD = B11111111;
}
}

if(indicator == 0){
digitalWrite(digit_common_pins[z], LOW);
}
else{
digitalWrite(digit_common_pins[z], HIGH);
}
}
else{

if(indicator == 0){
digitalWrite(digit_common_pins[z], HIGH);
}
else{
digitalWrite(digit_common_pins[z], LOW);
}
}

}

current_digit—;
if(current_digit < 0)
{
current_digit= max_digits; // NEED AN EXTRA REFRESH CYCLE TO CLEAR ALL DIGITS
}

actual_refresh_delay = millis();
}

}

[/spoiler]

Далее спустя некоторое время я собрал компактную паяльную станцию, а также отснял видео о том — на что следует обратить внимание при сборке и наладке. Нормальная сборка даже на коленке не требует наладки(проверенно не однократно моими подписчиками). Так же по просьбе подписчиков я сделал красочную схему по которой легко можно собрать Вашу паяльную станцию.

Обновлённый скетч.

 

arduino, паяльник, паяльная станция

Ссылки на модули: Arduino Pro MiniArduino UNOLM358N, IRFZ44,  7-ми сегментный индикатор,  DC-DCБлок питания 24В, Ручка паяльника.

55 КОММЕНТАРИИ

  1. Повторил проект. Все работает и температура адекватная при указанных номиналах, но есть проблема — показания на семисигментном непрерывно скачут-прыгают. В видео вы коснулись этого вопроса, но пропустили ответ по скетчу. Как эту проблему грамотно\правильно устранить?

    • прыгать будет так как пытается показать реальную, реальная внутри нагревателя а не жала(инерции меньше наверное). Я уже думал просто выводить установленную температуру на экран а не текущую … делается несложно .. заменой переменной…

  2. Было бы просто отлично если бы Вы указали какой тип термодатчика поддерживает Ваша схема. Данные ручки паяльника выпускаются с двумя видами термодатчика, с термопарой и с терморезистором. Я собирал на терморезистор а оказалось что нужна термопара. Так же у Вас на схеме указаны контакты D1,D2……. Я впервые столкнулся с Arduino и сколько не искал эти контакты на самой плате и на распиновке с интернета, так и не смог найти. В итоге просто сопоставлял контакты с Вашего видео. Контакт на полевик так и не смог найти, спалил плату. Если это возможно укажите какой тип термодатчика используется, и названия контактов в соответствии с официальной распиновкой.

    • Контакт на полевик D11(как его не найти?) так же в программе прописан комментарий :
      int nagr = 11; // пин вывода нагревательного элемента(через транзистор) …
      Как можно было его сжечь если он через сопротивления?
      По поводу контактов D1 и D2, у Вас опечатка наверное и вы хотели сказать D0 и D1 — на большинстве плат это RX и TX(всё зависит от платы которая у вас в руках).
      Да и в принципе если ввести в Google «arduino pin» и выбрать картинки — то множество распиновок различных плат платформы Arduino.
      Я понимаю если бы Вы столкнулись с проблемой поиска D15 и D16, об этом не все рассказывают — поэтому я обозначил их на схеме.
      Все кто купив ардуино наверняка первый раз запускают пример Blink — мигание светодиодом. Я же советую в будущем использовать этот пример для определения необходимого пина, изменяете D13 на D0(или D1) и подключаете светодиод(чрезе сопротивление) или мультиметр и проверяете на каком пине у Вас мигает.(я сам так проверяю когда сомневаюсь).
      Ручка с термопарой… другой у меня не было … в видео я рассказываю что LM358N усиливает миливольты(слабое напряжение) с датчика температуры ручки, но в статье действительно я этого не указал.
      На тот момент я даже не подозревал что существуют ручки ещё и с термосопротивлением. Возможно статью перепишу, но только на этом ресурсе…
      Контакты указанные на схеме… повторюсь(как и не раз на видео) … перед подключением ручки — её необходимо аккуратно разобрать и перепроверить целостность и прозвонить выводы.Так Вы поймёте где у Вас что. Я был ошибся и подал напругу на термопару))) — к счастью она выжила )))

  3. Alex привет!
    Пытаюсь повторить Ваш проект (пока на макетке). Все работает, но дико греется МОСФЕТ (IRFZ44E). Паяльник и все номиналы такие же как и у Вас на схеме, Ардуино нано, бп — 24В. Проверял полевик мультиметром (http://diodnik.com/kak-proverit-polevoj-tranzistor/) — вроде рабочий. Решил измерить ток при подаче на гейт максимального напряжения отдаваемого ШИМом. Установил в скетче temppwmreal = 255. Оказалось, что ток с драйна на паяльник около 0,6А (Если паяльник напрямую соединить с источником питания 24В ток составлял порядка 1,6А). Уже было думал заменить на IRL-ку, но с другой стороны у Вас же IRFZ не греется и работает норм? Может все-таки транзистор не рабочий? Или высокая частота ШИМ в Ардуине?
    Посоветуйте в какую сторону копать?

  4. Автору респект! Очень интересная статья.
    Но, вот, неплохо бы её отредактировать, а то информация в начале статьи не вяжется с инфой в конце.
    Например, написано: «Также нам нужны две кнопки подтянутые к +5В сопротивлениям 10кОм», а в схеме их нет. 🙁
    Также, написано: «Выводы сегментов я подключил через сопротивления 100 Ом.», а в схеме их опять нет. 🙁 Нужно ли их ставить?
    И ещё вопрос, сохраняется ли настройка температуры после отключения устройства?
    И ещё хотелось бы отметить, что некоторые дешёвые версии «Ручки паяльника», вместо термопары используют терморезистор.

  5. Доброго времени! Пытаюсь повторить ваш проект на базе ардуино нано. Спаял развязку по LM и мосфету, семисегменты тоже припаял. Залил скеч в ардуино. Возникли некоторые вопросы. Буду рад услышать на них ответы. 1. На идикаторе высвечивается «516» как это, что не так? 2. Кнопки подключены по вашей схеме (как написано в тексте) но на нажатия индикация не реагирует. Может вы их по другому подключили?

  6. Схема не изменилась, программа подогнана по распиновке к индикатору. Изменил в скетче распиновку на старую (по порядку, как написано в тексте), залил, индикатор вобще перестал что то показывать. Со старой индикатор работал и кнопка вверх работала. Как найти старую прошивку?

  7. Спасибо, залил старую прошивку. Все заработало как и раньше. Только вот кнопка вниз так и не работает. В старой прошивке написано, кнопка вверх 3 пин; кнопка вниз 2 пин. По какой схеме они так подключены? На схеме они кажется по другому подключены.

  8. 1. Пробовал разные транзисторы на нагреватель — все грелись. Потом нашел с материнки MTB1306 низковольтный с большим током и сопротивлением перехода вроде 0,075 ом. Теперь абсолютно холодный.
    2. В скетче переместил блок «подпрограммы для вывода на сегменты», как назвал ее автор, непосредственно перед основной программой void loop(). Иначе компилятор постоянно ругался на show(increment).
    3. Собрал на ардуино нано. Изначально подавал питание на ногу Vin, но на нее более 12 в подавать нельзя. Поставил стабилизатор 7809 на 9 вольт. Питание везде пошло нормальное но периодически начал тухнуть индикатор. Сделал проще с основного питания(19вольт) резистор 120 Ом 3Вт (тут получилось 11вольт) затем 7805 на +5 ардуино, ОУ и кнопки.

  9. Что бы не прыгала температура на индикаторе, нужны очень стабильные 5в на LM358. Но это мало помогает. Главная проблема именно в нагревателе. Нужен паяльник с терморезистором а не с термопарой. Нагреватель с терморезистором судя по отзывам в интернете и работает дольше и лучше, и стоит дешевле.
    В свое время собирал аналоговую станцию на К157УД2 поставил в нее вольтметр в качестве индикатора температуры и столкнулся с той же проблемой. Затем поменял нагреватель с термопарой на нагреватель с терморезистором и все стало нормально. На этой станции была та же проблема и так же решилась. Еще немного изменил скетч (Начальная температура, скорость переключения а так же удалил нижний ШИМ)

    Видео: https://youtu.be/0ppAV1NXhGE (Сначала работа на Arduino установленная температура 320 градусов. В конце работа аналоговой станции)

  10. Добрый день . Повторил ваш проект.
    Есть проблема не снимается температура с паяльника , нагревательный элемент нагревается походу дела до своего предела .
    Ардуинка выводит статично — 33 градуса .
    Полярность на термопару проверил , менять тоже побывал .
    Заметил что если отключить питание от LM показатели остаются такие же .
    Не можете подсказать куда смотреть ????