아두이노 PC817 옵토커플러: 12V/24V DC 입력 신호 모니터링

아두이노 입력 핀은 5V까지만 견디도록 만들어졌기 때문에, 12V나 24V 라인을 직접 연결하면 핀이 망가집니다. PC817 옵토커플러는 이 문제를 안전하게 해결합니다. 신호를 빛의 형태로 절연 간극을 건너 전달하므로, 아두이노는 외부 전압과 전기적으로 전혀 접촉하지 않고도 그 전압이 있는지 없는지 알 수 있습니다.

가장 쉬운 사용 방법은 완성된 PC817 옵토커플러 절연 모듈을 쓰는 것입니다. 저항과 상태 LED가 이미 보드에 장착되어 있고, 외부 전선은 나사 단자에 연결합니다. 이 튜토리얼에서는 모듈을 주된 방법으로 사용합니다.

이 튜토리얼에서는 다음을 배웁니다:

아두이노 pc817 옵토커플러

이 방법은 저전압 보드로 12V DC 신호를 안전하게 감지하거나 24V PLC 출력을 모니터링하는 표준적인 방법입니다. 또한 작업장이나 기계실에서 늘 나오는 질문, 즉 저 펌프, 히터, 램프 또는 모터가 지금 실제로 돌아가고 있는가에 대한 가장 간단한 해답이기도 합니다. 아두이노는 장치에 전원이 공급되고 있는지만 보면 되고, PC817은 안전한 거리에서 그것을 볼 수 있게 해 줍니다.

준비물

1×아두이노 우노 R3 쿠팡 | 아마존
1×USB 2.0 타입 A-to-B 케이블 (USB-A PC용) 쿠팡 | 아마존
1×USB 2.0 타입 C-to-B 케이블 (USB-C PC용) 아마존
1×PC817 Optocoupler Module 3-5V 아마존
1×PC817 Optocoupler Module 12V 아마존
1×브레드보드 쿠팡 | 아마존
1×점퍼케이블 쿠팡 | 아마존
1×(추천) 아두이노 우노용 스크루 터미널 블록 쉴드 쿠팡 | 아마존
1×(추천) Sensors/Servo Expansion Shield for Arduino Uno 쿠팡 | 아마존
1×(추천) 아두이노 우노용 브레드보드 쉴드 쿠팡 | 아마존
1×(추천) 아두이노 우노용 케이스 쿠팡 | 아마존
1×(추천) 아두이노 우노용 프로토타이핑 베이스 플레이트 & 브레드보드 키트 아마존
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

모듈은 하나만 있으면 됩니다. 감시하려는 신호의 전압에 맞는 모듈을 준비하세요.

PC817 옵토커플러에 대하여

PC817은 4핀 옵토커플러로, 포토커플러 또는 광절연기라고도 불립니다. 내부에는 적외선 LED가 절연 간극을 사이에 두고 포토트랜지스터와 마주 보고 있습니다. LED에 전류가 흐르면 그 빛이 트랜지스터를 켜므로, 신호가 전기가 아닌 빛으로 건너가게 됩니다. 이 때문에 양쪽이 전기적으로 분리된 상태를 유지합니다.

이 간극은 1분 동안 5000 Vrms의 절연 정격을 가지므로, 12V나 24V 쪽에서 고장이 발생해도 아두이노까지 전달되지 않습니다.

PC817 옵토커플러 절연 모듈은 이 칩을 작은 PCB에 올린 것으로, 직렬 저항이 이미 장착되어 있고, 상태 LED, 외부 신호용 나사 단자, 아두이노용 핀 헤더가 있습니다. 모듈은 1, 2, 4, 8채널 버전이 있습니다.

PC817 데이터시트에서 알아 두면 유용한 수치:

  • LED 순방향 전압(Vf): 일반적으로 약 1.2V, 최대 1.4V
  • LED 순방향 전류(If): 연속 최대 20mA, 일반적인 범위는 5mA ~ 20mA, 10mA가 적절한 목표값
  • 출력 컬렉터-이미터 전압(VCEO): 최대 35V
  • 출력 컬렉터 전류(IC): 최대 50mA
  • 컬렉터 전력 소모: 150mW
  • 절연 전압: 1분간 5000 Vrms
  • 전류 전달비(CTR): 등급에 따라 50% ~ 600% (A 등급 80-160%, B 130-260%, C 200-400%, D 300-600%)
  • 스위칭 속도: 상승 시간 약 4us, 하강 시간 약 3us
  • 동작 온도: -30 ~ +100 섭씨

어떤 옵토커플러 모듈이 필요할까요?

구매하기 전에 반드시 제대로 결정해야 하는 단 한 가지입니다. 모듈의 저항은 이미 장착되어 있고 하나의 입력 전압에 맞게 선택되어 있기 때문에, 모듈은 세 가지 종류로 따로 판매됩니다. 감시하려는 신호를 확인한 다음, 그에 맞는 모듈을 구매하세요:

감시하려는 신호 구매할 모듈
3.3V 또는 5V 로직 3-5V 모듈
12V DC 12V 모듈
24V DC 24V 모듈

모듈을 사용하면 저항을 계산할 필요가 전혀 없습니다. 종류를 고르는 것이 곧 저항을 고르는 것이며, 이미 결정되어 있습니다.

WARNING

모듈을 잘못된 전압에서 사용하지 마세요. 12V 모듈에 24V 라인을 연결하면 내부 LED에 의도한 전류의 약 두 배가 흘러 모듈이 손상됩니다. 24V 모듈에 12V 라인을 연결하면 구동 전류가 부족하여 출력이 늦게 바뀌거나, 불안정하게 바뀌거나, 아예 바뀌지 않을 수 있습니다. 어느 쪽 실수든 겉으로 드러나지 않습니다. 결국 고장 난 모듈이나 믿을 수 없는 측정값만 남게 됩니다.

※ 주의:

5V나 3.3V 신호도 절연할 가치가 있습니다. 절연은 고전압만의 문제가 아니라 접지 경로를 끊는 것이 핵심이므로, 두 회로가 서로 다른 전원 공급 장치를 사용하거나, 긴 케이블의 양 끝에 있거나, 모터 드라이버나 상용 전원으로 동작하는 기기 내부의 저전압 제어 보드처럼 한쪽이 전기적으로 노이즈가 많을 때 유용합니다. 이것이 바로 3-5V 모듈의 역할입니다.

작동 원리

  • 외부 신호가 입력 단자에 있으면, 모듈의 저항과 내부 LED를 통해 전류가 흐릅니다. LED가 켜지면서 포토트랜지스터를 켜고, 모듈의 OUT 핀 상태가 바뀝니다.
  • 외부 신호가 없으면 LED가 꺼지고, 포토트랜지스터도 꺼지며, OUT은 다시 원래 상태로 돌아갑니다.

모듈의 상태 LED는 내부 LED와 함께 켜지므로, 입력 쪽이 작동하는 것을 눈으로 직접 확인할 수 있습니다.

PC817은 전압을 측정하지 않습니다. 외부 신호가 있는지 없는지만 아두이노에 알려 줍니다. 예/아니오 대신 실제 값이 필요하다면 아두이노 - 전압 측정를 참고하세요.

선연결

PC817 옵토커플러 모듈을 아두이노에 배선하기

모듈에는 두 개의 면이 있으며, 바로 그것이 핵심입니다. 나사 단자는 외부 회로에 속하고, 핀 헤더는 아두이노에 속하며, 둘 사이를 건너는 것은 아무것도 없습니다.

  • 외부 12V/24V 신호는 IN+ 나사 단자에 연결해야 합니다
  • 외부 회로의 접지는 IN- 나사 단자에 연결해야 합니다
  • 모듈의 VCC 핀은 아두이노 5V 핀에 연결해야 합니다
  • 모듈의 GND 핀은 아두이노 GND 핀에 연결해야 합니다
  • 모듈의 OUT 핀은 아두이노 D2 핀에 연결해야 합니다
아두이노 pc817 옵토커플러 절연 모듈 배선도

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.

이 배선에는 직렬 저항을 추가할 곳이 없습니다. 모듈에 이미 들어 있습니다.

※ 주의:

12V/24V 회로의 접지를 아두이노 GND에 연결하지 마세요. IN- 단자와 모듈의 GND 핀은 분리된 상태를 유지해야 하며, 바로 이 분리가 아두이노를 보호합니다. 둘을 연결해도 모듈은 여전히 동작하지만, 절연이 사라지므로 옵토커플러를 사용하는 의미가 전혀 없어집니다.

모니터링하려는 장치와 PC817을 병렬로 연결하기

대부분의 경우 여분의 신호선이 따로 주어지지 않습니다. 이미 배선되어 작동 중인 장치가 있고, 그 장치가 언제 켜지는지 아두이노가 알기를 원하는 상황입니다. 이 경우 모듈 입력은 전압계를 연결하는 것과 같은 방식으로 장치 양단에, 즉 장치와 병렬로 연결합니다. 기존 회로에서 자르거나, 옮기거나, 경로를 바꾸는 것은 아무것도 없습니다.

12V 릴레이 코일을 예로 들어 보겠습니다. 이 경우에는 12V 모듈을 사용합니다. 코일에는 이미 릴레이가 여자될 때 전압이 걸리는 양극 단자와, 12V 전원의 접지로 돌아가는 음극 단자가 있습니다. 연결은 선 두 개만 추가하면 됩니다:

  • 코일의 양극(스위칭되는) 단자에서 모듈의 IN+ 단자로.
  • 코일의 음극(귀환) 단자에서 모듈의 IN- 단자로.
  • VCC, GND, OUT은 위의 배선과 똑같이 아두이노 5V, 아두이노 GND, 아두이노 D2에 연결합니다.

이 연결은 약 10mA를 소모합니다. 12V 릴레이 코일 자체가 약 30 ~ 80mA를 소모하므로, 추가된 10mA는 아무런 영향을 주지 않으며 릴레이는 이전과 똑같이 계속 작동합니다. 이것은 읽기 전용 측정입니다. PC817은 코일을 지켜볼 뿐, 스위칭하지 않습니다.

WARNING

모듈을 절대로 장치와 직렬로 연결하지 마세요. 직렬로 연결하면 릴레이 코일, 램프 또는 모터의 전체 부하 전류가 20mA 정격인 PC817 내부의 작은 LED를 통과해야 하므로, 장치를 켜는 순간 옵토커플러가 파손됩니다. 입력은 항상 장치 양단에 연결하고, 절대 장치와 일렬로 연결하지 않습니다.

연결이 아두이노 출력선이 아니라 코일 양단에 있기 때문에, 측정값은 장치가 실제로 하고 있는 일을 따라갑니다. 온도 조절기, 타이머, PLC 또는 사람이 릴레이를 켜면 아두이노가 그것을 감지합니다. 릴레이에 켜라는 명령이 내려졌지만 퓨즈가 끊어지거나 전선이 빠져서 여자되지 않으면 아두이노는 그것도 감지합니다. 그래서 가동 시간 카운터, 유휴 시간 기록, "실제로 시작되었나?" 알림에 이 회로를 만들 가치가 있습니다. 다만 무엇을 측정하는지는 정확히 알아야 합니다. 이 회로는 장치에 전원이 공급되고 있다는 것을 알려 줄 뿐, 장치가 제 역할을 하고 있다는 것은 알려 주지 않습니다. 따라서 걸린 모터나 타 버린 히터 소자도 여전히 전력을 소모하므로 ON으로 읽힙니다.

연결에 전원을 넣기 전에 확인할 세 가지:

  • 극성. 입력 쪽은 LED이므로 한 방향으로만 전류가 흐릅니다. IN+와 IN-가 바뀌면 모듈은 절대 켜지지 않습니다. 배선하기 전에 연결 지점의 어느 쪽이 양극인지 확인하세요.
  • 누설 전류가 있는 출력. 일부 PLC 트랜지스터 출력, 트라이액 출력, LED 램프 드라이버는 꺼져 있을 때도 작은 전류를 흘려보냅니다. 이 누설 전류가 PC817 LED를 약하게 켤 수 있으며, 그러면 아두이노는 실제로는 OFF인 장치를 ON으로 보고합니다. 증상은 쉽게 알아볼 수 있습니다. 측정값이 절대 ABSENT로 돌아가지 않습니다. 해결 방법은 IN+와 IN- 단자 사이에 약 4.7 kohm ~ 10 kohm의 블리더 저항을 연결하여, 누설 전류가 LED 대신 저항으로 흐르게 하는 것입니다.
  • AC 라인. PC817 입력은 LED 하나이므로 한 극성에만 반응합니다. 따라서 AC 라인 감지에는 적합하지 않으며, AC 라인에는 입력단에 LED 두 개가 역병렬로 연결된 옵토커플러가 필요합니다.

WARNING

릴레이 코일은 유도성 부하입니다. 꺼질 때 붕괴하는 자기장이 코일 양단에 구동 전압 12V보다 몇 배나 큰 역전압 스파이크를 만들어 내는데, PC817 입력 LED의 역방향 정격은 6V뿐입니다. IN+와 IN- 단자 사이에 일반 다이오드를 역병렬로 직접 연결하세요. 다이오드의 캐소드를 IN+에, 애노드를 IN-에 연결합니다. 정상 동작 중에는 이 다이오드가 역바이어스 상태여서 아무 일도 하지 않지만, 스파이크가 오면 도통하여 역전압을 1볼트보다 훨씬 낮게 제한합니다. 이런 작은 연결에는 1N4148이면 충분하고, 더 큰 부하에는 1N4007을 사용합니다. 솔레노이드, 접촉기, 밸브, 모터도 마찬가지입니다.

옵토커플러 모듈은 액티브 HIGH일까요, 액티브 LOW일까요?

단품 칩에서는 이것이 물리적으로 정해져 있습니다. 내부 풀업을 활성화하면 LED가 켜질 때 포토트랜지스터가 핀을 LOW로 끌어내리므로:

  • 외부 신호가 있을 때(PRESENT): 아두이노 핀은 LOW를 읽습니다
  • 외부 신호가 없을 때(ABSENT): 아두이노 핀은 HIGH를 읽습니다

모듈은 그렇게 예측 가능하지 않습니다. 대부분은 단품 칩과 똑같이 동작하지만, 일부 제조사는 보드에서 출력을 반전시켜 OUT이 입력을 그대로 따라가도록 만듭니다. 두 종류 모두 판매되고 있고 겉모습으로는 구별할 수 없으므로, 직접 확인해 보세요. 1분도 걸리지 않습니다:

  • 위와 같이 모듈을 배선하고, 아래 스케치를 아무것도 바꾸지 않고 업로드합니다.
  • 입력 단자에 아무것도 연결하지 않은 상태에서 시리얼 모니터를 보고 출력 내용을 기록합니다.
  • 이제 외부 신호를 가하고 출력 내용을 기록합니다.
  • 신호가 있을 때 핀이 읽는 값이 바로 모듈의 액티브 레벨입니다.
  • 모듈의 상태 LED로도 교차 확인하세요. 이 LED는 입력 쪽에 전원이 공급되는 동안 켜집니다. 그 LED가 켜져 있는데 시리얼 모니터에 여전히 ABSENT가 표시된다면, 모듈이 다른 종류입니다.

측정값이 반대로 나오더라도 아무것도 다시 작성할 필요가 없습니다. 코드 맨 위의 const bool MODULE_ACTIVE_LOW = true; 한 줄을 false로 바꾸고 다시 업로드하면 됩니다.

액티브 LOW의 경우는 풀업으로 배선한 아두이노 - 버튼이나 아두이노 - 리미트 스위치와 같은 패턴입니다.

선택 사항: 단품 PC817 칩으로 직접 만들기

입력 회로를 직접 만들고 싶다면, 4핀 단품 칩으로 몇 센트에 같은 일을 할 수 있지만, 이제 직렬 저항 값은 직접 정해야 합니다. 1번 핀은 칩에 점이나 홈으로 표시되어 있습니다.

  • 1번 핀 - 애노드(A): 외부 신호를 직렬 저항을 거쳐 여기에 연결해야 합니다
  • 2번 핀 - 캐소드(K): 외부 회로의 접지에 연결해야 하며, 아두이노 GND에 연결하면 안 됩니다
  • 3번 핀 - 이미터(E): 아두이노 GND에 연결해야 합니다
  • 4번 핀 - 컬렉터(C): 아두이노 D2 핀에 연결해야 합니다
pc817 옵토커플러 핀아웃
image source: diyables.io

R = (Vin - 1.2) / 0.01 식으로 약 10mA가 흐르도록 저항을 정하세요. 그러면 3.3V는 220 ohm, 5V는 390 ohm, 12V는 1 kohm, 24V는 2.2 kohm이 됩니다. 12V까지는 1/4W 저항이면 충분하고, 24V에서는 1/2W를 사용하세요.

이 페이지의 나머지 내용, 즉 병렬 연결, 클램프 다이오드, 코드는 모두 똑같이 적용됩니다.

PC817 프로그래밍 방법

  • pinMode() 함수를 사용하여 아두이노 핀을 내부 풀업이 있는 디지털 입력 모드로 설정합니다. 예를 들어 2번 핀:
pinMode(2, INPUT_PULLUP);
  • digitalRead() 함수를 사용하여 그 핀의 상태를 읽습니다:
int raw = digitalRead(2);
  • 그 측정값을 예/아니오 답으로 바꿉니다. 상수 하나가 어느 방향으로 해석할지 결정하므로, 다른 부분은 건드리지 않고 사용하는 모듈에 맞출 수 있습니다:
const bool MODULE_ACTIVE_LOW = true; bool signalActive = MODULE_ACTIVE_LOW ? (raw == LOW) : (raw == HIGH);

이 프로젝트에는 라이브러리가 필요하지 않습니다.

아두이노 코드 - PC817 옵토커플러

/* * 이 아두이노 코드는 newbiely.kr 에서 개발되었습니다 * 이 아두이노 코드는 어떠한 제한 없이 공개 사용을 위해 제공됩니다. * 상세한 지침 및 연결도에 대해서는 다음을 방문하세요: * https://newbiely.kr/tutorials/arduino/arduino-pc817-optocoupler-monitor-12v-24v-dc-input-signal */ // Arduino's pin connected to the OUT pin of the PC817 optocoupler module #define PC817_PIN 2 // Most PC817 modules pull the output LOW when the input signal is present. // If your module works the other way round, change this to false. const bool MODULE_ACTIVE_LOW = true; void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // the internal pull-up holds the pin HIGH while the PC817 is off pinMode(PC817_PIN, INPUT_PULLUP); } void loop() { int raw = digitalRead(PC817_PIN); bool signalActive = MODULE_ACTIVE_LOW ? (raw == LOW) : (raw == HIGH); if (signalActive) Serial.println("External signal: PRESENT"); else Serial.println("External signal: ABSENT"); delay(500); }

빠른 단계

  • USB 케이블로 아두이노를 PC에 연결합니다
  • 위의 모듈 배선도와 같이 배선합니다
  • Arduino IDE를 열고 올바른 보드와 포트를 선택합니다
  • 위 코드를 복사하여 Arduino IDE에서 엽니다
  • Arduino IDE에서 Upload 버튼을 클릭하여 코드를 아두이노에 업로드합니다
  • 외부 12V/24V 신호를 켰다 껐다 합니다
  • 시리얼 모니터에서 결과를 확인합니다.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
External signal: ABSENT External signal: ABSENT External signal: PRESENT External signal: PRESENT External signal: PRESENT External signal: PRESENT External signal: ABSENT External signal: ABSENT
Ln 11, Col 1
Arduino Uno on COM15
2

PRESENT와 ABSENT가 반대로 나온다면, 모듈이 액티브 HIGH 종류입니다. MODULE_ACTIVE_LOW를 false로 설정하고 다시 업로드하세요.

여기서부터 같은 회로로 많은 일을 할 수 있습니다. 24V 기계의 가동 또는 고장 램프 라인을 감시하거나, 점화 장치나 헤드라이트 같은 12V 차량 회로에 전원이 들어와 있는지 확인하거나, 24V 솔레노이드 코일이 언제 여자되는지 볼 수 있습니다. 아두이노가 상태를 알게 되면 아두이노 - 릴레이, 부저, 또는 로그 기록으로 대응할 수 있습니다. 펌프의 가동 시간을 세거나, 기계에 시작 명령을 내렸는데 시작되지 않았을 때 알림을 보내거나, 생산 라인이 얼마나 오래 멈춰 있었는지 기록할 수 있습니다.

동영상

비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.

댓글

관련 튜토리얼