하드웨어 핀맵과 인터페이스
라즈베리파이
현재 출시되는 모든 모델이 40핀 헤더를 제공하며 각 핀의 기능은 모델과 무관하게 같습니다. 핀 번호를 매기는 방법은 커넥터 기준(Physical/Board)과 CPU 채널 기준(GPIO/BCM) 두 가지가 있고, Grablo 는 GPIO/BCM 을 사용합니다.
40핀 헤더 전체 대응표 (핀 번호 ↔ GPIO 번호)
| 이름 | 핀 | 핀 | 이름 |
|---|---|---|---|
| 3.3V | 1 | 2 | 5V |
| GPIO 2 (SDA) | 3 | 4 | 5V |
| GPIO 3 (SCL) | 5 | 6 | GND |
| GPIO 4 (GPCLK0, 1-Wire 기본값) | 7 | 8 | GPIO 14 (TXD) |
| GND | 9 | 10 | GPIO 15 (RXD) |
| GPIO 17 | 11 | 12 | GPIO 18 (PCM_CLK) |
| GPIO 27 | 13 | 14 | GND |
| GPIO 22 | 15 | 16 | GPIO 23 |
| 3.3V | 17 | 18 | GPIO 24 |
| GPIO 10 (MOSI) | 19 | 20 | GND |
| GPIO 9 (MISO) | 21 | 22 | GPIO 25 |
| GPIO 11 (SCLK) | 23 | 24 | GPIO 8 (CE0) |
| GND | 25 | 26 | GPIO 7 (CE1) |
| GPIO 0 (ID_SD) | 27 | 28 | GPIO 1 (ID_SC) |
| GPIO 5 | 29 | 30 | GND |
| GPIO 6 | 31 | 32 | GPIO 12 (PWM0) |
| GPIO 13 (PWM1) | 33 | 34 | GND |
| GPIO 19 (PCM_FS) | 35 | 36 | GPIO 16 |
| GPIO 26 | 37 | 38 | GPIO 20 (PCM_DIN) |
| GND | 39 | 40 | GPIO 21 (PCM_DOUT) |
외부 장치에 전원을 공급하는 핀은 3.3V 가 1·17번, 5V 가 2·4번이고, GND 는 6·9·14·20·25·30·34·39번 핀입니다. 시중에서 판매하는 GPIO 확장 보드를 사용하면 브레드보드 등에 더 편리하게 연결할 수 있습니다. 각 핀에 대한 상세 정보는 pinout.xyz 에서 확인할 수 있습니다.
기능별 핀 위치 그림
| 용도 | 핀 | 비고 |
|---|---|---|
| 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 에서 보드 자체 소모 전류(카메라, USB 등 포함)와 3.3V 핀 소모 전류를 뺀 값입니다. 라즈베리파이에는 아날로그 입력 핀이 없으므로 아날로그 신호를 읽으려면 ADS1115 와 같은 ADC 를 함께 사용합니다.
젯슨 나노
젯슨 나노는 핀 번호와 GPIO 번호가 서로 다른 체계입니다. Grablo 에는 GPIO 번호를 입력합니다.
전원 핀은 3.3V 가 1·17번, 5V 가 2·4번이고, GND 는 6·9·14·20·25·30·34·39번 핀입니다. 디지털 입출력에 사용할 수 있는 핀과 GPIO 번호는 아래와 같습니다. 이 가운데 일부 핀은 PWM, SPI 핀을 겸하므로 해당 기능을 활성화하면 디지털 입출력으로 사용할 수 없습니다.
| 핀 | 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번(I2C1 SDA), 5번(I2C1 SCL) 핀을 사용합니다. I2C0 은 카메라 인터페이스 등 내부용이므로 외부
장치에 연결할 수 없습니다. UART 는 8번(TX), 10번(RX) 핀이며 포트 이름은
/dev/ttyTHS1 입니다. PWM 은 32번(PWM0), 33번(PWM2) 핀 두 개를 제공하며, SPI 는
포트 두 개를 제공합니다.
| SPI 포트 | MOSI | MISO | SCLK | CS0 | CS1 |
|---|---|---|---|---|---|
| SPI0 | 19번 | 21번 | 23번 | 24번 | 26번 |
| SPI1 | 37번 | 22번 | 13번 | 18번 | 16번 |
PWM 과 SPI 는 Jetson-IO 설정에서 활성화해야 사용할 수 있습니다. Jetson-IO 는 터미널에서 다음 명령으로 실행합니다.
sudo /opt/nvidia/jetson-io/jetson-io.py
- 화살표 키와 Enter 키로 Configure Jetson 40pin header 를 선택하고, 이어서 Configure header pins manually 를 선택합니다.
- 활성화할 기능을 선택하고 Enter 키를 누릅니다.선택된 기능에는 * 표시가 나타납니다.
- 선택을 마치면 Back 을 선택한 뒤 Save pin changes 를 선택합니다.
- Save and reboot to reconfigure pins 를 선택하여 재부팅합니다.
외부 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 |
FT232H
FTDI 의 고속 USB 브리지 IC 로, USB 2.0 Hi-Speed(480Mb/s)를 통해 GPIO, UART, SPI, I2C, JTAG 등의 기능을 제공합니다. 로직 레벨은 3.3V 이지만 입출력 핀이 5V 입력을 견디는 구조(5V tolerant)이므로 GPIO 에 5V 입력을 연결할 수 있습니다. +5V, +3.3V, GND 핀은 LED, I2C·SPI 장치 등 외부 장치에 전원을 공급하는 데 사용합니다.
| 핀 | 기능 | GPIO 번호 |
|---|---|---|
| +5V, +3.3V | 전원 | - |
| GND | GND | - |
| AD0 | I2C SCL, SPI SCLK | - |
| AD1 | I2C SDA, SPI MOSI | - |
| AD2 | I2C SDA, SPI MISO | - |
| AD3 | SPI CS | - |
| AD4, AD5, AD6, AD7 | GPIOL0~GPIOL3 | 0, 1, 2, 3 |
| AC0 ~ AC7 | GPIOH0~GPIOH7 | 4 ~ 11 (AC0 이 4, AC7 이 11) |
MCP2221A
MCP2221A 칩을 탑재한 USB 변환 모듈로 GPIO, I2C, ADC, DAC, UART 를 제공합니다. 아래 설명은 Adafruit MCP2221A 보드 기준이며, 모듈에 따라 핀 배치와 점퍼 위치가 다를 수 있습니다.
| 핀 | 기능 | GPIO 번호 |
|---|---|---|
| 5V | USB 에서 공급되는 5V 전원 | - |
| 3.3V (3V) | 내부 전압 레귤레이터에서 공급되는 3.3V 전원 | - |
| GND | 전원과 로직의 공통 GND | - |
| RST (R) | 리셋. LOW 를 입력하면 모듈이 리셋됩니다. | - |
| SCL, SDA | I2C | - |
| RX, TX | UART 수신, 송신 | - |
| G0 | GPIO | 0 |
| G1 | GPIO, ADC1 | 1 |
| G2 | GPIO, ADC2, DAC | 2 |
| G3 | GPIO, ADC3, DAC | 3 |
ADC 는 10비트(0~1023), DAC 는 5비트(0~31)이며 DAC 출력은 G2 와 G3 에 동시에 나옵니다. 디지털 입출력, ADC, DAC, I2C, UART 의 기본 전압 레벨은 3.3V 이고, ADC 입력과 DAC 출력의 전압 범위도 이 레벨에 따라 0~3.3V 또는 0~5V 가 됩니다. 5V 레벨로 바꾸려면 모듈 뒷면의 3V 점퍼 연결을 끊고 5V 점퍼를 납땜합니다.
UART 는 USB 시리얼 장치로 인식됩니다. Linux 에서는 /dev/ttyACM0 처럼 표시되며,
Windows 에서는 COM 포트로 표시됩니다.
NUMATO USB-GPIO
GPIO 와 ADC 를 제공하는 USB 모듈로 8채널부터 128채널까지 여러 모델이 있습니다. 아래는 8채널 모델 기준입니다. 디지털 입출력의 전압 레벨은 5V 이고, ADC 는 10비트(0~1023)이며 입력 전압 범위는 0~5V 입니다. VDD 핀은 연결한 장치에 5V 전원을 공급합니다.
| 핀 | 기능 | GPIO 번호 |
|---|---|---|
| IO0 ~ IO3 | GPIO, ADC0~ADC3 | 0 ~ 3 |
| IO4, IO5 | GPIO | 4, 5 |
| IO6, IO7 | GPIO, ADC4, ADC5 | 6, 7 |
| VDD | 5V 전원 | - |
| GND | GND | - |
연결한 장치의 전류가 USB 포트의 허용 범위를 넘는 경우에는 전원 선택 점퍼를 1-2(Ext Pwr)로 바꾸고 5V Ext 핀으로 외부 전원을 공급합니다.
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* 로 확인합니다. |
라즈베리파이의 UART 는 Full UART(PL011)와 Mini UART 두 종류입니다. Mini UART 는 Full UART 보다 성능이 낮고 일부 기능(패리티 비트, 프레임 오류 검출 등)이 없으며, 클럭이 VPU 코어 클럭에 연동되어 코어 주파수가 바뀌면 통신 속도도 함께 바뀝니다. 하드웨어 UART 핀(GPIO 14, 15)에 연결되는 Primary UART 가 어느 종류인지는 모델에 따라 다릅니다.
| 모델 | Primary UART | Secondary UART |
|---|---|---|
| Raspberry Pi Zero, 1, 2 | Full UART (UART0) | Mini UART (UART1) |
| Raspberry Pi Zero W, Zero 2 W | Mini UART (UART1) | Full UART (UART0), 블루투스 전용 |
| Raspberry Pi 3, 4 | Mini UART (UART1) | Full UART (UART0), 블루투스 전용 |
| Raspberry Pi 5 | UART10 (보드의 3핀 디버그 헤더) | 블루투스 전용 UART |
설정 파일의 경로는 라즈베리파이 OS Bookworm 부터 /boot/firmware/config.txt 입니다.
아래 절차는 모두 이 파일을 편집한 뒤 재부팅해야 적용됩니다.
sudo nano /boot/firmware/config.txt
nano 편집기에서는 Ctrl + O, Enter 로 저장하고 Ctrl + X 로 종료합니다. 재부팅은
sudo reboot 로 합니다.
Mini UART 대신 Full UART 사용하기 (라즈베리파이 3, 4, Zero W, Zero 2 W)
Primary UART 가 Mini UART 인 모델에서는 코어 주파수 변화 때문에 시리얼 통신이 불안정할 수 있습니다. 모드버스 RTU 처럼 안정적인 통신이 필요하면 Full UART(UART0)를 Primary UART 로 바꿉니다. 방법은 두 가지이며, 둘 중 하나를 설정 파일 끝에 추가하고 재부팅합니다.
- 블루투스를 끄고 Full UART 를 Primary 로: 블루투스 모뎀 서비스를 끄고(
sudo systemctl disable hciuart) 설정 파일에dtoverlay=disable-bt를 추가합니다. 이후 블루투스는 사용할 수 없습니다. - 블루투스를 Mini UART 로 옮기고 Full UART 를 Primary 로: 설정 파일에 코어 클럭을 고정하는
core_freq=250과dtoverlay=miniuart-bt를 추가합니다. 블루투스는 계속 사용할 수 있지만 블루투스의 최대 통신 속도가 낮아질 수 있습니다.
# 블루투스를 끄는 경우 dtoverlay=disable-bt # 블루투스를 Mini UART 로 옮기는 경우 core_freq=250 dtoverlay=miniuart-bt
재부팅한 뒤에는 /dev/serial0 이 Full UART(/dev/ttyAMA0)를 가리킵니다.
숨겨진 UART 사용하기 (라즈베리파이 4)
라즈베리파이 4 에는 숨겨진 Full UART 네 개(UART2~UART5)가 있습니다. 설정 파일 끝에 필요한
줄을 추가하고 재부팅하면 ttyAMA1 부터 순서대로 추가되며,
dmesg | grep tty 로 확인할 수 있습니다.
dtoverlay=uart2 dtoverlay=uart3 dtoverlay=uart4 dtoverlay=uart5
| UART | TXD | RXD |
|---|---|---|
| UART2 | GPIO 0 | GPIO 1 |
| UART3 | GPIO 4 | GPIO 5 |
| UART4 | GPIO 8 | GPIO 9 |
| UART5 | GPIO 12 | GPIO 13 |
TX, RX 핀의 GPIO 번호를 직접 지정할 수도 있습니다.
dtoverlay=uart2,txd2_pin=16,rxd2_pin=17
uart0-pi5 부터 uart4-pi5 까지의 오버레이로 활성화합니다. 각 UART 가
사용하는 핀과 옵션은 dtoverlay -h uart2-pi5 처럼 확인할 수 있습니다.
USB-TTL 컨버터를 연결한 경우 ls -l /dev/ttyUSB* 를 실행하면 현재 연결된
컨버터의 포트(ttyUSB0, ttyUSB1 등)가 표시되며, 이 이름을 포트 이름으로
사용합니다.