Soldering station v5.0 — hakko 936 "на стероидах"
Есть у меня «рабочая лошадка» — Hakko 936. Работает исправно уже больше 2х лет.
Но мне хотелось большей информативности и возможности менять некоторые характеристики станции.
Решил сделать «с нуля» свою станцию(без фена, т.к. хотелось некой мобильности) на основе atmega328 на «китайдуино nano».
Давно заказывал для Хакко запасной паяльник, но китайцы прислали паяльник с термопарой(сопр. терм. — 2.1Ом, сопр. нагр. — 15.5Ом), решил его использовать.
Скетч честно пытался писать сам, но не осилил, и заказал его. Потом дорабатывал под себя(символы, заставка, мелкие штрихи, доп. функции).
Корпус решил взять в магазине электротоваров. Подошла по габаритам коробка распаячная Tyco 200х140х75 IP55.
Блок питания взял с запасом: XK-2412-24 (220В.->24В.6a)
Экран решил использовать двухстрочный:LCD1602 с зелёной подсветкой.
Адаптер I2C к экрану на PCF8574AT
Пошла мелочевка: Разъем для паяльника GX12 5 Pin
Энкодер с кнопкой EC11
«Степ-даун» конвертер gw1584 для питания ардуинки и экрана.
Двухканальный операционный усилитель LM358P для снятия даных с датчика температуры паяльника.
Полевой транзистор — IRFZ44N для управления нагревательным элементом паяльника путем ШИМ-модуляции.
Кнопка включения, разъем для питающего шнура, держатель плавких вставок(Fuse), резисторы, керамические конденсаторы, светодиод, провода итд — все это было в наличии у меня, покупать не пришлось.
Схема была скопирована и доработана из «схемы паяльной станции Aleks Link для ардуино NANO». Изменена под управление инкрементным энкодером с защитой от «дребезга».
Вот оригинальная схема:
Почти все в схеме осталось нетронутым — заменил только экран.
Приступаю к сборке — высверлил все нужные отверстия и пропилил прямоугольник для экрана:
Готовый вид — невзрачно, но работоспособно:
По итогу: Вышло не плохо, набор температуры от комнатной до 300гр. за ~20-25сек.
Поддержание заданной температуры(но паять массивные детали не стоит.)
Есть режим «сон», который вырубает поддержку температуры(жало перестает нагреваться)через 10минут(в моем случае), при этом, станция работает, но на экране справа будет знак «S» — sleep. Для выхода из режима сна, нужно повернуть энкодер в любую сторону, и тогда знак поменяется на «W» — work, и начнется набор температуры до выставленной.
Скетч, по понятным причинам, не публикую, но покажу скетч от первоисточника — там нужно подправить вывод на экран(семисегментник) и всё.
Скетч первоисточника
/*
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();
}
}
И обновленный скетч от первоисточника:
/*
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();
}
}
Видео работы:
Если есть вопросы, задавайте. По возможности буду отвечать.
Propaiku.ru — простая цифровая паяльная станция
Предлагаю простую в повторении цифровую паяльную станцию, постройка которой обойдётся примерно в 7$ (без учёта источника питания).
Паяльная станция построена на Arduino Nano, поэтому для повторения не потребуется программатор и различные переходники для него. Схема имеет минимум деталей и не требует наладки.
Технические характеристики:
- Разработано для паяльников Hakko 907;
- Диапазон температур: 27°C–525°C;
- Время разогрева: 25–37с (325°C);
- Рекомендуемый источник питания: 24В, 3А;
- Мощность: 50Вт (средняя).
За и против цифровых паяльных станций
Как и любой другой радиолюбитель, я начал с обычного паяльника. Они хороши, но у них есть несколько минусов:
- Паяльнику, прежде чем им можно будет паять, требуется 7-15 минут для нагрева;
- После прогрева эти паяльники будут продолжать работать с максимальной температурой;
- В некоторых случаях, при продолжительном контакте, эти паяльники могут повредить электронные компоненты.
Обычные паяльники с диммерами:
Существует простой и распространенный способ регулировать температуру у обычных паяльников — это подключить их через диммер, чтобы ограничить мощность, поступающую на нагревательный элемент. Паяльники со встроенным диммером легко купить в магазине. Единственный недостаток — отсутствие обратной связи по температуре. При пайке массивных элементов таким паяльником, температура жала будет падать, что потребует увеличения температуры регулятором диммера. Как только пайка прекращена, жало начнёт перегреваться, и потребуется уменьшить температуру соответствующим регулятором.
Цифровая паяльная станция:
Паяльник очень похож на паяльник с диммером, но все автоматизировано с помощью системы ПИД. Проще говоря, автоматизированная электронная система управления паяльной станцией постоянно настраивает «ручку диммера» за вас. Когда система обнаруживает, что температура жала паяльника ниже заданной температуры, система увеличивает мощность, необходимую для нагрева жала. Когда температура паяльника выше установленной, его питание отключается, что приводит к падению температуры. Система делает этот процесс очень быстро, постоянно включая и выключая нагревательный элемент паяльника, чтобы поддерживать постоянную температуру на жале. Вот почему с цифровыми паяльными станциями время прогрева значительно сокращается.
Необходимые материалы:
Внутри паяльника Hakko 907 находится нагревательный элемент с датчиком температуры. Оба заключены в керамический материал. Нагревательный элемент — это просто змеевик, который выделяет тепло при подаче электроэнергии. С другой стороны, датчик температуры представляет собой термистор. Термистор похож на резистор: при изменении температуры изменяется его сопротивление.
К сожалению, Hakko не предоставляет данных о термисторе внутри своих нагревательных элементов. Поэтому я нагревая термистор записывал его сопротивление, получив тем самым график зависимости сопротивления от температуры.
Чтобы получить полезный выходной сигнал от датчика температуры термистора, пришлось подключить его в плечо делителя напряжения. Сопротивление верхнего резистора делителя напряжения я выбрал исходя из того, чтобы ограничить максимальную мощность, рассеиваемую на датчике (установив его на максимум 50 мВт). Максимальное выходное напряжение делителя в условиях максимальной рабочей температуры при этом составило около 1,6 В. Для более точного измерения температуры жала паяльника требуется усилить этот сигнал перед подачей его на АЦП Ардуино.
Для усиления сигнала от датчика температуры в устройстве применён не инвертирующий усилитель на операционном усилителе, коэффициент усиления которого составляет 2,22. Усилитель имеет запас по напряжению, что позволит применять другие модели паяльника.
В проекте, в качестве коммутирующего элемента, применён простой N-канальный MOSFET управляемый логическим уровнем IRFZL44. Он служит цифровым переключателем для подачи питания на нагревательный элемент. Неинвертирующий операционный усилитель (LM358) используется для усиления и масштабирования крошечных напряжений, которые создает комбинированный термистор делителя напряжения. Потенциометр 10k используется в качестве ручки управления температурой, а светодиод — это просто индикатор, который я подключил и запрограммировал в проекте, чтобы отображать, активен ли нагревательный элемент. Для этого конкретного проекта я использую ЖК-дисплей 16X2 с драйвером I2C, так как он более удобен для новичков в электронике.
Поскольку на большинство клонов Arduino Nano можно подавать напряжение не более 15 В, не перегружая регулятор AMS1117 5 В, а на нагревательный элемент требуется подать 24 В, для оптимальной работы я использую понижающий преобразователь. Регулятор AMS1117 5V, который есть в большинстве клонов Arduino Nano, имеет падение напряжения 1,5 В, это означает, что входное напряжение с вывода VIN Arduino Nano должно быть 6,5 В (5 В 1,5 В).
Перед установкой понижающего преобразователя на плату, требуется подстроечным резистором установить выходное напряжение в районе 6,5-7В.
Устройство можно собрать в любой подходящий корпус. Если есть возможность распечатать корпус на 3D принтере, в конце статьи можно скачать соответствующие файлы.
Перед компиляцией и загрузке кода в Ардуино убедитесь, что библиотеки Wire.h и LiquidCrystal_I2C.h установлены.
При первом включении паяльной станции не забудьте подстроечным резистором настроить контрастность ЖК-дисплея.
Паяльную станцию можно запитать от любого блока питания с выходным напряжением 24В и током 3А. Можно применить блок питания от ноутбука с выходным напряжением 18В и током 2,5А, но время прогрева паяльника увеличиться до 37 с.
Для улучшения теплопроводности рекомендую в паяльное жало Hakko 907 добавить термопасту. Только не забудьте выпустить воздух в течение первых 30 минут работы, так как смазка начнет кипеть и выделять пары. По прошествии 30 минут паста твердеет и становиться похожей на мел. Когда придет время замены наконечника, постукивая молотком по наконечнику, следует аккуратно вытаскивать нагревательный элемент изнутри.
Я использую эту паяльную станцию уже почти 5 лет и очень ей доволен!
Дополнительные файлы к статье тут
Изготовление
Обратите внимание, что паяльная станция является прибором долговременного пользования. Поэтому, конструируя самодельный аппарат, не спешите и предпочитайте проверенные годами решения. Например, изготавливая своими руками паяльную станцию широкого применения, имейте в виду, что самодельный аппарат должен быть собран на базе самых надёжных компонентов.
Профессиональные паяльные станции обладают возможностью ИК-нагрева. Это означает, что для обеспечения должной температуры в области пайки вовсе не используются способы контактного нагрева.
Задача переноса тепла перекладывается на бесконтактные приборы, излучающие ИК-лучи.
В качестве источников нагрева в бесконтактных станциях часто используют мощные галогеновые лампы накаливания, тогда как контактные паяльники обладают простым прибором нагрева в виде нихромовой спирали вокруг массивного медного жала.
Задавшись целью создать паяльную станцию на базе Arduino, надо в первую очередь присмотреться к аккуратности изготовления готовых комплектов. Обратите внимание, что в некоторых дешёвых наборах для сборки не только нет высоковольтных проводов, но порой даже отсутствует схема соединения.
Значительное внимание следует уделить корпусу прибора. Самодельная паяльная станция должна быть одновременно компактной, аккуратной и удобной.
При проектировании паяльной станции на базе Arduino приходится учитывать стандартные размеры печатных плат производителей электроники.
В качестве примера паяльной станции на основе Arduino можно взять конструкцию, неоднократно опробованную мастерами.
- Сперва нужно определиться с конструкцией отражателя нижнего нагревателя. Вполне подойдёт рефлектор обычного плафона освещения, рассчитанный на размещение четырёх ламп.
- Вторым этапом будет подбор галогеновых ламп нужной мощности. Лампочки баллонной конструкции для системы нижнего подогрева на Arduino не подходят. Нужно найти длинные линейные лампы.
- Важным моментом является выбор конструкции монтажного стола. Для пайки с нижним подогревом требуется прочно закрепить монтажную плату на определённом удалении от нагревательных ламп. Для этого используются монтажные «крокодильчики», закреплённые на точно отмеренном расстоянии от ламп.
- Сам блок управления аппаратом можно разместить в любом подходящем корпусе. Например, многие мастера используют для своих самоделок старые блоки питания от компьютеров.
Особенности
Схемотехника микроконтроллерных устройств на базе платформы Arduino долгое время была полностью открыта. В последнее время уже невозможно остановить распространение микроэлектронных устройств на базе Arduino по системе удалённых почтовых продаж. Более того, в рамках этой платформы активно распространяются микроконтроллеры конкурентов – SM32 м ESP.
Такое богатство выбора резонно вызывает интерес домашних мастеров — как на базе готового набора собрать что-нибудь полезное в быту. Учитывая, что интерес проявляют радиомастера, неудивительно, что большинство самоделок касается технологий монтажа радиоэлектронных компонентов.
Если пытаться сделать паяльную станцию на базе Arduino, то первое, с чем сталкивается конструктор, это выбор платформы паяльника.
Внутри паяльной станции находится полноценный «мозг», умеющий управлять температурой инструмента, но ему требуется сигнал от датчика температуры.
Существует три принципиально отличающиеся технологии паяльников с датчиками:
- с терморезистором;
- с термопарой;
- инфракрасная.
Первые недороги и широко распространены. Терморезистор, как правило, представляет собой всего лишь кусочек проволоки, изготовленной из особого материала. Это дёшево, но не обеспечивает должного качества измерения температуры.
Термопара, наоборот, обеспечивает крайне точное измерение. Но для этого в комплекте с термопарой нужно использовать специальный усилитель сигнала, калибрующий выходной сигнал согласно стандартам.
При возможности выбора всегда рекомендуется вариант с термопарой. Контроллеры, управляющие такими устройствами, не только технически сложнее, они точно отображают температуру жала паяльника. У них обычно есть цифровой индикатор, ориентируясь на который можно дозировать нагрев паяльника.
Паяльный фен на ардуино. часть первая.
Самодельная инфракрасная паяльная станция. бюджетный ремонт ноутбука своими руками.
Инфракрасная паяльная станция — это устройство для пайки микросхем в корпусе BGA. Если прочитанное ничего вам не говорит, вряд-ли вам стоит заходить под кат. Там ардуины, графики, программирование, амперметры, саморезы и синяя изолента.
Предыстория первая.
Моя профессиональная деятельность некоторым образом связана с электроникой. Поэтому родственники и знакомые постоянно норовят притащить мне какую-нибудь не совсем исправную электронную штуку со словами «ну посмотри, может тут какой проводок отпаялся».
В тот раз такой штукой оказался 17″ ноутбук eMachines G630. При нажатии на кнопку питания зажигался индикатор, шумел вентилятор, но дисплей был безжизненным, не было звуковых сигналов и активности жесткого диска. Вскрытие показало, что ноутбук построен на платформе AMD, а северный мост имеет маркировку 216-0752001. Беглое гугление показало, что у чипа весьма плохая репутация в части надежности, зато проблемы с ним легко диагностируются. Нужно лишь его прогреть. Выставил на паяльном фене 400 градусов и подул на чип секунд 20. Ноутбук запустился и показал картинку.
Диагноз поставлен. Казалось бы, дело за малым — перепаять чип. Вот тут меня ожидало первое откровение. После обзвона сервис-центров выяснилось, что минимальная сумма, за которую в Минске можно поменять чип — 80 долларов. 40 долларов за чип и 40 долларов за работу. Для ноутбука общей стоимостью хорошо если 150 долларов это было весьма не бюджетно. Дружественный сервис по знакомству предложил перепаять чип по себестоимости — за 20 долларов. Итоговый ценник снизился до 60 долларов. Верхняя граница психологически приемлемой цены. Чип был благополучно перепаян, ноутбук собран, отдан и я о нем благополучно забыл.
Предыстория вторая.
Через несколько месяцев после окончания первой предыстории мне позвонил родственник со словами «Ты же любишь разную электронику. Забери ноутбук на запчасти. Бесплатно. Или просто выкину в мусор. Сказали, вроде материнская плата. Отвал чипа. Ремонтировать экономически нецелесообразно». Так я стал обладателем ноутбука Lenovo G555 без жесткого диска, но со всем остальным, включая блок питания. Включение показало те же симптомы, что и в первой предыстории: кулер крутится, лампочки горят, больше признаков жизни нет. Вскрытие показало старого знакомого 216-0752001 со следами манипуляций.
После прогрева чипа ноутбук запустился как ни в чем не бывало, как и в первом случае.
Размышления.
Так я оказался владельцем ноутбука с неисправным северным мостом. Разобрать его на запчасти или попытаться починить? Если второе, то снова паять его на стороне, пусть даже за 60 долларов, а не за 80? Или купить собственную инфракрасную паяльную станцию? А может собрать своими руками? Хватит ли у меня сил и знаний?
После некоторых размышлений было решено попытаться починить, причем починить самостоятельно. Даже если попытка не увенчается успехом, разобрать его на запчасти это никак не помешает. А инфракрасная станция будет полезным подспорьем во многих работах, требующих предварительного подогрева.
Техническое задание.
Изучив цены на готовые промышленные инфракрасные станции (от $1000 до плюс бесконечности), перелопатив кучу топиков на профильных форумах и роликов на Youtube, окончательно сформировал техническое задание:
1. Буду изготавливать собственную паяльную станцию.
2. Бюджет конструкции — не более 80 долларов (две перепайки в сервис-центре без материалов).
3. Это будет не газовая плита и не прожектор, а устройство, хотя бы минимально умеющее поддерживать термопрофили согласно графика, найденного в сети:
4. Управляющим устройством будет персональный компьютер. Во-первых, автономные контроллеры нагревателей не укладываются в бюджет. Во-вторых, компьютер уже есть на рабочем столе и всегда включен во время ремонтов, ибо он и осциллограф и микроскоп и читалка схем-даташитов.
Материалы и компоненты
Для этого в онлайне были куплены:
Термопара К-типа — 2 шт.
Интерфейс термопары К-типа на микросхеме MAX6675 — 2 шт.
Безымянные твердотельные реле на 40 китайских ампер — 2 шт.
Дополнительно в оффлайне были куплены:
Линейные галогенные лампы R7S J254 1500W — 9 шт.
Линейные галогенные лампы R7S J118 500W- 3 шт.
Патроны R7S — 12 шт.
Из хлама в гараже на свет божий были извлечены:
Док-станция от какого-то допотопного лэптопа Compaq — 1 шт.
Штатив от советского фотоувеличителя — 1 шт.
В домашнем складе были найдены силовые и сигнальные провода, Arduino Nano, клемники WAGO.
Нижний нагреватель.
Вооружаемся болгаркой и отрезаем от док-станции все лишнее.
К листу металла прикрепляем патроны.
Соединяем патроны по три штуки последовательно, получившиеся три цепочки в параллель. Устанавливаем лампы, прячем в корпус.
Поиск материала для отражателя занял продолжительное время. Использовать фольгу не хотелось из-за подозрения в ее недолговечности. Использовать более толстый листовой металл не получалось из-за сложностей с его обработкой. Опрос знакомых сотрудников промышленных предприятий и обход пунктов скупки цветмета результатов не дал.
В конце концов удалось найти листовой алюминий чуть толще фольги, идеально подходящий для меня.
Теперь я точно знаю, где такие листы искать — у полиграфистов. Они их крепят к барабанам в своих машинах, то ли для переноса краски, то ли еще для чего-то. Если кто в курсе, расскажите в комментариях.
Нижний нагреватель с установленным отражателем и решеткой. Вместо решетки правильнее использовать специальный столик, но стоит он совершенно не бюджетно, как и все с наклейкой «Professional».
Светит красивым оранжевым светом. Глаза при этом не выжигает, смотреть на свет можно совершенно спокойно.
Потребляет порядка 2.3 кВт.
Верхний нагреватель
Идея конструкции та же самая. Патроны привернуты саморезами к крышке от компьютерного блока питания. К ней же прикреплен согнутый из алюминиевого листа отражатель. Три пятисотваттные галогенки соединены последовательно.
Тоже светит оранжевым.
Потребляет порядка 250 ватт.
Схема управления
Инфракрасная станция — суть автомат с двумя датчиками (термопара платы и термопара чипа) и двумя исполнительными механизмами (реле нижнего нагревателя и реле верхнего нагревателя).
Было решено, вся логика регулирования мощности нагрева будет реализована на ПК. Arduino будет только мостом между станцией и ПК. Получил с ПК параметры ШИМ-регулирования нагревателей — выставил их — отдал температуру термопар в ПК, и так по кругу.
Arduino ожидает на последовательном порту сообщения типа SETxxx*yyy*, где xxx — мощность верхнего нагревателя в процентах, yyy — мощность нижнего нагревателя в процентах. Если полученное сообщение соответствует шаблону, выставляются ШИМ-коэффициенты для нагревателей и возвращается сообщение OKaaabbbcccddd, где aaa и bbb — установленная мощность верхнего и нижнего нагревателей, ccc и ddd — температура, полученная с верхней и нижней термопары.
«Настоящий» аппаратный ШИМ микроконтроллера с частотой дискретизации несколько килогерц в нашем случае неприменим, так как твердотельное реле не может отключиться в произвольный момент времени, а только при прохождении переменного напряжения через 0. Было решено реализовать собственный алгоритм ШИМ с частотой порядка 5 герц. Лампы при этом полностью гаснуть не успевают, хоть и заметно мерцают. При этом минимальным коэффициентом заполнения, при котором еще есть шансы захватить один период сетевого напряжения, оказывается 10%, чего вполне достаточно.
При написании скетча была поставлена задача отказаться от задания задержек фунцией delay(), так как есть подозрение, что в момент задержек возможна потеря данных с последовательного порта. Алгоритм получился следующий: в бесконечном цикле проверяется наличие данных из последовательного порта и значение счетчиков времени программного ШИМ. Если есть данные из последовательного порта, обрабатываем их, если счетчик времени достиг значений переключения ШИМ, проводим действия по включению-выключению нагревателей.
Скетч
#include <max6675.h>
int b1=0;
int b2=0;
int b3=0;
int p_top, p_bottom;
int t_top, t_bottom;
int state_top, state_bottom;
char buf[32];
unsigned long prev_top, prev_bottom;
int pin_bottom = 11;
int pin_top = 13;
int tick = 200;
unsigned long prev_t;
int thermoDO = 4;
int thermoCLK = 5;
int thermoCS_b = 6;
int thermoCS_t = 7;
MAX6675 thermocouple_b(thermoCLK, thermoCS_b, thermoDO);
MAX6675 thermocouple_t(thermoCLK, thermoCS_t, thermoDO);
void setup()
{
Serial.begin(9600);
pinMode(pin_top, OUTPUT);
digitalWrite(pin_top, 0);
pinMode(pin_bottom, OUTPUT);
digitalWrite(pin_bottom, 0);
t_top = 10;
t_bottom = 10;
p_top = 0;
p_bottom = 0;
state_top = LOW;
state_bottom = LOW;
prev_top = millis();
prev_bottom = millis();
}
void loop()
{
if (Serial.available() > 0) {
b3 = b2; b2 = b1;
b1 = Serial.read();
if ((b1 == 'T') && (b2 == 'E') && (b3 == 'S')) {
p_top = Serial.parseInt();
if (p_top < 0) p_top = 0;
if (p_top > 100) p_top = 100;
p_bottom = Serial.parseInt();
if (p_bottom < 0) p_bottom = 0;
if (p_bottom > 100) p_bottom = 100;
t_bottom = thermocouple_b.readCelsius();
t_top = thermocouple_t.readCelsius();
sprintf (buf, "OKddddrn", p_top, p_bottom, t_top, t_bottom);
Serial.print(buf);
}
}
if ((state_top == LOW) && ((millis()-prev_top) >= tick * (100-p_top) / 100)) {
state_top = HIGH;
prev_top = millis();
}
if ((state_top == HIGH) && ((millis()-prev_top) >= tick * p_top / 100)) {
state_top = LOW;
prev_top = millis();
}
digitalWrite(pin_top, state_top);
if ((state_bottom == LOW) && ((millis()-prev_bottom) >= tick * (100-p_bottom) / 100)) {
state_bottom = HIGH;
prev_bottom = millis();
}
if ((state_bottom == HIGH) && ((millis()-prev_bottom) >= tick * p_bottom / 100)) {
state_bottom = LOW;
prev_bottom = millis();
}
digitalWrite(pin_bottom, state_bottom);
}
Приложение для компьютера.
Написано на языке Object Pascal в среде Delphi. Отображает состояние нагревателей, рисует график температуры и имеет встроенный примитивный язык моделирования, больше по философии напоминающий какой-нибудь Verilog, нежели к примеру Pascal. «Программа» состоит из набора пар «условие — действие». К примеру «при достижении нижней термопарой температуры 120 градусов установить мощность нижнего нагревателя 10%, а верхнего — 80%». Таким набором условий реализуется требуемый термопрофиль — скорость нагрева, температура удержания и т. п.
В приложении раз в секунду тикает таймер. По тику таймера функция отправляет в контроллер текущие установки мощности, назад получает текущие значения температур, отрисовывает их в окне параметров и на графике, вызывает процедуру проверки логических состояний, после чего засыпает до следующего тика.
Исходный код: drive.google.com/open?id=1ybs_o17qxBp1C3WeMLrRBQr2mTUntQIp
Сборка и пробный запуск.
Схему управления собрал на макетке. Не эстетично, зато дешево, быстро и практично.
Окончательно собранное и готовое к запуску устройство.
Прогон на тестовой плате выявил следующие наблюдения:
1. Мощь нижнего нагревателя невероятна. График температуры тонкой ноутбучной платы свечой взлетает вверх. Даже при 10% мощности плата уверенно греется до требуемых 140-160 градусов.
2. С мощностью верхнего нагревателя похуже. Догреть чип даже до температуры «низ 50 градусов» получается только на 100% мощности. То ли придется впоследствии переделывать, то ли пускай остается как защита от соблазна недогревать низ.
Покупка чипа на Aliexpress.
В продаже есть два вида мостов 216-0752001. Одни заявлены как новые и стоят от 20 долларов за штуку. Другие указаны как «бывшие в употреблении» и стоят 5-10 долларов за штуку.
Среди ремонтников много мнений относительно б/у чипов. От категорически отрицательных («бугага, приходи ко мне, у меня как раз под столом горка бэушных мостов насобиралась после перепайки, я тебе их недорого продам») до осторожно нейтральных («сажаю иногда, вроде нормально работают, возвраты если и бывают, то не намного чаще новых»).
Поскольку ремонт у меня ультрабюждетный, то было решено сажать чип бывший в употреблении. А чтобы перестраховаться на случай дрогнувшей руки или неисправного экземпляра, был найден лот «2 штуки за 14 долларов».
Демонтаж чипа
Устанавливаем плату на нижний подогрев, крепим одну термопару к чипу, вторую к плате подальше от чипа. Для уменьшения теплопотерь накрываем плату фольгой, за исключением окошка под чип. Ставим верхний нагреватель над чипом. Так как чип уже пересаживался, загружаем самостоятельно придуманный профиль для свинцового припоя (нагрев платы до 150 градусов, догрев чипа до 190 градусов).
Все готово для старта.
После достижения платой температуры 150 градусов автоматически включился верхний нагреватель. Внизу под платой видна разогретая нить накаливания нижней галогенки.
В районе 190 градусов чип «поплыл». Поскольку вакуумный пинцет в бюджет не уместился, цепляем его тонкой отверткой и переворачиваем.
График температур в процессе демонтажа:
На графике хорошо виден момент включения верхнего нагревателя, качество стабилизации температуры платы (желтая крупно волнистая линия) и температуры чипа (красная мелкая рябь). Красный длинный «зубец» вниз — падение термопары с чипа после его переворота.
Запаивание нового чипа
Ввиду ответственности процесса было не до фотосъемки и изготовления скриншотов. В принципе все то же самое: проходимся по пятакам паяльником, мажем флюсом, устанавливаем чип, устанавливаем термопары, отрабатываем профиль пайки, легким пошатыванием убеждаемся, что чип «поплыл».
Чип после установки:
Видно, что сел более-менее ровно, цвет не поменялся, текстолит не погнуло. Прогноз на жизнь — благоприятный.
Затаив дыхание включаем:
Да! Материнская плата запустилась. Я перепаял первый в жизни BGA. К тому же с первого раза успешно.
Ориентировочно смета затрат:
Лампа J254: $1.5*9=$13.5
Лампа J118: $1.5*3=$4.5
Патрон r7s: $1.0*12=$12.0
Термопара: $1.5*2=$3.0
MAX6675: $2.5*2=5.0
Реле: $4*2=$8.0
Чипы: $7*2=$14.0
Итого: $60 минус оставшийся запасной чип.
Ноутбук был собран, в него добавлен найденный в столе жесткий диск на 40 гигабайт, установлена операционная система. Для предотвращения в будущем подобных инцидентов с помощью k10stat напряжение питания ядра процессора понижено до 0.9В. Теперь при самом жестком использовании температура процессора не поднимается выше 55 градусов.
Ноутбук был установлен в столовой в качестве фильмотеки для самого младшего члена семьи, который отказывается принимать пищу без любимых мультиков.