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

Тема в разделе "Arduino & Shields", создана пользователем vector99, 7 дек 2016.

  1. directm86

    directm86 Нуб

    Добрый день. Подскажите пожалуйста схему диммера проверенную с данным контроллером. Заранее спасибо.
     
  2. Yurik-o

    Yurik-o Нерд

    Я думаю неплохая схема получается из SSR на нужный ток и схемы контроля нуля (zcc - zero cross control) это два резистора, диодный мост и оптопара схем в сети полно смотреть на тему пид нагреватель.
    А что и куда подключать есть в скетче
     
  3. Yurik-o

    Yurik-o Нерд

    zcc нужен один и два ssr - для верха и низа
     
  4. Yurik-o

    Yurik-o Нерд

    Ко 2 ИЛИ 3 пину
     
  5. vector99

    vector99 Нерд

    Добрый вечер господа! Прошивкой пока не занимаюсь, пока собираю железо в корпус. Назрел вопрос, безопасно ли запитать ардуино и MAX6675 напряжением 5.2В напрямую (на пин 5В). По даташитам их можно питать до 5.5В. А как в реале? Не хотелось бы что-то спалить. Или через резистор подключить?
     
  6. m2blit

    m2blit Нерд

    На коннектор DC ардуино лучше 9 - 12 В, а MAX6675 подключи к ардуино (5В)
     
    Последнее редактирование: 18 авг 2017
  7. ywor

    ywor Нерд

    а что есть дефицит в Линейных стабилизаторах типа 78L05,AMS1117-5.0,L7805CV или использовать стабилитрон на 5в
     
  8. vector99

    vector99 Нерд

    Имею на руках блок питания от спутникового ресивера. Выводы 5.2В, 8.4В, 12.1В, 22.2В. Встроенный стабилизатор ардуины выдаёт 4.8В, вот и думаю как стабильней и лучше будет!
     
  9. ywor

    ywor Нерд

    не критично может там и есть 5в а 0,2в то может сама погрешность тестера
     
  10. m2blit

    m2blit Нерд

  11. vector99

    vector99 Нерд

    Может. Но я имел в виду, не критична-ли эта погрешность?
     
  12. vector99

    vector99 Нерд

  13. m2blit

    m2blit Нерд

    Я подключил как написал выше.
     
  14. vector99

    vector99 Нерд

    Короче соберу всё воедино, попробую и так, и так. Блок питания всё позволяет, поэтому хочу его использовать. Думаю по питанию тему прекращаем, думаем о прошивке!
     
  15. 1beza1

    1beza1 Нерд

    я тут новичёк, но могу рассказать про свой микр.самое важное какая вебка, оптимально для себя взял http://www.logitech.com/ru-ru/product/hd-webcam-c270 И собрал на старом штативе фотоувеличителя Юность с родным объективом,родной оказался лучше фотоапаратных в разы по качеству картинки.Фокусноле расстояние меняется в зависимости от желаемого увеличения верхний предел у меня чуть более 30 см.[​IMG]
     

    Вложения:

    vector99 нравится это.
  16. Yurik-o

    Yurik-o Нерд

    Честно говоря, не в обиду скажу, тема не совсем про микроскопы
     
  17. Yurik-o

    Yurik-o Нерд

    Можно, конечно и отвлечься
     

    Вложения:

    • moto1.jpg
      moto1.jpg
      Размер файла:
      217,5 КБ
      Просмотров:
      125
    • moto2.jpg
      moto2.jpg
      Размер файла:
      233,2 КБ
      Просмотров:
      119
  18. SOLOway

    SOLOway Нерд

    Привет всем! Заранее прошу простить меня, так как буду постить о некоторых замеченных при работе (и при наблюдении за работой других) на различных видах ИК станций моментах. Конкретно к контроллерам и алгоритмам, разрабатываемым в данной теме, привязки не делаю, если моя писанинка чем-то заинтересует или поможет совершенствовать ваши алгоритмы - лучшей награды и не надо :).
    Все мы знаем, что в погоне за универсальностью приходится чем-то жертвовать, в итоге оказывается иногда, что одним эти жертвы незаметны, а другим - кость в горле...
    Разберём основные особенности нагревателей, что используют самодельщики:
    а) керамические ТЭНы, прямоугольные для НИ (400-650вт), квадратные для ВИ (250-450вт),
    б) нихромовая спираль в кварцевой трубке на НИ и ВИ,
    в) галогеновые линейные для НИ (1000-2000ВТ) и линейные же (150-500вт) или капсульные (~35вт) для ВИ лампы,
    г) смешанные варианты.
    Массивные керамические ТЭНы прощают мгновенные колебания/всплески подводимой мощности, однако очень долго выходят на заданную температуру, сильно затягивая профиль пайки и подвергая длительному воздействию высоких температур ни в чем не повинные компоненты плат. У самогонщиков используется нехитрое решение - "разгон", - подача полной мощи на ТЭН, с последующим переходом его на рабочий режим регулирования, при достижении нагреваемым объектом некой заданной температуры. Такой, примерно, режим рекомендуют использовать на станциях Термопро - ставить плату на уже предварительно разогретый термостол. Так как ВИ рассматриваем тоже керамику, видим, что включать его нужно не в момент, когда НИ разогрел плату до T-уставки, а несколько раньше, с небольшой мощностью, дабы и накопить тепло в зоне пайки (скажем, для активации флюса), и не вжаривать в холодный ВИ 100% мощи, а затем бороться с перелетами температуры из-за инерционности керамики.
    Ещё момент, который относится ко всем вариантам нагревателей, независимо от алгоритма управления, - при достижении платой T-уставки (+/- поправка на инерционность), НИ нужно перевести в режим питания фиксированной мощностью, чтобы ВИ не вводил НИ в заблуждение, заставляя его отрубать нагрев. Пусть НИ держит T-уставки за счет зафиксированного уровня подведённой к нему в этот момент мощности, игнорируя свой термодатчик и отключается только по окончании профиля.
     
    Последнее редактирование: 9 сен 2017
    vector99 и Asbest нравится это.
  19. elvfai11

    elvfai11 Нуб

    День добрый! Поясните пожалуйста как работает в данном коде параметр "Время нагрева" и где главный его код в исходнике?
     
  20. vector99

    vector99 Нерд

    такого параметра в нашей прошивке НЕТ. Есть параметр "Скорость нагрева":
    Код (Text):

    //счётчик скорости роста температуры        
          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');
            myGLCD.setFont(SevenSegNumFont);
            myGLCD.printNumI(setpointRamp,90, 120,3,'0');
            Setpoint1 = setpointRamp;
           }

     
    А весь процес отработки верхнего нагревателя с отображением на дисплее:
    Код (Text):

    //"Старт и процесс пайки", рост температуры с заданной скоростью
        case REFLOW_STATE_STEP_RAMP:
          if (updateScreen) {
            myGLCD.setFont(BigFontRus);
            myGLCD.setColor(VGA_RED);
            myGLCD.textRus("СТАРТ",370, 5);
            myGLCD.textRus("ПРОФИЛЬ",0, 5);
            myGLCD.setColor(VGA_LIME);
            myGLCD.textRus("ШАГ",5, 300);
            myGLCD.textRus("ВРЕМЯ",100, 300);
            //myGLCD.textRus("СКОРОСТЬ",280, 300);
            myGLCD.setColor(250, 180, 000);
            myGLCD.textRus("УСТАН",5, 153);
            myGLCD.textRus("УСТАН",5, 266);
            myGLCD.textRus("НАГРЕВ",235, 153);
            myGLCD.textRus("НАГРЕВ",235, 266);
            myGLCD.setFont(SevenSegNumFont);
            myGLCD.printNumI(temperatureStep[editStep],90, 120,3,'0');
            myGLCD.printNumI(SP2,90, 232,3,'0');
            updateScreen = false;
          }
            if (profileName == 1){
            myGLCD.setFont(BigFontRus);
            myGLCD.setColor(VGA_RED);
            myGLCD.textRus("СНЯТИЕ ЧИПА БЕССВИНЕЦ",75, 40);
            }
            if (profileName == 2){
            myGLCD.setFont(BigFontRus);
            myGLCD.setColor(VGA_RED);
            myGLCD.textRus(" СНЯТИЕ ЧИПА СВИНЕЦ   ",75, 40);
            }
            if (profileName == 3){
            myGLCD.setFont(BigFontRus);
            myGLCD.setColor(VGA_RED);
            myGLCD.textRus("УС-ВКА ЧИПА БЕССВИНЕЦ",75, 40);
            }
            if (profileName == 4){
            myGLCD.setFont(BigFontRus);
            myGLCD.setColor(VGA_RED);
            myGLCD.textRus(" УС-ВКА ЧИПА СВИНЕЦ   ",75, 40);
            }
            if (profileName == 5){
            myGLCD.setFont(BigFontRus);
            myGLCD.setColor(VGA_RED);
            myGLCD.textRus("   НИЖНИЙ ПОДОГРЕВ     ",75, 40);
          }
       
          if (tc2 >= SP2-1 && !TopStart) TopStart = true;  //если температура низа вышла на уставку включаем верхний нагреватель
     
          if (TopStart == true){        // включен верхний нагреватель  
          myPID1.SetMode(AUTOMATIC);//включение ПИД верхнего нагреветеля
          myPID2.SetMode(MANUAL);// фиксируем мощность нижнего нагревателя
          if (flag == 0)           //фиксируем стартовую температуру
           {
            startTemp = tc1;
            flag = 1;
           }
    //устанавливаем нужный шаг, до которой нагрета плата  
          if (startTemp > temperatureStep[currentStep -1]){
            for (x=1; startTemp > temperatureStep[currentStep - 1]; currentStep++){
              x++;
           }
           }  
          if (currentStep > x && flag == 1){
            flag = 0;
            startTemp = temperatureStep[currentStep - 2];    
            flag = 1;
           }
            myGLCD.setFont(BigFont);
            myGLCD.setColor(250, 180, 000);
            myGLCD.printNumI(currentStep,60, 300);
            //myGLCD.setFont(SevenSegNumFont);
           // myGLCD.printNumI(temperatureStep[currentStep - 1],90, 120);
     
    //счётчик скорости роста температуры        
          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');
            myGLCD.setFont(SevenSegNumFont);
            myGLCD.printNumI(setpointRamp,90, 120,3,'0');
            Setpoint1 = setpointRamp;
           }
           } //закрывам скобку

          if (setpointRamp >= temperatureStep[currentStep - 1]) //если достигли нужной температуры
           {
           // myGLCD.setColor(VGA_RED);
           // myGLCD.printNumI(temperatureStep[currentStep - 1],420, 300);
            reflowState = REFLOW_STATE_STEP;
           }
          if (cancelSwitchState == HIGH && ( millis() - ms_button)>50)
           {
            ms_button =  millis();
            digitalWrite(P1_PIN, HIGH);
            digitalWrite(P2_PIN, HIGH);
            digitalWrite(P3_PIN, HIGH);
            digitalWrite(P4_PIN, HIGH);
       
            reflowStatus = REFLOW_STATUS_OFF;
            reflowState = REFLOW_STATE_IDLE;
            updateScreen = true;
           }
          break;
     
        case REFLOW_STATE_STEP:
          Setpoint1 = temperatureStep[currentStep - 1];
          if (Input1 >= temperatureStep[currentStep - 1])
           {
            counter = 0;
            reflowState = REFLOW_STATE_STEP_DWELL;    
           }
          if (cancelSwitchState == HIGH && ( millis() - ms_button)>60)
           {
            ms_button =  millis();
            digitalWrite(P1_PIN, HIGH);
            digitalWrite(P2_PIN, HIGH);
            digitalWrite(P3_PIN, HIGH);
            digitalWrite(P4_PIN, HIGH);
            updateScreen = true;
       
            reflowStatus = REFLOW_STATUS_OFF;
            reflowState = REFLOW_STATE_IDLE;
           }
          break;
    //считаем время перехода на следующий шаг
        case REFLOW_STATE_STEP_DWELL:
          if (currentMillis - previousMillis > 1000)
           {    
            previousMillis = currentMillis;
            dwellTimerStep[currentStep - 1] = dwellTimerStep[currentStep - 1] - 1;
            TimerStep = dwellTimerStep[currentStep - 1];
            myGLCD.setFont(BigFont);
            myGLCD.setColor(250, 180, 000);
            myGLCD.printNumI(TimerStep,190, 300,2,'0');
           }
          if (dwellTimerStep[currentStep - 1] == 0) //если счётчик равен установленному времени
           {
            myGLCD.setFont(BigFont);
            myGLCD.setColor(VGA_RED);
            myGLCD.printNumI(TimerStep,190, 300,2,'0');
            tone(buzzerPin, 1045, 500);  //звуковой сигнал
            //counter = 0;
            setpointRamp = 0;
       
          if (profileSteps == currentStep) //если достигли последнего шага
           {
              currentStep = 1;
              x = 1;      //устанавливаем переменную в исходное состояние
              flag = 0;   //после завершения профиля сбрасываем флаг
              reflowState = REFLOW_STATE_COMPLETE;
           }
          else //если шаг не последний
           {      
              currentStep++; //переходим на следующий шаг
              reflowState = REFLOW_STATE_STEP_RAMP;      
           }
            }
          if (cancelSwitchState == HIGH && ( millis() - ms_button)>60)
           {
            ms_button =  millis();
            digitalWrite(P1_PIN, HIGH);
            digitalWrite(P2_PIN, HIGH);
            digitalWrite(P3_PIN, HIGH);
            digitalWrite(P4_PIN, HIGH);
            updateScreen = true;
       
            reflowStatus = REFLOW_STATUS_OFF;
            reflowState = REFLOW_STATE_IDLE;
           }
          break;
    //завершение пайки  
        case REFLOW_STATE_COMPLETE:
           digitalWrite(P1_PIN, HIGH);
           digitalWrite(P2_PIN, HIGH);
           digitalWrite(P3_PIN, HIGH);
           digitalWrite(P4_PIN, HIGH);
                 
          reflowStatus = REFLOW_STATUS_OFF;
          reflowState = REFLOW_STATE_IDLE;  
          updateScreen = true;
          break;
         }

     
    в данном коде реализован обратный отсчёт перехода на следующий шаг:
    if (currentMillis - previousMillis > 1000)
    {
    previousMillis = currentMillis;
    dwellTimerStep[currentStep - 1] = dwellTimerStep[currentStep - 1] - 1;
    TimerStep = dwellTimerStep[currentStep - 1];
    myGLCD.setFont(BigFont);
    myGLCD.setColor(250, 180, 000);
    myGLCD.printNumI(TimerStep,190, 300,2,'0');
    }
    if (dwellTimerStep[currentStep - 1] == 0) //если счётчик равен установленному времени
    {
    myGLCD.setFont(BigFont);
    myGLCD.setColor(VGA_RED);
    myGLCD.printNumI(TimerStep,190, 300,2,'0');
    tone(buzzerPin, 1045, 500); //звуковой сигнал
    //counter = 0;
    setpointRamp = 0;
    следующая реализация прошивки с аналоговыми кнопками и TFT дисплеем ожидается в течении двух недель! LCD версия мной прекращена, либо по коллективной просьбе.
     
    Последнее редактирование: 20 сен 2017