74,315 total views, 16 views today
Amazonで「OSOYOO(オソヨー) Raspberry Pi 学ぶ電子工作キット 初心者演習用パーツセット」を買ったら、その中に「1602 I2C Serial LCD Module(1602LCDキャラクタディスプレイ)」が入っていた。
これを「ラズベリーパイ3」で使おうとしたところ、思いのほか苦労した。
苦労はしたが、表示させることはできたので、その記録を残しておく。
苦労した原因
「1602 I2C Serial LCD Module(1602LCDキャラクタディスプレイ)」には、色々と癖があるようで、苦労する羽目になった。
具体的には、以下の点で苦労した。
- セットに含まれていたのはパーツのみで、説明等が一切ない
- もともとは、Arduino用のキットに含まれていたものをラズパイ用キットに流用している
- I2C接続である
- 5Vで動作させる必要がある
→使い方をネット上から探す必要がある
→ラズベリーパイで動作させたという情報があまりない
→ラズベリーパイで動作させた記事が見つかっても、I2C接続ではない(例:Raspberry Pi 2でキャラクタ液晶の制御、Raspberry PiとキャラクタLCDで遊んでみた)。
→しばらくの間、3.3Vで動作させようとしていた(3.3Vだと文字や数字の表示が見えない)
動作させるためのプログラム
上手く動作するプログラムをなかなか見つけることができなかったが、Using An I2C Enabled LCD Screen With The Raspberry PiのページにあるPythonのプログラムを使わせてもらうことで、LCDに表示ができるようになった(※英数字のみ)。
参考までに、動作したときの配線と、上記プログラムを基にした「日時」を表示させるプログラムを載せておく。
配線
ラズベリーパイへの入力が5Vになっているので、自己責任で。
ちなみに、ロジックレベル双方向変換モジュールというものを使って5Vから3.3Vに変換すれば問題ないらしい。
なお、OSOYOO(オソヨー)のセットにもロジックレベル変換モジュールは含まれているのだが、単方向の変換モジュールなのでI2C接続の場合には使えない。
「日時」表示プログラム
# -*- coding: utf-8 -*- #!/usr/bin/python from time import sleep from time import gmtime, strftime import datetime import smbus #initialize GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO.BCM) GPIO.cleanup() #read data using pin4 instance = dht11.DHT11(pin=4) # Define some device parameters I2C_ADDR = 0x27 # I2C device address #アドレスが違う場合もあるかもしれない LCD_WIDTH = 16 # Maximum characters per line # Define some device constants LCD_CHR = 1 # Mode - Sending data LCD_CMD = 0 # Mode - Sending command LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line LCD_BACKLIGHT = 0x08 # On #LCD_BACKLIGHT = 0x00 # Off ENABLE = 0b00000100 # Enable bit # Timing constants E_PULSE = 0.0005 E_DELAY = 0.0005 #Open I2C interface #bus = smbus.SMBus(0) # Rev 1 Pi uses 0 bus = smbus.SMBus(1) # Rev 2 Pi uses 1 def lcd_init(): # Initialise display lcd_byte(0x33,LCD_CMD) # 110011 Initialise lcd_byte(0x32,LCD_CMD) # 110010 Initialise lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size lcd_byte(0x01,LCD_CMD) # 000001 Clear display sleep(E_DELAY) def lcd_byte(bits, mode): # Send byte to data pins # bits = the data # mode = 1 for data # 0 for command bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT # High bits bus.write_byte(I2C_ADDR, bits_high) lcd_toggle_enable(bits_high) # Low bits bus.write_byte(I2C_ADDR, bits_low) lcd_toggle_enable(bits_low) def lcd_toggle_enable(bits): # Toggle enable sleep(E_DELAY) bus.write_byte(I2C_ADDR, (bits | ENABLE)) sleep(E_PULSE) bus.write_byte(I2C_ADDR,(bits & ~ENABLE)) sleep(E_DELAY) def lcd_string(message,line): # Send string to display message = message.ljust(LCD_WIDTH," ") lcd_byte(line, LCD_CMD) for i in range(LCD_WIDTH): lcd_byte(ord(message[i]),LCD_CHR) def main(): #「日時」を表示 # Main program block # Initialise display lcd_init() while True: local_time = datetime.datetime.now() lcd_string(strftime("%Y.%m.%d (%a)", gmtime()) , LCD_LINE_1) lcd_string(local_time.strftime("%H:%M"), LCD_LINE_2) sleep(1) local_time = datetime.datetime.now() lcd_string(strftime("%Y.%m.%d (%a)", gmtime()) , LCD_LINE_1) lcd_string(local_time.strftime("%H %M"), LCD_LINE_2) sleep(1) try: print('Start:' + str(datetime.datetime.now())) main() except KeyboardInterrupt: pass finally: LCD_BACKLIGHT = 0x00 #バックライトオフ lcd_byte(0x01, LCD_CMD) #表示内容クリア GPIO.cleanup()
日本語も表示させたい場合には、Raspberry PiとキャラクタLCDで遊んでみたや、Raspberry Piに接続したLCD(ACM1602NI)をPythonで動かすのページのプログラムが参考になるのだとは思うが、私は表示させることができなかった。
日本語表示させることが今後の課題である。
まとめ
- 「1602 I2C Serial LCD Module(1602LCDキャラクタディスプレイ)」を使うのに苦労した
- Using An I2C Enabled LCD Screen With The Raspberry Piのページに有るプログラムでLCDに英数字を表示させることができた
- 日本語の表示はまだできていないので、日本語表示させることが今後の課題