- Mất khoảng 3 năm để tháo rời và tái sử dụng các Lenovo ThinkPad 11e Chromebook do trường cấp vốn được định đem bỏ, nhằm tạo ra một bức tường video gồm 10 màn hình
- Thay vì dùng bộ điều khiển màn hình riêng, bo mạch chủ laptop sẵn có sẽ điều khiển từng màn hình, và một hệ thống đồng bộ hóa dựa trên web sẽ chia một video thành 10 phần để phát
c-syncdựa trênsocket.iogặp các vấn đề về hiệu năng chậm, chênh lệch thời gian tải, độ trễ và đồng hồ hệ thống, nhưng đã đạt được khả năng phát gần như đồng bộ bằng cách làm chậm vòng lặp theo máy khách chậm nhất- Các vấn đề về đăng ký doanh nghiệp của ChromeOS, hạn chế của chế độ nhà phát triển, và nguồn điện khi tháo pin được xử lý bằng coreboot, công cụ MrChromebox, USB cài Debian tự động, và điều khiển quạt bằng
ectool - Dù vẫn còn các hạn chế về góc nhìn của tấm nền TN, khác biệt màu sắc và đồng bộ chưa hoàn hảo, đây là một ví dụ biến rác thải điện tử thành một hệ thống lắp đặt hoạt động thực sự nhờ hợp tác và thiết kế lặp
Bức tường video bắt đầu từ những chiếc Chromebook bị loại bỏ
- Dự án bắt đầu khi nhà trường định loại bỏ các Chromebook cũ, từ đó nảy ra ý tưởng xem có thể làm gì với chúng
- Thiết bị được sử dụng là Lenovo ThinkPad 11e, từng là laptop cấp cho học sinh nhưng không còn nhận được cập nhật phần mềm từ Google
- Phần lớn máy còn khó tải nổi trang web, và bị ràng buộc bởi Enterprise Enrolment cũ nên khó sử dụng nếu không có tài khoản Google của trường
- Mục tiêu là tạo ra một bức tường video hoạt động bằng cách sắp xếp nhiều màn hình như một màn hình lớn duy nhất
Cách điều khiển màn hình và thử nghiệm đồng bộ hóa
- Ban đầu, nhóm cân nhắc tháo riêng các tấm nền màn hình laptop và dùng một máy tính mạnh để điều khiển đồng thời 10 màn hình
- Cách này tốn nhiều thời gian và chi phí, và vì các màn hình vốn đã gắn với những laptop đang hoạt động nên họ chuyển sang phương án để mỗi màn hình chạy bằng bo mạch chủ laptop riêng của nó
- Họ cũng thử gửi video tới nhiều thiết bị trong cùng mạng bằng streaming của VLC, nhưng cách này không phù hợp với yêu cầu của bức tường video
- Đây không phải hệ thống được thiết kế để đồng bộ hoàn hảo video
- Không phải hiển thị lặp lại cùng một video trên 10 màn hình, mà là chia một video dài thành 10 phần để mỗi màn hình hiển thị một đầu vào khác nhau
Căn thời điểm phát bằng c-sync
- Nhóm tạo ra
c-sync, một hệ thống server/client ExpressJS dùng trang web vàsocket.iođể đồng bộ phát video giữa các client - Cấu trúc cơ bản là server gửi sự kiện
play, rồi phần tử<video>trên mỗi client bắt đầu phát - Trong thử nghiệm trên máy tính để bàn, hệ thống có vẻ đồng bộ khá tốt, nhưng trên Chromebook thực tế thì không ổn định do thiếu hiệu năng
- Chênh lệch thời gian tải
- Độ trễ mạng
- Sai lệch đồng hồ hệ thống
- Cách cuối cùng được đổi thành để mỗi client phát sự kiện
startkhi video của nó đến cuối- Máy chậm nhất sẽ buộc các máy nhanh hơn phải chờ, giúp có đủ thời gian tải video
- Mỗi màn hình có thể nhận được 10 sự kiện
start, nên thời điểm lặp có thể hơi dao động - Nếu vài khung hình đầu của video giống nhau thì người xem khó nhận ra khác biệt
- Cách phát theo lịch dựa trên timestamp cũng có vẻ khả thi, nhưng các Chromebook này không thể giữ thời gian khớp nhau ổn định ở mức mili giây nên không hoạt động
Can thiệp firmware để rời khỏi ChromeOS
- Sau khoảng một hai tháng, dự án đã đạt tới mức có thể mở thủ công một trang web và hiển thị video đồng bộ toàn màn hình
- Để dùng như một hệ thống lắp đặt thực tế, khi có điện máy phải tự khởi động và tự mở trang client của
c-sync - ChromeOS mặc định khởi động vào màn hình đăng nhập Google bị khóa theo domain của trường, và khi tháo pin thì cắm điện cũng không tự bật máy
- Nhóm dùng ChromeOS Firmware Recovery Script của MrChromebox để xử lý bo mạch chủ GLIMMER
- Vào Recovery Mode
- Bật Developer Mode
- Chạy script trong ChromeOS Shell
- Một số Chromebook từ chối vào Developer Mode vì Enterprise Enrolment, và cả những máy cài Linux thành công cũng dần gặp hiện tượng video ngừng phát hoặc toàn bộ hệ thống bị treo
- Cách giải quyết là tháo vít Write Protection trên bo mạch chủ của từng laptop và ghi đè toàn bộ firmware mặc định bằng
coreboot- Có vẻ quá trình này cũng đã vượt qua được giới hạn đăng ký
- Việc này phải lặp lại trên hơn 20 máy tính nên rất chậm và phiền phức
- Sau đó
Wake on AChoạt động như một tính năng firmware, và việc phát video cũng không còn hỏng ngẫu nhiên
Tạo kiosk Linux tự khởi động
- Lúc đầu, nhóm dùng một script khởi động để mở Chromium rồi giả lập phím bấm nhằm chuyển sang toàn màn hình
FullPageOStừng được dùng trong dự án trước đó nhưng không chạy trên phần cứng x86- Porteus Kiosk hoạt động tốt vì đây là một bản phân phối Linux tối giản chạy Chromium toàn màn hình và cho phép đặt cờ để phát video mà không cần tương tác người dùng
- Tuy vậy, Porteus Kiosk có những trở ngại khi vận hành một hệ thống lắp đặt thực tế
- Không thể thay đổi màn hình splash có logo Porteus xuất hiện lúc khởi động
- Sau khi cài đặt, không thể làm việc từ xa như đổi URL của trang, điều này có thể thành vấn đề khi thiết bị đã được gắn lên tường
- Để tiến tới cấu hình gần như một bản phân phối tự xây, nhóm thử cách dùng một hệ thống tối giản, không có môi trường desktop, và tự chạy Chromium ở chế độ kiosk
- NixOS cài đặt thất bại vì dung lượng lưu trữ nhỏ của Chromebook
- Sau đó họ viết script provisioning dựa trên Debian minimal install
- Tạo
KIOSK_ID - Đặt hostname thành
csync-client-$KIOSK_ID - Kết nối vào WiFi của trường
- Tạo người dùng và phân quyền
- Tự khởi động Chromium ở chế độ kiosk toàn màn hình bằng
openbox
- Tạo
- Vì cài Debian thủ công quá bất tiện, họ dùng FAI - Fully Automatic Installation và FAI.me
- Cuối cùng, họ tạo được một USB duy nhất có thể tự động provisioning thành client
c-synckhi cắm vào Chromebook đã càicoreboot - controller cũng được thêm vào
c-syncđể quản lý các client đã kết nối và gán video cho từng client - Sau bài stress test kéo dài 3 ngày với việc phát mượt mà ổn định, dự án chuyển sang giai đoạn gắn lên tường
Gắn lắp, cấp nguồn và xử lý nhiệt
- Phần cứng gắn lắp do Aksel Salmi thiết kế, với cấu trúc cho phép treo bo mạch chủ và màn hình lên tường
- Bộ cấp nguồn được cấu hình bằng cách nối dây để mỗi adapter có thể cấp điện cho hai máy tính
- Sau khi lắp đặt, vấn đề lớn nhất là nhiệt, và sau quá trình xóa firmware thì quạt laptop không còn quay nữa
- Có thể truy cập ChromeOS Embedded Controller bằng
ectool, vì vậy tốc độ quạt được đặt thủ công - Tài liệu trên mạng rất ít, và có sự khác biệt giữa
ectoolphíacorebootvàectoolphía Google gây nhầm lẫn, nhưng một bản binary tìm được qua Wayback Machine đã hoạt động đúng để đặt tốc độ quạt - Qua thử nghiệm, nhóm tìm được giá trị tốc độ quạt cân bằng giữa độ ồn và nhiệt độ
Tạo video cho 10 màn hình
- Độ phân giải của mỗi màn hình là 1366×768, nên video cho toàn bộ 10 màn hình sẽ là 13660×768
- Không có nhiều phần mềm có thể biên tập video rộng như vậy, và thực tế chỉ có Final Cut Pro và Blender là dùng được
- Sau khi render video toàn chiều rộng, họ dùng
ffmpegđể cắt thành 10 phần và gán cho từng màn hình - Script chia cắt tạo các segment tương ứng vị trí từng màn hình theo dạng
crop=1366:768:x_offset:0
Kết quả hoàn thiện và những giới hạn còn lại
- Bức tường video hoàn chỉnh có đầy đủ chuỗi khởi động, quá trình trông như tự hiệu chỉnh, phát video đồng bộ, cùng enclosure và hệ thống đi dây cáp
- Kết quả không hoàn hảo
- Góc nhìn của tấm nền TN không tốt
- Màu sắc giữa các màn hình khác nhau
- Đồng bộ không hoàn hảo
- Mỗi quyết định có thể đều đã có phương án tốt hơn
- Dù vậy, đây vẫn là một kết quả biến rác thải điện tử thành một hệ thống lắp đặt thú vị, đồng thời thể hiện thiết kế lặp và sự hợp tác trong nhóm
1 bình luận
Các ý kiến trên Hacker News
Chúc mừng vì đã hoàn thành một dự án thú vị. Tôi đã làm khá nhiều việc về đồng bộ hóa media trên nhiều thiết bị, nên lúc nào cũng thấy vui khi xem mọi người nghĩ ra giải pháp gì
Cách tiêu chuẩn trong ngành để làm một video wall đồng bộ như thế này là dùng trình phát media BrightSign, nhưng với khoảng 20 màn hình thì chỉ riêng chi phí mua trình phát và màn hình đã dễ dàng lên tới hàng chục nghìn đô la. Việc làm cho nó chạy được bằng thiết bị tái sử dụng thật sự rất ấn tượng
Nếu bạn quan tâm đến việc làm trên codebase liên quan đến đồng bộ hóa media thì có thể liên hệ. Chúng tôi khá thường xuyên thuê lập trình viên hợp đồng tự do
Tôi luôn tò mò trong chi phí đó phần cứng và phần mềm chiếm tỷ trọng bao nhiêu, và tôi đoán các hệ thống digital signage chuyên nghiệp được thiết kế có tính đến cả những yếu tố như độ tin cậy và tuổi thọ
Khi Chromebook mới ra mắt, tôi đang làm ở Google, và khi họ kêu gọi ý tưởng trang trí sảnh, tôi đã đề xuất một thứ tương tự nhưng bị từ chối. Có lẽ là vì tôi đã yêu cầu 40–64 thiết bị
Tuy vậy, tôi nghĩ mình sẽ không cố đồng bộ video; thay vào đó tôi sẽ tạo hoạt ảnh theo thời gian và đồng bộ đồng hồ qua mạng
Có thể xem ví dụ ở đây: https://www.youtube.com/watch?v=64TcBiqmVko
Đó là 8 thiết bị chạy Chrome, và thứ được đồng bộ chỉ là cấu hình và thời gian. Các thiết bị cũng không nhất thiết phải xếp thành lưới, và ý tưởng này lấy cảm hứng từ thủy cung ảo của Boston Science Museum
Đại ý là: “Không may là các Chromebook này không thể giữ thời gian khớp nhau một cách ổn định ở mức mili-giây, nên cách này không hiệu quả với chúng tôi”
Như đã nói, cần đồng bộ đồng hồ tốt, và đặc biệt nếu có âm thanh thì lệch 20–30ms cũng đã rất dễ nhận ra nên không hề dễ. Dù vậy, dùng NTP/PTP vẫn có thể đi được khá xa
Hay thật. Tôi từng làm thứ tương tự bằng tablet 4x4, kết nối cả 16 máy với ADB và một host duy nhất rồi tự động hóa được phần lớn
Sau đó tôi tạo 16 màn hình ảo và 16 VNC client trong sway, rồi streaming tất cả qua Wi‑Fi để thử nghiệm; Wi‑Fi hoạt động tốt đến mức tôi không đi tìm giải pháp hiệu quả hơn nữa
Trong thời gian đó PC của tôi có 19 màn hình, trong đó 17 màn hình là VNC, nhìn rất hoành tráng. Có thể làm cùng một việc trên toàn bộ, hoặc dùng mỗi màn hình cho mục đích khác nhau như nhạc, htop, lịch, đồng hồ, phiên ssh
Tuy nhiên xử lý phần cứng thì khá phiền. Một số máy bị throttling, một số gặp vấn đề kết nối, và có pin không giữ được sạc
Ngày xưa từng có một thứ tương tự tên là Junkyard Jumbotron. Nó cho phép gom các màn hình đủ loại lại để hiển thị từng phần của một hình ảnh lớn hơn
https://github.com/mitmedialab/Junkyard-Jumbotron
Video: https://youtu.be/cAUtSVSTbzU?feature=shared
Cách gửi ảnh căn chỉnh qua email trông cũng khá thú vị theo kiểu riêng
Nếu chỉ lướt qua và chưa đọc toàn bộ blog, thì dự án này là do học sinh trung học thực hiện trong thời gian còn học cấp ba. Vì vậy nó trông càng ấn tượng hơn
Nhìn vào các đoạn “tôi không hoàn toàn chắc vì sao nó hoạt động tốt như vậy, nhưng tình cờ nghĩ ra một giải pháp vô lý” và “máy tính chậm nhất giữ chân máy tính nhanh nhất”, thì nó hoạt động tốt vì thiết kế hệ thống đã được tối ưu theo nút thắt cổ chai
Nên xem lý thuyết ràng buộc
Có lần tôi phải làm việc tương tự với 5 TV màn hình cảm ứng lớn đặt như một cái bàn. Mỗi mặt phải là một ứng dụng cảm ứng riêng, tất cả cùng phát video nền đã đồng bộ, trong khi người dùng tương tác với các phần tử chảy từ đầu này sang đầu kia, hoặc gửi một vật thể họ tìm thấy cho người dùng ở phía đối diện của bàn
Cuối cùng, thiết bị trong ngân sách gần như duy nhất có thể chạy đồng thời tất cả màn hình là Mac Pro hình trụ, nên chúng tôi dùng nó, và các ứng dụng được đồng bộ bằng Redis. Phần đó là do tôi viết
Nó hoạt động khá tốt, nhưng tôi chưa kịp thấy sản phẩm hoàn chỉnh trước khi rời công ty. Ban đầu chúng tôi muốn đồng bộ các máy tính riêng biệt, nhưng không thể làm đủ ổn định; nó chạy được một lúc rồi lệch đồng bộ vì nhiều yếu tố, khiến phải khởi động lại ứng dụng định kỳ, mà điều đó thì không chấp nhận được
Từ những ngày đầu của PC, điều tôi luôn mong muốn là khả năng nối nhiều thiết bị qua mạng để chia sẻ tài nguyên và hợp tác nhiều hơn. Tôi từng tưởng tượng việc tận dụng mọi máy tính trong văn phòng như một siêu máy tính để xử lý công việc. Tất nhiên đây là vấn đề rất khó, ứng dụng và hệ điều hành phải được thiết kế theo cách đó, và cũng cần thuật toán mới. Nhìn việc ngay trong một thiết bị đơn trên cùng bo mạch mà còn mất nhiều thời gian mới tận dụng tốt đa bộ xử lý thì càng thấy vậy, nhưng các dự án như seti@home hay folding@home cũng đã làm phần nào việc đó, và tôi từng hy vọng một ngày nào đó bản thân máy tính sẽ hỗ trợ điều này
Nhìn vào đoạn “tôi bắt đầu tạo ‘bản phân phối của mình’ có thể cài lên laptop. Hệ thống phải khởi động với cấu hình tối thiểu, và có một script gọn gàng tự khởi chạy một instance Chromium ở kiosk mode mà không có môi trường desktop. Ban đầu tôi thử NixOS, nhưng nhanh chóng nhận ra dung lượng lưu trữ của các Chromebook này quá nhỏ nên không khả thi, và lần nào cài đặt cũng thất bại. Cuối cùng tôi bỏ cuộc và bắt đầu với bản cài tối thiểu của Debian, nhưng nhận ra cài Debian phải bấm quá nhiều nút nên quá tốn thời gian, rồi tìm thấy ‘FAI - Fully Automatic Installation’ và công cụ web FAI.me”, thì DietPi, OpenWrt và OpenBalena cũng có tùy chọn cài đặt tự động lên bare metal tối thiểu với các gói được chọn cụ thể
Tôi cũng tò mò liệu còn lựa chọn phi desktop nào khác không
Điều thú vị nhất là hiện tượng treo đã được giải quyết khi chuyển sang coreboot. Tôi tò mò không biết có giả thuyết nào về lý do không
Có thể liên quan đến ACPI/DSDT, hoặc có lẽ BIOS gốc đã khởi tạo sai bộ điều khiển phần cứng