Raspberry Pi3 Model BでI2Cシリアルインターフェース付きのLCD1602の表示実験をしました。
LCD1602は、アマゾンから購入したSODIAL LCD1602で、I2Cシリアルインターフェースモジュールは、同じくアマゾンから購入したEasy Word Mallのもので、LCD1602の裏側にはんだ付けしてあります。
このモジュールには、PHILIPS社のPCF8574というI2Cバス・8ビットパラレルバスインターフェースICが使われています。つまり、I2Cシリアルバスのデータ受信し、ACK信号で8ビットパラレスバスに出力する、シリアル・パラレルインターフェースです。
まず、このモジュールのI2Cスレーブ・アドレスを調べました。0x27です。
PCF8574モジュールとRaspberry Piの接続は、LCD側が5V、ラズパイ側が3.3Vなので、I2Cレベル変換モジュールを間に入れました。
下の図の回路図ように接続しました。
テストに使ったスクリプトです。
--------------------------------
"""
I2C LCD1602 test
use PCF8574 I2C pararel interface
2017.6.12
JH7UBC Keiji Hata
"""
I2C LCD1602 test
use PCF8574 I2C pararel interface
2017.6.12
JH7UBC Keiji Hata
"""
# -*- coding:utf-8 -*-
from time import sleep
import smbus
import smbus
#PCF8574 LCD1602 connection
#P0 = LCD RS
#P1 = LCD R/W
#P2 = LCD E
#P3 = LCD BackLight
#P4 = LCD DB4
#P5 = LCD DB5
#P6 = LCD DB6
#P7 = LCD DB7
#P0 = LCD RS
#P1 = LCD R/W
#P2 = LCD E
#P3 = LCD BackLight
#P4 = LCD DB4
#P5 = LCD DB5
#P6 = LCD DB6
#P7 = LCD DB7
bus = smbus.SMBus(1)
LCD_addr = 0x27
LCD_EN = 0b0000100#LCD Enable
LCD_BL = 0b0001000#LCD BackLight
LCD_addr = 0x27
LCD_EN = 0b0000100#LCD Enable
LCD_BL = 0b0001000#LCD BackLight
LCD_CMD = 0x00#command mode
LCD_CHR = 0x01#character mode
LCD_CHARS = 16
LCD_LINE1 = 0x80#Line1 top address
LCD_LINE2 = 0xC0#Line2 top address
LCD_CHR = 0x01#character mode
LCD_CHARS = 16
LCD_LINE1 = 0x80#Line1 top address
LCD_LINE2 = 0xC0#Line2 top address
def LCD_write(bits,mode):
#High 4bits
data = (bits & 0xF0) | mode
bus.write_byte_data(LCD_addr,(data | LCD_EN | LCD_BL),(data | LCD_BL))
sleep(0.0001)#wait 100us
#Low 4bits
data = ((bits << 4) & 0xF0) | mode
bus.write_byte_data(LCD_addr,(data | LCD_EN | LCD_BL),(data | LCD_BL))
sleep(0.0001)#wait 100us
#High 4bits
data = (bits & 0xF0) | mode
bus.write_byte_data(LCD_addr,(data | LCD_EN | LCD_BL),(data | LCD_BL))
sleep(0.0001)#wait 100us
#Low 4bits
data = ((bits << 4) & 0xF0) | mode
bus.write_byte_data(LCD_addr,(data | LCD_EN | LCD_BL),(data | LCD_BL))
sleep(0.0001)#wait 100us
def LCD_init():
LCD_write(0x33,LCD_CMD)
LCD_write(0x32,LCD_CMD)
LCD_write(0x06,LCD_CMD)
LCD_write(0x0C,LCD_CMD)
LCD_write(0x28,LCD_CMD)
LCD_write(0x01,LCD_CMD)
sleep(0.001)
LCD_write(0x33,LCD_CMD)
LCD_write(0x32,LCD_CMD)
LCD_write(0x06,LCD_CMD)
LCD_write(0x0C,LCD_CMD)
LCD_write(0x28,LCD_CMD)
LCD_write(0x01,LCD_CMD)
sleep(0.001)
def LCD_text(message,line):
message = message.ljust(LCD_CHARS," ")
LCD_write(line,LCD_CMD)
for i in range(LCD_CHARS):
LCD_write(ord(message[i]),LCD_CHR)
message = message.ljust(LCD_CHARS," ")
LCD_write(line,LCD_CMD)
for i in range(LCD_CHARS):
LCD_write(ord(message[i]),LCD_CHR)
def main():
while True:
LCD_text("Hello World!",LCD_LINE1)
LCD_text("JH7UBC",LCD_LINE2)
sleep(3)
LCD_text("ABCDEFGHIJKLMNOP",LCD_LINE1)
LCD_text("1234567890123456",LCD_LINE2)
sleep(3)
while True:
LCD_text("Hello World!",LCD_LINE1)
LCD_text("JH7UBC",LCD_LINE2)
sleep(3)
LCD_text("ABCDEFGHIJKLMNOP",LCD_LINE1)
LCD_text("1234567890123456",LCD_LINE2)
sleep(3)
try:
LCD_init()
main()
except KeyboardInterrupt:
pass
------------------------------------------
LCD_init()
main()
except KeyboardInterrupt:
pass
------------------------------------------
テストの様子です。
とりあえず、初期化と表示だけの実験です。
他の関数、機能も加えて、近いうちに詳細をJH7UBCホームページに掲載したいと思います。