전자공학 기초
장치를 배선할 때 알아 두어야 하는 내용을 정리했습니다.
디지털 입출력
디지털 회로는 스위치가 닫히면 전류가 흐르고 열리면 흐르지 않습니다. 닫힌 상태를 HIGH, 열린 상태를 LOW 라고 합니다. 디지털 입력은 외부 스위치의 열림과 닫힘을 컨트롤러가 감지하는 것이고, 디지털 출력은 컨트롤러가 그 열림과 닫힘을 제어하는 것입니다.
아날로그 신호와 ADC
빛의 밝기, 소리의 크기처럼 연속적으로 변하는 값은 아날로그 신호입니다. 컨트롤러는 디지털 신호만 처리하므로 아날로그 신호를 읽으려면 ADC(Analog-Digital Converter)가, 내보내려면 DAC 가 필요합니다. 라즈베리파이에는 아날로그 입력 핀이 없으므로 ADS1115 와 같은 ADC 장치를 I/O 장치로 등록하여 사용합니다.
디지털 신호는 전기가 흐르는 상태(ON, 1, 참)와 흐르지 않는 상태(OFF, 0, 거짓) 두 가지로만 표현됩니다. 전등 스위치, 컴퓨터의 데이터 처리가 디지털의 예이고, 빛의 밝기, 소리의 크기, 바람의 세기가 아날로그의 예입니다. 예를 들어 마이크에 들어온 소리(아날로그 전압)는 ADC 를 거쳐 디지털 데이터로 바뀐 뒤 처리되고, 다시 DAC 를 거쳐 아날로그 전압으로 바뀌어 스피커에서 소리가 됩니다. 디지털 데이터의 단위는 비트와 바이트를 참고합니다.
LED 저항 계산
공급 전압이 LED 의 순방향 전압보다 높으면 반드시 저항으로 전류를 제한해야 합니다. 저항이 없으면 정격을 크게 넘는 전류가 흘러 LED 가 손상됩니다. 저항 값은 옴의 법칙으로 구합니다.
R = (공급 전압 - LED 순방향 전압) / 전류
예를 들어 순방향 전압 2V 인 빨간색 LED 를 3.3V GPIO 에 연결할 때, 라즈베리파이의 핀 출력 한도(약 8mA)를 고려하여 전류를 5mA 로 잡으면 약 260Ω 이 나옵니다. 시중에서 흔한 220Ω 을 쓰면 전류가 약 5.9mA 로 안전한 범위에 들어옵니다. 저항은 LED 의 어느 극에 연결해도 무방합니다.
LED 의 순방향 전압(forward voltage)과 순방향 전류(forward current)는 데이터시트에 표시되어 있습니다. 예를 들어 순방향 전압 2V, 전류 20mA 인 빨간색 LED 를 옴의 법칙(V = I × R)으로 계산하면 (3.3V − 2V) / 0.02A = 65Ω 이 나오지만, 라즈베리파이 GPIO 의 출력 한도(핀당 약 8mA, 전체 50mA)를 넘으므로 위와 같이 5mA 로 다시 계산합니다. 정격 20mA 보다 작은 전류가 흐르므로 상대적으로 어둡지만 일반적으로 사용할 수 있는 밝기입니다.
색상별 LED 순방향 전압과 권장 저항
데이터시트가 없을 때 참고할 수 있는 일반적인 값입니다. 실제 값은 제품마다 다릅니다.
| 색상 | 순방향 전압 | 일반 전류 |
|---|---|---|
| 빨간색 | 1.8~2.3V | 20mA |
| 주황색 | 2.0~2.3V | 30mA |
| 노란색 | 2.0~2.8V | 20mA |
| 초록색(연두 계열) | 1.8~2.3V | 20mA |
| 초록색(순녹색) | 3.0~3.6V | 20mA |
| 파란색 | 3.4~3.8V | 20mA |
| 분홍색 | 3.4~3.8V | 20mA |
| 흰색 | 3.4~4.0V | 20mA |
위 계산 방법으로 구한 라즈베리파이(3.3V) 기준의 대략적인 저항 값은 다음과 같습니다.
| 색상 | 저항 |
|---|---|
| 빨간색 | 220Ω |
| 노란색 | 180Ω |
| 초록색 | 220Ω |
| 흰색 | 100Ω |
풀업 · 풀다운 저항
푸시버튼을 누르지 않은 상태에서 입력 핀이 전원과 접지 어느 쪽에도 연결되지 않으면 HIGH 도 LOW 도 아닌 플로팅 상태가 됩니다. 이 상태에서는 노이즈나 정전기로 값이 임의로 바뀌어 제어할 수 없습니다. 풀업 저항은 누르지 않은 상태를 HIGH 로, 풀다운 저항은 누르지 않은 상태를 LOW 로 고정하여 이 문제를 없앱니다.
입력 핀은 전원(VCC)에 연결되면 HIGH, GND 에 연결되면 LOW 로 인식됩니다. 아래 왼쪽 그림처럼 푸시버튼을 GND 에만 연결하면, 누른 상태에서는 입력 핀이 GND 와 연결되어 0V(LOW)가 되지만 누르지 않은 상태에서는 전압을 알 수 없는 플로팅 상태가 됩니다.
풀업 저항을 입력 핀과 VCC 사이에 연결하면, 누르지 않은 상태에서는 전류가 입력 핀으로 흘러 HIGH 가 되고, 누른 상태에서는 전류가 GND 로 흘러 LOW 가 됩니다.
입력 핀의 임피던스(100kΩ~1MΩ)는 풀업 저항보다 매우 크므로 두 저항이 직렬로 연결된 것과 같고, 풀업 저항에서는 전압 강하가 거의 일어나지 않습니다. 따라서 입력 핀에는 VCC 에 가까운 전압이 걸립니다.
풀다운 저항은 입력 핀과 GND 사이에 연결하며, 누르지 않은 상태를 LOW 로 고정하고 누른 상태에서 GND 로 과도한 전류가 흐르는 것(단락)을 막습니다.
3.3V 와 5V 변환
라즈베리파이 GPIO 의 동작 전압은 3.3V 입니다. 5V 전용 센서나 아두이노 우노와 같은 5V 장치를 연결할 때는 전압을 변환해야 하며, 변환 없이 5V 를 연결하면 보드가 손상됩니다.
- 분압기: 저항 두 개로 전압을 낮춥니다. 5V 를 3.3V 로 낮추려면 예를 들어 R1 을 1kΩ, R2 를 2kΩ 으로 두어 출력이 약 3.3V 가 되도록 합니다. HC-SR04 초음파 센서의 Echo 핀처럼 5V 를 출력하는 신호를 받을 때 사용합니다.
- 로직 레벨 컨버터: 양방향 변환과 여러 채널을 지원하는 모듈입니다. 통신선처럼 양방향 신호에는 이 방법을 사용합니다. 높은 전압 쪽을 HV, 낮은 전압 쪽을 LV 에 연결합니다.
3.3V 장치에는 라즈베리파이, 젯슨 나노, 아두이노 듀에·제로·나노 33 IoT 등이, 5V 장치에는 아두이노 우노·나노·메가·레오나르도 등이 해당합니다. 전압 변환은 다음과 같은 경우에 필요합니다.
- 3.3V 를 출력하는 센서나 모듈을 5V 장치에 연결하는 경우
- 5V 를 출력하는 센서나 모듈을 3.3V 장치에 연결하는 경우
- 3.3V 장치와 5V 장치가 서로 통신하는 경우
분압기의 출력 전압은 다음 식으로 구합니다. R1 은 입력 쪽, R2 는 GND 쪽 저항입니다.
Vout = R2 / (R1 + R2) × Vin
로직 레벨 컨버터에는 한 방향으로만 변환하는 단방향(Uni-direction) 제품과 양쪽 방향으로 변환하는 양방향(Bi-direction) 제품이 있습니다. UART 처럼 송수신선이 있는 통신에는 양방향 제품을 사용합니다.
시리얼 통신 방식
UART(Universal Asynchronous Receiver/Transmitter)는 데이터를 직렬(serial)로 주고받는 하드웨어로, 흔히 시리얼 통신이라고 하면 UART 를 사용한 통신을 말합니다. TX(송신), RX(수신) 두 핀으로 1:1 통신하며, CPU 의 병렬(parallel) 데이터를 직렬 데이터로 바꾸어 보내고 받은 직렬 데이터를 다시 병렬 데이터로 바꿉니다.
UART 는 비동기(asynchronous) 통신이므로 두 기기의 통신 속도(Baud rate), 데이터 비트 수, 패리티 비트 종류, 정지 비트 수를 서로 같게 맞춰야 정상적으로 통신합니다. 모드버스 RTU 와 사용자 정의 통신(시리얼)의 통신 설정 항목이 이 값들입니다.
| 방식 | 특징 |
|---|---|
| TTL UART | 보드의 UART 핀을 직접 연결합니다. 거리가 짧고 1:1 통신에 적합합니다. |
| RS-232 | PC 의 표준 시리얼 규격입니다. 1:1 통신이며 TTL 과 전압 규격이 달라 변환 모듈이 필요합니다. |
| RS-422 | 차동 신호로 장거리 전송에 유리합니다. 1:N 단방향 구성에 사용합니다. |
| RS-485 | 차동 신호로 장거리에 강하고 여러 장치를 한 선에 연결할 수 있습니다. 산업용 모드버스 RTU 에서 널리 쓰입니다. |
TTL 레벨
TTL(Transistor-Transistor Logic) 레벨은 HIGH(ON, 1)와 LOW(OFF, 0)로 인식하는 전압 범위를 정한 방식의 하나입니다. 5V TTL 레벨은 다음과 같습니다.
| 구분 | 입력 | 출력 |
|---|---|---|
| HIGH (ON, 1) | 2~5V | 2.7~5V |
| LOW (OFF, 0) | 0~0.8V | 0~0.4V |
UART 는 TTL 레벨을 사용합니다. 전압 레벨이 낮고 노이즈 마진(입력과 출력 전압 기준의 차이)이 작아 노이즈에 약하고 통신 거리에 제약이 있으므로, 주로 기기 내부나 짧은 거리의 통신에 사용합니다.
RS-232, RS-422, RS-485
UART 의 단점을 보완하여 노이즈에 강하고 더 먼 거리까지 통신할 수 있도록 한 규격입니다. 이 규격들은 하드웨어와 전압 레벨에 관한 것이며, 통신 프로토콜은 UART 를 그대로 사용합니다.
| 항목 | RS-232 | RS-422 | RS-485 |
|---|---|---|---|
| 동작 방식 | Single-Ended | Differential(차동) | Differential(차동) |
| 네트워크 | 1:1 | 1:N (Multi-drop) | 1:N (Multi-drop) |
| 배선 | TX, RX, GND 3선. 양쪽의 TX 와 RX 를 교차 연결 | TX+, TX-, RX+, RX- 4선 | 2선식 또는 4선식 |
| 최대 통신 거리 | 약 15m | 약 1.2km | 약 1.2km |
| 최대 통신 속도 | 20kb/s | 10Mb/s | 10Mb/s |
| 최대 출력 전압 | ±25V | -0.25V ~ +6V | -7V ~ +12V |
| 최대 입력 전압 | ±15V | -7V ~ +7V | -7V ~ +12V |
| 장치 구성 | 2대 | 마스터 1대, 슬레이브 최대 10대 | 최대 32대. 어느 장치나 마스터가 될 수 있음 |
- RS-232: 더 먼 거리까지 통신하기 위해 ±12V 전압 레벨을 사용합니다.
- RS-422: + 선과 - 선에 같은 노이즈가 실리면 서로 상쇄되는 차동 방식을 사용하여 노이즈에 강합니다. 다만 마스터가 1대로 고정되므로 완전한 Multi-drop 구성은 아닙니다.
- RS-485: RS-422 와 비슷하지만 네트워크의 어떤 장치든 마스터 또는 슬레이브가 될 수 있습니다. 장거리 통신에서는 노이즈를 줄이기 위해 통신선 양 끝에 종단 저항(termination resistor)을 연결하기도 합니다.
모터와 릴레이
DC 모터는 전압으로 속도를, 서보 모터는 PWM 신호로 각도를, 스텝 모터는 펄스 수로 회전량을 제어합니다. 세 종류 모두 I/O 장치로 지원합니다 (7부).
- DC 모터: 기동 토크가 크고 출력 토크가 입력 전류에 비례합니다. 극성을 반대로 연결하면 반대 방향으로 회전합니다. 모터 드라이버를 사용하면 정회전·역회전과 PWM 신호를 이용한 속도 제어가 가능합니다.
- 서보 모터: 흔히 RC 서보 모터라고 하며, PWM 신호의 펄스 폭에 따라 0~180도 사이의 각도로 회전하여 그 위치를 유지합니다. 연속 회전이나 속도 제어에는 적합하지 않으며, 산업용 서보 모터와는 다른 종류입니다.
- 스텝 모터: 입력 펄스 하나마다 한 스텝씩 회전합니다. 분해능이 높아 3D 프린터나 생산 설비처럼 정밀한 위치 제어와 속도 제어에 사용합니다. A4988 과 같은 스텝 모터 드라이버를 사용하며, 스텝 수만큼의 펄스를 정확한 타이밍으로 출력해야 합니다.
릴레이는 전기 신호로 작동하는 자동 스위치로, 전자 계전기라고도 합니다. 손으로 스위치를 누르는 대신 약한 전기 신호로 접점을 여닫습니다. 컨트롤러의 출력은 아두이노가 DC 5V 최대 40mA, 라즈베리파이가 DC 3.3V 핀당 약 8mA 이므로 큰 부하는 릴레이를 거쳐 제어합니다. 릴레이는 다음 두 종류로 나뉩니다.
- 유접점 릴레이: 코일에 약한 전류를 흘리면 자기력으로 접점이 닫히고, 전류가 끊기면 스프링의 힘으로 접점이 열립니다.
- 무접점 릴레이(SSR, Solid State Relay): 기계적인 구동부 없이 반도체로 스위칭합니다. 스위칭 속도가 빠르고 수명이 깁니다.
멀티 쓰레드와 실행 주기
쓰레드는 프로그램 안에서 독립적으로 실행되는 작업 단위이며, 하나의 프로그램이 여러 쓰레드로 여러 작업을 동시에 처리하는 방식을 멀티 쓰레드라고 합니다. Grablo 의 로직도 각각 독립된 쓰레드로 실행됩니다.
CPU 코어 하나는 한 번에 하나의 작업만 실행하므로, 코어 수보다 많은 쓰레드는 운영체제가 번갈아 가며 CPU 에 할당합니다. 이를 스케줄링(scheduling)이라 하고, 실행 중인 작업을 바꾸는 것을 컨텍스트 스위칭(context switching)이라 합니다. 이 때문에 각 쓰레드의 실행 시간은 CPU 성능과 점유율에 따라 달라지며, 예를 들어 100밀리초마다 실행되도록 설정한 로직의 실제 실행 주기는 100밀리초를 넘을 수 있습니다. 더 정밀한 타이밍이 필요한 제어에는 실시간 운영체제(RTOS)가 필요합니다. 실행 주기 설정은 4부를 참고합니다.