[아두이노] PID 제어의 함정: 왜 출력값만 단순히 자르면(Clamping) 안 될까?

아두이노로 온도를 제어할 때, 주변부 보호를 위해 "블럭 온도가 50도를 넘으면 무조건 출력을 차단해!"라는 식의 조건문을 넣는 경우가 많습니다. 하지만 PID 제어에서 이런 **단순 클램핑(Clamping)**은 예기치 못한 폭주를 불러올 수 있습니다. 오늘은 그 이유와 해결책을 알아봅니다. 1. 단순 클램핑의 복수: 'Integral Windup' 현상 목표 온도는 25도인데, 주변부 보호를 위해 PTC 블럭의 출력을 강제로 제한했다고 가정해 봅시다. 이때 PID 제어기의 내부에서는 어떤 일이 벌어질까요? 불만의 누적: PID의 I(적분) 항은 목표값에 도달하지 못하면 오차를 계속해서 쌓아 올립니다. 출력 억제: 소프트웨어로 출력을 강제 차단했기 때문에 실제 온도는 오르지 않습니다. 적분항의 폭주: PID는 "전력을 더 쏟아부어야 해!"라며 내부적으로 적분값을 최대치까지 쌓아둡니다. 이를 Windup(와인드업) 현상이라고 합니다. 대참사: 드디어 온도가 목표치에 도달하여 제한이 풀리는 순간, 쌓여있던 엄청난 적분값 때문에 출력이 급발진하며 온도가 목표치를 훌쩍 넘어버리는 심각한 오버슈트 가 발생합니다. 2. 해결책: "PID 엔진에 직접 한계를 알려주라" 가장 좋은 방법은 PID 연산이 끝난 '결과'를 건드리는 것이 아니라, PID 연산 과정 자체에 개입 하는 것입니다. ① 동적 출력 제한 (Dynamic Output Limits) 아두이노 PID 라이브러리의 SetOutputLimits(min, max) 함수를 실시간으로 활용하는 방식입니다. 로직: PTC 블럭의 온도가 45도에서 50도 사이로 진입하면, PID가 낼 수 있는 max 출력값 자체를 서서히 낮춥니다. 효과: 라이브러리 내부에서 "아, 지금은 여기까지가 최대구나"라고 인식하며 적분항을 스스로 조절(안티 와인드업)합니다. 덕분에 제한이 풀려도 온도가 튀지 않습니다. ② 캐스케이...

[아두이노] PTC 히터 제어의 핵심: Soft Start와 PID 로직의 완벽한 연동

PTC 히팅 시스템을 구축할 때 가장 많이 하는 실수가 "PID 라이브러리만 올리면 끝"이라고 생각하는 것입니다. 하지만 진정한 엔지니어링은 **초기 기동의 안전(Soft Start)**과 **정상 상태의 정밀도(PID)**를 어떻게 조율하느냐에 달려 있습니다. 1. 왜 두 로직을 연동해야 하는가? PID의 공격성: PID 제어기는 전원을 켜는 순간 목표 온도와 현재 온도 차이가 크기 때문에 무조건 100% 출력 을 내보내려 합니다. PTC의 취약점: 차가운 PTC 히터에 100% 전력이 공급되면 저항이 낮아 **돌입 전류(Inrush Current)**가 수 배로 치솟으며 SSR에 치명적인 손상을 줍니다. 해결책: PID의 출력값을 Soft Start라는 필터 로 한 번 걸러서 내보내는 '제어권 이양' 전략이 필요합니다. 2. 제어 로직 연동 설계: "바톤 터치(Baton Touch)" 알고리즘 두 로직은 별개로 노는 것이 아니라, 시간(Time) 또는 **온도(Temperature)**를 기준으로 매끄럽게 연결되어야 합니다. [단계 1] Soft Start 구간 (가동 후 초기 5~10초) 시스템이 켜지면 아두이노는 PID 연산값보다 우선하여 **출력 한도(Output Limit)**를 강제로 설정합니다. 0초: 출력 한도 0% 2.5초: 출력 한도 50% 5초: 출력 한도 100% (완전 개방) 이 기간 동안 PID가 아무리 100%를 외쳐도, 시스템은 설정된 한도 내에서만 SSR을 구동합니다. [단계 2] PID Control 구간 (안정기 진입 후) 히터 블럭이 예열되어 저항이 안정화되면, 이제 모든 제어권은 PID에게 넘어갑니다. 이때부터는 센서로부터 들어오는 미세한 온도 변화에 따라 전력을 0.1% 단위로 정밀하게 조절하며 목표 온도를 유지합니다. 3. [실전] 아두이노 연동 코드 구조 블로그 독자들이 자신의 프로젝트에 바로 적용해 볼 수 있는 논리 구조입니다. // 1. PID 연산 수행 ...

[아두이노] 아두이노 히팅 시스템 안전 가이드: 화재 걱정 없는 3중 보호 설계

아두이노와 SSR(Solid State Relay)을 이용한 온도 제어는 메이커들 사이에서 매우 인기 있는 프로젝트입니다. 하지만 열을 다루는 장치인 만큼, 코드 한 줄의 오류가 화재로 이어질 수 있다는 위험성이 항상 존재합니다. 오늘은 **'소프트웨어는 반드시 멈춘다'**라는 가정하에, 하드웨어와 소프트웨어가 상호 보완하는 산업 표준급 안전 설계 방법을 정리해 보겠습니다. 1. 하드웨어의 핵심: '물리적 3중 안전 계층' 소프트웨어(아두이노)가 먹통이 되어도 물리적으로 전원을 차단할 수 있는 직렬 보호 라인 을 구축해야 합니다. 전원(L상)에서 열선으로 가는 길목에 다음 장치들을 순서대로 배치합니다. ① 배선용 차단기 (Circuit Breaker - B커브) 가장 먼저 만나는 보호 장치입니다. 열선은 모터와 달리 돌입 전류가 없으므로, 반응이 민감한 B커브 차단기를 사용하여 이상 전류 발생 시 즉각 계통을 분리합니다. ② 과전류 보호 퓨즈 (Glass/Ceramic Fuse) 차단기가 건물을 지킨다면, 퓨즈는 기기를 지킵니다. SSR이 내부 단락(Short)으로 고장 났을 때 전선이 타기 전에 먼저 끊어지는 소모품입니다. ③ 바이메탈 써모스탯 (Bimetal Thermostat) - 상시 과열 방지 감시 온도: 약 70~80°C (사용 환경에 따라 설정) 패드 온도가 설정치에 도달하면 물리적으로 접점이 떨어지고, 식으면 다시 붙습니다. 아두이노가 SSR을 계속 켜두더라도 이 장치가 있으면 온도는 일정 수준 이상 올라가지 않습니다. ④ 온도 퓨즈 (Thermal Fuse) - 최종 방어선 감시 온도: 약 100~120°C 바이메탈마저 접점이 달라붙어 고장 난 최악의 상황을 대비합니다. 설정 온도를 넘으면 내부 소자가 녹아 전원을 영구 차단 합니다. 일회용이지만 화재를 막는 최후의 수단입니다. 2. SSR(Solid State Relay) 안정화 및 격리 설계 SSR은 무소음·고속 제어라는 장점이 있지만, 열 과 플로팅 현상...

[PLC] 서보 모터 브레이크 결선, 왜 릴레이 터미널을 써야 할까?

이미지
[실무 가이드] 서보 모터 브레이크 결선, 왜 릴레이 터미널을 써야 할까? 서보 앰프 브레이크 배선 예시 (ex. MINAS-A6B 시리즈) 서보 시스템을 설계하거나 시운전(Try Run)을 할 때 가장 빈번하게 발생하는 사고 중 하나가 서보 드라이버의 출력 포트 소손 입니다. "그냥 24V 신호니까 브레이크에 바로 연결하면 안 되나?"라는 의문에서 시작해, 가장 안전하고 똑똑한 결선 방법까지 정리해 봅니다. 1. 서보 드라이버 출력(X4)의 한계: "생각보다 약하다" 대부분의 메이저 서보 드라이버(Panasonic, Mitsubishi 등) 출력 포트는 최대 정격이 30V 50mA 내외입니다. 반면, 모터 브레이크를 해제하는 데 필요한 전류는 소형 모터 기준 약 300~400mA 에 달합니다. 결론: 직접 연결하는 순간 정격의 6~8배가 넘는 전류가 흐르며 드라이버 내부 트랜지스터가 즉사합니다. 2. 해결사: 릴레이 터미널 선택의 기술 드라이버 보호를 위해 중간에 '릴레이'라는 다리를 놓아야 합니다. 이때 어떤 보드를 쓰느냐가 시스템의 안정성을 결정합니다. 브레이크 OFF 신호는 X4 커넥터의 핀 1, 2번을 사용해서 배선합니다. BRK-OFF-(2번 핀)에 DC24V의 0V를 연결하고 BRK-OFF+(1번 핀)을 릴레이 코일의 -단자에 연결합니다. 그리고 릴레이 코일의 +단자에는 DC24V+를 연결합니다. 중요한 점은 브레이크 코일용 DC 파워서플라이와 제어용 DC 파워서플라이는 별개의 것을 사용하는 것이 권장사항입니다. ① 소비전류를 체크하라 (앰프 보호) 범용 릴레이(HR7 등): 코일 소비전력이 약 0.9W(37.5mA)로, 드라이버 정격(50mA)에 너무 바짝 붙어 있어 위험 마진이 적습니다. 슬림 릴레이 터미널(R4T-YC, R4T-16P-S): 소비전력이 약 110~120mW (약 10mA) 수준입니다. 드라이버 정격의 20%만 사용하므로 매우 안전합니다. ② 유도성 부하(브레이크)에 강...

[전기실무] 부하 특성 데이터와 KEC 차단기 선정 가이드

[전기실무] 부하 특성 데이터와 KEC 차단기 선정 가이드 전기 설비 설계 시 부하의 정격 전류만 확인하면 예기치 못한 차단기 트립이나 선로 과열이 발생할 수 있습니다. 슈나이더 일렉트릭의 기술 가이드에 명시된 부하별 상세 특성과 **한국전기설비규정(KEC)**에 따른 차단기 선정 핵심을 정리해 드립니다. 1. 주요 부하별 상세 특성 (실무 기술 데이터) 설계 시 차단기가 오동작하지 않도록 부하별 기동(돌입) 전류 배수를 반드시 확인해야 합니다. 유도 전동기 (Motor) 기동 전류는 정격의 약 6 ~ 8배 이며, 피크 시 최대 12 ~ 15배 까지 발생합니다. 스타-델타 기동 등을 통해 기동 전류를 낮출 수 있습니다 (예: 7.5배 → 4배로 감소). 변압기 (Transformer) 전원 투입 시 정격의 약 25배 에 달하는 매우 높은 돌입 전류가 순간적으로 흐릅니다. LED 조명 점등 시 정격의 수십 배에서 최대 250배 이상의 돌입 전류가 아주 짧은 시간(250μs 미만) 동안 발생합니다. 방전등 (HID / 형광등) 램프 전력 외에 **안정기 손실(약 10 ~ 25%)**을 부하 합계에 반드시 포함해야 합니다. 역률 개선 콘덴서가 없는 형광등의 역률은 약 0.6으로 매우 낮습니다. 적외선 램프 및 저항 부하 일반 히터는 역률이 1에 가깝지만, 적외선 램프는 초기 투입 시 냉간 저항 특성으로 정격의 10 ~ 15배 전류가 흐를 수 있습니다. 2. KEC 기준 차단기 선정 공식 KEC 212.4.1에 따라 과부하 보호장치(차단기)는 다음 조건을 만족해야 합니다. [조건 1] 기본 선정 부등식 차단기 정격전류( In )는 설계전류( Ib )보다 크고 전선의 허용전류( Iz )보다 작아야 합니다. Ib ≤ In ≤ Iz 설계 전류 (Ib) 계산식: 3상 부하: Ib = Pn / (1.732 × V × 효율 × 역률) 단상 부하: Ib = Pn / (V × 효율 × 역률) [조건 2] 규약 동작 전류 검토 차단기가 전선의 절연이 파괴되기 전에 확실히 동작...

[퀀트] 포트폴리오 분산 수식 유도과정

  포트폴리오 분산은 왜 이렇게 생겼을까? — 정의에서 출발하는 완전한 유도 많은 금융·퀀트 책에서 포트폴리오 분산은 갑자기 다음과 같이 등장한다. σ p 2 = w T Σ w \sigma_p^2 = w^T \Sigma w 하지만 이 식은 기억해야 할 공식이 아니라 , 아주 기본적인 분산의 정의에서 기계적으로 따라 나온 결과 다. 이번 글의 목표는 단 하나다. “이 식이 어디서 나왔는지, 단 한 줄도 점프하지 않고 이해하기” 1️⃣ 출발점: 분산의 정의 모든 것은 이 정의 하나에서 시작한다. V a r ( X ) = E [ ( X − E [ X ] ) 2 ] \mathrm{Var}(X) = \mathbb{E}\left[(X - \mathbb{E}[X])^2\right] 이 식이 말하는 것은 단순하다. “X가 자기 평균에서 얼마나 흔들리는지를 제곱해서 평균 낸 값” 여기서: X X  : 확률변수 (예: 자산 수익률) E [ X ] \mathbb{E}[X]  : 그 확률변수의 평균(기대값) 2️⃣ 자산 수익률은 왜 확률변수인가? 자산의 미래 수익률은 확정된 숫자가 아니다. 오를 수도 있고 내릴 수도 있고 그 크기도 매번 다르다 그래서 우리는 자산 수익률을 이렇게 둔다. X = 자산 X의 수익률 (확률변수) X = \text{자산 X의 수익률 (확률변수)} 그리고 과거 데이터로 평균을 추정한다. E [ X ] ≈ 1 T ∑ t = 1 T r t \mathbb{E}[X] \approx \frac{1}{T}\sum_{t=1}^{T} r_t ​ 3️⃣ 포트폴리오 수익률 정의 이제 자산 2개짜리 포트폴리오 를 보자. 자산 X 비중: w 1 w_1 ​ 자산 Y 비중: w 2 w_2 ​ 포트폴리오 수익률은 정의상 R p = w 1 X + w 2 Y R_p = w_1 X + w_2 Y 👉 이건 모델이 아니라 정의다 (“돈을 이렇...

[퀀트] 배당을 반영한 조정 종가(Adj Price) 계산하기

  배당을 반영한 조정 종가(Adj Price) 계산하기 – Python 예제 주식 투자나 포트폴리오 분석을 할 때, **배당을 반영한 조정 종가(Adjusted Close, Adj Price)**를 사용하는 것은 매우 중요합니다. 그 이유는 단순 종가(Close)만으로 수익률을 계산하면, 배당 지급으로 인한 가격 변동을 무시하게 되어 **총수익률(total return)**이 정확히 반영되지 않기 때문입니다. 이번 글에서는 CSV 파일에서 종가와 배당 데이터를 읽어와 Python으로 조정 종가를 계산 하는 방법을 예제와 함께 소개합니다. 1️⃣ 왜 조정 종가(Adj Price)가 필요한가? 배당이 나오는 날, 주가는 배당만큼 하락하는 것이 일반적입니다. 예를 들어: 날짜 종가(Close) 배당(Dividend) 1월 1일 100 0 1월 2일 90 10 단순 종가만 보면 100 → 90으로 10% 손실 처럼 보이지만 실제로는 배당 10을 받았기 때문에 총 자산 가치는 여전히 100 입니다. 이처럼, 배당을 고려하지 않으면 로그 수익률 계산, 변동성 계산, 포트폴리오 최적화 에서 왜곡이 생깁니다. 그래서 과거 가격을 배당 지급 기준으로 조정 한 Adj Price가 필요합니다. 2️⃣ 조정 종가 계산 원리 배당일 t t 에 배당금 D t D_t 이 지급될 때: factor t = P t − D t P t \text{factor}_t = \frac{P_t - D_t}{P_t} ​ ​ P t P_t  : 배당일 종가 D t D_t  : 배당금 규칙 배당일 이전의 모든 가격에 factor를 곱함 배당일 이후 가격은 그대로 둠 여러 배당이 나올 경우 factor를 누적 곱 이렇게 하면, 배당이 포함된 총수익률 기준 연속 가격 시계열 을 만들 수 있습니다. 3️⃣ CSV 예제 구조 Date,Close,Dividend 2025-01-01,100,0 2025-01-02,...