LED 點陣 NTP 時鐘 (一)
這其實不是我自己的 project,而是我在 AppWorks 指導的實習生 Ryan 目前正在進行的專案。
去年暑假我從美國回來後,Ryan 跟著我學了一些 Arduino 的基本知識,也用 ESP8266 跑 Arduino 做了一些用 Wi-Fi 連網的小專案,我還去淘了一組用 DC 有刷馬達驅動的簡易小車平台,讓他做了一台可以用 CIR 紅外線碼遙控的小車。以上的這些歷程,Ryan 都記錄在他的部落格 “自造者萊恩” 裡面。
要學好這些工程的技術和知識,就要有目標,一邊從做中學一邊朝著目標前進,才會有樂趣和成就感。因此一路上我一直在思考要定什麼樣的題目,才能讓一個只念到資管系大二、會寫點程式但是完全沒有工程背景的小朋友跟得上又不會太無聊。
分秒不差的願望
就在這時,我那位喜歡分秒不差的 SOP 控 A 同學許了個願: 他想要一個可以掛在會議室,透過 NTP 同步的時鐘。
NTP 校時用 ESP8266 來做其實不難,Ryan 花了幾天就做到了,但難是難在時鐘本身怎麼呈現。身為 maker 的老祖宗,我若是隨便端出個一兩吋的 7-segment 顯示器來做時鐘,未免貽笑大方。如果是我自己做的話,可能會搞個 B-7971 之類的 nixie tube 來顯示,但最近管子的貨源比較不足,而且現在工作的環境沒有足夠的工程資源可以校調高壓電源,幾經考慮,我決定做點陣 LED 顯示。
本來我只打算做單色的 LED 點陣,後來在查一些 LED 驅動電路的資料時,發現有一顆很好用的 3×8-channel LED PWM driver,是台灣的點晶科技做的 DM163,很常用在大型的全彩 LED 驅動。用一組類似 shift register 的資料界面就可以用 8-bit 解析度的 PWM 控制 8 顆 RGB 的 LED,每個 channel 的電流可以到 60mA,而且還附贈 6-bit 的 dot correction 功能。我一直想試試點陣的全彩 LED,於是我就決定衝全彩的了。
點陣 LED 的掃瞄驅動說難不難,但沒做過的人很難光憑想像就理解它的原理,因此在實際驅動全彩 LED 模組之前,我先找了個小顆的單色 8×8 LED 模組,用 NodeMCU 接了 8 條線出來,讓 Ryan 試著用 ESP8266 控制 4×4 的區域。
如果不偷用 SPI flash 的兩隻 data pin 的話,ESP8266 能用的 I/O 腳也差不多這麼多隻而已,因此最後我們要怎麼驅動整面的 LED 點陣,我還得再想想。
Ryan 很努力的學會了用 timer 產生中斷去掃瞄 4×4 的 LED 點陣,並且還寫了個 ESP8266 的 web 界面去控制它。但就在去年 12 月,我正在 Las Vegas 參加 AWS re:Invent 時,他突然收到兵單,我從美國回來不久後,他就去當兵了。
一切就像按下電腦的 hibernation 鍵,凍結在他離開的那一天。
—– 這是四個月的分隔線 —–
一晃眼,四個月過去。Ryan 退伍,然後回到 AppWorks 實習 。現在的小朋友也太爽,當兵只要四個月。
當兵會不會變笨,每個人各有造化,但 Ryan 在退伍前就開始努力撰寫他的部落格,重新整理他之前跟著我學到的東西,就算有變笨也多少可以撿回一點。寫文章是喚醒記憶和自省的好方法。
捲土重來
既然回來了,我們就繼續朝著點陣 LED 的 NTP 時鐘努力吧。
這四個月裡雖然沒有進度,但我也沒完全擱下。我心裡始終掛念著要怎麼透過 ESP8266 驅動 DM163,去推動多個 8×8 的全彩 LED 點陣
在我原來的構想中,用 3×7 的數字字型,最多只需要 4 個 8×8 模組,總共 32×8 的解析度就可以顯示完整的時、分、秒鐘面,我還用 Excel 畫了 layout:
但 Ryan 自己設計了點陣圖的顯示樣式後,還想加上其它的特效 (火箭什麼的… =_=),主動跟我提出想要加到五個 8×8 模組,總解析度變成 40×8。因為 DM163 是設計在 LED 模組的陰極上以 current sink 驅動,我打算把全部模組的陰極都接在一起,然後掃瞄陽極來驅動 (這只是初步的構想,我還沒精算 I/O 的頻寬和 duty cycle 到底夠不夠),因此多接一個模組就是多 8 隻掃瞄用的陽極而已,而掃描電路我打算用 shift register 來做,因為 ESP8266 的 I/O 實在不夠用啊。
這是我原來規劃的電路:
其實我二月的時候就動手畫了一部份的電路圖,也做了一些電源的計算,但遲遲沒有完成。
門戶受限
最大的障礙是 ESP8266 的 I/O 不夠用。控制 DM163 要 5 隻腳: shift register 要 3 隻 (clock、data、strobe),dot correction bank select 用掉 1 隻,還要 1 隻 reset。陽極端的 shift register 最少也要 4 隻,這樣就用掉 9 隻了。
但 ESP8266 的 I/O 榨到乾也才 13 隻,這還包括了用來控制開機模式的 GPIO/0GPIO2/GPIO15,和UART 共用用來燒錄程式的 GPIO1/GPIO3,以及必需把 SPI flash 降到 1-bit mode 才能使用的 GPIO9/GPIO10。東扣西扣,真的能用起來高枕無憂的 GPIO 只有 7 隻,遠遠不夠啊。
當然像 GPIO0/GPIO2/GPIO15 等接腳只要在開機時的狀態正確,開起來後就可以當一般的 GPIO 使用,因此限制比較少。而 GPIO9/GPIO10 這種和 SPI flash 有關的腳,則必需確定 SPI 真的沒有用到才可以拿來用。
為了徹底了解 ESP8266 這些共用接腳的行為,我洗了一張小板子,打算用 ESP-12F 模組來好好觀察這些 GPIO 腳的行為。在繼續設計電路前,我得先確定有足夠的 GPIO 可以用,或者可能還要加 I/O extender。
墊檔的 Colorduino
在有自己的 LED 驅動電路可以繼續進行下去之前,我去淘了幾片 Colorduino 回來,當做給 Ryan 暫時練習的平台。
Colorduino 是一個叫 Nick 的英國人設計的 LED 板,他也是個 LED 狂熱份子,部落格上滿滿的都是 LED project。Colorduino 其實就是一個用 ATmega328 的 Arduino 板子加上 DM163 的 LED 驅動電路、以及 60mm 8×8 的點陣 LED 模組而成。
它可以單片使用,也可以串接起來,利用 I2C 控制多片。但如果要送整面的影像資料,我有點擔心 I2C 的頻寬,不過還沒細算。
一般買到的 Colorduino 和其它 LED 驅動板配的是圓形的 LED 點陣,但基於以前設計面板的堅持,為了讓 fill factor 更高,顯示面看起來更有味道,我特別去找了方點陣的 LED 模組換上。
在我去美國參加 Facebook F8 的這段時間,Ryan 熟悉了 Colorduino 的操作,還在上面寫了個貪食蛇,很有進展。
接下來挑戰,就是用 I2C 串起五片 Colorduino,讓它們一起工作。
(待續)
近期留言