카테고리 없음

서울시내버스 BIT를 라즈베리파이 피코로 구현하기 1

고래왓 2026. 7. 7. 23:14

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-6212229053650626"
     crossorigin="anonymous"></script>

사진출처 중앙일보

갑자기 서울 시내버스 BIT를 만들고 싶어졌다.

 

요즘은 스마트폰에서 조금만 검색해보면 버스 도착 정보를 쉽게 알 수 있다.

그럼에도 불구하고 버스정보안내기가 정류장에 남아있는 데에는 이유가 있지 않을까?

그 이유는 역설적이게도 편리함이다. 스마트폰에서 찾아보지 않아도 버스 정보를 쉽게 알 수 있으니.

또 스마트폰 사용이 어려운 디지털 취약계층이 많이 있으니 그 분들을 위해 남아있기도 하다.

 

나는 처음 구상하면서 우리 학교 밖으로 나가는 문 위에 BIT를 달면 좋겠다고 생각했다.

버스를 타는 친구들이 굳이 스마트폰을 꺼내지 않아도 얼마나 기다려야 하는지, 버스를 타기 위해 뛸지 말지 등을 금방 판단할 수 있기 때문이다.

그래서 저 곳에서 자로 길이를 재면서 실측까지 하였었다.

 

원래 내 방에 있었던 LED를 꺼내왔다.

 

사진출처 DBL

내 LED 사양은 HUB75단자에 P5 128x32 이다

HUB75는 단자 명칭으로, HDMI와 같은 역할을 한다.

특징이라면 HDMI는 듀얼 모니터를 쓰려면 모두 메인보드에 연결하는게 일반적이지만

HUB75는 지그비처럼 첫 번째 LED를 메인보드에, 나머지는 LED끼리 이어붙여도 듀얼모니터가 된다.

출처 동아일보

그래서 이걸 백 몇개씩 붙여서 공연장 뒷 LED역할로 쓰기도 한다.

나 같은 경우는 64x32를 가로로 2개 이어붙여서 128x32로 만들었다.

사진출처 BiBiLED

P5, P2.5등 Px는 LED 조명이 얼마나 조밀하게? 붙어있는지 표기한 것으로

x의 숫자가 작을수록 더 선명해진다 정도만 알면 된다. 

내가 쓴 P5는 실제 BIT에 쓰이는 LED보다 약간 희미한 정도이다.

사진출처 huidu controller 유튜브

집에 HUB75 LED표출에 특화된 HD-WF2 컨트롤러가 있다.

이 컨트롤러는 전용 앱으로 글자를 그리면, 그 화면을 그대로 캡쳐해 LED에 표출하는 방식이다.

현재시각 정도는 연동하여 제공되지만, API를 곧바로 LED에 표출할 정도는 되지 않는다. 

 

그래서 이 컨트롤러를 LED에 연결하여, 한글을 LED에 넣을 공간이 있는지 재본다.

학교 문쪽에 달거라 곧도착 버스만 따로 표시하는 부분은 필요가 없을 것 같아 뺐다. 문에서 곧도착이면 뛰어가도 놓치기 때문이다.

색깔도 서울시 순정 색, 대비가 좋은 색 등으로 테스트 해보았다.

LED 패널을 확인한 이후, 컨트롤러를 정하는 단계에 돌입했다.

실제 버스정류장의 BIT를 조사해보니

라즈베리 파이 5 or ARM기반 스냅드래곤AP or 자체제작 프로세서

정도를 쓰는 듯 하였다. 

나는 LED에 학교에 남아도는 라즈베리 파이 피코를 물렸다.

피코 확장보드와 HUB75 각 단자를 점퍼선 십몇개로 이어주니 놀랍게도 작동이 된다.

구글 AI인 Gemini를 통해 라즈베리파이-LED 간 연결 테스트 코드를 작성하여 표출하였다.

이 과정이 3시간 가까이 걸렸는데, 3시간 걸려 처음으로 본 Hello world는 말로 다 할 수 없는 감격을 가져다준다. 

이제 서울 버스 openAPI를 받아서 표출하면 된다.

그런데 첫 번째 걸림돌. 서울버스 API가 개판이다.

 

api.bus.go.kr에 API 설명이 나와있는데..

아래쪽에 추억의 해치 캐릭터와 Hi Seoul 로고를 보아라. 하이서울은 2015년 I SEOUL U 로 바뀌면서 사라진 브랜드인데, 저게 아직도 있다는건 적어도 10년 이상 관리가 안되었다는 뜻이다.

아무튼 내가 써야하는건 메뉴 밑쪽에 있는 버스도착정보 조회이다.

"경유노선전체정류소별-"은 무슨 정류소 +3개를 요청하면 그에 대한 답변을 주는 것이고

"정류소노선별노선별-"은 몇번버스, 무슨정류소 +3 개를 요청하면 그에 대한 답변을 주는 것이다.

 

전자는 정류소 이름으로 해당 정류소를 경유하는 모든 노선의 도착정보를 받아볼 수 있고

후자는 12개 노선이 경유하는 정류소라면 12번 요청해서 받아와야한다.

당연히 일반적이면 전자를 택하겠지만.. 골때리는게 전자로 코드를 짰더니 계속 오류가 났다. 

정류장 정보가 잘못된건가 하고 후자를 했을 때에는 잘 되는 것을 보아 그냥 API에 문제가 있는걸로 판단했다.

 

그래서 나 같은 경우는 일일이 노가다해서 요청을 보내도록 설계했다.

stId, rId는 정류장 코드와 노선 코드인데, 이들은 구글링 해서 찾은 스프레드시트에서 하나하나 찾아야했고,

특히 ord의 경우 요청한 정류장이 이 노선의 몇 번째 정류장인지 적어야하는데, 그걸 알기 위해 각 노선의 노선도를 보면서 기점에서 상암고 정류소까지 몇 정거장인지 일일이 세었는데, 정말 말도 안된다고 생각한다.

아무쪼록 실시간 남은 시간이 출력이 되기 시작했다. 673의 경우 상술한 정류장 갯수를 잘못 세어서 출력이 안되었었다. 

그런데 여기서 "분"을 안쓰고 "m"을 쓴 이유가 있다. 라즈베리파이 피코의 저장용량 한계로 라이브러리와 코드를 넣으니 한글을 넣을 공간이 안나왔던 것이다. 다만 분=m 정도는 거의 모든 사람이 알고 있기 때문에 컨트롤러 변경 없이 그대로 가기로 결정했다.


LED를 학교에서 가져와 최종 작업을 하였다.

여기서 재미있게도, LED가 5V 5A 정도 먹는데, 집에 그정도 출력을 지원해주는 SMPS가 없어서

5V 2A 어댑터 2개와 5V 1A 어댑터 1개를 하나의 선으로 합쳐지게 하였다.( 5V 2A + 5V 2A + 5V 1A = 5V 5A )

근데 GPT가 계속 하지말라고 경고를 줘서 결국 밝기를 줄이고 5V 2A 어댑터 하나로 작동하도록 수정하였다.

인터페이스를 개선하고, 뒤에 계도문구나 날씨 등 기타 정보를 놓을 페이지까지 만들어놓았다.
또 곧 도착이 0m으로 표시되던걸 now로 표시 되도록 바꾸었으며, 도착 3분 전일 경우 시간이 빨간색으로 표출 되도록 개선하였다.

14291 상암고등학교 정류소에는 15개 노선이 정차하지만, 하교시간대에 운행하지 않는 출퇴근 버스와 심야 버스를 제외한 12개 노선만 표출되도록 하였다. 

API가 개판인 탓에 노선추가를 하나하나 노가다하여 표출하였지만, 이 덕에 미운행 노선은 아예 전광판에서 뺄 수 있는 뜻 밖의 긍정적인 효과 또한 있었다.

 

현재 ESP32로 교체하여 한글을 넣고, LED 또한 밀도 높은 제품으로 구매하여 실제 BIT와 비슷한 사양을 만드는 것을 계획중인데, 이것을 하게 된다면 2부로 글을 쓰게 될 것이다.

 

 

p.s

중국산 LED패널과 라즈베리 파이 피코 적용으로 10만원 채 안되는 싼 가격으로 버스 BIT를 만들었지만, 버스 BIT가 왜 100만원을 호가 하는지 이번 경험으로 제대로 알게 된 것 같다.

인터넷을 찾아보니 BIT를 구현한 사람이 한 두분 정도 더 있는 것 같던데,

실제 설치용 BIT가 되었든, 취미로 만든 BIT가 되었든, 라즈베리 파이 피코로 이걸 만든 사람은 내가 최초 아닐까??