在 macOS 上使用名片型 LED 字幕機

前兩週在逛光華商場的時候,看到店家在賣一種名片型的 LED 字幕機,想想如果在身上或是桌上有一塊這樣的玩意,顯示一些文字/圖案,應該還頂有意思的,就買了兩組回家當做玩具。

這玩意看起來稱呼很多種,我後來在網路上看了一下,以這一則網路拍賣來說,就還有「LED跑馬名牌」、「LED名片」、「LED名牌」、「LED胸牌」、「LED電子名片」等稱呼—販賣這種商品的店家還頂多的,甚至看起來型號都一樣,不太了解這個業界,也不知道是同一個工廠有很多個代理商,還是說有很多家都在生產,但是共用同一個設計。

這類字幕機價格在台幣五六百元之譜,有紅、藍、黃、綠等多種顏色,我買來的這組解析度為 12×48 pixels,但是好像還有一種更小一點的,解析度是 11×44 pixels。在裝置上可以容納八條訊息,可以用後方的按鈕決定要切換到哪一條訊息,後面還有磁碟以及別針,可以讓你貼在鐵器或是別在身上。

機器上也提供 USB 接頭,除了拿來充電之外,連接電腦之後,還可以透過軟體修改字幕機裡頭的內容,但軟體這部份其實有點麻煩。

軟體附在在包裝盒內的一片小光碟中—就是如果如果放進了吸入式光碟機裡頭,不但讀不到資料也拿不出來的那種—這年頭已經有很大比例的電腦已經沒有光碟機了,我自己都不太記得我上次用光碟是什麼時候的事情。透過搜尋引擎,我們可以在網路上找到一些廠商的網站,下載對應的軟體,像是去阿囉哈光電科技有限公司的下載區,或是深圳市特邦達光電科技有限公司…等等。而隨機所附的軟體只提供 Windows 的版本,而既然平常使用的是蘋果電腦,就想找找看有沒有什麼 macOS 上的解決方案,省去還要開啟 WIndows VM 的麻煩。

用 Mini LED 啦、字幕機的型號 B1248 當關鍵字,去 github 裡頭去查,還真的找到一些東西,看來國外之前就有人對這樣的 LED 字幕機做逆向工程,不過,看來迷你 LED 字幕機也很多種,真的能用在我買來的機種的,只有 LEDBadgeProgrammer 這個專案。LEDBadgeProgrammer 這個專案主要是在 Linux 上用 Python 程式語言開發,但是在 macOS 上也可以使用,只是要稍微調幾個地方。

LEDBadgeProgrammer

我們首先要做幾件事情:

  • 安裝
    PL2303 Mac OS X Driver
    。安裝驅動程式、重新開機後,把裝置街上電腦的 USB 後,可以在 /dev 目錄下看到一個叫做 tty.usbserial 的裝置。
  • 安裝對應的 Python 套件。LEDBadgeProgrammer 使用 pyserial 操作 serial port 裝置,並且使用 PIL 繪製要放在 LED 字幕機上的畫面,所以我們需要安裝對應的套件。只要透過 pip 安裝 pillow。話說前兩年還會在安裝 pillow 時遇到 64/32 位元不相容的問題,不過這次倒是很順利地就裝起來了。

說到 PIL。在一些網拍廣告上(像這則 華敏電子公司的廣告),強調「支援多種文字,中、日、韓、英、俄」,但其實字幕機上使用的是一種點陣圖片格式,我們是在 desktop 軟體中,先把文字會製成圖片,再傳到字幕機上。

想起來我們也可以換成其他的圖形函式庫,像是在 Mac 上,我們可以改用 Cocoa Drawing API ,不過,既然都已經有人寫好程式,那就罷了。

我們就可以下載 LEDBadgeProgrammer,執行看看

python ledbadge.py -p /dev/tty.usbserial "Hello, world!"

就可以看到效果。

中文

不過,LEDBadgeProgrammer 畢竟是國外的作品,並沒有考慮到中文。要讓 LEDBadgeProgrammer 支援中文,我們要調整幾個地方。

首先是中文 encoding,LEDBadgeProgrammer 是用 Python 2.x 寫的,而 Python 2 在處理 Unicode 就是很麻煩,我們先找到這一行

 m.setText(c, font, halign=halign, valign=valign, wrap=wrap, invert=invert)

在前面加上一行

c = c.decode('utf-8')

再來是字體。LEDBadgeProgrammer 使用的是 PIL 所提供的英文點陣字體,要能夠顯示中文,就必須換成中文字體,而我們手邊的中文字體往往是 TrueType 字體,所以要稍微改一下程式。找一下這一行:

ifont = ImageFont.load( font )

改成

if font.endswith(".ttf") or font.endswith(".ttc") or font.endswith(".otf"):
    ifont = ImageFont.truetype( font, 12, encoding='unic')
else:
    ifont = ImageFont.load( font )

在輸入指令時,指定一下中文字體,像是指定系統字體蘋果平方字:

python ledbadge.py -p /dev/tty.usbserial font=/System/Library/Fonts/PingFang.ttc effect=left "在 macOS 使用名片型 LED 字幕機"

蘋果平方字在這個解析度時的表現…實在不怎麼樣,要讓字體清晰一點,我們可能要加粗筆劃,在 ImageFont.truetype( font, 12, encoding=’unic’) 這一行,我們可以加上 idnex=4 之類的,指定要使用粗體的平方字。

應用

既然是 Python script,那就可以很容易與其他的 Python 程式整合。比方說,我們夠過 feed parser 讀取 App Store 上的用戶留言的 RSS(像這裡就可以讀到 KKBOX 在台灣 AppStore 上的留言),再銜接一下 LEDBadgeProgrammer,就可以把用戶留言變成跑馬燈。效果如下:

話說另外弄一台 Raspberry Pi 來做這件事情會比較合適。

Be Sociable, Share!

Leave a Reply