우리는 스위치를 눌러서 전등을 켜거나 끕니다. 스위치를 켜면 전기가 통하여 전등이 켜지고, 스위치를 끄면 전기가 통하지 않아 전등이 꺼집니다.
아두이노, 라즈베리파이, 컴퓨터 등의 디지털 장치는 다양하고 복잡한 작업을 할 수 있지만, 근본적인 작동 원리는 스위치로 전등을 켜고 끄는 것과 동일합니다. 다만, 아주 많은 스위치를 아주 빠른 속도로 작동하는 차이밖에 없습니다. 오늘날의 컴퓨터 CPU에는 수십억개의 트랜지스터 (스위치) 가 있고 초당 수십억번의 속도로 스위치를 켜거나 끌 수 있습니다.
데이터의 표현
그렇다면, 단순히 스위치를 켜고 끄는 것으로 어떻게 문서를 작성하거나, 인터넷 서핑을 하거나, 동영상을 시청하는 작업이 가능할까요?
컴퓨터는 내부의 스위치가 켜진 상태를 1이라고 하고 꺼진 상태를 0이라고 해석합니다. 그러므로 컴퓨터가 어떠한 데이터를 표현하기 위해서는 0과 1만 사용할 수 있고 이것을 2진수(binary)이라고 부릅니다.
여기서 2진수의 한 자리수 (0 또는 1)을 1 비트 (bit)라고 부릅니다. 예를 들어, 10진수 숫자 3은 2진수로 11 이며 두 자리수 이므로 2비트입니다.
2비트로 표현 가능한 숫자는 아래와 같이 4개 (2의 2승) 입니다.
2진법
10진법
00
0
01
1
10
2
11
3
마찬가지로 n개의 비트로 표현 가능한 숫자는 2의 n승 개입니다.
이처럼 컴퓨터는 0과 1을 사용하는 2진수로 숫자, 문자 등의 모든 데이터를 표현하며 이러한 데이터를 이용하여 다양하고 복잡한 작업을 할 수 있습니다.
바이트
사용하는 이유
앞서 설명한 바와 같이 비트를 이용하여 다양한 데이터를 표현할 수 있지만, 컴퓨터에서는 비트를 데이터 처리의 단위로 사용하지는 않습니다. 데이터에 따라 6비트, 17비트, 196비트 등 크기가 다양하므로 결국 비트를 하나씩 읽기 위해서는 CPU가 데이터의 주소를 1비트 단위로 접근해야 하므로 매우 빈번하게 작동해야하기 때문입니다.
예) 10진수 37은 2진수 100101 이며 6비트로 표현 가능합니다. 그러나, 작은 숫자를 하나를 처리하는데 CPU가 6번 읽거나 써야 하므로 매우 비효율적입니다.
대신, 컴퓨터는 데이터를 8비트로묶은 단위로 처리를 하고 이를 1 바이트 (byte) 라고 합니다. 최소 단위를 8비트를 사용하므로 경우에 따라 일부 불필요한 비트가 추가되어 용량의 낭비가 발생하지만, 매우 효율적으로 빠르게 처리할 수 있는 장점이 있습니다.
예) 10진수 37은 2진수 100101 이며 앞에 00을 추가하여 00100101, 즉 8비트 (1바이트)로 만들어서 처리합니다. CPU는 1번만 읽거나 쓰면 되기 때문에 매우 효율적입니다.
Hex code (Hexadecimal code, 헥사값)
컴퓨터가 처리하는 바이트값을 2진수로 표시할 경우 사람이 읽기가 매우 불편하므로 16진수(hexadecimal)를 사용하여 표시한 값이 Hex code (헥사값)입니다. 2자리의 Hex code로 1 바이트를 표시할 수 있기 때문에 바이트를 효율적으로 표시할 수 있습니다. Hex code의 앞에는 보통 0x 를 붙여 16진수임을 나타냅니다.
디지털(Digital)이라는 용어는 고대 이집트에서 손가락을 의미하는 “digit” 에서 유래한 말로 점차 그 의미가 변하여 숫자를 의미하게 되었습니다. 즉, 1개, 2개와 같이 셀 수 있는 숫자를 의미합니다.
CD플레이어, 컴퓨터와 같은 디지털 장치에서 디지털 신호란 전기가 흐르거나 (true, ON, 1, 참) 또는 흐르지 않는 (false, OFF, 0, 거짓) 상태를 이용하는 신호를 의미합니다. 즉, 디지털 장치는 0과 1, 두가지 상태만을 이용하여 모든 데이터를 처리합니다. 보다 자세한 내용은 여기를 참고합니다.
디지털 신호의 예시는 아래와 같습니다.
전등 스위치
CD 플레이어의 출력
컴퓨터의 데이터 처리 방법
아날로그 신호
아날로그(Analog)라는 용어의 어원은 “비슷한”, “유사한” 이라는 의미를 가지고 있습니다. 아날로그 신호는 갯수를 셀수 없는 연속적인 신호로 자연상태의 대부분의 신호가 이에 해당하며, LP 레코드, 카세트 테이프 등도 아날로그 신호를 이용한 장치입니다. 아날로그 신호의 예는 아래와 같습니다.
빛의 밝기
소리의 크기
바람의 세기
LP 레코드의 출력
카세트 테이프의 출력
디지털 <-> 아날로그 변환
컴퓨터와 같은 디지털 장치는 오직 0과 1로 구성된 디지털 신호만 입력하거나 출력할 수 있습니다. 그러므로 아날로그 신호를 입력 또는 출력하기 위해서는 디지털 <-> 아날로그 신호 변환기를 사용해야 합니다.
디지털 신호를 아날로그 신호로 변환하는 장치를 Digital-Analog Converter (DAC)라고 하고, 아날로그 신호를 디지털 신호로 변환하는 장치를 Analog-Digital Converter (ADC)라고 합니다.
아래는 마이크에 입력된 아날로그 신호가 디지털 신호로 변환되어 디지털 프로세싱을 거친 후, 다시 아날로그 신호로 변환되어 스피커로 출력되는 과정을 보여줍니다.
LED 사용시 저항을 연결하는 이유는 과도한 전류로 인해 LED가 타버리는 것을 방지하기 위함입니다. 저항은 LED의 +, – 극 어디에 연결해도 상관없습니다.
LED의 데이터시트에는 정격/최대 전압 및 전류가 표시되어 있으며, 아래는 빨간색 LED의 데이터 시트의 예입니다.
위의 LED는 Forward Voltage 2V를 인가할 경우, 정격전류 20mA가 흐르고 이때는 별도의 저항을 연결하지 않아도 됩니다.
아래의 그림은 LED의 전압과 전류의 관계를 표시한 그래프입니다. 라즈베리파이의 GPIO의 공급전압은 3.3V이므로 저항을 연결하지 않고 적색 LED에 바로 전압을 연결하면 전류가 20mA를 훨씬 초과하여 LED는 타버리게 됩니다. 그러므로 LED를 연결할때는 반드시 저항을 연결하여 전류를 제한해야 합니다.
그러므로, 계산 결과와 유사한 저항 중에 시중에 많이 판매되는 220옴의 저항을 사용하면 되며, 이때의 전류는 약 5.9mA이므로 안전하게 사용이 가능합니다. 정격전류 20mA 보다 작은 전류가 흐르므로 상대적으로 좀 더 어둡지만, 일반적으로 사용 가능한 수준의 밝기입니다.
MCU, 아두이노와 같은 장치에서 디지털 입력을 연결할때 풀업, 풀다운 저항을 연결하는 경우를 많이 보게 됩니다.
디지털 회로에서는 전원으로 부터 입력핀에 전류가 흐르면 HIGH 그렇지 않으면 LOW 가 됩니다.
컨트롤러에 연결된 푸시버튼이 눌러진 상태에서는 컨트롤러의 입력핀의 전압은 GND와 연결되므 0V, 즉 LOW 가 됩니다. 그러나 푸시버튼을 누르지 않은 상태라면 입력핀은 VCC(전원), GND 어디에도 연결되지 않아 HIGH 도 LOW도 아닌 상태가 됩니다. 이를 플로팅(floating)상태라고 하며, 노이즈, 정전기 등에 의해 HIGH 또는 LOW가 될 수 있으므로 제어가 불가능한 상태가 됩니다.
풀업(Pull-up) 저항
아래와 같이 연결한 저항을 풀업(Pull-up)저항이라고 합니다. 푸시버튼을 누르지 않은 상태에서는 전류가 컨트롤러의 입력핀으로 흐르기 때문에 HIGH 상태가 되고, 푸시버튼을 누른 상태에서는 전류가 GND로 흐르기 때문에 컨트롤러 입력핀은 LOW 상태가 됩니다.
컨트롤러의 입력핀의 임피던스 (100k~1MOhm)는 풀업 저항에 비해 매우 크기 때문에 아래 그림과 같이 저항이 직렬 연결된 상태에서 풀업 저항 하단에서 전압 강하는 거의 발생하지 않습니다. (저항의 직렬 연결) 그러므로 풀업 저항이 있음에도 불구하고 입력 전압에 가까운 전압이 입력 핀에 걸리게 되어 HIGH로 인식합니다.
풀다운(Pull-down) 저항
아래와 같이 연결한 저항을 풀다운(Pull-down) 저항이라고 합니다. 푸시버튼을 누르지 않는 상태에서는 컨트롤러의 입력핀이 GND와 연결되므로 LOW가 되고, 푸시버튼을 누른 상태에서는 전류가 입력핀으로 흐르기 때문에 HIGH가 됩니다. 이때, 풀다운 저항은 GND로 과도한 전류가 흐르는 것 (Short circuit)을 방지하는 역할을 합니다.
라즈베리파이
라즈베리파이의 GPIO에는 소프트웨어적으로 활성화 시킬 수 있는 50kΩ의 내부 풀업, 풀다운 저항이 있습니다. 이 저항의 크기는 푸시버튼 등 대부분의 경우에 적합하므로 별도의 외부 저항을 연결할 필요가 없습니다. 물론 필요에 따라 외부 저항을 추가하여 사용할 수도 있습니다.
I/O 장치 – 디지털 읽기/쓰기에서 모드를 “읽기”를 선택 시 내부 풀업/풀다운 저항을 설정할 수 있습니다.
UART(Universal Asynchronous Receiver/Transmitter, 범용 비동기 송수신기)는 데이터를 직렬(Serial)로 전송하는 하드웨어로서 일반적으로 아두이노, MCU등에 탑재되어 있습니다. 아두이노, 라즈베리파이에서 흔히 시리얼통신이라 함은 UART통신을 의미합니다.
UART는 Tx(송신), Rx(수신) 2개의 핀을 사용하여 1:1로 통신하며, CPU와 같은 장치로 부터 입력받은 병렬(parallel) 데이터를 직렬(serial) 형태로 변환하거나 외부 장치로 부터 수신한 직렬 데이터를 다시 병렬 데이터로 변환하여 CPU와 같은 장치에 전달하는 역할을 합니다.
아래는 UART 통신에 사용되는 프로토콜 구조입니다. 비동기 (Asynchronous) 통신이며, 두 기기가 통신을 하기 위해서는 통신속도(Baud rate), Data bits의 갯수, Parity bit의 타입 등을 서로 일치시켜야 정상적인 통신이 가능합니다.
TTL
아두이노, 라즈베리파이, PC와 같은 제어장치는 0(OFF)과 1(ON)을 이용해 데이터를 표현합니다. 예를 들어 십진수 숫자 10은 이진법으로 1010이며 내부 트랜지스터 소자를 ON(High)-OFF(Low)-ON(High)-OFF(Low)하여 표현합니다.
TTL(Transistor-Transistor Logic) 레벨은 ON(High) 또는 OFF(Low)로 인식하는 전압의 레벨을 결정하는 방식중의 하나이며 전압의 레벨은 아래와 같습니다.
구분
INPUT
OUTPUT
ON(High, 1, True)
2~5V
2.7~5V
OFF(Low, 0, False)
0~0.8V
0~0.4V
UART 통신은 TTL레벨을 사용합니다. TTL레벨을 이용한 통신은 전압레벨이 낮고 노이즈 마진 (Input, Output 전압의 차이)이 작기 때문에 노이즈에 약하고 통신거리에 제약이 있는 단점이 있습니다. 그렇기 때문에 UART통신은 주로 기기 내부의 통신 또는 단거리 통신에만 사용됩니다.
RS-232, RS-422, RS-485
UART 통신의 단점을 보완하여 노이즈에 강하고 좀 더 먼거리까지 통신이 가능하도록 한 것이 RS-232, RS-422, RS-485입니다. 다만, 이 규격들은 하드웨어, 전압레벨 등에 관한 것이며 통신 프로토콜은 UART를 사용합니다.
항목
RS-232
RS-422
RS-485
동작모드
Single-Ended
Differential
Differential
네트워크
1:1 (Point To Point)
1:N (Multi-drop)
1:N (Multi-drop)
전송방식
half duplex full duplex
half duplex
half duplex
최대 통신거리
15m
1.2km
1.2km
최대 통신속도
20kb/s
10Mb/s
10Mb/s
최대 출력전압
±25V
-0.25V to +6V
-7V to +12V
최대 입력전압
±15V
-7V to +7V
-7V to +12V
RS-232
좀 더 먼거리까지 통신하기 위해 ±12V 전압레벨을 사용합니다. 1:1 통신만 가능하며 최대 통신거리는 약 15m입니다. Rx, Tx, GND 3개의 선을 사용하여 통신합니다.
RS-422
노이즈에 강하고 좀 더 먼거리까지 통신하기 위해 differential 연결방식을 사용합니다. TX+, TX-, RX+, RX- 4개의 선을 사용하며 +선과 -선의 노이즈는 동일하므로 서로 상쇄할 수 있는 원리입니다.
1:N (Multi-drop)통신이 가능하며 최대 통신거리는 약 1.2km 입니다. 다만, 1개의 기기만 마스터가 될수 있고 나머지 최대 10개의 기기들은 슬레이브만 가능하다는 점에서 진정한 Multi-drop 구성은 아닙니다.
• 마스터 : 다른기기에 명령을 내리는 장치 • 슬레이브: 마스터로 부터 명령을 받아서 처리 또는 회신하는 장치
RS-485
RS-422와 유사하나, 네트워크 내의 어떤 기기도 마스터 또는 슬레이브가 될 수 있으므로 최대 32개의 진정한 Multi-drop 네트워크를 구성할 수 있습니다. 2선식 또는 4선식을 사용할 수 있으며, 장거리 통신의 경우 노이즈를 저감하기 위해서 통신선 양단에 종단저항 (Termination Resistors)을 붙이기도 합니다.
모터(Motor)는 전기 에너지를 회전 에너지로 변환하는 장치이며 전동기라고도 합니다. 전원의 타입, 구조에 따라 다양한 타입의 모터가 있으나 아두이노, 라즈베리파이에서 주로 사용되는 모터는 DC모터, 서보모터, 스텝모터입니다. 각각의 모터마다 사용목적이 다르므로 목적에 맞는 모터를 선정해야합니다.
DC모터
휴대용 선풍기, 무선조종 자동차와 같이 연속된 회전을 목적으로 사용되는 모터이며 여러 분야에서 가장 널리 사용되는 모터입니다. 기동 토크가 크며, 출력토크가 입력전류에 비례하는 특성이 있습니다.
+, – 극에 전원을 연결하면 정방향으로 회전하며, 극성을 반대로 연결하면 역방향으로 회전합니다. 모터 드라이버를 사용하면 모터의 정/역회전 및 PWM 신호를 이용한 속도제어가 가능합니다.
DC모터 구동에 필요한 전류는 아두이노, 라즈베리파이에서 공급가능한 전류보다 매우 큽니다. 그러므로 반드시 모터의 전압 및 전류에 맞는 외부 DC 전원을 통해 전류를 공급해야합니다.
서보모터
아두이노, 라즈베리파이에 사용되는 서보모터는 흔히 RC서보모터로 불리며, RC카의 방향조정등을 위한 목적으로 사용됩니다. PWM 신호의 pulse width에 따라 0~180도의 각도로 회전 및 유지하는 특성을 가지고 있습니다. 연속 회전이나 속도 제어의 목적에는 적합하지 않으며, 특정 각도를 제어해야하는 경우에 사용되는 모터입니다.
• 공장자동화 등에 사용되는 산업용 서보모터와는 다른 타입의 모터이므로 유의합니다. • 서보모터의 전압과 소모전류를 고려하여 적절한 외부 DC 전원으로 부터 전류를 공급해야합니다.
스텝모터
입력 펄스 신호마다 1 스텝을 회전하는 모터입니다. 분해능이 높아 고정밀 위치 또는 속도제어의 목적에 사용될 수 있습니다. 주로 3D 프린터나 산업용 생산설비와 같이 정밀한 제어가 필요한 곳에 사용됩니다. A4988과 같은 스텝모터 드라이버를 사용하여 구동되며, 회전하고자 하는 스텝 수만큼 연속적인 펄스 신호를 컨트롤러에서 드라이버로 보내야 합니다.
스텝모터의 전압과 소모전류를 고려하여 적절한 외부 DC 전원으로 부터 전류를 공급해야합니다.
멀티 쓰레드 (Multi thread)는 하나의 프로세스를 여러 개의 조각 (쓰레드)으로 나누어 동시에 실행하는 것을 의미합니다. 오늘날 대부분의 컴퓨터 프로그램은 멀티 쓰레드를 사용하여 작업을 나누어서 동시에 실행함으로서 보다 빠르고 효율적으로 실행하고 있습니다.
예를 들어, 웹 브라우저를 사용할 때, 파일을 다운로드하거나 여러 개의 웹 페이지를 띄워도 사용자는 이전 작업이 완료될 때까지 기다리지 않아도 다른 작업을 계속 진행할 수 있습니다. 이것은 웹 브라우저의 프로그램 (프로세스)이 멀티 쓰레드로 구성되어 동시에 여러 작업을 수행할 수 있기 때문입니다.
실제로 윈도우의 작업 관리자를 열어보면, 하나의 프로그램이 여러 개의 쓰레드로 실행됨을 알 수 있습니다.
CPU의 코어 1개는 한번에 하나의 작업만 실행할 수 있습니다. 예를 들어 인텔 i5-12400 CPU는 6개의 코어를 가지고 있으므로 최대 6개의 작업을 동시에 실행할 수 있습니다.
그렇다면 이 경우 최대 6개의 프로세스 또는 쓰레드만 실행이 가능할까요? 그렇지 않습니다. 우리는 게임을 하면서 동영상을 시청하거나 웹 서핑을 동시에 할 수 있으며 이 경우, 수십개의 프로세스 또는 수백개의 쓰레드가 동시에 실행되고 있습니다.
CPU의 코어 1개는 한번에 하나의 작업만 실행이 가능하지만 윈도우 또는 리눅스와 같은 운영체제는 여러 개의 프로세스 또는 쓰레드를 번갈아 가면서 CPU에 할당하여 실행시키며 그 속도가 매우 빠르기 때문에 동시에 실행되는 것 처럼 보이는 것입니다.
CPU의 할당 순서 및 방법을 결정하는 것을 스케쥴링 (Scheduling), CPU에 할당된 작업을 변경하는 것을 컨텍스트 스위칭(Context Switching)이라고 합니다.
리눅스 기반의 라즈베리파이 OS 또한 스케쥴링 (Scheduling)을 지원하며, 그래블로의 로직은 각각 개별적인 쓰레드로 실행되므로 동시에 실행할 수 있습니다.
그러나 멀티 쓰레드는 실제로 동시에 실행되는 것이 아니라 아주 빠른 속도로 번갈아가면서 실행하는 것이기 때문에 CPU의 성능 또는 작업의 내용에 따라 실행 시간이 변할 수 있는 단점이 있습니다. 사양이 낮은 PC에서 포토샵과 같은 무거운 프로그램을 돌리거나 많은 갯수의 프로그램을 실행하면 전체적인 속도가 저하되는 것도 이러한 이유입니다.
그렇기 때문에 그래블로의 로직의 실행 주기는 경우에 따라 설정한 주기보다 길어질 수 있습니다. 예를 들어 로직이 0.1초 (100밀리초) 마다 실행되도록 설정했다면, 실제 실행 주기는 100밀리초를 초과할 수도 있습니다. 저사양의 라즈베리파이일 수록 오차가 커지며, 고사양의 라즈베리파이일 수록 오차가 작아집니다. 오차 수준은 실행 환경에 따라 다를 수 있으나 일반적 사용 조건에서는 0~3밀리초 이며 대부분의 경우 사용하는데 문제가 없는 수준입니다.
만약 구현하고자 하는 내용이 1밀리초 이내의 매우 정확한 타이밍이 필요한 경우에는 그래블로는 적합하지 않으며 실시간 운영체제를 이용해야 합니다.
릴레이(Relay)는 전기적 신호를 이용하여 작동시키는 자동 스위치 이며 전자계전기 라고도 합니다.
우리는 스위치를 눌러서 천장에 달려있는 전등을 켜거나 끕니다.
릴레이의 기본원리도 이와 동일하며 손으로 직접 스위치를 누르는 대신 약한 전기 신호로 동작하는 자동 스위치가 릴레이입니다.
PC, 아두이노, 라즈베리파이와 같은 컨트롤러에서 출력되는 전기 신호는 약한 세기의 직류(DC)이며 교류(AC)나 큰 전류를 출력할 수 없습니다. 이러한 장치들은 두뇌의 역할을 하기 때문에 다른 장치를 제어하기 위한 제어 신호 수준의 약한 전류만 출력할 수 있습니다. 아두이노, 라즈베리파이의 디지털 출력핀에서 출력가능한 전압, 전류는 아래와 같습니다.
아두이노 : DC 5V, max 40mA
라즈베리파이: DC 3.3V, max 8mA
그렇기 때문에 컨트롤러는 교류 또는 큰 전류의 직류를 소모하는 장치에 직접 전류를 공급할 수 없고 약한 세기의 전류를 이용해 릴레이 스위치를 켜거나 끔으로써 간접적으로 제어하는 것입니다.
릴레이는 크게 유접점, 무접점식으로 구분할 수 있으며 무접점식을 (SSR, Solid State Relay)라고 합니다.
아래는 유접점 릴레이의 구조를 나타낸 그림입니다. 기본 원리는 전자석의 원리와 동일하며 코일에 약한 전류를 흘려주면 자기력에 의해 접점이 닫히고, 전류가 흐르지 않으면 스프링에 의해 접점이 열리는 구조입니다. 이렇게 닫히고 열리는 접점(접촉점)이 존재한다고 해서 기계식 또는 유접점 릴레이라고 부릅니다.
반면, 무접점 릴레이(SSR)는 기계적인 구동부가 존재하지 않고 반도체를 이용하여 전자식으로 스위칭하는 방식으로 유접점 방식에 비해 스위칭 속도가 빠르고 수명이 긴 장점이 있으나 가격이 비교적 비쌉니다.