AC오토스폿용접기 커스텀버전 회로만들기
- 원리 이해와  회로도 및 아두이노 스케치파일 -
- Arduino Sketch for AC Auto Spot Weldering -

Arduino Pro mini sketch source for AC Auto Spot Weldering

출처: https://mindeater.tistory.com/2327 [MindEater™ - Life Sketch]


<오토스폿 회로가 들어간 풀 회로도>


이 글은 아두이노 스케치 카테고리를 새롭게 만들면서 기존 DIY Sketch에 올린 글에서 관련내용을 옮긴 글이다.

기존 스폿용접 회로에 자동스폿을 지원하기 위한 히스토리가 들어가 있으며,
그 기능이 반영된 스케치파일을 공유하고, 버전관리를 위한 페이지이다.





오토스폿을 구현하기 위해 DIY카페 혹은 아두이노 정보를 올리는 블로그, 지식인 등등 문의를 해보았지만,
실제로 그 원리에 대해서 쉽게 이야기 해주는 사람이 없었다.

스위치를 이용하는 매뉴얼 스폿의 경우 회로와 소스가 오픈되어 있고 다양한 버전이 있지만,
오토스폿에 관련한 정보는 자작인들의 실구현이 드물다보니 구현자가 오픈하기 전에는 관련 정보를 얻기가 쉽지 않았다.




오토스폿의 원리


여러 루트를 통한 정보를 종합해 본 결과 비교적 구현이 쉬운 것은 스너버회로에 의해 2차 권선에 유도된 전압을 이용하는 것이다.
대다수의 공개된 회로에는 전원 인가시 순간적으로 치솟는 전압을 잡아주어 회로 보호 목적으로 스너버(Snubber)회로를 사용하고 있다.

이 스너버회로에 의해 유도된 2차권선의 전압를 포토커플러를 이용하여 Detect 하는 것이다.
여기까지가 추정한 원리 중에 하나였고 아두이노를 통해서 실구현 하는 방법에 대해서 막연하게 찾아보고 있었다.
전압분배도 공부하고, 풀업, 풀다운 회로도 알아보고,,, ^^;;;


그런데 차에,,
e홈메이드 클럽에 락시꾼님이 구현에 성공했고 그 소스와 원리에 대해서 카페에 오픈해서 한 스텝 앞으로 나갈 수 있었다.

처음엔 포토커플러 없이 아두이노용 전압센서를 사용한 버전을 공개했었는데,
그 로직에 전압센서 대신 포토커플러를 이용한 버전을 이어서 공개했다.




락시꾼님이 구현한 오토스폿의 원리


아날로그 핀에 잡히는 수치를 이용한 방식인데 완벽하게 이해를 하지는 못했다.

[관련 락시꾼님의 글] https://cafe.naver.com/hssoon/191391

스너버 전압에 의한 2차 권선의 전압이 포토커플러 1번과 2번을 통해서 동작가능한 전압이 되면,,
수광부 4번핀에서 3번핀으로 전류가 흐르는 데,, (PC814, K3010의 경우)
락시꾼님이 구성한 회로는 3번핀은 GND, 그리고 4번핀은 아날로그 A0를 사용했다.



<PC814 Function Diagram, 내부 회로>

1번과 2번에 전류가 흘러(다이악, 방향성없음) LED가 발광하면 4번에서 3번 핀으로 전류가 흐르는 구조다.


추정컨대,,
아날로그 핀 A0에 아두이노 내부 VCC의 전압이 일정부분 드롭되어 GND쪽으로 흐르다가,
동봉 쇼트시 GND쪽으로 흐름이 끊껴 A0핀에 전압이 높게 잡히는 원리가 아닐까 싶다.
실제 잘 동작한다.


.
.
.


여하튼 락시꾼님이 공개하신 스케치파일에서 오토스폿함수를 차용해서 진행 중인 스폿기에 맞게 수정 후 작업해보았다.
다만 잘 되다가도 대기 상태에서 헛데이타가 읽혀 동봉 숏트가 아닌데도 오토스폿이 진행되는 경우가 종종 발생했다.
- 3K 링코어와 50sq 권선을 사용했다 -

그렇게 작업한 결과를 카페에 공유를 했었다.
그런데 뜻밖에도 '맹지동'이라는 아이디를 사용하시는 분이 의미있는 실험결과를 댓글로 공유해주셨다.

포토커플러의 수광부인 4번에 5V를 입력하고 3번은 풀다운저항과 함께 GND에 연결했고,
평소 5V 그리고 동봉 쇼트시 0V가 확실하게 읽힌다는 실험 결과
였다.


브레드 보드를 이용해서 실험해보니 정확했고 이를 아두이노에 반영해보기로 했다.

몇 번의 시행착오를 거친 결과 디지탈 핀의 HIGH/LOW만 읽어 처리가 가능한 새로운 커스텀 버전을 만들 수 있었다.

결국 락시꾼님과 맹지동님의 도움으로 나만의 버전을 만들 수 있었기에,,
그 분들게 감사의 말씀을 드리며, 락시꾼님 커스텀 버전으로 소개해본다.








커스텀 버전의 오토스폿 원리


결선 전체적인 동작을 그림으로 그려보았다.
포토커플러 PC814와 소자 보호를 위한 220옴 저항이 전부다.



평소 대기 상태는 포토커플러가 동작되고,,
포토커플러 4번 핀과 연결된 아두이노 10번 핀(INPUT_PULLUP으로 설정)의 값이 LOW가된다.

그러다가 동봉이 쇼트가 되면 포토커플러의 동작(1.2V 이상에서 동작)이 멈춘다.
결과 그라운드로로 이어지는 라인이 끊어지고 아두이노 내부 PULLUP 저항에 의해 10번 핀의 값이 HIGH가 되는 방식이다.


+
PC814를 사용했으며 좀 더 저가인 K3010 소자를 사용했을 경우 상대적으로 대기상태의 LOW값이 자주 튀는 편이다.
이는 전방보호를 위한 Debounce 값을 주어 2번 이상 연속할 경우 쇼트를 인지할 수 있도록 해서 해결했다.


서두에 올린 스키마틱 상단에 이 회로가 들어가 있다.





사진에 보이는 녹색의 저항(120Ω)과 빨강색의 0.1uf 커패시터로 이루어진 RC스너버 회로다.
- 회로를 보면 트라이악의 상태와 무관하게 1차측에 연결되어 있다. -

이 회로에 의해 2차 측에 대략 2V정도의 전압이 잡힌다.
- 220v 인가시 6v가 유도되는 링코어에서 -


+
보완사항으로 PC814가 1.2V에서 작동하지만, - LED의 밝기에 따라 (추정)- 수광부 센서가 튀는 것 같아
같은 콘덴서를 병렬(결과 0.2uf)로 달아 주었더니 대기 전압이 4V대로 증가했고 튀는 증상이 현저히 줄어들었다.
따라서 이 방식의 안정적인 오토스폿을 위해선 커패시터의 용량을 0.2uf 이상을 추천한다.

다만 너무 높은 정전용량의 커패시티를 사용할 경우 전압이 상대적으로 높아져 스폿용접봉을 쇼트시킬경우,,
간헐적으로 작은 불꽃이 뒤기도 하지만, 전류가 미세해 크게 걱정하지 않아도 될 것 같다.




용량을 증가시킨 스너버회로에 의한 평소 동봉의 전압을 측정해보았다.
4.133V가 측정되었다.



회로도처럼 포토커플러(PC814) 1번 핀에 220옴 저항을 연결했고, 모두 동봉에 연결,,
위 결선도처럼 3번은 GND, 4번은 아두이노의 디지탈 10번핀에 연결했다.


+
여담이지만,,
처음에는 맹지동님의 솔루션처럼 풀다운 저항으로 220옴을 3번 핀 사이에 구성하여 테스트 해보았다.
하지만 이상하게 아두이노에서 플로팅증상이 심해 구현하기가 어려웠다.
테스트로 구성한 회로에서 풀다운저항이 제대로 동작을 안하는 걸로 추측된다.
- 핀모드를 INPUT으로 두고 4번을 5V 전원에 인가하고 3번을 그라운드에 연결해서 테스트 -


이런저런 시도 끝에 아두이노 내부에 풀업저항(PULLUP)이 구현되어 있다는 걸 알게 되었고,
결국 포토커플러 3번핀은 GND, 4번 핀은 아두이노의 10번 핀에 저항없이 작결하여 구현에 성공했다.
이 경우 핀모드를 INPUT_PULLUP으로 설정해야한다.


이하 오토스폿을 처리하는 함수와 스팟관련 함수를 소개하고,,
스케치파일도 함께 공유한다.








다음은 용접동동을 쇼트를 디텍트하고 오토스폿을 처리하는 함수다.

void processAutoSpot()
{
  if (acHzValue < 50)
    return;
    
  int aData = digitalRead(PIN_AUTO_SPOT);
  if ( aData == LOW )
  {
    autoDetectCount = 0;
    autoDetectFlag = 0;
    autoSpotDebounce = 0;
  }
  else
  {
    if ( autoSpotDebounce++ < AUTO_SPOT_MAX_DEBOUNCE )
      return;
      
    if (autoDetectCount < autoDelay )
        autoDetectCount++;
    if ( autoDetectCount == autoDelay && !autoDetectFlag)
    {
      drawInfo(); /* for display sync */
      triggerSpot();
      DELAY(500);
      autoDetectFlag = 1;
    }
  }
}

AUTO_SPOT_MAX_DEBOUNCE 값은 2로 정의되어 있고 상수값이다.
실제 동봉을 쇼트시에는 연속에서 HIGH 값이 읽이는 데 의미있는 연속된 값이다.
일종의 전방보호값이다.

구현하면서 2차측 약한 전압으로 LOW값이 너무 자주 튄다면 1씩 올려 사용하면 될 것같다.
디스플레이의 A:X의 X값이 대기상태에서 움직일 경우다.



+
스폿타임 설정함수를 보기 전에 먼저 스폿타임 산출하는 방식에 대해서 알아보자.


AC 스폿타임 컨트롤의 방법

- 220V 60Hz-



AC스폿에서 스팟타임 컨트롤 방법을 간단히 그려보았다.
시간은 반(1/2)주기 단위로 계산이 되고 설정된 시간이 총 몇 번의 반주기가 필요한지 계산을 하게 된다.

실제 스팟 액션이 실행되면 다가오는 제로크로싱 포인트까지의 시간은 버리고,
그 시점부터 전체 필요한 시간의 끝 부분부터 역산을 하게 되는데,,
이유는 사용된 소자 트라이악 BTA41의 STOP 시점이 ZeroCrossing 포인트 이기 때문이다.

결국,
설정된 스폿시간을 만족하는 전체 반사이클 수를 구한 뒤 설정된 시간보다 큰 잉여시간(spotFirstHoldTime)만큼 대기했다가 실행한다.
아래의 코드를 이해하기위한 설명이었다.



/* 
 * triggerSpot()
 * 
 * 마지막 제로크로싱 끝나는 지점을 스폿타임이 끝나는 지점으로 역산하여 start 시간을 계산한다.
 * 설정된 스폿시간을 1/2 cycle(hCycleTime) 시간을 이용하여 사이클 회수(needHCycles)와 나머지값(spotFirstCycleTime)을 구한다.
 * 나머지 값을 첫 번째 사이클에 반영하고, 결과 spotFirstHoldTime만큼 기다렸다가 spotFirstCycleTime만큼 스폿을 진행한다.
 * needHCycles값이 있다면 추가 사이클만큼 진행하고 멈춘다.
 * 
 * ref) triac의 stop 시점이 제로크로싱 시점만 가능, start는 상관없음
 */
void triggerSpot()
{
  float hCycleTime = 1000 / ((float)(acHzValue*2));  /* half cycle time, 8.33ms in case of the 60Hz */
  int needHCycles = spotTime / hCycleTime;
  int spotFirstHoldTime = (int)((hCycleTime-(spotTime-(needHCycles*hCycleTime)))*1000);
  int spotFirstCycleTime = (int)((hCycleTime*1000)-spotFirstHoldTime);

  cli();

  /* AutoMode에서도 다단스폿은 적용! */
  for (int ii=0; ii<multiSpotCount; ii++)
  {
    /* LED를 켜고 PIN_ZERO_CROSS 포인트가 되면 다음 단계로.. */
    do {
      digitalWrite(PIN_LED, HIGH);
    } while (digitalRead(PIN_ZERO_CROSS_DETECT) == HIGH );

    delayMicroseconds(spotFirstHoldTime);
    digitalWrite(PIN_SPOT_TRIGGER, HIGH) ;
    delayMicroseconds(spotFirstCycleTime);

    if (spotTime > hCycleTime)
    {
      for (int jj = 0; jj < needHCycles ; jj++)
        delayMicroseconds(hCycleTime*1000);
    }

    digitalWrite(PIN_SPOT_TRIGGER, LOW);
    digitalWrite(PIN_LED, LOW);
    
    delayForMultiSpot();
  }
  
  sei();
}

/* Manual Spot - triggered by Switch Pin Interrupt */
void isrSpotActionSwitch()
{
  if ( curSpotMode != SPOT_MODE_MANUAL )
    return;
  if ( curProgMode != PG_MODE_NONE )
    return;
    
  swCount++ ;
  if ( swCount == 1 )
  {
    triggerSpot();
  }
}

isrSpotActionSwitch() 는 인터럽트로 처리되고, 풋스위치를 누를 때 실행되는 함수다.
triggerSpot() 은 스폿시간을 계산하여 트리거핀에 신호를 전달해 실제 스폿을 진행하는 함수다.
스폿타임 8ms 가 제대로 동작하지 않아 디버깅하면서 원리를 파악한 후 재작성했다.



마치며,,


온도센싱을 위해 사용한 A1핀과
오토센싱을 위해 사용한 디지탈 10번 핀을 제외하면
락시꾼님이 공개하신 회로의 소자와 핀맵이 대동소이하니 아래 참고글을 확인하여 자신만의 회로를 구성할 수 있겠다.



참고글

좌충우돌...AC스폿회로자작 무작정 따라하기 - 이홈메이드클럽 slotgodori님글 






Arduino Pro Mini Sketchs



Version 관리

최초 버전: 20180813_01

Updated Time : 2019-08-31
    1. 엔코드 컨트롤 변경 :
        > 대기상태에서만 오토모드와 수동모드를 변환하도록 함
        > 설정모드일 경우 바로 대기상태로 변경, 특정 값을 수정후 순환하지 않고 바로 대기모드로 빠져나올 수 있게 함
    2. 오토모드 실행시 cycle값이 60Hz 일 경우만 실행함
    3. 프로그램 시작시 로고에 SW 버전 표시



보완예정

1.
엔코더 클릭시 디바운스 값과 한번 설정모드로 들어가면 끝까지 순환해야 스폿대기상태로 진입하는 점이 조금 불편
더블클릭과 같은 기능을 넣어 바로 대기상태로 나올 수 있는 기능을 생각중이다.

수정완료


2.
3번, 4번핀의 뒤바뀌어 결선해도 동작함을 확인,,
현상에 대한 디버깅 필요!!




관련글



아두이노 프로 미니 기반 AC 스폿회로 만드는 중... ing - 전구 테스트 통과!!




3K 링코어 AC 오토스폿용접기 자작 회로를 이용한 제작기 - 아두이노 스케치 파일 커스텀 버전 소개




[DIY] 2K 트로이달 링코어로 미니(?) 스폿용접기 만들기 Ver 2.0 - 기존 불편함 해소를 위해 최대한 미니미니하면서 성능은 업!!