[Из песочницы] Паяльная станция своими руками на базе Arduino

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

НачнёмДля создания паяльной станции нам первым делом нужна ручка паяльной станции, зачастую это китайские станции типа 907 A1322 939.

image

Характеристики ручки:

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

Для управления ручкой паяльника нам первым делом нужно снимать данные с датчика температуры, в этом нам поможет LM358N. Эта схема уже работает у меня почти 2 года.

image

Далее нам нужно управлять (включать и выключать) нагревательный элемент паяльника, в этом на поможет импульсный транзистор IRFZ44. Его подключение очень простое:

image

Хочу обратить Ваше внимание на будущий режим работы нагревательного элемента. Его мы будем включать в три этапа путём ШИМ-модуляции. При старте программы будет включаться почти максимальная мощность (скважность 90%), при приближении к заданной температуре мощность понижается (скважность 35–45%), и при минимальной разнице между текущей и заданной температуры мощность держится на минимуме (скважность 30–35%). Таким образом мы устраняем инерцию перегрева. Повторюсь, паяльная станция стабильно работает почти 2 года, и термоэлемент не находится в постоянной предельной нагрузке (что продлевает его жизнь). Все настройки в программе можно отредактировать.

Подключать ручку нужно по схеме:

imageОбратите внимание, разъём на панели станции, а не на ручке.

Очень настаиваю: проверяйте ручки перед пуском, раскрутите и проверьте целостность нагревательного элемента, а также правильность распайки проводов на разъёме.

Далее нам нужен контроллер. Для демонстрации я выбрал Arduino Uno — как самый популярный и удобный. Заметьте, что паяльную станцию я делаю блочной и это даёт возможность самому выбрать контроллер. Также нам нужны две кнопки подтянутые к +5В сопротивлениям 10кОм и 7-ми сегментный индикатор на три разряда. Выводы сегментов я подключил через сопротивления 100 Ом.

ANODES: D0 — aD1 — bD2 — cD3 — dD4 — eD5 — fD6 — gD7 — dp (точка)

CATHODES: D8 — cathode 3D9 — cathode 2D10 — cathode 1

Хочу также заметить, что кнопки мы сажаем на аналоговые пины 3 и 2. И в программе я их опрашиваю как аналог. Сделал я это для того, чтобы не вводить в заблуждение молодое поколение. Не каждый знает где найти пин 14, 15 и 16. А учитывая, что скорости достаточно и памяти в контроллере много, то так будет проще.

Давайте посмотри что получилось:

image

image

image

Вы можете заметить пустую панельку возле индикатора, это заготовка под LM358N, просто аналог KA358 показал плохие результаты в работе. Поэтому я воспользовался блоком термодатчиков на LM358N для паяльной станции с феном.

image

image

Далее необходимо выбрать источник питания. Я взял блок питания от какого-то ноутбука на 22V 3А, его хватает с запасом. Потребление при старте паяльника 1,5 А, а при поддержке температуры 0,5А. Поэтому выбирайте себе подходящий блок питания, желательно 24V DC 2A.

На фото выше видно жмут проводов и многих это пугает. Поймите, это демо, вариант под любой контроллер, станцию можно собрать и компактно, к примеру:

image

image

Это наглядный пример для реализации Вашего проекта паяльной станции. Видео, которое наглядно поможет понять Вам как собрать самому:

[embedded content]

Вот тест программы, писал под версией IDE 1.5.2. Учтите всё вышесказанное и сильно не критикуйте (программу пытался написать просто и доступно).

/*

// Пины подключения индикаторов ANODES: D0 — a D1 — b D2 — c D3 — d D4 — e D5 — f D6 — g D7 — dp (digital point) a ******** * * f * * b * g * ******** * * e * * c * d * ******** # dp CATHODES: D8 — cathode 3 D9 — cathode 2 D10 — cathode 1 */

// -------------------------------------------------- не изменять, это для Сегментов ----------------------------------------------- byte const digits[] = { B00111111, B00000110, B01011011, B01001111, B01100110, B01101101, B01111101, B00000111, B01111111, B01101111};

int digit_common_pins[]={8,9,10}; // пины для разрядов сегментов (при изменении убедитесь что Ваш порт не используется) int refresh_delay = 5; int count_delay = 300; // 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 knup = 3; //Пин кнопки вверх in (красный светодиод) int kndn = 2; //Пин кнопки вниз in (синий светодиод)

int nagr = 11; // пин вывода нагревательного элемента (через транзистор) int tin = 0; // Пин Датчика температуры IN Analog через LM358N int tdat = 0; //Переменная Датчика температура int ustt = 210; // Выставленная температура по умолчанию (+ увеличение и уменьшение при нажатии кнопок) int mintemp = 140; // Минимальная температура int maxtemp = 310; // Максимальная температура int nshim = 0; // Начальное значение шим для нагрузки

void setup (){ pinMode (nagr, OUTPUT); // Порт нагрузки (паяльника) настраиваем на выход analogWrite (nagr, nshim); //Вывод шим в нагрузку паяльника (выводим 0 — старт с выключенным паяльником — пока не определим состояние температуры) // -------------------------------------------------- не изменять, это для Сегментов ----------------------------------------------- DDRD = B11111111; for (int y=0; y

}

void loop () { show (increment); // Вывести значение переменной на экран (LED) if (tdat < ustt ){ // Если температура паяльника ниже установленной температуры то: if ((ustt - tdat) < 16 & (ustt - tdat) > 6) // Проверяем разницу между установленной температурой и текущей паяльника, // Если разница меньше 10 градусов, то { nshim = 99; // Понижаем мощность нагрева (шим 0–255, мы делаем 99) — таким образом мы убираем инерцию перегрева } else if ((ustt — tdat) < 7 & (ustt - tdat) > 3) { nshim = 80; // Понижаем мощность нагрева (шим 0–255, мы делаем 99) — таким образом мы убираем инерцию перегрева } else if ((ustt — tdat) < 4 ) { nshim = 45; // Понижаем мощность нагрева (шим 0-255, мы делаем 99) - таким образом мы убираем инерцию перегрева } else { nshim = 230; // Иначе поднимаем мощность нагрева (шим 0-255, мы делаем 230) на максимум для быстрого нагрева до нужной температуры } analogWrite(nagr, nshim); //Вывод в шим порт (на транзистор) значение мощности } else { //Иначе (если температура паяльника равняется или выше установленной) nshim = 0; // Выключаем мощность нагрева (шим 0-255 мы делаем 0) - таким образом мы отключаем паяльник analogWrite(nagr, nshim); //Вывод в шим порт (на транзистор) значение мощности } if(millis() - actual_count_delay > count_delay) // это для сегментов

{ actual_count_delay = millis (); // Здесь мы пишем нашу прогу по считыванию состояния кнопок (это место в счетчик не будет тормозить вывод на сегменты) tdat = analogRead (tin); // Считать состояние датчика температуры и присвоить tdat tdat =map (tdat,0,430,25,310); // калибровка п умолчанию 0,430,25,310 increment = tdat; // присвоить текущее значение температуры переменной сегмента if (analogRead (kndn) < 1) // Если нажата синяя кнопка, то понизить температуру на 5 { if( ustt <= mintemp || (ustt-5) <= mintemp ) { ustt= mintemp; increment = ustt; } else { ustt=ustt-5; increment = ustt; } } else if (analogRead(knup) < 1) // Если нажата красная кнопка, то повысить температуру на 5 { ustt=ustt+5; if( ustt >=maxtemp) { ustt= maxtemp; } increment = ustt; } }

}

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 { PORTD = B00000000; }

digitalWrite (digit_common_pins[z], LOW); }else{ digitalWrite (digit_common_pins[z], HIGH); }

}

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

} Очень надеюсь, что Вам это как-то поможет в создании своего проекта.

© Habrahabr.ru