Quantcast
Channel: JH7UBCブログ
Viewing all articles
Browse latest Browse all 440

Raspberry Pi I2C LCD1602

$
0
0
 Raspberry Pi3 Model BでI2Cシリアルインターフェース付きのLCD1602の表示実験をしました。

 LCD1602は、アマゾンから購入したSODIAL LCD1602で、I2Cシリアルインターフェースモジュールは、同じくアマゾンから購入したEasy Word Mallのもので、LCD1602の裏側にはんだ付けしてあります。

イメージ 1

 このモジュールには、PHILIPS社のPCF8574というI2Cバス・8ビットパラレルバスインターフェースICが使われています。つまり、I2Cシリアルバスのデータ受信し、ACK信号で8ビットパラレスバスに出力する、シリアル・パラレルインターフェースです。

 まず、このモジュールのI2Cスレーブ・アドレスを調べました。0x27です。

イメージ 2

 PCF8574モジュールとRaspberry Piの接続は、LCD側が5V、ラズパイ側が3.3Vなので、I2Cレベル変換モジュールを間に入れました。

 下の図の回路図ように接続しました。

イメージ 3

 表示テストのスクリプトは、前の記事LCD1602表示テストの記事Circuit Basicsというサイトなどを参考にして、自分なりに書いてみました。

 テストに使ったスクリプトです。
--------------------------------
"""
I2C LCD1602 test
use PCF8574 I2C pararel interface
2017.6.12
JH7UBC Keiji Hata
"""
# -*- coding:utf-8 -*-
from time import sleep
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
bus = smbus.SMBus(1)
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

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

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)

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)

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)
try:
    LCD_init()
    main()
   
except KeyboardInterrupt:
    pass
------------------------------------------
テストの様子です。
イメージ 4

 とりあえず、初期化と表示だけの実験です。

他の関数、機能も加えて、近いうちに詳細をJH7UBCホームページに掲載したいと思います。



Viewing all articles
Browse latest Browse all 440

Trending Articles