라즈베리 파이 PC817 포토커플러: 12V/24V DC 입력 신호 모니터링
라즈베리 파이의 GPIO 핀은 3.3V로 동작하며 5V를 견디지 못합니다. 그래서 떠돌던 12V나 24V 전선이 40핀 헤더에 닿으면 핀 하나만 손상되는 것이 아니라, 보통 SD 카드 슬롯, 이더넷 포트 등 보드 전체가 망가집니다. PC817 옵토커플러는 이 위험을 완전히 없애 줍니다: 신호가 전기가 아닌 빛으로 틈을 건너기 때문에 외부 전압이 파이에 절대 닿지 않습니다.
이것을 배선하는 대부분의 사람들이 실제로 묻는 질문은 단순합니다: 저 기계, 펌프, 히터, 램프가 지금 실제로 작동하고 있나? 라즈베리 파이는 몇 주 동안 켜 둘 수 있고 본 것을 기록할 수 있기 때문에 이 질문에 좋은 답이 됩니다. 이 튜토리얼은 라즈베리 파이를 절연된 12V 또는 24V 라인을 감시하고 기록을 남기는 상시 가동 노드로 만드는 방법을 보여줍니다. 구체적으로 다음 내용을 배웁니다:
- 라즈베리 파이로 12V/24V 신호를 읽을 때 옵토커플러가 가장 안전한 방법인 이유
- 세 가지 PC817 모듈 버전(3-5V, 12V, 24V) 중 어느 것이 감시하려는 라인에 맞는지
- 기성품 PC817 절연 모듈을 라즈베리 파이에 배선하는 방법, 그리고 원한다면 칩 단품으로 같은 회로를 만드는 방법
- 모듈이 액티브 LOW인지 액티브 HIGH인지 1분 안에 알아내는 방법과 상수 하나로 코드를 바꾸는 방법
- 장치와 병렬로 PC817을 연결하여 파이가 그 장치의 켜짐/꺼짐 상태를 따라가게 하는 방법
- 파이썬으로 라즈베리 파이를 프로그래밍하여 절연된 입력을 읽는 방법
- 외부 신호의 모든 변화를 타임스탬프와 함께 파일에 기록하여 가동 시간 기록을 남기는 방법
추천 사항:
- GPIO 핀을 풀업 입력으로 설정해 본 적이 없다면 먼저 라즈베리 파이 - 버튼 튜토리얼을 읽어 보세요. PC817도 똑같은 방식으로 읽습니다.
- 감지하려는 것이 전압이 전혀 없는 무전압 기계식 접점이라면 대신 라즈베리 파이 - 리미트 스위치 튜토리얼을 읽어 보세요. 이 경우 옵토커플러가 필요하지 않습니다.
- 파이를 장기 로깅 노드로 계속 켜 둘 계획이라면 라즈베리 파이 - 타임스탬프가 포함된 데이터 SD 카드에 기록하기 튜토리얼을 읽어 보세요.
- 12V/24V 부하를 읽는 것이 아니라 스위칭하고 싶다면 라즈베리 파이 - 릴레이 튜토리얼을 읽어 보세요. 릴레이는 옵토커플러의 출력 쪽 짝입니다.

준비물
| 1 | × | 라즈베리 파이 5 | 쿠팡 | 아마존 | |
| 1 | × | 마이크로 SD 카드 | 아마존 | |
| 1 | × | PC817 Optocoupler Isolation Module - 3-5V version | 아마존 | |
| 1 | × | PC817 Optocoupler Isolation Module - 12V version | 아마존 | |
| 1 | × | 12V 전원 어댑터 | 아마존 | |
| 1 | × | (또는) 24V Power Adapter | 아마존 | |
| 1 | × | DC 커넥터 전원 연결 잭 플러그 소켓 | 쿠팡 | 아마존 | |
| 1 | × | 브레드보드 | 쿠팡 | 아마존 | |
| 1 | × | 점퍼케이블 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 라즈베리 파이용 스크루 터미널 블록 쉴드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 라즈베리 파이 프로토타이핑 베이스 플레이트 & 브레드보드 키트 | 아마존 |
모듈 버전들은 같은 보드를 다른 사양으로 판매하는 것입니다 - 신호에 맞는 하나만 사면 되고, 여러 개를 살 필요는 없습니다.
PC817 옵토커플러에 대하여
PC817은 포토커플러이며, 광 절연기 또는 옵토커플러라고도 부릅니다. 작은 검은색 패키지 안에는 절연된 틈을 사이에 두고 포토트랜지스터를 마주 보는 적외선 LED가 있습니다. LED에 전류가 흐르면 그 빛이 포토트랜지스터를 켭니다. 틈을 건너는 것은 빛뿐이므로 칩의 양쪽은 전기적으로 분리된 상태를 유지합니다 - 바로 이것이 라즈베리 파이를 보호합니다.
PC817의 사양은 다음과 같습니다:
- 패키지: 4핀 DIP, 1번 핀은 점이나 홈으로 표시됨
- 입력 LED 순방향 전압(Vf): 일반적으로 약 1.2 V, 최대 1.4 V
- 입력 LED 순방향 전류(If): 연속 최대 20 mA, 일반 사용 시 5 mA ~ 20 mA, 10 mA가 적절한 목표값
- 출력 컬렉터-이미터 전압(VCEO): 최대 35 V
- 출력 컬렉터 전류(IC): 최대 50 mA
- 컬렉터 전력 소모: 150 mW
- 절연 전압: 1분간 5000 Vrms
- 전류 전달비(CTR): 등급에 따라 50% ~ 600% (A 등급 80-160%, B 등급 130-260%, C 등급 200-400%, D 등급 300-600%)
- 스위칭 속도: 상승 시간 약 4 us, 하강 시간 약 3 us
- 동작 온도: -30 °C ~ +100 °C
라즈베리 파이에서 중요한 수치는 5000 Vrms 절연 전압입니다. 12V나 24V 회로가 헤더에 닿으려면 5천 볼트의 절연을 뚫어야 한다는 뜻입니다.
PC817 옵토커플러 절연 모듈
라즈베리 파이에서 PC817을 사용하는 실용적인 방법은 기성품 절연 모듈입니다. 이 모듈은 같은 칩을 직렬 저항, 상태 LED, 나사 단자와 함께 작은 보드에 실어 두었으므로, 계산하거나 납땜할 것이 없습니다:

- IN+와 IN- 나사 단자: 입력 쪽입니다. 12V/24V 신호는 IN+에, 같은 12V/24V 회로의 접지는 IN-에 연결해야 합니다.
- VCC 핀: 라즈베리 파이의 3.3V (핀 1)에 연결해야 합니다.
- GND 핀: 라즈베리 파이의 접지 핀, 예를 들어 GND (핀 6)에 연결해야 합니다.
- OUT 핀 (DO 또는 OUT1로 표시되기도 함): 라즈베리 파이의 GPIO 핀, 예를 들어 GPIO 12 (핀 32)에 연결해야 합니다.
배선하기 전에 보드의 상태 LED에 대해 알아 두면 좋습니다: 입력 쪽에 전원이 들어오면 켜지므로, 라즈베리 파이를 켜기 전에도 입력 쪽이 제대로 동작하는지 알 수 있습니다.
※ 주의:
모듈의 핀 배열은 제조사마다 다를 수 있습니다. 일부 보드는 VCC와 GND의 위치가 바뀌어 있고, 일부는 입력 단자를 IN+와 IN- 대신 +와 -로 표시합니다. 위 그림보다 항상 자신의 모듈에 인쇄된 표시를 믿고, 전원을 넣기 전에 자세히 확인하세요.
어떤 옵토커플러 모듈이 필요한가요 - 3-5V, 12V 또는 24V?
이 페이지 전체에서 유일한 구매 결정이며, 세 가지 버전이 모두 똑같이 생겨서 실수하기 쉽습니다. 직렬 저항은 이미 보드에 장착되어 있고, 하나의 입력 전압에 맞춰져 있습니다. 그래서 모듈이 세 가지 버전으로 따로 판매되는 것입니다:
| 감시하려는 라인 | 구매할 모듈 | 일반적인 예 |
|---|---|---|
| 3.3V 또는 5V 로직 신호 | 3-5V 모듈 | 센서 출력, 5V PLC 신호, 다른 마이크로컨트롤러 |
| 12V DC 신호 | 12V 모듈 | 자동차 회로, 12V 펌프 또는 팬, 경보 패널 |
| 24V DC 신호 | 24V 모듈 | 산업용 기계 출력, UPS 경보 접점, 24V 솔레노이드 |
모듈 하나 또는 오후 시간 전체를 날리게 되는 두 가지 실수를 피하세요:
- 12V 모듈에 24V 라인을 연결하면 내부 LED에 의도한 전류의 약 두 배가 흘러 LED가 손상됩니다.
- 24V 모듈에 12V 라인을 연결하면 LED 구동이 부족해져 출력이 늦게 바뀌거나, 불안정하게 바뀌거나, 아예 바뀌지 않을 수 있습니다 - 그리고 간헐적인 입력은 죽은 입력보다 원인을 찾기가 훨씬 어렵습니다.
신호 전압이 표의 값 사이에 있거나 정확히 모른다면, 주문하기 전에 멀티미터로 측정하세요. 모듈에서는 아무것도 계산하지 않고 알맞은 버전을 고르기만 하면 됩니다 - 그 선택이 곧 저항값을 직접 고르는 것과 같은 일입니다.
3-5V 버전은 일부 사람들을 놀라게 합니다: GPIO 핀이 직접 읽을 수 있는 신호를 왜 절연할까요? 절연은 고전압 때문만이 아니라 접지 경로를 끊기 위한 것이기 때문입니다. 두 회로가 서로 다른 전원 공급 장치를 사용하거나, 긴 케이블의 양 끝에 있거나, 한쪽이 전기적으로 잡음이 많을 때(모터 드라이버나 상용 전원으로 동작하는 가전 내부의 저전압 제어 보드 등) 절연이 제 몫을 합니다. 라즈베리 파이에서는 보호하려는 대상이 SD 카드가 들어 있는 리눅스 컴퓨터 전체이므로 이 주장은 평소보다 더 강합니다.
작동 원리
라즈베리 파이의 GPIO 핀은 내부 풀업이 활성화된 입력으로 설정되므로, 아무것도 끌어내리지 않을 때는 3.3V에 머뭅니다. 핀을 끌어내리는 것은 포토트랜지스터입니다.
| 외부 12V/24V 신호 | 내부 LED | 포토트랜지스터 | 라즈베리 파이 GPIO 읽기값 |
|---|---|---|---|
| 있음 | 켜짐 | 도통 | LOW |
| 없음 | 꺼짐 | 비도통 | HIGH |
따라서 읽기값은 반전됩니다: 외부 신호가 있으면 핀은 LOW를, 없으면 HIGH를 읽습니다. 처음에는 거의 모든 사람이 이 점에 놀랍니다. 이 페이지의 코드는 이를 다시 반전시켜, signal_active라는 변수가 12V/24V 라인에 실제로 전압이 있을 때 True가 되도록 합니다.
라즈베리 파이의 GPIO 핀에는 소프트웨어로 선택할 수 있는 내부 풀업 저항이 있으므로 외부 풀업 저항을 추가할 필요가 없습니다. GPIO.setup()의 인자 하나로 활성화됩니다.
옵토커플러 모듈은 액티브 LOW인가요, 액티브 HIGH인가요?
위 표는 이 페이지에서 설명한 대로 배선한 칩 단품에 대해서는 확실한 물리 법칙입니다: GPIO 핀에 풀업이 있으면 포토트랜지스터가 핀을 끌어내리므로, 신호 있음 = LOW입니다.
모듈은 이야기가 다릅니다. 일부 제조사는 보드에 반전 단을 추가하여 OUT 핀이 입력과 반대가 아니라 입력을 따라가게 만듭니다. 두 종류 모두 판매되고, 겉모습도 같으며, 판매 설명에 어느 쪽인지 적혀 있는 경우도 드뭅니다. 그러니 추측하지 말고 1분만 들여 확인하세요:
- 아래 그림처럼 모듈을 라즈베리 파이에 배선하고, 핀의 원시 상태를 보고하는 이 페이지의 첫 번째 스크립트를 실행하세요.
- 입력 나사 단자에 아무것도 연결하지 않은 상태에서 터미널에 무엇이 출력되는지 기록하세요.
- 이제 입력 쪽에 전원을 넣고 대신 무엇이 출력되는지 기록하세요.
- 신호가 있을 때 나타나는 값이 그 모듈의 액티브 레벨입니다. 그때 핀이 LOW를 읽으면 모듈은 액티브 LOW이고, HIGH를 읽으면 액티브 HIGH입니다.
- 보드의 상태 LED와 비교해서 확인하세요: 그 LED는 입력 쪽에 전원이 들어오면 켜지므로, LED가 켜지는 것과 핀이 액티브 레벨이 되는 것은 항상 함께 일어나야 합니다. LED는 켜지는데 파이에서 아무것도 바뀌지 않는다면, 문제는 입력 쪽이 아니라 출력 쪽(VCC, GND 또는 OUT 선)에 있습니다.
어느 쪽으로 나오든 코드에서 단어 하나만 바꾸면 됩니다. 이 페이지의 두 파이썬 스크립트는 모두 다음으로 시작합니다:
MODULE_ACTIVE_LOW = True
액티브 LOW 모듈이면 True로 두고, 액티브 HIGH 모듈이면 False로 설정하세요. 모든 읽기값이 이 상수 하나에서 결정되므로, 두 스크립트의 다른 부분은 바꿀 필요가 없습니다.
배선도
PC817 옵토커플러 절연 모듈을 라즈베리 파이에 배선하기

이 이미지는 Fritzing을 사용하여 만들어졌습니다. 이미지를 확대하려면 클릭하세요.
배선 구성을 간단하고 체계적으로 만들기 위해, Raspberry Pi용 스크루 터미널 블록 실드 사용을 권장합니다. 이 실드는 아래와 같이 더욱 안정적이고 관리하기 쉬운 연결을 제공합니다:

연결은 다음과 같습니다:
- 외부 12V/24V 신호의 양극 선을 모듈의 IN+ 나사 단자에
- 외부 12V/24V 회로의 접지를 모듈의 IN- 나사 단자에
- 모듈의 VCC 핀을 라즈베리 파이의 3.3V (핀 1)에
- 모듈의 GND 핀을 라즈베리 파이의 GND (핀 6)에
- 모듈의 OUT 핀을 라즈베리 파이의 GPIO 12 (핀 32)에
이 목록 어디에도 직렬 저항이 없는데, 그것이 바로 모듈의 핵심입니다 - 버전이 입력 단자에 들어오는 전압과 맞기만 하면 저항은 이미 보드에 있습니다.
※ 주의:
옵토커플러의 출력 쪽 전원은 라즈베리 파이의 5V (핀 2 또는 핀 4)가 아니라 3.3V (핀 1 또는 핀 17)에서 공급하세요. GPIO 핀은 3.3V까지만 견딜 수 있으며, 5V로 전원을 공급한 모듈은 OUT 핀에 5V를 내보낼 수 있습니다.
※ 주의:
12V/24V 회로의 접지를 라즈베리 파이의 접지에 연결하면 안 됩니다. 두 접지는 분리된 상태로 유지되어야 합니다 - 그 분리가 PC817을 사용하는 이유의 전부입니다. 두 접지를 연결해도 회로는 여전히 스위칭되고 코드도 여전히 동작하지만, 절연은 사라지고 라즈베리 파이는 다시 12V/24V 쪽에서 일어나는 모든 일에 노출됩니다.
선택 사항 - PC817 칩 단품으로 같은 입력 회로 만들기
직접 납땜하고 싶다면 칩 단품으로도 더 적은 비용으로 같은 일을 할 수 있습니다 - 모듈이 대신 해 주던 저항 선택을 직접 하면 됩니다.
칩은 4핀 DIP이며, 1번 핀은 점이나 홈으로 표시되고 거기서부터 반시계 방향으로 핀 번호가 매겨집니다.

연결은 다음과 같습니다:
- 외부 12V/24V 신호의 양극 선을 직렬 저항의 한쪽 다리에
- 직렬 저항의 다른 쪽 다리를 PC817 핀 1 - 애노드(A)에
- PC817 핀 2 - 캐소드(K)를 외부 12V/24V 회로의 접지에 (라즈베리 파이의 접지가 아님)
- PC817 핀 4 - 컬렉터(C)를 라즈베리 파이의 GPIO 12 (핀 32)에
- PC817 핀 3 - 이미터(E)를 라즈베리 파이의 GND (핀 6)에
핀 1과 2는 입력 쪽, 핀 3과 4는 출력 쪽이며, 그 사이에는 전기적 경로가 없습니다. 목표 LED 전류 10 mA에 대해 R = (Vin - 1.2) / 0.01로 저항값을 정하세요: 3.3V에서 220 Ω, 5V에서 390 Ω, 12V에서 1 kΩ, 24V에서 2.2 kΩ (24V에서는 1/2 W 부품). 24V 라인에 1 kΩ 저항을 그대로 두면 20 mA 정격 LED에 약 22.8 mA가 흐릅니다 - 칩 단품에서 12V 모듈을 24V 라인에 연결하는 것과 같은 실수입니다. 이렇게 배선한 칩 단품은 항상 액티브 LOW입니다.
모니터링하려는 장치와 PC817을 병렬로 연결하기
위 배선도는 입력 쪽에 별도의 전원을 공급하는 모습인데, 이는 작업대에서 실험할 때의 방식입니다. 실제 설치에서는 입력 쪽에 자체 전원이 전혀 없습니다 - 상태를 알고 싶은 장치의 양단에 병렬로 연결합니다. 여기서 사용하는 예는 기계나 UPS의 24V 경보 접점으로, 이미 경광등이나 패널에 배선되어 있고 이제 라즈베리 파이로도 감시하고 싶은 종류의 라인입니다.
WARNING
옵토커플러 입력을 장치와 직렬로 연결하지 마세요. 직렬로 연결하면 그 장치(릴레이 코일, 접촉기, 램프, 모터)의 부하 전류 전체가 내부 LED로 흐르게 되어, 장치가 켜지는 순간 LED가 파괴됩니다. 입력은 장치의 두 단자 양단에 병렬로 연결하며, 기존 회로의 어떤 부분도 끊거나 경로를 바꾸지 않습니다.
24V 기계 또는 UPS 경보 접점을 예로 들고 24V 모듈을 사용하면, 연결은 다음과 같습니다:
- 24V 경보 접점의 양극(스위칭되는) 단자를 모듈의 IN+ 나사 단자에
- 24V 경보 접점의 음극(복귀) 단자를 모듈의 IN- 나사 단자에
- 모듈의 VCC 핀을 라즈베리 파이의 3.3V (핀 1)에
- 모듈의 GND 핀을 라즈베리 파이의 GND (핀 6)에
- 모듈의 OUT 핀을 라즈베리 파이의 GPIO 12 (핀 32)에
- 경보 접점의 기존 배선은 그대로 유지 - 아무것도 분리하지 않음
모듈에서 병렬 연결을 할 때는 별도의 직렬 저항이 필요 없습니다. 보드에 있는 저항이 이미 24V에 맞춰져 있기 때문이며, 바로 그래서 버전이 연결하는 라인과 맞아야 합니다. 칩 단품 방식에서는 같은 연결에 핀 1 앞에 2.2 kΩ 저항을 넣습니다.
이 연결은 약 10 mA를 소비합니다. 릴레이 코일, 램프, 솔레노이드 밸브, 모터가 소비하는 전류에 비하면 아무것도 아니므로, 장치는 이전과 똑같이 계속 동작합니다. 측정은 비침습적이며 읽기 전용입니다.
입력 쪽이 LED이고 LED는 한 방향으로만 전류가 흐르므로 극성이 중요합니다. IN+와 IN-(칩 단품에서는 핀 1과 핀 2)를 바꾸면 회로는 그냥 절대 켜지지 않으며, 다른 증상은 전혀 없습니다. 배선하기 전에 연결 지점의 어느 쪽이 양극인지 확인하세요.
※ 주의:
유도성 장치에는 클램프 다이오드가 필요합니다. 릴레이 코일, 솔레노이드, 접촉기, 밸브, 모터는 꺼지는 순간 큰 역전압 스파이크를 내보내는데, PC817 입력 LED는 역방향으로 6 V까지만 견딜 수 있으므로 그 스파이크에 손상될 수 있습니다. 입력 단자 양단에 일반 다이오드를 역병렬로 직접 장착하세요 - 다이오드 캐소드를 IN+에, 다이오드 애노드를 IN-에 (칩 단품에서는 캐소드를 핀 1에, 애노드를 핀 2에). 정상 동작 중에는 그 다이오드가 역바이어스되어 아무 일도 하지 않고, 스파이크가 오면 도통하여 역전압을 1볼트 훨씬 아래로 제한합니다. 작은 연결에는 1N4148이, 더 큰 연결에는 1N4007이 적합합니다.
일부 반도체 출력은 누설 전류가 있습니다. PLC 트랜지스터 출력, 트라이액 출력, LED 램프 드라이버는 꺼져 있는 동안에도 작은 전류를 흘릴 수 있으며, 그 누설이 충분하면 내부 LED가 부분적으로 켜집니다 - 그러면 장치가 실제로는 쉬고 있는데도 라즈베리 파이는 켜짐으로 보고합니다. 증상은 알아보기 쉽습니다: 읽기값이 비활성으로 돌아오지 않고, 모듈의 상태 LED가 꺼지지 않고 희미하게 빛납니다. 해결책은 옵토커플러 입력 단자와 병렬로 약 4.7 kΩ ~ 10 kΩ의 블리더 저항을 장착하여, 누설 전류가 LED 대신 저항으로 흐르게 하는 것입니다.
이것은 DC 전용 연결이기도 합니다: PC817 입력은 LED 하나이고 한 극성에만 반응하므로 AC 라인 감지에는 맞지 않는 부품입니다 - AC에는 입력단에 LED 두 개가 역병렬로 들어 있는 옵토커플러가 필요합니다.
연결이 장치 앞이 아니라 장치 양단에 있으므로, 라즈베리 파이가 읽는 것은 원인이 무엇이든 그 장치의 실제 상태입니다 - 온도 조절기, 플로트 스위치, PLC, 타이머, 또는 건물 반대편에서 누군가 버튼을 누른 것이든 상관없습니다. 장치가 아예 켜지지 않을 때도 똑같이 충실하게 따라가므로 기록할 가치가 있습니다: 누적 가동 시간, 고장 알림, "실제로 시작했나?" 확인이 모두 같은 연결에서 나옵니다. 한 가지 솔직한 한계: 이것은 장치에 전원이 들어왔다는 것을 알려줄 뿐, 장치가 제 역할을 하고 있다는 것을 알려주지는 않습니다. 멈춰 버린 모터나 타버린 히터도 여전히 전력을 소비하므로 켜짐으로 읽힙니다.
라즈베리 파이 코드 - PC817 옵토커플러를 통해 절연된 12V/24V 신호 읽기
이 프로젝트에는 라이브러리가 필요하지 않습니다. PC817이 외부 전압을 단순한 HIGH/LOW 레벨로 바꿔 주므로 RPi.GPIO만으로 충분합니다.
빠른 단계
- 위의 모듈 배선도대로 PC817을 라즈베리 파이에 배선하고, 12V/24V 접지가 파이에 닿지 않는지 다시 확인하세요.
- 파이에 Raspberry Pi OS 또는 라즈베리 파이와 호환되는 다른 운영 체제가 설치되어 있는지 확인하세요.
- 라즈베리 파이가 PC와 같은 로컬 네트워크에 연결되어 있는지 확인하세요.
- 라이브러리를 설치해야 하는 경우 라즈베리 파이가 인터넷에 연결되어 있는지 확인하세요.
- 라즈베리 파이를 처음 사용한다면 라즈베리 파이 - 소프트웨어 설치을 참고하세요.
- Linux와 macOS에서는 내장 SSH 클라이언트를, Windows에서는 PuTTY를 사용하여 SSH로 PC를 라즈베리 파이에 연결하세요.
- RPi.GPIO 라이브러리가 설치되어 있는지 확인하세요. 설치되어 있지 않다면 다음 명령으로 설치하세요:
- 파이썬 스크립트 파일 pc817_optocoupler.py를 만들고 다음 코드를 추가하세요:
- 파일을 저장하고 터미널에서 다음 명령을 실행하여 파이썬 스크립트를 실행하세요:
- 외부 12V/24V 라인에 전원을 넣었다가 다시 끄세요.
- 터미널에서 결과를 확인하세요.
스크립트는 0.5초마다 GPIO 핀을 계속 확인하며 매번 한 줄씩 끝없이 출력합니다. 터미널에서 Ctrl + C를 눌러야만 멈추며, 이때 GPIO 핀도 해제됩니다.
이 스크립트는 앞에서 설명한 액티브 LOW / 액티브 HIGH 확인에 사용하는 스크립트이기도 합니다: 입력에 전원을 넣고 어떤 표시가 나타나는지 보세요. 라인이 쉬고 있을 때 ENERGISED가, 라인에 전압이 있을 때 idle이 출력된다면 모듈이 보드에서 반전하는 것입니다 - 파일 맨 위의 MODULE_ACTIVE_LOW를 False로 설정하고 다시 실행하세요. 스크립트의 다른 어떤 부분도 읽기값의 방향을 결정하지 않으므로, 그 상수 하나만 바꾸면 됩니다.
코드 설명
소스 코드의 주석에 포함된 한 줄씩 설명을 확인하세요!
라즈베리 파이 코드 - 장치의 켜짐/꺼짐 상태를 모니터링하고 타임스탬프와 함께 기록하기
1초에 두 번 같은 줄을 출력하는 것은 첫 테스트에는 유용하지만, 라즈베리 파이는 보통 작은 상시 가동 서버로 계속 켜 둡니다. 그런 역할에서는 똑같은 줄이 계속 나오는 것이 아니라, 실제로 무언가 바뀐 순간의 기록이 필요합니다. 이 두 번째 스크립트는 절연된 입력의 상태가 바뀔 때만 이전 상태가 얼마나 지속되었는지와 함께 한 줄을 출력하고 파일에 추가합니다.
그래서 24V 기계 가동 또는 고장 램프 라인, 12V 냉동고 컴프레서나 배수 펌프 가동 신호에 바로 사용할 수 있습니다. 이런 경우 흥미로운 질문은 지금의 상태가 아니라 밤새 얼마나 자주, 얼마나 오래 작동했는지입니다. nohup으로 또는 작은 systemd 서비스로 몇 주 동안 켜 두면, 같은 스크립트가 조용히 장치의 가동 시간 기록을 쌓아 갑니다. 그리고 두 기록 사이의 간격은 패널을 흘끗 보는 것으로는 절대 답할 수 없는 질문에 답해 줍니다: 시작해야 할 때 실제로 시작했나?
이 스크립트를 켜 두고 자리를 뜨기 전에 첫 번째 스크립트로 극성 문제를 해결하세요. 반대로 배선된 모듈은 여기서 요란하게 실패하지 않기 때문입니다 - 그럴듯하지만 반전된 기록을 로그 파일에 조용히 써 넣어, 모든 가동이 휴지 기간으로, 모든 휴지 기간이 가동으로 기록되며, 몇 주 동안 알아채지 못할 수도 있습니다.
빠른 단계
- 파이썬 스크립트 파일 pc817_optocoupler_logger.py를 만들고 다음 코드를 추가하세요:
- 파일을 저장하고 터미널에서 다음 명령을 실행하여 파이썬 스크립트를 실행하세요:
- 외부 12V/24V 라인을 몇 번 켜고 끄되, 각 상태를 잠시 동안 유지하세요.
- 터미널에서 결과를 확인하세요.
같은 줄이 스크립트 옆의 isolated_input.log라는 파일에 추가되므로, SSH 세션을 닫은 후에도 기록이 남습니다. 이 스크립트는 첫 번째 스크립트와 같은 MODULE_ACTIVE_LOW 상수를 가지고 있고 그 상수로 변화를 감지하므로, 거기서 정한 값이 여기서도 그대로 적용됩니다. 스크립트는 터미널에서 Ctrl + C를 누를 때까지 자체 루프 간격으로 계속 확인합니다.
코드 설명
소스 코드의 주석에 포함된 한 줄씩 설명을 확인하세요!
동영상
비디오 제작은 시간이 많이 걸리는 작업입니다. 비디오 튜토리얼이 학습에 도움이 되었다면, YouTube 채널 을 구독하여 알려 주시기 바랍니다. 비디오에 대한 높은 수요가 있다면, 비디오를 만들기 위해 노력하겠습니다.
스스로 도전해 보세요
- 쉬움: 출력되는 표시를 자신의 기계에 맞게 바꾸고, 절연된 입력에 전압이 있을 때마다 다른 GPIO 핀의 LED를 켜 보세요.
- 보통: 두 번째 스크립트를 모니터링 장치의 가동 시간 카운터로 바꿔 보세요: 전압이 있던 시간을 합산하고, 몇 번 시작했는지 세어, 변화가 있을 때마다 두 합계를 출력하세요.
- 어려움: 잡음이 많은 긴 24V 전선이 연속으로 두 번의 이벤트를 기록하지 않도록 소프트웨어 디바운싱을 추가하거나, 4채널 옵토커플러 모듈로 절연된 라인 네 개를 동시에 감시하거나, 예상 시각보다 몇 분이 지나도 입력에 전압이 들어오지 않으면 로그에 "펌프가 시작되지 않음" 경고를 기록해 보세요.
추가 지식
초보자들이 아주 흔하게 묻는 질문은 저항 몇 개로 훨씬 저렴하게 같은 일을 할 수 없느냐는 것입니다.
라즈베리 파이에서 24V 신호를 읽기 위해 PC817 옵토커플러와 저항 전압 분배기를 비교해 봅시다.
옵토커플러와 전압 분배기의 공통점:
- 둘 다 24V 신호를 3.3V GPIO 핀이 받아들일 수 있는 수준으로 낮춥니다.
- 둘 다 같은 파이썬 한 줄로 읽습니다.
- 둘 다 비용이 아주 적게 듭니다.
옵토커플러와 전압 분배기의 차이점:
| PC817 옵토커플러 | 저항 전압 분배기 | |
|---|---|---|
| 파이와의 전기적 연결 | 없음, 양쪽이 분리됨 | 직접 연결, 두 회로가 접지를 공유함 |
| 절연 전압 | 5000 Vrms | 없음 |
| 24V 쪽에 스파이크나 단락이 발생하면 | 파이는 영향을 받지 않음 | 스파이크가 GPIO 핀에 도달함 |
| 읽기값 | 칩 단품과 대부분의 모듈에서 반전되며, 코드의 상수 하나로 설정 | 반전되지 않음, HIGH가 신호 있음을 의미 |
| 접지 처리 | 12V/24V 접지는 분리되어야 함 | 12V/24V 접지를 파이 접지에 연결해야 함 |
| 추가 부품 | 모듈 하나, 또는 칩 하나와 저항 하나 | 저항 두 개 |
직접 제어하는 벤치 전원으로 책상 위에서 실험한다면 분배기도 괜찮습니다. 하지만 차량, 기계, 경보 패널, 상용 전원으로 동작하는 24V 전원 공급 장치에 연결되는 것이라면 분배기는 나쁜 거래입니다: 부품 하나를 아끼는 대신 전기적 고장과 망가진 라즈베리 파이 사이에 서 있는 유일한 보호막을 포기하는 것입니다. GPIO 핀이 손상되면 보통 칩 하나가 아니라 보드 전체를 교체해야 하므로, 옵토커플러는 처음 문제가 생기는 순간 그 값을 합니다.