1602 I2C Serial LCD Moduleをラズベリーパイ3(Raspberry Pi 3)で使う

 35,362 total views,  3 views today

Amazonで「OSOYOO(オソヨー) Raspberry Pi 学ぶ電子工作キット 初心者演習用パーツセット」を買ったら、その中に「1602 I2C Serial LCD Module(1602LCDキャラクタディスプレイ)」が入っていた。


(おもて面)



(うら面)



これを「ラズベリーパイ3」で使おうとしたところ、思いのほか苦労した。


苦労はしたが、表示させることはできたので、その記録を残しておく。

苦労した原因

「1602 I2C Serial LCD Module(1602LCDキャラクタディスプレイ)」には、色々と癖があるようで、苦労する羽目になった。
具体的には、以下の点で苦労した。

  1. セットに含まれていたのはパーツのみで、説明等が一切ない
  2. →使い方をネット上から探す必要がある

  3. もともとは、Arduino用のキットに含まれていたものをラズパイ用キットに流用している
  4. →ラズベリーパイで動作させたという情報があまりない

  5. I2C接続である
  6. →ラズベリーパイで動作させた記事が見つかっても、I2C接続ではない(例:Raspberry Pi 2でキャラクタ液晶の制御Raspberry PiとキャラクタLCDで遊んでみた)。

  7. 5Vで動作させる必要がある
  8. →しばらくの間、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に英数字を表示させることができた
  • 日本語の表示はまだできていないので、日本語表示させることが今後の課題