ИК паяльная станция на Arduino Mega 2560. Доработка скетча "ARS_v2_Lilium_JSN"

Тема в разделе "Глядите, что я сделал", создана пользователем Jalnin, 2 ноя 2012.

Статус темы:
Закрыта.
  1. SOLOway

    SOLOway Гуру

    @revolover
    Посыпаю голову пеплом.Я виноват перед вами - я предоставил вам ссылку на дисплей, не уточнив информацию по его разрешению. Прошу прошения. Не знал, что tft 3.2" бывают 320*240.
    Под дисплей с таким разрешением правил скетч Yurik-o здесь Он появляется в теме, но обновленными версиями своих доработок пока не поделился.
    Обращаюсь ко всем участникам темы - будьте, пожалуйста, внимательны. Я отредактировал тот свой пост
    Прошу прощения у всех, кто заказал набор по той моей ссылке.

    P.S.: В Сети натыкался на старенький проект на Mega128 с софтом под линукс. Страница проекта
     
    Последнее редактирование: 18 май 2020
  2. Yurik-o

    Yurik-o Нерд

    Ну, скажем кардинально новых версий пока нет, хотя есть куда двигаться вместе с форумом. Моя последняя версия 1m5. версия 2m1 не пошла и я начал версию 3m0 - здесь у меня полное перелопачивание интерфейса с настройкой параметров почти "на лету", не уходя в отдельное меню настроек, но она далека до завершения - банально нет на это времени, если кому интересно покопаться могу выложить.
    disp.h нужен. В третьей версии их (.h) уже много, я сгруппировал и вынес в отдельные файлы функции и подпрограммы для удобства.
     

    Вложения:

    • ARSUNO_v1m5.ino
      Размер файла:
      54,2 КБ
      Просмотров:
      438
    • disp.h
      Размер файла:
      1,2 КБ
      Просмотров:
      410
    • display_m5.jpg
      display_m5.jpg
      Размер файла:
      580,2 КБ
      Просмотров:
      873
    Последнее редактирование: 5 май 2018
    Vinyla и SOLOway нравится это.
  3. revolover

    revolover Гик

    Бывает) Перекурил, успокоился. Погляжу, может и интерфейс поправлю, может перезакажу, только теперь я совсем в ступоре, как экран выбрать и нужен ли шилд...
     
  4. Dmitrysh

    Dmitrysh Гуру

    нет не нужен, если только на sd карту писать не будете. А на моем, вроде и сдишка есть
     
    Последнее редактирование: 4 май 2018
  5. Dmitrysh

    Dmitrysh Гуру

  6. bamik

    bamik Нерд

    Под системой понимается не только нагреватель. Его инерционным можно называть только в том случае, если мы будем управлять его нагревом и измерять его температуру. Для стандартного алгоритма применения ПИДа к паяльной станции нагреватели должны быть такой мощности, которой достаточно для достижения температуры уставки. А не по принципу, чем больше тем лучше. Либо сам нагреватель должен успевать менять свою температуру в короткое время. Тогда вся система будет достаточно инерционной для работы ПИДа. Есть разработки, где и нижний и верхний нагреватели имеют мощность по 350 Вт в кварце. И все отлично работает.
    По-идее, ПИД предназначен для поддержания некоего состояния с минимумом выходов за пределы при неопределенных факторах сторонних воздействий. Мы же его заставляем делать несколько другую работу.
     
  7. tssergej

    tssergej Нерд

    только не у этого перца заказывать...слишком много негативных отзывов у него.
     
  8. Dmitrysh

    Dmitrysh Гуру

    Да, это я для примера показал какой нужен.
     
  9. Dmitrysh

    Dmitrysh Гуру

    Расписал переменные скетча, так как я их понимаю. Может кому сгодится.
    Код (C++):
    extern uint8_t SmallFont[];      //маленький шрифт lcd
    extern uint8_t BigFont[];        //большой шрифт lcd
    extern uint8_t BigFontRus[];     //Кирилица
    extern uint8_t SevenSegNumFont[];//шрифт в виде семисегментного индикатора

    int temp;

    int er1 = 1;  //переменная для расчета переполнения в алгоритме Брезенхема для ВИ
    int er2 = 1;  //переменная для расчета переполнения в алгоритме Брезенхема для НИ
    int reg1;     //промежуточная переменная для алгоритма Брезенхема для ВИ
    int reg2;     //промежуточная переменная для алгоритма Брезенхема для НИ
    boolean out1; //выход импульса управления ВИ алгоритма Брезенхема
    boolean out2; //выход импульса управления НИ алгоритма Брезенхема

    //int pwr1; - атавизм, нужно убрать из скетча
    //int pwr2; - атавизм, нужно убрать из скетча

    //секция ввода/вывода для ПЭВМ
    char buf[20];   //буфер вывода сообщений через сом порт
    char buf1[70];  //буфер вывода праметров через сом порт
    String ttydata; //принятая строка параметров с сом порта от ПЭВМ



    int min_pwr_BOTTOM;              //минимальная мощность нижнего нагревателя
    int max_pwr_BOTTOM;              //максимальная мощность нижнего нагревателя
    int min_pwr_TOPStep[3];          //минимальная мощность верхнего нагревателя
    int max_pwr_TOPStep[3];          //максимальная мощность верхнего нагревателя

    //RelayPin "1"-ВЕРХНИЙ нагреватель
    //RelayPin "2"-НИЖНИЙ нагреватель
    #define RelayPin1 7  //назначаем пин "ВЕРХНЕГО" нагревателя для управления симистором ВИ
    #define RelayPin2 6  //назначаем пин "НИЖНЕГО" нагревателя для управления симистором НИ


    // Выходы реле
    #define P1_PIN 9   //назначаем пин реле 1 - секция 1 НИ
    #define P2_PIN 10  //назначаем пин реле 2 - секция 2 НИ
    #define P3_PIN 11  //назначаем пин реле 3 - секция 3 НИ
    #define P4_PIN 12  //назначаем пин реле 4 - секция ВИ


    int tableSize=3;  //количество подключенных секций НИ
    int buzzerPin = 8;//пин пищалки

    // int time = 0; - это что-то лишнее

    //Назначаем пины кнопок управления
    int upSwitchPin = 21;     //пин кнопки вверх
    int downSwitchPin = 20;   //пин кнопки вниз
    int cancelSwitchPin = 19; //пин кнопки отмена или назад
    int okSwitchPin = 18 ;    //пин кнопки ОК или подтверждения

    //состояние кнопок по умолчанию
    int upSwitchState = 0;       //состояние кнопки вверх
    int downSwitchState = 0;     //состояние кнопки вниз
    int cancelSwitchState = 0;   //состояние кнопки отмена или назад
    int okSwitchState = 0;       //состояние кнопки ОК или подтверждения

    //переменные для кнопок
    long ms_button = 0;                 //время в мс сколько была нажата кнопка
    boolean  button_state = false;      //статус короткого нажатия кнопки
    boolean  button_long_state = false; //статус длинного нажатия кнопки

    //секция профиля
    byte currentProfile = 1;//текущий профиль
    int currentStep = 1;    //текущий шаг профиля
    byte profileSteps=3;    //количество шагов профиля
    int profileName;        //имя профиля

    //current editing step pointer
    int editStep = 0; //номер шага профиля который редактируется в данный момент

    int dwellTimerStep[3]; //установленное время перехода на следубщий шаг
    double rampRateStep[3];//скорость роста температуры
    double TimerStep;      //текущее время перехода на следующий шаг

    int kp1;  //пропорциональный коэффициент ПИД для ВИ
    int ki1;  //интегральный коэффициент ПИД для ВИ
    int kd1;  //дифференциальный коэффициент ПИД для ВИ
    int kp2;  //пропорциональный коэффициент ПИД для НИ
    int ki2;  //интегральный коэффициент ПИД для НИ
    int kd2;  //дифференциальный коэффициент ПИД для НИ

    double startTemp; //стартовая температура для профиля, когда НИ вышел на уставку, используется для определения шага профиля с которого начинаем

    int setpointRamp; //заданная температура по определённому шагу профиля ВИ, связана с заданной скоростью роста температуры
    boolean TopStart = false; //флаг включения ВИ
    int flag = 0;             //флаг для фиксации стартовой температуры
    int x=1;                  //переменная для перехода на нужный шаг при горячей плате
    int temperatureStep[3];   //заданные температуры для шагов профиля ВИ

    //int eepromAddress = 0;//начало eepromaddress - атавизм, нужно убрать из скетча

    long previousMillis; //это для счетчиков времени

    double counter;     //это сам счетчик времени

    //these are the different states of the sketch. We call different ones depending on conditions
    // ***** TYPE DEFINITIONS *****
    //структура статусов событий
    typedef enum REFLOW_STATE:byte
    {
      REFLOW_STATE_IDLE,
      REFLOW_STATE_MENU_STEPS,
      REFLOW_STATE_MENU_TABLE_SIZE,
      REFLOW_STATE_MENU_BOTTOM_HEAT,
      REFLOW_STATE_MENU_BOTTOM_PWR_MIN,
      REFLOW_STATE_MENU_BOTTOM_PWR_MAX,
      REFLOW_STATE_MENU_STEP_RAMP,
      REFLOW_STATE_MENU_STEP_TARGET,
      REFLOW_STATE_MENU_TOP_PWR_MIN,
      REFLOW_STATE_MENU_TOP_PWR_MAX,
      REFLOW_STATE_MENU_STEP_DWELL,
      REFLOW_STATE_MENU_BOTTOM_P,
      REFLOW_STATE_MENU_BOTTOM_I,
      REFLOW_STATE_MENU_BOTTOM_D,
      REFLOW_STATE_MENU_TOP_P,
      REFLOW_STATE_MENU_TOP_I,
      REFLOW_STATE_MENU_TOP_D,
      REFLOW_STATE_STEP_RAMP,
      REFLOW_STATE_TABLE_SIZE,
      REFLOW_STATE_STEP,
      REFLOW_STATE_STEP_DWELL,
      REFLOW_STATE_COMPLETE,
      REFLOW_STATE_ERROR
    }
    reflowState_t;

    typedef enum REFLOW_STATUS:byte   //структура статуса пайки, запущен или нет
    {
      REFLOW_STATUS_OFF,
      REFLOW_STATUS_ON
    }
    reflowStatus_t;

    #define SENSOR_SAMPLING_TIME 1000 //read tc every second //время обновления температуры в милисекундах

    reflowStatus_t reflowStatus; //переменная статусов событий
    // Reflow oven controller state machine state variable
    reflowState_t reflowState;   //переменная статуса пайки

    //TC read timer variables
    //unsigned long nextCheck1; - атавизм, убрать если не надо
    unsigned long nextRead1; //переменная для времени обновления текущей температуры

    //PID stuff
    double Setpoint1, Input1, Output1;  //соответственно для ВИ: установленная температура(уставка) | текущая температура(измеренная max6675) | выход ПИД регулятора

    //Specify the links and initial tuning parameters

    //unsigned long windowStartTime;    //атавизм, убрать, если не нужно
    //PID stuff
    double Setpoint2, Input2, Output2;  //соответственно для НИ: установленная температура(уставка) | текущая температура(измеренная max6675) | выход ПИД регулятора
    //Specify the links and initial tuning parameters


    //Alarm state boolean
    boolean alarmOn = false;          //признак предупреждения

    //Update whole screen boolean
    boolean updateScreen = true;      //признак обновления экрана

    //назначаем пины уселителя термопары MAX6675 "ВЕРХНЕГО" нагревателя   clk=sck cs=cs do=so
    int thermoCLK = 14;  //=sck
    int thermoCS = 15;   //=cs
    int thermoDO = 16;   //=so
    //назначаем пины уселителя термопары MAX6675 "НИЖНЕГО" нагревателя clk=sck cs=cs do=so
    int thermoCLK2 = 14;  //=sck
    int thermoCS2 = 17;   //=cs
    int thermoDO2 = 16;   //=so

    // переменные для калмана "ВЕРХНЕГО" нагревателя
    float varTerm1 = 0.25;  // среднее отклонение (ищем в excel)
    float varProcess1 = 0.0125; // скорость реакции на изменение (подбирается вручную)
    float Pc1 = 0.0;
    float G1 = 0.0;
    float P1 = 1.0;
    float Xp1 = 0.0;
    float Zp1 = 0.0;
    float Xe1 = 0.0;

    // переменные для калмана "НИЖНЕГО" нагревателя
    float varTerm2 = 0.25;  // среднее отклонение (ищем в excel)
    float varProcess2 = 0.0125; // скорость реакции на изменение (подбирается вручную)
    float Pc2 = 0.0;
    float G2 = 0.0;
    float P2 = 1.0;
    float Xp2 = 0.0;
    float Zp2 = 0.0;
    float Xe2 = 0.0;
    // переменные для калмана
    int tc1; //переменная для хранения текущей температуры ВИ
    int tc2; //переменная для хранения текущей температуры НИ
     
    SOLOway нравится это.
  10. Dmitrysh

    Dmitrysh Гуру

    Достаточно это >=. И обязательно запас по мощности минимум процентов 10, а в нашем случае чем больше тем лучше(без фанатизма конечно).
    Вот зачем нужен запас по мощности.
    Кварц излучает нужный ИК спектр, по этому и мощность можно меньше. А у меня, допустим, снизу галоген, сверху керамика. Излучают они нужного ИК не так уж и много, поэтому и мощность у них выше.
    Дак у нас, по идее, так и есть. Об этом я позже напишу.
     
  11. bamik

    bamik Нерд

    Скорость изменения температуры на излучателе не только зависит от мощности. От мощности зависит нагрев, а охлаждение зависит от теплоемкости. Керамика - совсем не для наших целей. Вот яйца в инкубаторе греть - да, сгодится. В Китае продаются различные кварцевые излучатели в типовые разъемы для галогенок. Просто покупаешь и заменяешь. А верхний нагреватель придется переделывать.
    Я планирую собрать верх из кварцевых ламп, а низ из кварцевых трубок.
     
    Dmitrysh нравится это.
  12. Dmitrysh

    Dmitrysh Гуру

    Поддерживаю.
    Вот в этом и основная проблема не только у меня но и у большинства других людей. А именно отсутствие достаточного финансирования. Проект не коммерческий, требуется изыскивать средства из своего бюджета, а это не у всех получается. Да и хочется сделать устройство, которое будет работать на всём что доступно.
     
  13. Dmitrysh

    Dmitrysh Гуру

    Вы как-то писали:
    Так у нас так и есть, смотрите кусок кода:
    Код (C++):
    //счётчик скорости роста температуры            
          if ((currentMillis - previousMillis) > 1000 * rampRateStep[currentStep - 1] * 0.1) //скорость роста температуры от 0.1с. до 3с.
           {
            previousMillis = currentMillis;
            counter = counter + 1;
            setpointRamp = counter + startTemp;
            myGLCD.setFont(BigFont);
            myGLCD.setColor(250, 180, 000);
            myGLCD.printNumI(setpointRamp,420, 300,3,'0');
            Setpoint1 = setpointRamp;
           }
    Setpoint1 отправляется в ПИД как уставка, в зависимости от скорости роста температуры. Т.е каждый шаг разбивается на много частей и по частям скармливается ПИДу. И чем медленнее рост температуры, тем больше частей делается. А на шаги профиль разбивается для того чтобы делать "полки", т.е промежутки времени с одинаковой температурой. Смотрите код, он по-уму написан.
     
    geleos27 нравится это.
  14. SOLOway

    SOLOway Гуру

    Попробуем представить концепцию инфракрасной паяльной станции? Основные тезисы, против которых не станут возражать большинство участников?
    1.Нагреватели:
    Т.к. требуется, чтобы максимальное количество излучаемого тепла было поглощено паяемым объектом, нужно длинноволновое излучение в диапазоне, наглядно показанном на рисунке temperatura_volny_0.
    temperatura_volny_0.jpg
    Более короткие волны плохо проникают внутрь материалов, но сильнее разогревают поверхность, что вызывает "загар" и опасные деформацией и разрывом межслойных соединений дорожек механические напряжения в слоях платы.
    Также для преднагрева плат успешно используется конвекция - нагрев плат над алюминиевой плитой, применение термофена сверху.
    Размеры излучающих поверхностей выбирают исходя из следующих условий: для НИ - немного больше самой большой из плат, которые будем паять часто (деление на секции позволит удобно работать с малыми платами и экономить на электричестве), для ВИ - больше самого большого чипа.
    Желательно предусмотреть различные размеры и формы излучателей ВИ для следующих случаев: а) пайка чипа, б) пайка разъема. Для простоты замены, оба варианта излучателя должны иметь одинаковую мощность.
    Расчет мощности нагревателей.
    Применяя бесконтактный нагрев, учитываем, что воздух - плохой проводник тепла, затраты на прогрев у нас больше, чем при контактной пайке. По той же причине нужно иметь мощность нагревателей, позволяющую скомпенсировать возможные просадку напряжения в сети, снижение окружающей температуры, внезапный сквозняк. При малой мощности преднагревателя сталкиваемся с ещё одной серьезной проблемой - увеличивается время прогрева платы, длительность термопрофиля выходит за рамки, рекомендованные производителями, а также компоненты платы подвергаются длительному воздействию высоких температур, на которые не расчитаны. Также замечено, что слабый ~200 Вт нагреватель, расположенный, скажем, в ~5 см над чипом, при ~200*С у чипа, разогреется до ~600*С и выйдет в видимый спектр, а мощный ~800 Вт - при тех условиях не дойдет и до ~400*С, потребляя при этом менее 50% и оставаясь в темной зоне ИК-излучения.
    Равномерность по площади нагрева.
    Выше описаны возможные пагубные последствия неравномерного прогрева. Достаточная мощность излучателей позволит поднять плату над ними до уровня, где неравномерность излучения сведется к пренебрежимо малой величине из-за особенностей распространения излучения - наглядно на рисунке izluchenie_Rom.by.
    izluchenie_Rom.by.jpg
    Вывод - хотим снизить мощность нагревателей - применяем очень качественные термоэлементы с хорошей равномерностью отдачи тепла по всей поверхности и располагаем плату близко к ним.
    Учет перечисленного и анализ конструкций самодельных станций за период с 2009-года подтвердил обоснованность следующих вводных для расчета мощностей, позволяющих комфортно работать: Для НИ плотность 3,5-2,5 Вт/кв.см. Для ВИ 20-12 Вт/кв.см. В расчет принимается именно излучающая площадь, а не общая площадь нагревателя.
     
    geleos27 нравится это.
  15. Dmitrysh

    Dmitrysh Гуру

    Полностью со всем согласен. Хотелось бы узнать, как считать расстояние от трубочных излучателей до платы, чтобы распределение энергии излучения было по-возможности равномерным.
     
  16. Vinyla

    Vinyla Нуб

    А где достать "s_button.h"?
     
  17. SOLOway

    SOLOway Гуру

    @Dmitrysh Вот то что у меня в закладках есть: №1, №2, №3, практика.
    Статью с теоретическими обоснованиями и формулами расчета никак пока не могу вспомнить, где видел, поищу ещё, но быстрее у меня получилось как в видео подобрать...
     
    Последнее редактирование: 7 окт 2019
    Иван_В. нравится это.
  18. Yurik-o

    Yurik-o Нерд

    Упс
    про него-то я забыл
    распаковать в папку со скетчем или (что лучше) в отдельную папку в Arduino/libraries
    очень корректная, быстрая и функциональная библиотека обработки кнопок
     

    Вложения:

    • s_button.zip
      Размер файла:
      2,5 КБ
      Просмотров:
      213
    Vinyla и SOLOway нравится это.
  19. bamik

    bamik Нерд

    В любом случае вливания финансов требуются. Сам по себе проект не коммерческий, но в большинстве случаев делается для коммерческих нужд. Редко кто готов потратить 5-10К рублей на хобби, на станцию, которая будет использована 2-3 раза в год. Из этого следует, что выгодней задавить жабу и купить нормальные нагреватели, чем дешевые галогенки и непонятные керамики.
    Это как раз в коммерческих проектах используют керамику чаще всего, промышленные контроллеры, которые не предназначены для этого. "Мы слепили, а вы мучайтесь. Главное, термопрофиль правильно подберите."
    А мы делаем для себя. И хотим достичь идеала. Потому многие делают и переделывают. Начинают с дешевых галогенок, результат - поджарка; решают, что лучше керамика (немного дороже, но руками меньше двигать), результат - в лучшем случае работает, но несколько чипов пузырями; и только намучившись и самые упорные добираются до кварца. Моя любимая поговорка из личного опыта работы с клиентами: "Скупой платит дважды, чаще трижды, но обычно до него доходит на четвертый раз."
     
    buivol135 нравится это.
  20. SOLOway

    SOLOway Гуру

    Я! Я такой бываю! Нет бизнеса у меня ремонтного :(
     
Статус темы:
Закрыта.