10년 넘게 모니터도 키보드도 없는 Embedded Firmware를 개발하다 보니, 모니터도 키보드도 업는 headless 환경이 더 편리하다고 느끼는 FW 개발자입니다. 만약 여러대의 라즈베리파이를 네트워크로 구성하셨다면, 라즈베리파이마다 모니터와 키보드를 연결하시겠습니까? 물론, 라즈베리파이를 일반 PC처럼 모니터와 키보드가 달려있는 상태로 사용하는 환경이라면 그것이 적절하겠지만, 굳이 모니터와 키보드가 필요 없는 환경이라면 이렇게 구성하는 것은 적절하지 않습니다. 어쩌면 모니터 하나의 가격이 라즈베리파이 보드 한 장의 가격보다 더 비쌀지도 모르겠습니다.
[다수의 라즈베리파이가 구성된 환경]
아래의 그림은 다수의 라즈베리파이를 사용하는 환경입니다. 3대의 라즈베리파이를 하나의 네트워크에 연결하였습니다. 각각의 라즈베리파이에 모니터와 키보드를 모두 연결해야 할까요?
굳이 모니터와 키보드가 필요 없는 환경이라면 네트워크로만 라즈베리파이에 연결을 하면 됩니다. CUI 환경이라면 ssh 프로토콜을, GUI 환경이라면 vnc를 이용하시면 라즈베리파이마다 모니터와 키보드를 연결하지 않아도 사용할 수 있습니다.
위와 같이 구성하면 한대의 PC로 다수의 라즈베리파이를 관리할 수 있습니다. ssh나 vnc 등으로 라즈베리파이에 접속할 수 없을 때만 라즈베리파이에 모니터를 연결해서 적절한 조치를 취해주면 됩니다.
[부팅 시 서비스가 시작되는 순서]
Headless 환경으로 셋업을 하면 모니터와 키보드 없이 라즈베리파이 네트워크로 접속이 가능하지만, 라즈베리파이가 부팅이 되지 않는 상황이거나, 네트워크에 문제가 있으면 어떻게 하시겠습니까? 이 때는 어쩔 수 없이 또 다른 방법으로 문제의 원인을 찾아서 조치해야 합니다.
그럼 HDMI 출력, UART 시리얼 포트 Shell, ssh/vnc 중에서 사용 가능한 상태가 되는 순서는 어떻게 될까요?
- 0순위 : 출력 가능한 장치가 없음
- 1순위 : HDMI를 통한 모니터 출력
- 2순위 : UART 시리얼 포트를 통한 Shell
- 3순위 : ssh/vnc
우주의 기원인 빅뱅(Big Bang)에 비유해서 설명을 드리자면 아래와 같습니다.
[0순위 : Big Bang]
라즈베리파이에 전원이 인가되고 Reset Vector로 PC(Program Counter)가 이동하는 순간을 Big Bang으로 표현하겠습니다. 이 순간은 어떠한 출력 장치도 사용이 불가능한 상태이므로 이 시점의 동작이나 로그를 살펴볼 수 있는 방법은 없습니다. BIOS(Basic Input Output System)에서 HDMI 포트를 초기화할 때까지 HDMI 화면에는 어떠한 것들도 표시되지 않습니다.
[1순위 : 중성자의 생성]
BIOS로 라즈베리파이의 초기화가 완료되면, 가장 먼저 즉각적으로 출력되는 장치는 HDMI 출력입니다. BIOS로 초기화되는 Basic Output은 HDMI 포트라고 할 수 있겠습니다. 부팅 불량과 같은 초기 문제점을 해결하는데 아주 적절합니다.
[2순위 : 원자의 생성]
BIOS에서 SD 카드의 OS를 로딩하면서 아래와 같은 부팅 로그가 UART 시리얼 포트로 흘러나옵니다.
물론 이 로그는 HDMI 모니터를 통해서도 출력됩니다.
MMC: mmcnr@7e300000: 1, emmc2@7e340000: 0
Loading Environment from FAT... *** Warning - bad CRC, using default environment
In: serial
Out: vidconsole
Err: vidconsole
Net: No ethernet found.
starting USB...
No working controllers found
## Info: input data size = 6 = 0x6
Hit any key to stop autoboot: 0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr
2569 bytes read in 19 ms (131.8 KiB/s)
## Executing script at 02400000
8390521 bytes read in 633 ms (12.6 MiB/s)
Total of 1 halfword(s) were the same
Decompressing kernel...
Uncompressed size: 25907712 = 0x18B5200
29530201 bytes read in 2161 ms (13 MiB/s)
Booting Ubuntu (with booti) from mmc 0:...
## Flattened Device Tree blob at 02600000
Booting using the fdt blob at 0x2600000
Using Device Tree in place at 0000000002600000, end 000000000260ea67
Starting kernel ...
[ 1.475441] spi-bcm2835 fe204000.spi: could not get clk: -517
ext4
Thu Jan 1 00:00:05 UTC 1970
-.mount
dev-mqueue.mount
sys-kernel-debug.mount
sys-kernel-tracing.mount
kmod-static-nodes.service
systemd-modules-load.service
ufw.service
[3순위 : 지구의 생성]
Ubuntu Linux나 Raspbian과 같은 OS의 부팅이 완료되면 ssh나 vnc와 같은 서비스가 시작됩니다. 이때부터 네트워크를 통해서 원격으로 라즈베리파이에 로그인할 수 있습니다.
[MAX3232 칩에 관하여]
라즈베리파이의 UART를 PC의 시리얼 포트에 연결하기에 앞서서 MAX3232 칩에 대해서 간략하게 설명을 드리고자 합니다.
요즘 PC에는 시리얼 포트가 없는 경우가 많습니다. 대신, USB-To-Serial 케이블과 MAX3232 칩을 이용하시면 됩니다. MAX3232 칩의 경우 VCC에 3.3V를 넣어주면 TX/RX가 3.3V로 동작되고, 5V를 넣어주면 TX/RX가 5V로 동작하는 칩입니다. 이 때문에 3.3V로 동작하는 UART와 5V로 동작하는 UART에 범용으로 사용할 수 있어서 편리합니다. 시중에서 저렴하게 구입이 가능합니다. 참고로 라즈베리파이의 UART 포트는 3.3V로 동작함을 유의하시기 바랍니다.
아래 Diagram은 MAX3232 칩의 동작을 아주 심플하고 명확하게 설명해줍니다.
실물은 아래와 같이 생겼습니다. X3232C라고 쓰여있네요.
VCC에 3.3V를 연결하면 TX/RX가 3.3V로 동작하고, VCC에 5V를 연결하면 TX/RX가 5V로 동작합니다.
아래 사진은 MAX3232의 VCC에 3.3V를 인가했을 때, TX의 전압이 3.3V로 나오고 있음을 보여줍니다.
반면, MAX3232의 VCC에 5V를 가하면, TX의 전압 역시도 5V로 나오는 것을 확인할 수 있습니다.
[UART 시리얼 포트 연결하는 방법]
그럼 지금부터는 UART 시리얼 포트를 PC와 연결하여 부팅 초기의 로그를 수집하고, 터미널에 접속하는 방법에 대해서 설명드리겠습니다. (본 내용은 Ubuntu Linux OS를 기준입니다.)
아래와 같이 라즈베리파이의 UART 포트를 PC의 UART 포트와 연결합니다.
라즈베리파이의 TX를 PC의 RX에, 라즈베리파이의 RX는 PC의 TX에 연결하면 됩니다. Data를 쏘는 쪽은 TX이고, Data를 받는 쪽은 RX이기 때문입니다. 이 때문에 라즈베리파이에서 Data를 전송하는 TX를 PC의 RX에 연결하고, PC에서 Data를 송신하는 TX에 라즈베리파이의 RX를 연결해야 합니다. 이 개념이 조금 헷갈리실 수 있겠습니다만, 내 귀(RX)에 니 입(TX)을 연결하고, 니 귀(RX)에 내 입(TX)을 연결한다고 생각하시면 편하겠습니다.
핀 맵으로 표현하면 아래와 같습니다.
Raspbery Pi Side | PC Side | Description | Note | |
Pin Number | Pin Name | |||
1 | 3V3 | VCC | MAX3232 칩의 VCC에 연결 | 라즈베리파이의 UART는 3.3V입니다. |
8 | GPIO14 (TXD0) | RX | MAX3232 칩의 RX에 연결 | |
10 | GPIO15 (RXD0) | TX | MAX3232 칩의 TX에 연결 | |
14 | GND | GND | MAX3232 칩의 GND에 연결 |
라즈베리파이 4B의 경우 6개의 UART 채널을 지원하지만 기본적인 부팅 로그를 출력하는 채널은 UART 0번 채널입니다.
아래 빨간색으로 표시한 부분이 기본 쉘입니다. UART의 TX신호를 TXD로 표현하고, UART의 RX신호를 RXD로 표현합니다. UART 0번 채널의 TX는 TXD0으로 표현하고, UART 0번 채널의 RX는 RXD0으로 표현합니다.
제가 사용하는 MAX3232 커넥터의 모습이고, 거기에 맞춰서 VCC, TX, RX, GND 하네스를 간략하게 만들어봤습니다. 반대쪽은 소켓 점퍼 케이블 타입으로 해서 라즈베리파이에 손쉽게 꽂을 수 있게 했습니다. 하네스를 만들 때 VCC는 붉은색으로, GND는 검은색으로, 나머지 신호들은 노란색, 파란색 등을 사용하면 구분하기도 쉽고 잘못 연결하는 불상사를 막을 수 있습니다. (단, 녹색은 접지와 헷갈릴 수 있으므로 가급적 사용하지 않는 게 좋습니다.)
라즈베리파이에 3.3V와 GND만 연결하고, MAX3232의 TX단을 멀티미터로 찍어보는 게 좋습니다. 라즈베리파이의 UART는 3.3V로 동작하므로, 혹여라도 5V로 동작하는 건 아닌지 확인 차원으로, 멀티미터가 없으시면 생략하셔도 좋습니다.
Baud Rate가 어떻게 되는지 오실로스코프로 확인해봤습니다. BIT 2개가 대략 17us니까 115,200 BPS입니다.
1s = 1,000ms = 1,000,000us 1,000,000us / 115,200bits = 8.68us/s |
통신속도(Baud Rate)는 115,200 BPS로 설정합니다. Data Bits는 8BIT, Parity Bit는 None, Stop bits는 1BIT로 설정합니다.
터미널 프로그램은 평소에 쓰시던 프로그램을 사용하시면 됩니다.
연결 상태를 한 번 더 체크하고, 라즈베리파이에 전원을 인가하면 아래와 같은 메시지들이 시리얼을 통해서 흘러나옵니다. 혹시라도 결선에 문제가 있을 경우를 대비해서, MAX3232가 뜨거워지거나 타는 듯한 냄새가 날 경우 바로 전원을 끄시기 바랍니다.
MMC: mmcnr@7e300000: 1, emmc2@7e340000: 0
Loading Environment from FAT... *** Warning - bad CRC, using default environment
In: serial
Out: vidconsole
Err: vidconsole
Net: No ethernet found.
starting USB...
No working controllers found
## Info: input data size = 6 = 0x6
Hit any key to stop autoboot: 0
switch to partitions #0, OK
mmc0 is current device
Scanning mmc 0:1...
Found U-Boot script /boot.scr
2569 bytes read in 19 ms (131.8 KiB/s)
## Executing script at 02400000
8390521 bytes read in 633 ms (12.6 MiB/s)
Total of 1 halfword(s) were the same
Decompressing kernel...
Uncompressed size: 25907712 = 0x18B5200
29530201 bytes read in 2161 ms (13 MiB/s)
Booting Ubuntu (with booti) from mmc 0:...
## Flattened Device Tree blob at 02600000
Booting using the fdt blob at 0x2600000
Using Device Tree in place at 0000000002600000, end 000000000260ea67
Starting kernel ...
[ 1.475441] spi-bcm2835 fe204000.spi: could not get clk: -517
ext4
Thu Jan 1 00:00:05 UTC 1970
-.mount
dev-mqueue.mount
sys-kernel-debug.mount
sys-kernel-tracing.mount
kmod-static-nodes.service
systemd-modules-load.service
ufw.service
sys-fs-fuse-connections.mount
sys-kernel-config.mount
systemd-remount-fs.service
부팅이 완료되면 아래와 같이 로그인 창이 뜹니다. ttyS0로 연결된 것을 알 수 있습니다. 라즈베리파이의 UART 0번 채널의 터미널이라는 의미입니다.
[ OK ] Started Regular background program processing daemon.
cron.service
Starting Pollinate to seed the pseudo random number generator...
Starting Service for snap application lxd.activate...
Starting Permit User Sessions...
[ OK ] Started Unattended Upgrades Shutdown.
unattended-upgrades.service
[ OK ] Started Deferred execution scheduler.
atd.service
[ OK ] Finished Availability of block devices.
blk-availability.service
[ OK ] Finished Permit User Sessions.
systemd-user-sessions.service
Starting Hold until boot process finishes up...
Starting Terminate Plymouth Boot Screen...
Ubuntu 20.04.1 LTS ubuntu ttyS0
ubuntu login:
[끝맺음 말]
이것으로 라즈베리파이의 UART 시리얼 포트를 PC와 연결하여 부팅 디버그 메시지를 수집하고, ttyS0 터미널에 접속하는 방법에 대해서 설명을 마칩니다.
부디 유용한 정보였기를 바라면서, 공감, 댓글, 구독 등은 저에게 큰 보람을 줍니다.
감사합니다.
'Study > 라즈베리파이 공부' 카테고리의 다른 글
[라즈베리파이] ACT LED가 5번 깜빡이면서 부팅 불량시 조치사항 (0) | 2021.02.01 |
---|---|
[라즈베리파이] ACT LED가 계속 점등되면서 느려지는 문제 해결 방법 (0) | 2021.01.31 |
[라즈베리파이] LED 4번 깜빡이는 부팅불량 발생시 조치방법 (0) | 2021.01.25 |
[라즈베리파이] 현재 GPIO 출력값을 읽어와 토글 시키는 방법 (0) | 2021.01.24 |
[라즈베리파이] 적외선 센서로 인체의 움직임이 감지되면 부저가 울리는 python 예제 (0) | 2021.01.24 |