Зарегистрироваться

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
https://www.youtube.com/c/AlexLink-Free
https://vk.com/linklife
https://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
https://www.youtube.com/c/AlexLink-Free
https://vk.com/linklife
https://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();     
 }

}

Видео работы:


Если есть вопросы, задавайте. По возможности буду отвечать.
Добавить в избранное +21 +38
+
avatar
+3
Спартанец)))
+
avatar
  • sir0ta
  • 05 июня 2018, 12:09
+4
Без пид регулировки такое себе… Ведь есть же вагон готовых проектов.
+
avatar
+1
От классического ПИД отказался, нужен был быстрый нагрев.
+
avatar
  • sir0ta
  • 05 июня 2018, 12:29
+3
Так в том то и фишка пида. Тем более код у вас.
Я в свое время пытался управлять нагревателем подобным образом. Но выходило очень не очень ))) Пока не перешел на пид. 3 попытки калибровки и шикарнейше. Да стало на 2-3% дольше выходить на температуру, но именно выйдя на нее не было проблем с пролетами и просадками.
+
avatar
+1
ну замерял термопарой(откалиброванной) — разброс небольшой. Просадки есть но не критичны.
+
avatar
+2
А если ткнуть жало в большой полигон — тоже некритично?
Или кондер из матринки выпаять…
+
avatar
+1
Я предупредил в статье, что большие детали не стоит, но кондер из материнки нормально выпаивает. Полигон тоже но чуть больше времени на прогрев всей массы припоя уходит.
+
avatar
  • hpv
  • 05 июня 2018, 14:00
0
А в чем тут преимущество пида перед простым сравнением с уставкой температуры и простым включением или отключением транзистора?
+
avatar
+1
А в чем недостатки?
Сильно прыгает температура: прислонил — вниз, начинает греть — вверх, ветер дунул — в неизвестную сторону…
+
avatar
  • hpv
  • 06 июня 2018, 14:24
-1
Сильно это сколько? И для каких целей это сильно?
+
avatar
0
Я же не возражаю — пользуйтесь ПСН-40, Ваш выбор — Ваше право.
А мое право сделать свой выбор, и при этом не проводить анализа множества сценариев использования паяльника с привлечением теории систем автоматического регулирования, в которых я не силен.
Мне вполне хватает впечатлений.

Разницу между термодатчиком (любого типа) непосредственно в жале и в нагревателе, который практически всегда отделен от жала воздушным зазором мне вообще сказать нечего — тут у меня точно знаний не хватит, что бы все это теоретически посчитать.
А практика Вам не интересна, как я вижу…
+
avatar
  • hpv
  • 06 июня 2018, 14:51
-1
Зачем вы оправдываетесь? Мне не интересны оправдания.
Я задал вопрос который мне интересен, вдруг я не прав и пид тут действительно нужен.
+
avatar
+1
А я не оправдываюсь.
Вы ведь просили теорию? А теории САР я не силен, мягко говоря.
То, что жало Т12 в отличии от жала 900М, не прилипает к плате при попытке выпаять что то массивное и почему это происходит, знают, по моему, все — кто по собственному опыту, кто сначала по прочитанному в инете, а потом уже по собственному опыту…
Но это практика, а объяснить теоретически я не могу.
Только на пальцах — но снимать видео мне как то влом…
+
avatar
0
перескоки температуры, большой гистерезис, но для пайки нормально, не нужна там супер стабильность +-10° ни на что не повлияют

разве что пид чуть раньше греть начнет при остывании, за счёт интегрирования
+
avatar
  • hpv
  • 06 июня 2018, 13:58
0
Каким образом пид может раньше греть то? Раньше чем сразу по уставке? Строго определённая температура то не требуется, для примитивного метода по уставке, эту уставку можно просто завысить немного и также будет поддерживается температура, там же кучу раз в секунду все это сравнивается и включается выключается
+
avatar
+1
за счет интегрирования, он отреагирует на небольшое отклонение, на которое простой пропорциональный регулятор не станет реагировать

но для паяльника пропорциональный регулятор совершенно достаточен, пользователю от пид никакой радости не будет, кроме фапа на точность до градуса
+
avatar
  • hpv
  • 06 июня 2018, 14:54
0
Вот вот, я это понимаю, НО, нам то не важно точное соответствие температуры выставленной в уставке и фактической.
Если сравнить пид и просто тупое сравнение с чуть завышенной уставкой? Не будет ли тут такая же скорость?
+
avatar
0
как настроить, пидом можно тоже небольшое перерегулирование в конце нагрева сделать и будет такая же скорость нагрева как и просто руками на максимум включить

если без шим, то п в пид это тупое сравнение и есть и его доля настраивается от 0 до 100%
+
avatar
+1
От классического ПИД отказался, нужен был быстрый нагрев.
У меня с классическим ПИД выходит на 350 градусов секунд за 10-12…
Это много?
+
avatar
+2
у вас какой паяльник? С термопарой или терморезистором?
+
avatar
0
Т12 у меня.
+
avatar
  • hpv
  • 05 июня 2018, 14:17
+2
Объясните в чем плюс пида в данном случае
+
avatar
  • bevice
  • 06 июня 2018, 02:07
0
Пид автоматически подстраивается под жало, температуру воздуха, количество припоя и размер полигона. Короче люто-бешенно крутит мощностью паяльника так, чтобы реальная температура была максимально близко к заданной.

Уже довольно продолжительное время испотльзую паяльник с ПИД-регулятором. Работать паяльником без него противно.
По поводу быстрого нагрева — у меня паяльник выходит на режим около 7 секунд, с перелетом в 15/20 градусов. Это достаточно быстро?
+
avatar
  • hpv
  • 06 июня 2018, 14:01
0
Каким образом он подстраивается то?)) или для каждого жала свои пиды ?))
Допустим для жала которое нагревается очень быстро и для массивного — чтобы все максимально быстро нагревалось и не перескакивало нужную температуру нужны свои пиды
+
avatar
0
именно свои коэффициенты под каждое жало
так и реализовано в контроллерах на STM32
+
avatar
  • hpv
  • 06 июня 2018, 14:57
0
Это даёт какой-то реально видимый/ощущаемый эффект?
+
avatar
-1
учитывая что в не оригинальных жала термопара может отличаться по параметрам от заданных значений (8Ом), то индивидуальная калибровка жал желательна/обязательна.
Это как раз и дает приемлемую точность измерения и поддержания заданной температуры
+
avatar
  • bevice
  • 06 июня 2018, 16:40
0
Да тоже не особо нужно — интегральная и дифференциальная составляющие сами подстроятся под жало
+
avatar
0
Ну, суда наработкам Victor_P. на радио-коте, вполне достаточно и ПИ регулирования.
+
avatar
  • bevice
  • 06 июня 2018, 16:45
+1
Кроме пропорционального управления (это разность заданной и измеренной температуры) есть еще дифференциальное — это, как мы помним из школы — скорость изменения температуры, и интегральная составляющая, которая хранит «предыдущий опыт», все это позволяет автоматически подстроиться под конкретные условия.
+
avatar
  • sir0ta
  • 06 июня 2018, 08:11
+1
Пид позволяет быстро и точно выйти на требуемую температуру. второе — точно ее держать.
+
avatar
  • hpv
  • 06 июня 2018, 14:08
0
Быстрее чем тупо греть на максимуме, пид не нагреет.
Нагрев жала можно включать и отключать сотни раз в секунду. Нагрев процесс инертный, он сам по себе сглаживает температуру. Так какой тут смысл в пиде? Это же не клапан и не задвижка которая не может сотни раз в секунду понемногу двигаться.
+
avatar
  • sir0ta
  • 06 июня 2018, 15:15
+1
Изучите тему.
+
avatar
  • rx3apf
  • 06 июня 2018, 16:23
-1
Физику обмануть не получится — больше, чем 100% мощности в нагреватель никакой ПИД не даст, поскольку неоткуда.
+
avatar
  • bevice
  • 06 июня 2018, 16:39
+1
Так пид и будет греть на 100%, но в отличии от пропорционального алгоритма сделает это намного эффективнее. Простой алгоритм на компораторе из-за огромной инертности нагревателя обеспечит существенный перелет температуры, пропорциональный алгоритм, по той же прицине так же или перелетит или будет долго греть.
Да и в работе удобно, ПИД будет всеми правдами удерживать температуру, вне зависимости от того, паяете вы 0603 резистор или тот же конденсатор на 16-слойной материнке на огромном земляном полигоне.
+
avatar
  • rx3apf
  • 06 июня 2018, 20:31
-1
Речь шла о скорости нагрева. ПИД, не-ПИД — все одно, больше 100% мощности все равно не выйдет, соответственно и скорость разогрева зависит не от этого (правда, температура сенсора и температура кончика жала это две большие разницы, тем более для 900-й серии). ПИД предотвратит (или уменьшит) выбег температуры, но скорости начального разогрева не прибавит (а, наоборот, чуть замедлит).
+
avatar
  • sir0ta
  • 06 июня 2018, 21:20
0
Вы совсем не адекват или паяете только 120Вт медным жалом? Объясняю на пальцах. Имеется компонент. Его максимальна температура живучести 200 градусов. Иначе в нем случаются граничные физико-химические процессы разваливающие его в хлам. Имеется система требующая в переходных процесса олово не ниже ПОС-61. И имеется температура плавления ПОС-61 183 градуса. И при всем при этом местами у вас контакт 2мм квадратных с пустотой под ним, а местами полигон в пол платы с 4 слоями под ним разного рода проводников?
Смысл инструмента (особенно фена) не в том чтобы максимально выйти на заданную температуру, а сделать это максимально быстро не вылетая максимально точно за установленные пределы.
Еще более точнее. Выпаять я могу много что и много от куда даже 20Вт паяльником. но что при этом будет во круг и с тем что я выпаиваю…
+
avatar
  • rx3apf
  • 06 июня 2018, 21:36
+1
Вы вообще понимаете, о чем идет речь, или нет? Не надо мне объяснять, что такое PID. Не надо мне объяснять логику регулировки — я это все прекрасно знаю. Речь шла о скорости набора температуры. Быстрее, чем 100% мощностью набрать нельзя никак и никаким методом. Но без ПИД оно достигнет этой температуры и пролетит, а с ПИД — не пролетит. Окончательное установление с ПИД будет быстрее. А первоначальное достижение этой же температуры будет быстрее без ПИД (но пролетит). Но это то, о чем вообще был спор.

А вот про достоинства ПИД применительно к 900-й серии не надо рассказывать сказки. Тем более что речь идет вообще о нихромовом нагревателе с термопарой. Никакой алгоритм не позволит установить и поддерживать температуру на кончике жала. Потому что есть тепловое сопротивление между нагревателем и кончиком (тем более что основная масса ширпотребных жал — просто хлам). Его можно учесть в статике, но никак нельзя в процессе работы. Никак, просто в принципе (нет датчика в точке пайки). С этим столкнулся, например, автор DSS-90 Леонид Ридико (см. на том же Радиокоте). Да, ПИД. Да, идеально выходит на режим и поддерживает. На сенсоре. А на кончике жала при работе — хоть застрелитесь, не будет. Оно и с Т12-то (по крайней мере китайскими клонами) идеально не получается, а на нихромовой подделке под 900 — и не мечтайте. И даже на керамике не получится.

С феном — другая песня. Опять же можно быстро подогнать и идеально удержать температуру на термопаре, но там, где поток соприкасается с нагреваемым объектом картина будет совсем иной.

А, да, и для теоретиков — Вы с ума сошли, если предполагаете паять компонент с предельной температурой 200 градусов ПОС-61. У которого рабочая температура примерно 250 (никто не паяет при температуре начала плавления припоя).
+
avatar
  • VG1544
  • 05 июня 2018, 12:14
0
А чем изолировали полевик? Интересно ваше мнение, использовали бы супер клей в качестве изоляции не греющихся элементов, а если не использовали бы, то что другое?
+
avatar
0
ну мосфет тут не греется и я залил просто термоклеем. Супер не использовал бы а вот классический да — он «резина», по мне так лучше.
+
avatar
+14
Если не публикуется измененная схема и новый скетч, то зачем этот, так называемый, обзор?
+
avatar
-2
Это не «обзор» это «топик в сообщество» с тэгом «сделай сам» — не тупо скопируй, а подчерпни идей.
+
avatar
+16
подчерпни идей
Какая тут идея?
Запихнуть горсть компонентов в распаечную коробку?
Даже не потрудились показать людям что отображает 1602.
Бесполезная статья с тэгом «сделай сам».
ИМХО.
+
avatar
  • tklim
  • 06 июня 2018, 04:45
0
так ничего ж и не отображает)
+
avatar
0
Вы через строку читали? Там есть фото где всё видно, что показывает 1602.
+
avatar
+2
А мне не понятно, почему бы свой код не опубликовать.
+
avatar
+1
потому что он был заказан за деньги
+
avatar
+4
1. Про деньги не написано в обзоре.
2. Если там только вывод на экран поправлен, ну глупо же скрывать. Тем более что был бесплатно использован чужой труд.
+
avatar
+1
1- написано что я его заказал
2- глобально — да, но ещё сделано много мелочей, которые почти полностью меняют скетч(нетронутым остался принцип ШИМ)
+
avatar
+5
Вероятно опасается, что его код скопипастят и начнут клепать в производственных масштабах. А вообще смешно конечно. Рассматривать ардуино, как базу не стоит, минимум ST32.
+
avatar
-1
Не опасаюсь. Но столько труда и бессонных ночей на тестирование, калибровку итд угрохано…
+
avatar
+14
Но столько труда и бессонных ночей на тестирование
пожалуй, да, пусть оно лучше гниёт у юного Билли на винте))
+
avatar
0
Аминь
+
avatar
  • rx3apf
  • 05 июня 2018, 12:34
+1
Если обработку энкодера делать изначально грамотно, не потребуются сомнительные «костыли» в виде конденсаторов. Вне зависимости от дребезга контактов.
И что-то не соображу — у оригинальной 936 ведь резистивный сенсор, а на схеме явно под термопару, т.е. под дешевую китайскую подделку с нихромовым нагревателем?
+
avatar
0
Конденсаторы как подстраховка, а дребезг в скетче учтен.
Да, я давно заказывал прозапас на свой Хакко паяльник, но мне прислали с термопарой… забыл указать в обзоре, исправлюсь
+
avatar
0
Если обработку энкодера делать изначально грамотно, не потребуются сомнительные «костыли» в виде конденсаторов. Вне зависимости от дребезга контактов.

А можно ссылку на грамотную реализацию? Спасибо.
+
avatar
  • bevice
  • 06 июня 2018, 11:19
0
Так же как и с кнопками — читайте по таймеру. А обработку у @DiHalt можно найти easyelectronics.ru/obrabotka-mnozhestva-inkrementalnyx-enkoderov-odnovremenno.html
+
avatar
  • rx3apf
  • 06 июня 2018, 12:13
0
Конкретно ссылку сейчас не подскажу, на electronix.ru обсуждалось неоднократно. Ключевое слово — «автомат состояний». На каждом этапе опроса (но можно сделать и на прерываниях) имеем текущее состояние квадратурных каналов, и их же состояние из предыдущего опроса. И по полученным 16 комбинациям принимается решение — инкремент, декремент или ничего не делать. Поскольку инкрементов на один полный цикл будет 4, для типичного полноциклового энкодера из счетчика «списывается» четверками (т.е. берем целую часть от деления на 4, остаток оставляем в счетчике). Я у себя обычно использую частоту опроса порядка 4..8 kHz. Бывают и контроллеры с готовым квадратурным входом, но их относительно немного.
+
avatar
0
на electronix.ru обсуждалось неоднократно
читал и сделал свой велосипед — github.com/enjoyneering/RotaryEncoder

И по полученным 16 комбинациям принимается решение — инкремент, декремент или ничего не делать.
достаточно 8-и состояний (4-е инкремент, 4-е декремент). засада в том analogRead() у arduino фреймворка для AVR настолько ме-е-дленый, что не могу прочитать оба сигнала по одному прерыванию. на arduino esp8266 и arduino STM32 такой проблемы нет — работает как часики. даже приходится еще 0.1мФ допаивать — процы такие быстрые, что все равно умудряются дребезг нахватать.

void RotaryEncoder::readAB()
{
  noInterrupts();                                         //disable interrupts

  _currValueAB  = digitalRead(_encoderA) << 1;
  _currValueAB |= digitalRead(_encoderB);


  switch ((_prevValueAB | _currValueAB))
  {
    //case 0b0001: case 0b0111: case 0b1000: case 0b1110: //CW states, half steps counter
    case 0b0001: case 0b1110:                             //CW states, skip half steps counter
      _counter++;
      break;

    //case 0b0010: case 0b0100: case 0b1011: case 0b1101: //CCW states, half steps counter
    case 0b1011: case 0b0100:                             //CCW states, skip half steps counter
      _counter--;
      break;
  }

  _prevValueAB = _currValueAB << 2;                       //update previouse state

  interrupts();                                           //enable interrupts
}


функцию readAB() вешаю на обработчик прерывания по — «CHANGE»
+
avatar
  • rx3apf
  • 06 июня 2018, 20:33
0
Вот тем и хорош опрос по таймеру — есть дребезг, нет дребезга, а все едино. Как не крути, ни набросов, ни пропусков. И времянки предсказуемы.
+
avatar
0
Согласен, но тогда универсальность библиотеки не получится. Тк настройка таймеров у всех разная и не включена во фреймворки.Щас без кондеров на esp и stm при дребезге идет пропуск кликов. С кондерами все ОК. Сражаюсь с avr — пытаюсь подменить digitalRead() на свой более быстрый аналог.
+
avatar
  • bevice
  • 06 июня 2018, 22:23
0
Бросьте вы эти digitalRead(), да и вообще avr. Нет в них ничего хорошего.
А таймеры — не важно как настраиваются, все равно они почти всегда используются, а подсунуть в таймер библиотечную функцию чтения энкодера не сложно
+
avatar
  • zhevak
  • 05 июня 2018, 13:27
+3
Готовый вид — невзрачно, но работоспособно
Всё правильно! Приоритеты правильно расставлены. Одобрям-с!

Когда ресурсов много, то каждый сможет сделать шедевр. Но когда ресурсы ограничены, то приходится идти по сокращённому варианту, чем-то жертвовать. Время — это, к стати, тоже ресурс.

У одних изделий основное предназначение выглядеть красиво. Бутафория не обязана работать. Другие — созданы чтобы надёжно работать и обеспечивать вполне конкретную функциональность. И совсем не важно, как они выглядят.

Это не важно как покрашена лопата, главное в том, что она позволяет (не ломаясь) вскопать огород.
+
avatar
+4
Это не важно как покрашена лопата, главное в том, что она позволяет (не ломаясь) вскопать огород.
Ну, в принципе оно так…

Говорят, ездит…
+
avatar
  • ibn
  • 05 июня 2018, 14:17
0



Отличная патина)))
+
avatar
  • zhevak
  • 05 июня 2018, 14:23
+1
К чему этот автомобиль? (Ржавый Москвич)

Еще раз. Следите за руками… «при НЕДОСТАТКЕ РЕССУРСОВ...»

А Вы представьте себе ситуацию, когда жахнул реактор Чернобыльской АЭС, а других средств передвижения у вас нет. У Вас нет ни времени, ни денег, чтобы найти другой автомобиль. А этот — как Вы говорите — способен выполнять свою основную задачу — надёжно перемещать вас в пространстве. И я не думаю, что Вы будете надувать губы, чтобы покинуть зону поражения только на комфортабельном авто.

А если Вы считаете, что эта ржавая халабуда не способна надёжно выполнять свою задачу (ехать не ломаясь и везти груз), то зачем Вы её тогда привели в качестве антипримера?
+
avatar
0
При недостатке ресурсов можно ездить и на этом автомобиле, я разве спорю?
При совсем уж недостатке ресурсов идут в фикспрайс и покупают десяток паяльников.
На пяток паек их должно хватить…
+
avatar
  • Arian
  • 05 июня 2018, 18:46
+3
При совсем уж недостатке ресурсов идут в фикспрайс и покупают десяток паяльников.
На пяток паек их должно хватить…
Вы путаете недостаток ресурсов с переизбытком ;)
+
avatar
  • jeepeg
  • 05 июня 2018, 20:24
0
А кто-то покидать собрался???
+
avatar
-1
Спасибо, как раз искал такую вариацию данной схемы и именно с таким дисплеем, жирный плюс!
+
avatar
-2
Я тоже искал но не нашел в сети, хотелось именно на 1602. Пришлось пилить «свой огород». Если будете реализовывать, и будут вопросы — пишите в ЛС
+
avatar
+1
Для экрана есть библиотека получше — github.com/enjoyneering/LiquidCrystal_I2C
+
avatar
0
#include <LiquidCrystal_I2C.h> именно это я и использую.
+
avatar
0
Их тонны под одним названием.
+
avatar
-1
Я думал вы не увидели что не семисегментник использую)
+
avatar
  • tklim
  • 06 июня 2018, 04:47
+1
я не увидел. к чему в прошивке аноды и катоды?
+
avatar
-1
а я даже во включенном состоянии станцию не увидел, не говоря уже о инфе на дисплее
+
avatar
+1
могу вставить видео, чтобы уж точно всё видно было))
+
avatar
-1
надо сразу это делать, а не по прошествию нескольких дней, когда обзор практически уже никому не интересен
+
avatar
0
Аминь
+
avatar
+2
Скетч, по понятным причинам, не публикую
Хоть намекните на эти причины… Лицензия не позволяет?
+
avatar
  • hpv
  • 05 июня 2018, 14:16
+14
Отсутствие опыта программирования — люди с таким опытом всегда считают что их творения кто-то украдет и разбогатеет))
+
avatar
-4
вы себе противоречите — «отсутствие опыта» не есть «с таким опытом»))) Возможно вы хотели сказать «без опыта»
+
avatar
  • hpv
  • 06 июня 2018, 14:32
0
Но сам то человек, который без опыта, решил что у него опыт есть))) эффект Даннинга-Крюгера в действии ;)
+
avatar
  • bevice
  • 06 июня 2018, 02:12
0
Еще бывает стыдно. Хотя даже на хабре не стесняются ловить кнопки прерываниями, так что вряд ли
+
avatar
0
Еще бывает стыдно.
по-моему это хабравчане и ввели такую фигню среди русских программистов, либо стесняться, либо заведомо извиниться «за говнокод», бред же, как написано так написано, поделились исходником — скажи спасибо

не стесняются ловить кнопки прерываниями
а это плохо?)
+
avatar
  • bevice
  • 06 июня 2018, 11:04
+1
Кнопки дребезжат, антидребезг — это костыль. Что программный, что аппаратный.
Читайте кнопки по таймеру и никаких проблем не будет.
+
avatar
0
очень категорично)
а если на ближайшие пару лет у вас только 20мач электричества?
и прерывание можно выключить на время дребезга, ещё можно только флаг в нём ставить, зачем себя ограничивать только таймером, его даже просто может не быть в распоряжении

костыль тоже словечко от тех же хабравчан, любое решение можно костылем обозвать
+
avatar
  • bevice
  • 06 июня 2018, 16:29
0
Если нужно энергосбережение — по прерыванию можно проснуться, но использовать прерывание для детекции нажатия кнопок — это плохая практика.
Нарушать правила — можно и даже нужно, но только в том случае, когда есть понимание того, что делается и для чего. А с пониманием у ардуино-коммунити все очень и очень плохо.
+
avatar
  • tklim
  • 06 июня 2018, 04:58
0
а что неправильного в обработке кнопок в пперываниях? или тут тонкий сарказм?
+
avatar
0
Да, а чем плох метод ловли кнопки по прерванию?
+
avatar
-7
+
avatar
+7
Я недавно донатил автору кастомной прошивки на плеер xduoo x3. Но я себе не представляю ситуацию, когда я бы у этого автора попросил особую фичу для плеера, заплатил и не разрешал выкладывать её для остальных.

Мотив может быть только один — я хочу на основе этого кода сделать коммерческий продукт и зарабатывать деньги.
Вы хотите сделать партию таких паяльников и продавать? Или может продаете эту модифицированную прошивку?
+
avatar
-9
+
avatar
+15
Осуждаю. Пользуетесь плодами библиотек написаннвх людми бескорыстно и не выкладывайте код. Они ведь тоже время тратили.
+
avatar
+3
а первоисточник не указал лицензию, выкатит сборы по $20 с копии, когда автор захватит рынок паяльников))
+
avatar
+1
Не понял со схемой: у вас из 24 вольта получается 5, а в схеме из 5 преобразовывается в 24в.
Почему не использовали вместо lm платку mAX6675 с компенсацией холодного спая термопары? Были бы точнее показания температуры.
ru.aliexpress.com/item/5Set-lot-ENC28J60-Ethernet-LAN-Network-Module-Schematic-51-AVR-LPC-for-arduino-SD-Card-Module/1607942167.html?spm=2114.13010708.0.0.4eb333edl6Mv7D
Вместо вашего паяльника взять этот
ru.aliexpress.com/item/SHEVCHENKO-T12-950-Handle-Digital-Soldering-Station-FX-9501-Handle-Soldering-Iron-For-HAKKO-912-Handle/32835065313.html?spm=2114.13010708.0.0.3a9933edFRcwUe
Этот маленький корпус
ru.aliexpress.com/item/Electric-Unit-Digital-Soldering-Iron-Station-Temperature-Controller-Kits-for-HAKKO-T12-Handle-DIY-kits-w/32740527077.html?spm=2114.13010708.0.0.3a9933edFRcwUe
Этот контролер
ru.aliexpress.com/item/-/32836534258.html?spm=a2g0s.9042311.0.0.274233edHXLtpy
10 секунд нагрева до 300 градусов при 24 вольтах питания
+
avatar
0
В схеме все верно, не понял, где вы увидели 5->24
Возможно ваш вариант и лучше, но на тот момент, когда я собирал свой, таких недорогих контроллеров еще не существовало.
+
avatar
0
А откуда поступают 24 вольта, наверно с окружности.Просто так не рисуют. Все разобрался.
+
avatar
  • ResSet
  • 05 июня 2018, 17:09
+18
Скетч, по понятным причинам, не публикую, но покажу скетч от первоисточника
Это что ж я получается протупил когда выложил правленный скетч на робота?
Не, это конечно дело автора, но DIY это не "почерпни часть знаний, а дальше уже сам". Зачастую это "Повтори за мной если хочешь". В этом ценность данного раздела. Если есть руки ты повторишь, если не нравится — переделаешь по-своему.
+
avatar
+4
Без скетча это уже и не обзор. Писать про одно, выложить другое…
+
avatar
+13
И о чем этот «обзор»?
нормальной схемы нет, прошивка отсутствует

А на самом деле оказалось пришивку за вас допиливал другой человек…
А элементы схемы срисованы с подобных разработок с кота и паяльника. И что тут вашего???

Фото-хваст — типа «я смог!»
+
avatar
+3
Для тех, кто заинтересовался идеей: оригинальная статья (от Alex Link) с комментариями.
+
avatar
  • t0xy
  • 05 июня 2018, 22:33
0
я тоже себе в такую засунул, только там еще блок питания и фен
+
avatar
0
Полевки греется?
+
avatar
  • bevice
  • 06 июня 2018, 11:44
0
греется, но очень слабо. Ток через нагреватель, 24/16 — 1.5A, транзистор не полностью открытый, при 5Vgs у оригинального транзистора должно быть порядка 50 mOhm Rds, при токе 1.5A на транзисторе будет выделяться 113mW, что при сопротивлении 62С/W (для не подключенного к радиатору транзистора), нагреет кристалл на 7 градусов, корпус нагреется еще меньше. И это для постоянно включенного нагревателя, а по факту он работает меньше.
+
avatar
0
Vgs = 5v для IRFZ44N чуть-чуть маловато. ему бы Vgs = 6..7v минимум.
взяли бы IRLZ44N у него Rds(on) = 22mOhm при Vgs = 4.5v

подробности — elchupanibrei.livejournal.com/40487.html
+
avatar
  • stupic
  • 06 июня 2018, 11:27
0
коробка распаячная Tyco 200х140х75 IP55
есть такие же, но без гермовводов, код 67055
+
avatar
0
Есть, но в нашем единственном магазине электротоваров его нет((