하드웨어 및 참고자료
보드별 GPIO 핀맵과 인터페이스, 컨트롤러 접속 방법, 외부 서비스 준비 절차, 그리고 배선에 필요한 전자공학 기초를 정리했습니다.
하드웨어 핀맵과 인터페이스
라즈베리파이
현재 출시되는 모든 모델이 40핀 헤더를 제공하며 각 핀의 기능은 모델과 무관하게 같습니다. 핀 번호를 매기는 방법은 커넥터 기준(Physical/Board)과 CPU 채널 기준(GPIO/BCM) 두 가지가 있고, Grablo 는 GPIO/BCM 을 사용합니다.
| 용도 | 핀 | 비고 |
|---|---|---|
| I2C | GPIO 2(SDA), 3(SCL) | 일반 디지털 입출력으로도 사용할 수 있습니다. |
| SPI | GPIO 7, 8, 9, 10, 11 | 일반 디지털 입출력으로도 사용할 수 있습니다. |
| UART | GPIO 14(TX), 15(RX) | Primary UART 입니다. |
| 하드웨어 PWM | GPIO 12, 13 | 일반 디지털 입출력으로도 사용할 수 있습니다. |
| 1-Wire | GPIO 4 | 기본값이며 아래 절차로 변경할 수 있습니다. |
전원 핀을 제외한 모든 GPIO 핀의 전압 레벨은 3.3V 입니다. 허용 전류는 입력 최대 0.5mA, 출력 최대 약 8mA 이며 출력 핀 전체의 합이 50mA 를 넘지 않아야 합니다. 전원 핀의 허용 전류는 3.3V 핀이 약 800mA, 5V 핀은 약 2.5A 에서 보드 자체 소모 전류와 3.3V 핀 소모 전류를 뺀 값입니다. 라즈베리파이에는 아날로그 입력 핀이 없으므로 아날로그 신호를 읽으려면 ADS1115 와 같은 ADC 를 함께 사용합니다.
젯슨 나노
젯슨 나노는 핀 번호와 GPIO 번호가 서로 다른 체계입니다. Grablo 에는 GPIO 번호를 입력합니다.
| 핀 | GPIO | 핀 | GPIO | 핀 | GPIO |
|---|---|---|---|---|---|
| 7 | 216 | 19 | 16 | 31 | 200 |
| 11 | 50 | 21 | 17 | 32 | 168 |
| 12 | 79 | 22 | 13 | 33 | 38 |
| 13 | 14 | 23 | 18 | 35 | 76 |
| 15 | 194 | 24 | 19 | 36 | 51 |
| 16 | 232 | 26 | 20 | 37 | 12 |
| 18 | 15 | 29 | 149 | 38 | 77 |
| - | - | - | - | 40 | 78 |
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
외부 GPIO 어댑터
보드에 GPIO 핀이 없거나 부족한 경우 USB-GPIO 어댑터를 사용합니다. 등록 방법은 6부를 참고합니다.
| 어댑터 | 디지털 입출력 | 그 밖의 기능 | 로직 레벨 |
|---|---|---|---|
| FT232H | 12개. 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 를 허용합니다. |
| MCP2221A | 4개. 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 |
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
/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 디렉토리와 오른쪽의 컨트롤러 디렉토리 사이에서 파일을 올리거나 내립니다.
/home/계정이름, /tmp 처럼
권한이 있는 디렉토리에만 파일을 올릴 수 있습니다.
자동 로그인
Grablo 는 시스템 서비스로 실행되므로 로그인하지 않아도 부팅과 함께 시작됩니다. 다만 이미지 보기와 미디어 재생(비디오)처럼 화면 출력이 필요한 기능은 데스크톱 세션이 있어야 동작하므로, 모니터를 붙여 무인으로 운전하는 경우에는 자동 로그인을 켭니다. 우분투와 데비안 계열에서는 설정 > System > Users 에서 Unlock 후 Automatic Login 을 켭니다.
외부 서비스 준비
일부 설정 항목은 외부 서비스에서 발급한 키나 값을 입력해야 사용할 수 있습니다. 각 서비스에서 필요한 값을 얻는 방법입니다.
| 서비스 | Grablo 에 입력할 값 | 사용하는 곳 |
|---|---|---|
| Google Cloud | API 키 | 텍스트 음성 변환, 음성 텍스트 변환 |
| OpenAI | API 키 | 텍스트 음성 변환, 음성 텍스트 변환, LLM AI |
| ElevenLabs | API 키, Voice ID | 텍스트 음성 변환 |
| 텔레그램 | 봇 토큰, Chat ID | 텔레그램 봇 설정, 텔레그램 메시지 동작 |
| Firebase | 데이터베이스 주소, 웹 API 키, 로그인 계정 | 데이터베이스 |
| 사운드 폰트 | 뱅크, 프리셋 번호 | 전자 악기 연주 동작 |
Google Cloud (TTS · STT)
- Google Cloud 콘솔에서 프로젝트를 만들고 결제에 결제 수단을 등록하여 프로젝트에 연결합니다.
- API 및 서비스 에서 Text-to-Speech API 와 Speech-to-Text API 를 각각 찾아 사용을 활성화합니다.
- API 및 서비스 > 사용자 인증 정보 에서 + 사용자 인증 정보 만들기 → API 키로 키를 만들고 값을 복사합니다.
- 같은 화면의 키 제한에서 사용 대상을 위 두 API 로 한정합니다.키가 유출되었을 때의 피해 범위를 줄이는 조치입니다.
OpenAI
- OpenAI 플랫폼에 로그인하고 Dashboard > API keys 에서 새 시크릿 키를 만들어 값을 복사합니다.
- 설정 > Billing > Payment methods 에서 결제 수단을 등록하고 사용할 금액을 충전합니다.OpenAI 의 음성 변환에는 무료 사용량이 없으므로 충전이 필요합니다.
ElevenLabs
- 가입 후 좌측 하단의 계정 이름 → API Keys → Create Key 로 키를 만들어 값을 복사합니다.
- 좌측 메뉴의 Voices 에서 사용할 음성을 미리 들어 보고 View → ID 를 클릭하여 Voice ID 를 복사합니다.API 키만으로는 설정이 완성되지 않습니다. Voice ID 를 함께 입력해야 합니다.
텔레그램 봇
- 텔레그램에서
BotFather를 찾아 대화를 시작하고/newbot을 입력합니다. - 봇의 표시 이름을 입력하고, 이어서 사용자 이름을 입력합니다.사용자 이름은 bot 으로 끝나야 하며 다른 봇과 겹치지 않아야 합니다.
- 발급된 토큰을 설정 → 텔레그램 봇의 토큰 항목에 입력합니다.
- 만들어진 봇의 주소를 클릭해 채팅방을 열고 START 를 눌러 대화를 시작합니다.이 과정을 거치지 않으면 봇이 메시지를 보낼 수 없습니다.
- 텔레그램에서
@userinfobot을 찾아 시작하면 자신의 Chat ID 를 알려줍니다. 이 값을 동작 → 텔레그램 메시지의 Chat ID 에 입력합니다.
Firebase Realtime Database
- Firebase 콘솔에서 프로젝트를 만들고 Realtime Database → 데이터베이스 만들기로 데이터베이스를 생성합니다. 보안 규칙은 잠금 모드로 시작을 선택합니다.
- 화면 상단에 표시되는 데이터베이스 주소를 복사합니다.
- Authentication → 로그인 방법에서 사용할 방식을 활성화합니다. 이메일과 비밀번호로 접근하려면 해당 방식을 켜고 사용자 탭에서 계정을 추가하며, 로그인 없이 접근하려면 익명을 활성화합니다.
- 프로젝트 설정 > 일반 에서 웹 API 키를 복사합니다.
- 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 로 고정하여 이 문제를 없앱니다.
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-232 | PC 의 표준 시리얼 규격입니다. 1:1 통신이며 TTL 과 전압 규격이 달라 변환 모듈이 필요합니다. |
| RS-422 | 차동 신호로 장거리 전송에 유리합니다. 1:N 단방향 구성에 사용합니다. |
| RS-485 | 차동 신호로 장거리에 강하고 여러 장치를 한 선에 연결할 수 있습니다. 산업용 모드버스 RTU 에서 널리 쓰입니다. |
모터와 릴레이
DC 모터는 전압으로 속도를, 서보 모터는 PWM 신호로 각도를, 스텝 모터는 펄스 수로 회전량을 제어합니다. 세 종류 모두 I/O 장치로 지원합니다 (7부).