設備:Arduino UNO R3、Waveshare 電子紙 5in65f,以及 HiLetgo SD & TF 卡擴充板。
參考資料:
- 5.65 吋 7 色相框:[https://www.youtube.com/watch?v=YawP9RjPcJA&t=153s
](https://www.youtube.com/watch?v=YawP9RjPcJA&t=153s
) 2. 硬體接線:[https://github.com/robertmoro/7ColorEPaperPhotoFrame/tree/main
](https://github.com/robertmoro/7ColorEPaperPhotoFrame/tree/main
) 3. JPG 轉 7 色矩陣:[https://gist.github.com/joeycastillo/317816ad36491a2a79389d97b53f5b3e
](https://gist.github.com/joeycastillo/317816ad36491a2a79389d97b53f5b3e
)
我原本計畫製作一個電子紙相框,因為我的女兒過去經常長時間盯著我們的 LCD 相框看。 幸運的是,我在網路上找到一些使用電子紙顯示器與微控制器來製作精美相框的貼文和影片。 正如第二篇參考貼文的物料清單(BOM)中所提到的,我購入了一塊 SD 卡擴充板和一個 5.65 吋 7 色電子紙顯示器。
1. 問題
我原以為程式編寫部分對我來說應該是小菜一碟,畢竟我之前曾製作過 LCD 相框。 然而,仍有兩個問題阻礙了我成功。
1.a 色彩量化
第一個難點在於如何準備 7 色圖像。 上次我將照片轉換為位圖,Arduino程式只需載入像素,再將RGB轉為565格式即可。但電子紙僅有7種顏色來呈現圖像,這將依賴點彩畫的色彩混合理論。那麼,我該如何將原始照片轉換為點彩風格的照片呢?
1.b 儲存或串流
另一個問題是照片該儲存在哪裡。 我之前的製作使用的是附帶 micro-SD 讀卡機的 LCD 螢幕,但這次的電子紙顯示器並沒有內建讀卡機。我曾考慮使用藍牙模組或 Wi-Fi 模組將照片從電腦傳輸到 Arduino,但這需要電腦扮演伺服器的角色,雖然很酷,但對我來說有點複雜,畢竟我現在還得照顧孩子。
2. 解決方案
2.a 色彩量化
第一個問題透過 GitHub 上第三篇參考文章解決了。 使用自訂色盤和 PIL 函式庫轉換圖片,這真是救了我一命。 第二篇貼文則利用 GIMP 的索引與捨棄功能來實現相同的色彩量化。 這兩者都將轉換後的照片儲存為 BMP 檔案,但我其實不太喜歡 BMP 格式。 我知道 Arduino 能直接從二進位檔案讀取位元組,因此這次我決定將照片儲存為 uint8_t 二進位格式。 Waveshare 的官方 Arduino 程式碼提到,輸入像素的格式必須進行合併。 更具體來說,就是將兩個 3 位元的像素合併到一個位元組中。 因此,我在 Python 的預處理程式碼中進行了合併。 以下是我編寫的合併程式碼,供您參考。
def combine2pixels(my_img):
matrix=[]
for r_idx in range(shape_6in65[1]):
line = []
for c_idx in range(int(shape_6in65[0]/2)):
p1 = my_img.getpixel((c_idx*2, r_idx))
p2 = my_img.getpixel((c_idx*2+1, r_idx))
combined_p = (p1<<4)+p2
line.append(combined_p)
matrix += line
return matrix
2.b 儲存或串流
考量到個人專案的時間有限,我選擇了較簡單的方式,即使用 micro-SD 卡來儲存所有經過量化處理的照片。 我在 Amazon 購入了一款 SD 卡讀卡器擴充板,並依照產品頁面的說明,透過 SPI 介面來控制照片的讀取。
隨後便迎來了我的苦惱。
電子紙顯示器與我的 SD 卡讀卡機都使用 SPI 連接,而 Arduino 上的選通腳位必須有所區別。 SD 卡擴充板的 PCB 已將 Arduino 的 D10 腳位硬連線為其 CS,而電子紙的 CS 則可由我自由選擇。 因此,我將 D10 分配給讀卡機,D6 則分配給電子紙。 隨後發生了許多奇怪的事情。 例如,我的兩張 SD 卡因不明原因損壞,無法格式化以重新使用。 我原以為這是兩張舊 SD 卡的老化問題,於是趕緊買了新卡。 拿到新 SD 卡後,我很快又弄壞了一張。天啊! 但新卡的情況更詭異。 所有照片都被刪除了! 我不得不反覆格式化卡片並重新複製照片進去。 這完全不合常理,畢竟我只是從 Arduino 讀取這些資料。
在除錯過程中,我發現我的 Arduino 失控了。 虛擬 COM 埠經常停止運作。 即使重新啟動電腦也無法解決問題。 只有在拔除 Arduino 的電源並移除所有 SPI 裝置後,我才能將最新韌體重新安裝到控制器上。
我暫時擱置了這個專案,花更多時間陪伴我摯愛的家人。 試著找出哪個環節出了問題。 難道我沒有正確遵循資料手冊嗎?是 SPI 的 CS 腳位?還是電子紙的初始化? 經過無數次的嘗試與研究,我終於找到了根本原因。
亞馬遜商品頁面給了我錯誤的 SD 卡擴充板 CS 引腳資訊。該死……
如右上角所示,唯一被使用的數位引腳是 D4。
正是錯誤的 CS 引腳導致我的系統出現無法預期的行為。 好,問題解決了。在 Arduino 程式碼中設定正確的引腳後,我的相框終於運作正常了。
我的電子紙相框。
把所有零件緊密地裝好,讓我感到非常開心。
我在 micro-SD 卡裡放了一些數位化照片,並設定 20 分鐘的定時器來載入下一張照片。
我對這種低色相飽和度的效果相當滿意,因為畫面看起來充滿復古風情。
這也讓我想起過去使用低解析度印表機列印照片的舊時光。 希望我的故事能讓你會心一笑,或是幫助你避免重蹈我的覆轍。