2014年12月29日 星期一

Raspberry Pi b+ 用 Python 控制 LCD 16x2 (HD44780) 教學 Part 1 硬體設定篇


在玩Raspberry Pi的時候,常常會有需要顯示一些簡單文字訊息的需求。像是開機抓到動態IP位置的時候顯示出來,方便遠端ssh登入。

這個時候用LCD螢幕線得太大又太笨重,用UART又需要準備一條USB-TTL的轉接線用電腦來登入,整個弄得非常的繁雜。所以這種時候就需要下面這個東西--兩行十六字的 LCD 顯示模組:

在電子材料行裡可以用便宜的價格輕易買到,去Google的話常常會被提到的型號或關鍵字不是 HD4478 就是 1602 (16x2十六個字兩行)。雖然型號上有點小差異但是控制指令都一樣。而傳輸資料介面除了基本款的 16 pin腳的版本外還有I2C介面。網路上也有人利用位移暫存器來間接控制基本款的 16 pin腳,這種的方式就以後有時間再來寫了。






下面預計會分三個部分介紹如何在 Raspberry Pi B+版上用 Python 透過 GPIO 針腳控制這個LCD模組.

--part1: 硬體設定篇
--part2: 基本指令介紹
--part3: 初始化動作
--part4: 自訂字形

開機順序和資料傳輸基本動作

硬體接腳設定:

從LCD模組的Datasheet上面會知道有十四根接腳是控制LCD的主要接腳,而有附帶背光模組(通常都會有)的會多兩根接腳負責給電給LED發光。

LCD模組通常會提供兩種模式:4-bit 和 8-bit。

8-bit模式會使用8支接腳來傳輸在資料或指令,可以一個動作送出/讀入完整的 8 個 bit(1 byte) 數據。

4-bit模式則只需要使用4支接腳來傳輸在資料或指令,但是一個動作只能送出/讀入4個bit的數據,所以要送出/讀入完整的一個 byte 要多花一個動作。不過由於可以省下4個GPIO腳位,所以現在大多使用這種操作模式。

接下來說明程式的接腳設定。可以參考下圖的Pi B+版的GPIO腳位圖: 
--------------------------------------------- 
(LCD模組電源和顯示對比度控制)
1 : VSS --> 接地 (下圖有圈圈的號碼6,9,14,20,25,30,34,39任選一個) 
2 : VDD --> LCD模組的電源, 接+3.3V或+5V (買的時候問老闆是吃哪個電壓) 
            3.3v 接圈圈1或17, +5V 接圈圈2或4 
3 : V0  --> 這地方給的電壓大小決定LCD顯示對比度的高低, 建議接個可變電阻. 
            V0---(可變電阻)---GND (圈圈號碼6,9,14,20,25,30,34,39) 

(訊號功能控制接腳)
4 : RS  --> 接 圈圈號碼 38 控制 "指令" 或 "資料" 讀寫模式
5 : R/W --> 接 圈圈號碼 40 控制 "讀出" 或 "寫入" 模式
6 : EN  --> 接 圈圈號碼 29 通知LCD模組執行動作

( 低 4bit 接腳,使用4 bit 操作模式時這四根接腳不用接,省下寶貴的GPIO)
7 : D0  --> X  
8 : D1  --> X  
9 : D2  --> X 
10: D3  --> X  

( 高 4bit 接腳)
11: D4  --> 接 圈圈號碼 31 
12: D5  --> 接 圈圈號碼 33 
13: D6  --> 接 圈圈號碼 35 
14: D7  --> 接 圈圈號碼 37 

(有附帶背光模組的LCD模組才會有這兩根電源接腳)
15: A --> 背光LED的電源, 接+3.3V或+5V...問老闆或查datasheet... 
          3.3v 接圈圈1或17, +5V 接圈圈2或4 
16: K --> 背光LED的接地 


當然這麼多條線和pin腳常常會接錯,而且接下來在LCD還沒做出正確的初始化動作之前是部會正常動作的。常常會搞不清楚是哪邊出問題。

比較好的選擇,可以去買下面這塊艾鍗學院設計的多功能IC擴充子版,在小小一塊板子內整合了I2C-EEPROM, SPI-FlashRAM, 紅外線接受器, 繼電器模組,兩個按鈕開關,USB-Serial模組,蜂鳴器,兩個LED, LCD2016連接埠。

非常適合拿來做各種常用通訊介面以及GPIO的程式練習。(天瓏書局有在販售)







電源打開背光LED應該就會亮了起來。然後就可以開始寫程式做練習了。



# 使用 RPi.GPIO 模組 import RPi.GPIO as GPIO # pin 的編號直接使用 40 pin 上的物理編號(1~40)也就是上圖的圈圈裡的號碼。 GPIO.setmode(GPIO.BOARD) # pin 的設定為 ittraining 的教育子板新版的設定 RS = 38 RW = 40 E = 29 D4 = 31 D5 = 33 D6 = 35 D7 = 37 # 設定指定的pin為 output GPIO.setup(E, GPIO.OUT) # E GPIO.setup(RS, GPIO.OUT) # RS GPIO.setup(RW, GPIO.OUT) # RW GPIO.setup(D4, GPIO.OUT) # DB4 GPIO.setup(D5, GPIO.OUT) # DB5 GPIO.setup(D6, GPIO.OUT) # DB6 GPIO.setup(D7, GPIO.OUT) # DB7 # 初始化這些pin的輸出電位為low GPIO.output(LCD_RS,0) GPIO.output(LCD_RW,0) GPIO.output(LCD_E,0) GPIO.output(LCD_D4,0) GPIO.output(LCD_D5,0) GPIO.output(LCD_D6,0) GPIO.output(LCD_D7,0)


下一篇 part2: 基本指令介紹

--part1: 硬體設定篇
--part2: 基本指令介紹
--part3: 初始化動作
--part4: 自訂字形

Python 控制 LCM模組的Code 可在 Github 下載。
https://github.com/itrobotics/python_LCM_control




1 則留言 :