시작하기
부록

하드웨어 및 참고자료

보드별 GPIO 핀맵과 인터페이스, 컨트롤러 접속 방법, 외부 서비스 준비 절차, 그리고 배선에 필요한 전자공학 기초를 정리했습니다.

하드웨어 핀맵과 인터페이스

주의 Grablo 에서 입력하는 모든 핀 번호는 GPIO 번호입니다. 커넥터에 인쇄된 물리 핀 번호와 다르므로 혼동하지 않도록 유의합니다.

라즈베리파이

현재 출시되는 모든 모델이 40핀 헤더를 제공하며 각 핀의 기능은 모델과 무관하게 같습니다. 핀 번호를 매기는 방법은 커넥터 기준(Physical/Board)과 CPU 채널 기준(GPIO/BCM) 두 가지가 있고, Grablo 는 GPIO/BCM 을 사용합니다.

용도비고
I2CGPIO 2(SDA), 3(SCL)일반 디지털 입출력으로도 사용할 수 있습니다.
SPIGPIO 7, 8, 9, 10, 11일반 디지털 입출력으로도 사용할 수 있습니다.
UARTGPIO 14(TX), 15(RX)Primary UART 입니다.
하드웨어 PWMGPIO 12, 13일반 디지털 입출력으로도 사용할 수 있습니다.
1-WireGPIO 4기본값이며 아래 절차로 변경할 수 있습니다.

전원 핀을 제외한 모든 GPIO 핀의 전압 레벨은 3.3V 입니다. 허용 전류는 입력 최대 0.5mA, 출력 최대 약 8mA 이며 출력 핀 전체의 합이 50mA 를 넘지 않아야 합니다. 전원 핀의 허용 전류는 3.3V 핀이 약 800mA, 5V 핀은 약 2.5A 에서 보드 자체 소모 전류와 3.3V 핀 소모 전류를 뺀 값입니다. 라즈베리파이에는 아날로그 입력 핀이 없으므로 아날로그 신호를 읽으려면 ADS1115 와 같은 ADC 를 함께 사용합니다.

주의 GPIO 핀에 5V 를 연결하면 보드가 손상됩니다. 모터나 다수의 LED 처럼 소모 전류가 큰 장치는 보드 전원이 아니라 별도의 외부 전원으로 공급합니다.

젯슨 나노

젯슨 나노는 핀 번호와 GPIO 번호가 서로 다른 체계입니다. Grablo 에는 GPIO 번호를 입력합니다.

GPIOGPIOGPIO
7216191631200
1150211732168
127922133338
131423183576
1519424193651
1623226203712
1815291493877
----4078

I2C 는 3번(SDA), 5번(SCK) 핀을 사용합니다. I2C0 은 카메라 인터페이스 등 내부용이므로 외부 장치에 연결할 수 없습니다. UART 는 8번(TX), 10번(RX) 핀이며 포트 이름은 /dev/ttyTHS1 입니다. PWM(32, 33번 핀)과 SPI 는 Jetson-IO 설정에서 활성화해야 사용할 수 있으며, 터미널에서 다음 명령을 실행한 뒤 Configure Jetson 40pin header > Configure header pins manually 에서 기능을 선택하고 저장 후 재부팅합니다.

sudo /opt/nvidia/jetson-io/jetson-io.py
알아두기 위 표는 젯슨 나노 기준입니다. Orin Nano 와 AGX Orin 은 핀과 GPIO 번호 체계가 다르므로 해당 보드의 공식 자료를 확인합니다.

외부 GPIO 어댑터

보드에 GPIO 핀이 없거나 부족한 경우 USB-GPIO 어댑터를 사용합니다. 등록 방법은 6부를 참고합니다.

어댑터디지털 입출력그 밖의 기능로직 레벨
FT232H12개. AD4~AD7 이 GPIO 0~3, AC0~AC7 이 GPIO 4~11 입니다.I2C(AD0=SCL, AD1·AD2=SDA, 두 핀을 함께 연결), SPI(AD0=SCLK, AD1=MOSI, AD2=MISO, AD3=CS)3.3V. 입력은 5V 를 허용합니다.
MCP2221A4개. G0~G3 이 GPIO 0~3 입니다.I2C(SCL, SDA), UART(RX, TX), ADC 10비트(G1~G3), DAC 5비트(G2 또는 G3, 두 핀에 동시 출력)기본 3.3V. 모듈의 점퍼를 바꾸면 5V 로 변경됩니다.
NUMATO USB-GPIO모델에 따라 8~128개. IO0 부터 GPIO 0 으로 시작합니다.ADC 10비트 6채널(8채널 모델 기준 IO0~IO3, IO6~IO7)5V
주의 USB-GPIO 어댑터는 USB 포트에서 전력을 공급받습니다. 연결한 장치의 전류 합이 400~500mA 를 넘으면 USB 포트가 손상될 수 있습니다.

I2C 장치의 주소 확인

I/O 장치를 등록할 때는 I2C 주소가 필요합니다. 컨트롤러 터미널에서 다음 명령을 실행하면 하드웨어 I2C 핀에 연결된 장치의 주소가 16진수로 표시됩니다. 버스 번호는 보드에 따라 다를 수 있습니다.

sudo i2cdetect -y 1

이 명령은 주소만 표시하며 장치의 이름이나 종류는 알려주지 않습니다. 장치가 여럿이면 각 장치의 데이터시트에서 주소를 확인하여 대조합니다. 하드웨어 I2C 핀이 아닌 다른 핀에 연결한 장치(소프트웨어 방식)의 주소는 이 명령으로 찾을 수 없습니다.

1-Wire 핀 변경

라즈베리파이의 1-Wire 핀은 기본값이 GPIO 4 입니다. DS18B20 과 같은 장치를 다른 핀에 연결하려면 설정 파일을 편집합니다.

sudo nano /boot/firmware/config.txt

파일에서 dtoverlay=w1-gpio 를 찾아 사용할 핀을 지정합니다. 여러 개의 1-Wire 핀이 필요하면 줄을 여러 개 씁니다. 저장한 뒤 sudo reboot 로 재부팅하면 적용됩니다.

dtoverlay=w1-gpio,gpiopin=17
dtoverlay=w1-gpio,gpiopin=27
알아두기 설정 파일의 경로는 라즈베리파이 OS Bookworm 부터 /boot/firmware/config.txt 이며, 그 이전 버전에서는 /boot/config.txt 입니다.

시리얼(UART) 포트

모드버스와 사용자 정의 통신에서는 포트 이름을 입력해야 합니다. 라즈베리파이의 UART 는 다음과 같이 장치로 인식됩니다.

UART장치 이름설명
Primary/dev/serial0하드웨어 UART 핀(GPIO 14, 15)에 연결된 포트입니다. 모델에 따라 실제 타입이 다르므로 이 이름을 쓰는 것이 안전합니다.
Secondary/dev/serial1블루투스가 있는 모델에서는 블루투스 전용으로 사용됩니다.
Full UART/dev/ttyAMA0성능과 기능이 완전한 UART 입니다.
Mini UART/dev/ttyS0성능이 낮고 일부 기능이 없습니다.
USB-TTL 컨버터/dev/ttyUSB*FT232RL, CP2102, PL2303, CH340 등의 칩셋을 지원합니다. 연결 후 ls -l /dev/ttyUSB* 로 확인합니다.

라즈베리파이 4 에는 숨겨진 Full UART 네 개가 있습니다. 설정 파일에 dtoverlay=uart2 부터 uart5 까지 필요한 줄을 추가하고 재부팅하면 ttyAMA1 부터 순서대로 추가되며, dmesg | grep tty 로 확인할 수 있습니다. 추가 포트의 기본 핀은 UART2 가 GPIO 0·1, UART3 이 GPIO 4·5, UART4 가 GPIO 8·9, UART5 가 GPIO 12·13(TXD·RXD 순서)입니다.

컨트롤러 접속과 파일 전송

컨트롤러에 직접 명령을 실행하거나 음원, AI 모델과 같은 파일을 넣어야 할 때 사용하는 방법입니다. 프로젝트 안에서 쓰는 파일 업로드와는 다른 경로입니다 (3부).

주소 확인

SSH 와 SFTP 접속에는 컨트롤러의 호스트 이름 또는 IP 주소가 필요합니다. 운영체제를 설치할 때 지정한 호스트 이름을 그대로 쓸 수 있으며, 라즈베리파이의 기본값은 raspberrypi 또는 raspberrypi.local 입니다. 접속한 뒤 ip a 명령으로 실제 IP 주소를 확인할 수 있고, 호스트 이름으로도 닿지 않으면 같은 네트워크에서 IP 스캐너로 검색합니다.

SSH 서버 설치

라즈베리파이 OS 와 데비안 계열 배포판에는 SSH 서버가 기본으로 포함되어 있으나, 일부 배포판에서는 직접 설치해야 합니다. 컨트롤러가 인터넷에 연결된 상태에서 다음 명령을 실행합니다.

sudo apt-get update
sudo apt-get install -y openssh-server

SSH 접속

SSH 클라이언트로 컨트롤러에 접속하여 원격으로 명령을 실행합니다. Windows 에서는 PuTTY, macOS 와 리눅스에서는 터미널의 ssh 명령 또는 Termius, MobaXterm 과 같은 클라이언트를 사용합니다. 접속에는 호스트 이름 또는 IP 주소와 포트 번호(기본값 22), 그리고 운영체제의 로그인 계정이 필요합니다.

ssh 계정이름@raspberrypi.local

파일 전송

PC 와 컨트롤러 사이에 파일을 주고받으려면 SFTP 를 사용합니다. FileZilla 와 같은 SFTP 클라이언트에 컨트롤러의 호스트 이름, 로그인 계정, 포트 번호(기본값 22)를 입력하여 접속한 뒤, 왼쪽의 PC 디렉토리와 오른쪽의 컨트롤러 디렉토리 사이에서 파일을 올리거나 내립니다.

알아두기 관리자(root) 계정이 아닌 경우에는 /home/계정이름, /tmp 처럼 권한이 있는 디렉토리에만 파일을 올릴 수 있습니다.

자동 로그인

Grablo 는 시스템 서비스로 실행되므로 로그인하지 않아도 부팅과 함께 시작됩니다. 다만 이미지 보기와 미디어 재생(비디오)처럼 화면 출력이 필요한 기능은 데스크톱 세션이 있어야 동작하므로, 모니터를 붙여 무인으로 운전하는 경우에는 자동 로그인을 켭니다. 우분투와 데비안 계열에서는 설정 > System > Users 에서 UnlockAutomatic Login 을 켭니다.

외부 서비스 준비

일부 설정 항목은 외부 서비스에서 발급한 키나 값을 입력해야 사용할 수 있습니다. 각 서비스에서 필요한 값을 얻는 방법입니다.

서비스Grablo 에 입력할 값사용하는 곳
Google CloudAPI 키텍스트 음성 변환, 음성 텍스트 변환
OpenAIAPI 키텍스트 음성 변환, 음성 텍스트 변환, LLM AI
ElevenLabsAPI 키, Voice ID텍스트 음성 변환
텔레그램봇 토큰, Chat ID텔레그램 봇 설정, 텔레그램 메시지 동작
Firebase데이터베이스 주소, 웹 API 키, 로그인 계정데이터베이스
사운드 폰트뱅크, 프리셋 번호전자 악기 연주 동작

Google Cloud (TTS · STT)

  1. Google Cloud 콘솔에서 프로젝트를 만들고 결제에 결제 수단을 등록하여 프로젝트에 연결합니다.
  2. API 및 서비스 에서 Text-to-Speech APISpeech-to-Text API 를 각각 찾아 사용을 활성화합니다.
  3. API 및 서비스 > 사용자 인증 정보 에서 + 사용자 인증 정보 만들기API 키로 키를 만들고 값을 복사합니다.
  4. 같은 화면의 키 제한에서 사용 대상을 위 두 API 로 한정합니다.키가 유출되었을 때의 피해 범위를 줄이는 조치입니다.

OpenAI

  1. OpenAI 플랫폼에 로그인하고 Dashboard > API keys 에서 새 시크릿 키를 만들어 값을 복사합니다.
  2. 설정 > Billing > Payment methods 에서 결제 수단을 등록하고 사용할 금액을 충전합니다.OpenAI 의 음성 변환에는 무료 사용량이 없으므로 충전이 필요합니다.

ElevenLabs

  1. 가입 후 좌측 하단의 계정 이름 → API KeysCreate Key 로 키를 만들어 값을 복사합니다.
  2. 좌측 메뉴의 Voices 에서 사용할 음성을 미리 들어 보고 ViewID 를 클릭하여 Voice ID 를 복사합니다.API 키만으로는 설정이 완성되지 않습니다. Voice ID 를 함께 입력해야 합니다.

텔레그램 봇

  1. 텔레그램에서 BotFather 를 찾아 대화를 시작하고 /newbot 을 입력합니다.
  2. 봇의 표시 이름을 입력하고, 이어서 사용자 이름을 입력합니다.사용자 이름은 bot 으로 끝나야 하며 다른 봇과 겹치지 않아야 합니다.
  3. 발급된 토큰을 설정텔레그램 봇의 토큰 항목에 입력합니다.
  4. 만들어진 봇의 주소를 클릭해 채팅방을 열고 START 를 눌러 대화를 시작합니다.이 과정을 거치지 않으면 봇이 메시지를 보낼 수 없습니다.
  5. 텔레그램에서 @userinfobot 을 찾아 시작하면 자신의 Chat ID 를 알려줍니다. 이 값을 동작텔레그램 메시지의 Chat ID 에 입력합니다.

Firebase Realtime Database

  1. Firebase 콘솔에서 프로젝트를 만들고 Realtime Database데이터베이스 만들기로 데이터베이스를 생성합니다. 보안 규칙은 잠금 모드로 시작을 선택합니다.
  2. 화면 상단에 표시되는 데이터베이스 주소를 복사합니다.
  3. Authentication로그인 방법에서 사용할 방식을 활성화합니다. 이메일과 비밀번호로 접근하려면 해당 방식을 켜고 사용자 탭에서 계정을 추가하며, 로그인 없이 접근하려면 익명을 활성화합니다.
  4. 프로젝트 설정 > 일반 에서 웹 API 키를 복사합니다.
  5. Realtime Database규칙 탭에서 규칙을 아래와 같이 바꾸고 게시합니다.잠금 모드로 만든 데이터베이스는 누구도 접근할 수 없습니다. 이 규칙을 적용하면 위에서 허용한 사용자만 접근할 수 있습니다.
{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null"
  }
}

사운드 폰트에서 악기 선택

전자 악기 설정에는 사운드 폰트 파일과 함께 악기를 가리키는 뱅크프리셋 번호를 입력합니다. 이 번호는 사운드 폰트 편집기에서 확인합니다. Polyphone 과 같은 편집기로 사운드 폰트(sf2, sf3)를 열고 프리셋 목록에서 악기를 선택한 뒤, 가상 건반으로 소리를 확인하고 화면 아래에 표시된 뱅크와 프리셋 값을 그대로 입력합니다.

날씨 데이터 받아오기

Grablo 에는 날씨 전용 동작이 없으므로 HTTP 통신 동작으로 날씨 API 를 호출합니다. WeatherAPI.com 을 예로 들면, 가입 후 대시보드에서 API 키를 확인하고 아래 형식으로 요청합니다.

https://api.weatherapi.com/v1/forecast.json?key=API_KEY&q=Seoul&days=3&lang=ko

q 에는 도시 이름(영문), 위도와 경도, 또는 auto:ip 를 넣을 수 있고, days 는 예보 일수, lang 은 응답 언어입니다. 응답 JSON 에서 자주 쓰는 값은 다음과 같으며, JSON 블록으로 값을 꺼내 변수에 저장합니다 (8부).

경로
current.temp_c현재 기온(섭씨)
current.humidity현재 습도(%)
current.condition.text현재 날씨 설명
forecast.forecastday[].day.maxtemp_c일별 최고 기온
forecast.forecastday[].day.daily_chance_of_rain일별 강수 확률(%)
forecast.forecastday[].astro.sunrise일출 시각
알아두기 외부 서비스의 무료 사용량과 요금은 수시로 바뀝니다. 실제 조건은 각 서비스의 요금 안내 페이지에서 확인합니다.

전자공학 기초

장치를 배선할 때 알아 두어야 하는 내용을 정리했습니다.

디지털 입출력

디지털 회로는 스위치가 닫히면 전류가 흐르고 열리면 흐르지 않습니다. 닫힌 상태를 HIGH, 열린 상태를 LOW 라고 합니다. 디지털 입력은 외부 스위치의 열림과 닫힘을 컨트롤러가 감지하는 것이고, 디지털 출력은 컨트롤러가 그 열림과 닫힘을 제어하는 것입니다.

아날로그 신호와 ADC

빛의 밝기, 소리의 크기처럼 연속적으로 변하는 값은 아날로그 신호입니다. 컨트롤러는 디지털 신호만 처리하므로 아날로그 신호를 읽으려면 ADC(Analog-Digital Converter)가, 내보내려면 DAC 가 필요합니다. 라즈베리파이에는 아날로그 입력 핀이 없으므로 ADS1115 와 같은 ADC 장치를 I/O 장치로 등록하여 사용합니다.

LED 저항 계산

공급 전압이 LED 의 순방향 전압보다 높으면 반드시 저항으로 전류를 제한해야 합니다. 저항이 없으면 정격을 크게 넘는 전류가 흘러 LED 가 손상됩니다. 저항 값은 옴의 법칙으로 구합니다.

R = (공급 전압 - LED 순방향 전압) / 전류

예를 들어 순방향 전압 2V 인 빨간색 LED 를 3.3V GPIO 에 연결할 때, 라즈베리파이의 핀 출력 한도(약 8mA)를 고려하여 전류를 5mA 로 잡으면 약 260Ω 이 나옵니다. 시중에서 흔한 220Ω 을 쓰면 전류가 약 5.9mA 로 안전한 범위에 들어옵니다. 저항은 LED 의 어느 극에 연결해도 무방합니다.

풀업 · 풀다운 저항

푸시버튼을 누르지 않은 상태에서 입력 핀이 전원과 접지 어느 쪽에도 연결되지 않으면 HIGH 도 LOW 도 아닌 플로팅 상태가 됩니다. 이 상태에서는 노이즈나 정전기로 값이 임의로 바뀌어 제어할 수 없습니다. 풀업 저항은 누르지 않은 상태를 HIGH 로, 풀다운 저항은 누르지 않은 상태를 LOW 로 고정하여 이 문제를 없앱니다.

알아두기 라즈베리파이 등의 GPIO 에는 소프트웨어로 켤 수 있는 내부 풀업·풀다운 저항이 있고, 그 크기가 푸시버튼 같은 입력 장치에 적합하므로 외부 저항을 따로 달지 않아도 됩니다. I/O장치디지털 읽기/쓰기의 초기 명령(INIT) 에서 설정합니다.

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 장치에는 라즈베리파이, 젯슨 나노, 아두이노 듀에·제로 등이, 5V 장치에는 아두이노 우노·나노·메가 등이 해당합니다.

시리얼 통신 방식

방식특징
TTL UART보드의 UART 핀을 직접 연결합니다. 거리가 짧고 1:1 통신에 적합합니다.
RS-232PC 의 표준 시리얼 규격입니다. 1:1 통신이며 TTL 과 전압 규격이 달라 변환 모듈이 필요합니다.
RS-422차동 신호로 장거리 전송에 유리합니다. 1:N 단방향 구성에 사용합니다.
RS-485차동 신호로 장거리에 강하고 여러 장치를 한 선에 연결할 수 있습니다. 산업용 모드버스 RTU 에서 널리 쓰입니다.

모터와 릴레이

DC 모터는 전압으로 속도를, 서보 모터는 PWM 신호로 각도를, 스텝 모터는 펄스 수로 회전량을 제어합니다. 세 종류 모두 I/O 장치로 지원합니다 (7부).

주의 모터는 소모 전류가 커서 보드의 전원 핀으로 직접 구동할 수 없습니다. 반드시 별도의 외부 전원과 모터 드라이버를 사용합니다. 마찬가지로 컨트롤러의 출력(3.3V, 약 8mA)으로는 가정용 AC 기기나 대전류 장치를 직접 켤 수 없으므로, 릴레이 모듈을 사용해 컨트롤러 신호로 별도 전원 회로를 여닫는 방식으로 구성합니다.