Vỏ enclosure WOPR LEDs gắn rack 1U
Vỏ enclosure gắn rack 1U cho WOPR LEDs, vừa 3 module LED matrix 8x8 (MAX7219) dạng 1x4 nối daisy chain. Kèm link hướng dẫn đấu dây Raspberry Pi Pico + MicroPython và code hiệu ứng mô phỏng WOPR.
Mô tả
Mình luôn bị cuốn hút bởi “vibe” thẩm mỹ của WOPR, cái máy tính trong phim War Games (1983). Mấy dãy đèn thay đổi đều đều, được cho là thể hiện trạng thái của cỗ máy, là thứ mình đã muốn tái hiện trong server rack của mình suốt nhiều năm. Gần đây mình quyết định: nếu ngoài thị trường chưa có sẵn, thì mình tự làm.
Sau khi tìm hiểu một vòng, mình biết tới mấy module LED matrix 8x8 nhỏ xíu, dùng driver MAX7219. Dưới $10 là có thể mua được một board 1x4 (gồm 4 cái 8x8)…. và còn có thể daisy chain nối chuỗi với nhau. Ba board kiểu này nối liền một hàng là vừa khít trong một khe 1U.
Mình đấu dây chúng vào một Raspberry Pi Pico chạy MicroPython, làm theo một bài hướng dẫn để gắn đúng chân và thêm driver cơ bản rồi chạy vài demo, thấy mọi thứ ổn. Vấn đề là mình không muốn nó chạy kiểu “bình thường”: mình muốn điều khiển từng “pixel” riêng lẻ và cố gắng mô phỏng lại đúng kiểu WOPR nhìn như thế nào.
Sau vài lần lặp/điều chỉnh, mình ra được chức năng như sau:
Khi chạy, nó sẽ “tung đồng xu” cho mỗi cột (96 cột) để quyết định cột đó có thay đổi so với trạng thái trước không. Nếu cột đó được đổi, nó sẽ “tung” 8 lần nữa để quyết định cột đó sẽ trông như thế nào. Sau đó nó vẽ hình lên display. Tiếp theo, nó “tung” một đồng xu 4 mặt để quyết định sẽ chờ bao lâu trước khi tiếp tục và lặp lại vòng loop. Mình thấy cách này tái hiện khá đúng cái cảm giác chậm rãi, có tính toán của mấy đèn chỉ thị WOPR.
Wiring guide:
https://microcontrollerslab.com/max7219-led-dot-matrix-display-raspberry-pi-pico/
LED module:
https://www.amazon.com/dp/B07FFV537V
Driver:
https://github.com/mcauser/micropython-max7219/blob/master/max7219.py
Code của mình:
from machine import Pin, SPI
import max7219
import random
from time import sleep
spi = SPI(0,sck=Pin(2),mosi=Pin(3))
cs = Pin(5, Pin.OUT)
display = max7219.Matrix8x8(spi, cs, 12)
display.brightness(0)
while True:
for y in range (8):
for x in range (96):
flip = random.randint(0, 1)
if (flip == 0):
flipp = random.randint(0, 1)
if (flipp == 0):
display.pixel(x,y,1)
else:
display.pixel(x,y,0)
else:
pass
display.show()
timeflip = random.randint(0,3)
if (timeflip == 0):
sleep(1)
elif (timeflip == 1):
sleep(1.5)
elif (timeflip == 2):
sleep(2)
else:
sleep(0.5)
boot.py đã được đính kèm.
Giấy phép
File mô hình
Chưa có bản in nào được khoe. Hãy là người đầu tiên!
Chưa có bình luận nào. Hãy là người đầu tiên!