製作 LCD 番茄鐘:用 Raspberry Pi GPIO 控制 16×2 LCD 顯示器

最近看的書反覆提到番茄工作法,想試試看,於是就用手上的樹莓派與零件製作了🍅 LCD 番茄鐘來用!

用 Python 寫了一隻 pomodoro_timer.py 來讀秒,也為了把字印到 16×2 的液晶顯示器上,寫了 lcd1602gpio 模組從 Raspberry Pi 3 Model B 的 GPIO 操作它。

番茄鐘程式的部份比較單純,用迴圈反覆做 25 分鐘 + 5 分鐘的讀秒。考慮到 Raspberry Pi 沒有內建可靠的系統時鐘,於是用 Python 的 time.monotonic() 算差值,做出每秒鐘都能輸出一次字串到 LCD 的效果。

操作 LCD 的部份雖然網路上已經有許多範例可看,但實際比想像中麻煩許多。手上有一顆十幾年前南亞塑膠出的 16×2 LCD 模組:

沒有方便的 I²C 介面可以用,只好自己接線,在 lcd1602gpio README 的 Examples 有整理我使用的腳位,光是腳位的用法跟順序就跟別人家不一樣。

  • 這個 LCD 模組有背光,但專用腳位是放在 LCD 主模組的接地線(名義上的第一個腳位)旁邊,不是像它廠放在 Data bus 之後。
  • 讓背光的陽極跟 LCD 從麵包板吃一樣的 5V 就亮不起來,接另一隻 5V 給背光才亮起來,然後想說串電阻做點保護卻又亮不起來,於是就沒串了直上 +5V。
  • Contrast 直接接地,因為對比已經低到有些字都快看不到,於是也沒有串可變電阻去調。

接好的電路長得像這樣:(Data bus DB0 ~ DB7 八隻腳全上)

由於目標只想先在 LCD 顯示一些字,只做了寫入指令到 LCD 的功能,所以 R/W 腳位直接接地,沒有做從 LCD 讀取資料的功能,加上沒去讀 Busy Flag (BF) 就把 delay 拉得很長以確保 LCD 有足夠時間跑完指令。

過程中為了搞懂 LCD 指令的意義,找到了 HD44780 控制器的說明文件嘗試自己操作看看,卻發現裡頭有很多聰明的設計。

像是在初始化 LCD 的時候,有些人會說總之先送 0x33 (0b00110011)0x32 (0b00110010) 兩組 instruction 到 data bus,之後再做一次 Function Set 設定行列數與字型。初始化的指令都是屬於 Function Set 指令,但會需要送這麼多次是有意義的,原因在於設計電路的我們無法得知 LCD 模組在任何時候是處在何種模式 (8-bit 或 4-bit),每個 Enable cycle 送進去的資料、LCD 會當作 1 cycle per instruction 還是 2 cycles per instruction 是說不準的。於是才有 0x33 & 0x32 兩指令,對 8-bit 電路來說就是 2 cycles 送完,雖然最後兩位低位元不一樣,但因為是 Don’t care bits 所以會被 LCD 忽略,不管 LCD 是處在 4-bit 或 8-bit 模式下,最後完成初始化的時候都會是 8-bit 模式。遇到 4-bit 電路的話,這兩個指令會以 Nibble sending logic 被拆成 4 cycles,原本會被忽略的低位元就可能被 LCD 當成高位元指令吃進去,不管 LCD 是處在 4-bit 或 8-bit 模式下,最後完成初始化的時候都會進入 4-bit 模式。像這樣的設計實在充滿巧思。

最後,雖然寫了這麼多都是集中在 LCD 的話題上,也趁這個機會對 Raspberry Pi 做了比較詳細的認識。這次用到的 LCD module 剛好只需要 GPIO 做高低電位差就能操作,若是要用到感測器一類的類比元件就得準備 ADC 了(或改用像是 Arduino 能讀類比的控制器),我想 Raspberry Pi 的強項在處理數位訊號、拿來架設小 server、以及用 HDMI 輸出畫面做電子看板之類的應用比較合適。

分類: 未分類,標籤: , , , 。這篇內容的永久連結

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *