- 폐기 예정이던 학교 지급 Lenovo ThinkPad 11e 크롬북을 분해·재활용해 10개 화면짜리 비디오 월을 만드는 데 약 3년이 걸림
- 별도 디스플레이 컨트롤러 대신 기존 노트북 메인보드가 각 화면을 구동하고, 웹 기반 동기화 시스템으로 하나의 영상을 10개 조각으로 나눠 재생함
socket.io기반c-sync는 느린 성능, 로딩 시간 차이, 지연 시간, 시스템 시계 문제를 겪었지만, 가장 느린 클라이언트에 맞춰 루프를 늦추는 방식으로 거의 동기화된 재생을 구현함- ChromeOS의 기업 등록, 개발자 모드 제한, 배터리 제거 시 전원 문제는 coreboot, MrChromebox 도구, Debian 자동 설치 USB,
ectool팬 제어로 우회함 - TN 패널 시야각, 색상 차이, 완벽하지 않은 동기화가 남았지만, 전자폐기물을 협업과 반복 설계로 실제 작동하는 설치물로 바꾼 사례임
폐기 예정 크롬북에서 시작한 비디오 월
- 학교가 기존 크롬북들을 폐기하려 하면서, 이를 활용해 무엇을 만들 수 있을지에서 프로젝트가 시작됨
- 사용된 기기는 Lenovo ThinkPad 11e로, 학교 지급용 노트북이었지만 더 이상 Google 소프트웨어 업데이트를 받지 못함
- 대부분 웹페이지 로딩도 버거웠고, 오래된 Enterprise Enrolment에 묶여 학교 Google 계정 없이는 사용하기 어려웠음
- 목표는 여러 화면을 하나의 큰 디스플레이처럼 배치해 동작하는 비디오 월을 만드는 것이었음
화면 구동 방식과 동기화 실험
- 처음에는 노트북 디스플레이 패널만 떼어내 강력한 컴퓨터 하나로 10개 화면을 동시에 구동하는 방식을 검토함
- 시간과 비용 부담이 컸고, 화면이 이미 작동하는 노트북에 붙어 있었기 때문에 각 화면을 각자의 노트북 메인보드로 구동하는 방식으로 전환함
- VLC 스트리밍으로 같은 네트워크 안의 여러 장치에 영상을 보내는 실험도 했지만, 비디오 월 요구사항과 맞지 않았음
- 영상이 완벽히 동기화되도록 설계된 시스템이 아니었음
- 10개 화면에 같은 영상을 반복 표시하는 것이 아니라, 하나의 긴 영상을 10개 조각으로 나눠 각 화면에 다른 입력을 표시해야 했음
c-sync로 맞춘 재생 타이밍
- 웹페이지와
socket.io를 이용해 클라이언트 간 비디오 재생을 맞추는 ExpressJS 서버/클라이언트 시스템c-sync를 만듦 - 기본 구조는 서버가
play이벤트를 보내면 각 클라이언트의<video>요소가 재생을 시작하는 방식이었음 - 데스크톱 컴퓨터 테스트에서는 꽤 잘 동기화되는 것처럼 보였지만, 실제 크롬북에서는 성능 부족 때문에 안정적으로 맞지 않았음
- 로딩 시간 차이
- 네트워크 지연
- 시스템 시계 차이
- 최종 방식은 각 클라이언트가 영상 끝에 도달하면
start이벤트를 내보내도록 바뀜- 가장 느린 컴퓨터가 빠른 컴퓨터를 기다리게 만들어 영상 로딩 시간을 확보함
- 각 화면이 10개의
start이벤트를 받을 수 있어 루프 시점이 약간 흔들릴 수 있음 - 영상의 첫 몇 프레임이 같으면 사용자가 차이를 알아차리기 어려웠음
- 타임스탬프 기반 예약 재생도 가능해 보였지만, 이 크롬북들은 서로 밀리초 단위로 시간을 안정적으로 맞추지 못해 작동하지 않았음
ChromeOS를 벗어나기 위한 펌웨어 작업
- 한두 달 안에 웹페이지를 수동으로 열어 전체 화면 동기화 영상을 보여주는 단계까지 도달함
- 실제 설치물로 쓰려면 전원이 들어오면 자동 부팅되고
c-sync클라이언트 페이지가 열려야 했음 - 기본 ChromeOS는 학교 도메인으로 잠긴 Google 로그인 화면으로 부팅됐고, 배터리를 제거한 상태에서는 전원을 연결해도 자동으로 켜지지 않았음
- MrChromebox의 ChromeOS Firmware Recovery Script를 사용해 GLIMMER 메인보드를 다룸
- Recovery Mode 진입
- Developer Mode 활성화
- ChromeOS Shell에서 스크립트 실행
- 일부 크롬북은 Enterprise Enrolment 때문에 Developer Mode 진입을 거부했고, Linux 설치에 성공한 기기들도 시간이 지나면 비디오 재생이 멈추거나 시스템 전체가 잠겼음
- 해결책은 각 노트북 메인보드에서 Write Protection 나사를 제거하고 기본 펌웨어 전체를
coreboot로 덮어쓰는 것이었음- 이 과정이 등록 제한도 우회한 것으로 보였음
- 20대가 넘는 컴퓨터에서 반복해야 해 느리고 번거로웠음
- 이후
Wake on AC가 펌웨어 기능으로 동작했고, 비디오 재생도 무작위로 깨지지 않았음
자동 부팅되는 Linux 키오스크 만들기
- 처음에는 Chromium을 열고 키 입력을 흉내 내 전체 화면으로 만드는 시작 스크립트를 사용함
FullPageOS는 이전 프로젝트에서 사용해 봤지만 x86 하드웨어에서 동작하지 않았음- Porteus Kiosk는 최소 Linux 배포판으로 전체 화면 Chromium을 실행하고, 사용자 상호작용 없이 비디오 재생을 허용하는 플래그를 설정할 수 있어 잘 동작함
- 다만 Porteus Kiosk는 실제 설치물 운영에 걸림돌이 있었음
- 부팅 때마다 Porteus 로고가 표시되는 스플래시 화면을 바꿀 수 없었음
- 설치 후 페이지 URL 변경 같은 원격 작업을 할 수 없어, 벽에 장착한 뒤 문제가 될 수 있었음
- 자체 배포판에 가까운 구성을 만들기 위해 최소 시스템에서 데스크톱 환경 없이 kiosk 모드 Chromium을 자동 실행하는 방식을 시도함
- NixOS는 크롬북의 작은 저장공간 때문에 설치에 실패함
- 이후 Debian minimal install을 기반으로 프로비저닝 스크립트를 작성함
KIOSK_ID생성- 호스트명을
csync-client-$KIOSK_ID로 설정 - 학교 WiFi 연결
- 사용자와 권한 생성
openbox로 전체 화면 kiosk 모드 Chromium 자동 시작
- 수동 Debian 설치가 번거로워 FAI - Fully Automatic Installation과 FAI.me를 사용함
- 최종적으로
coreboot가 적용된 크롬북에 꽂으면c-sync클라이언트로 자동 프로비저닝하는 단일 USB를 만들었음 c-sync에는 연결된 클라이언트를 관리하고 각 클라이언트에 영상을 할당하는 controller도 추가됨- 3일간의 스트레스 테스트에서 재생이 부드럽게 유지된 뒤 벽 장착 단계로 넘어감
장착, 전원, 발열 처리
- 장착 하드웨어는 Aksel Salmi가 설계했으며, 메인보드와 디스플레이를 벽에 걸 수 있는 구조가 사용됨
- 전원 공급 장치는 각 어댑터가 두 대의 컴퓨터에 전원을 공급할 수 있도록 케이블을 이어 붙이는 방식으로 구성됨
- 설치 뒤 가장 큰 문제는 발열이었고, 펌웨어를 지우는 과정 이후 노트북 팬이 돌지 않았음
- ChromeOS Embedded Controller에는
ectool로 접근할 수 있어 팬 속도를 수동 설정할 수 있음 - 온라인 문서가 부족했고
coreboot와 Google 쪽ectool이 달라 혼란이 있었지만, Wayback Machine을 통해 구한 바이너리가 팬 속도 설정에 정상 동작함 - 테스트를 거쳐 소음과 온도 사이 균형이 맞는 팬 속도 값을 찾음
10개 화면용 영상 제작
- 각 디스플레이 해상도는 1366×768이고, 10개 화면 전체 영상은 13660×768이 됨
- 이처럼 넓은 영상을 편집할 수 있는 소프트웨어가 많지 않았고, 실제로 Final Cut Pro와 Blender만 사용 가능했음
- 전체 폭 영상을 렌더링한 뒤
ffmpeg로 10개 구간으로 잘라 각 화면에 배정함 - 분할 스크립트는
crop=1366:768:x_offset:0형태로 각 화면 위치에 맞는 세그먼트를 생성함
완성 결과와 남은 한계
- 완성된 비디오 월은 부팅 시퀀스, 자체 보정처럼 보이는 과정, 동기화 영상 재생, 인클로저와 케이블 라우팅까지 갖춤
- 결과물은 완벽하지 않음
- TN 패널의 시야각이 좋지 않음
- 화면마다 색상이 다름
- 동기화가 완벽하지 않음
- 각 의사결정에는 더 나은 대안이 있었을 수 있음
- 그래도 전자폐기물을 흥미로운 설치물로 바꾸고, 반복 설계와 팀 협업을 보여주는 결과물로 완성됨