【Raspberry Pi】LCDディスプレイで好きな文字を表示させる方法

【ラズパイ】lcdで好きな文字を表示させる方法

こんにちは! けい(Twitter)です!

今回は、ラズパイでLCDを使う方法についてまとめていきたいと思います。

必要なもの

ラズパイ本体

今回はラズパイ4で動作を行いましたが、どんなモデルでも大丈夫です。

LCD

LCDは複数のピンがあり全てを繋ぐのは大変なので、I2C接続が可能になっているモジュールがおすすめです。
これであれば、ラズパイと4本の線だけで充分です。

ラズパイの設定(I2C)

ラズパイでI2Cを有効にする必要があります。
この時点でI2Cを有効にした覚えがある方は読み飛ばしてください。

ラズパイの電源を点けてください。

「設定」 > 「Raspberry Piの設定」をクリックします。

このような画面が開くので、「インターフェース」の項目にある「I2C」を有効にしてください。

接続方法

ラズパイとI2C通信を行うので、2本の電源線と2本の信号線の、計4本で接続完了です。

上の画像では、「hello」と出ていますが、実際にはバックライトが点灯するだけでこの時点では何も表示されません。

接続を確認する

ラズパイにI2Cデバイスを接続したときに、ラズパイ側で接続を確認する方法があります。

上の回路図で接続が完了したら、次のコマンドを実行しましょう。

$ i2cdetect -y 1

下の画像のように出力されれば、ラズパイに認識されています。

これは、I2Cデバイスのアドレスを確認するコマンドで、今回私が接続しているLCDデバイスのアドレスが0x27だということが分かりました。

ここで確認するアドレスは後々重要なので、確認しておきましょう。

プログラム

サンプルプログラムのダウンロード

プログラムを自分で書いてもいいんですが、電子工作キットなどを作っている「osoyoo」のサンプルコードがあるので、そちらを拝借させていただきます。

次のコマンドでサンプルプログラムをダウンロードします。

$ wget http://osoyoo.com/driver/i2clcda.py

サンプルプログラムの中身

ここで注意することはアドレスです。

デフォルトで I2C_ADDR = 0x27 となっています。(12行目)

もし、お使いのLCDのアドレスが違うアドレスだった場合は、これを書き換える必要があります。
先ほどのアドレスを確認するコマンド「i2cdetect -y 1」で画面に出力されたアドレスに書き換えます。

# _____ _____ _____ __ __ _____ _____ 
#|     |   __|     |  |  |     |     |
#|  |  |__   |  |  |_   _|  |  |  |  |
#|_____|_____|_____| |_| |_____|_____|
#
# Project Tutorial Url:http://osoyoo.com/?p=1031
#  
import smbus
import time

# Define some device parameters
I2C_ADDR  = 0x27 # I2C device address, if any error, change this address to 0x3f
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_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th 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
  time.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
  time.sleep(E_DELAY)
  bus.write_byte(I2C_ADDR, (bits | ENABLE))
  time.sleep(E_PULSE)
  bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
  time.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:

    # Send some test
    lcd_string("Created by         <",LCD_LINE_1)
    lcd_string("Osoyoo.com        <",LCD_LINE_2)

    time.sleep(3)
  
    # Send some more text
    lcd_string("> Tutorial Url:",LCD_LINE_1)
    lcd_string("> http://osoyoo.com",LCD_LINE_2)

    time.sleep(3)

if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  finally:
    lcd_byte(0x01, LCD_CMD)

実行

上のダウンロードしたサンプルコードを次のコマンドで実行します。

$ python3 i2clcda.py

このような文字が表示されれば、正しく動作しています。

ここで文字が表示されなければ、可変抵抗を回してバックライトの調節をしたり、アドレスを再度確認してみてください。

好きな文字を表示させる

ダウンロードしたサンプルコードを使って、自分の表示させたい文字や数字なども、勿論表示させることができます。

pythonのモジュールのインポート機能を使って、ダウンロードしたコードの関数を使うことができます。

新しくpythonファイルを作ります。

先ほどダウンロードした「i2clcda.py」と同じディレクトリ内に、下のコードをコピペしてpythonファイルを保存してください。

import i2clcda as lcd

lcd.lcd_init()
lcd.lcd_string("METAELE 12345#", lcd.LCD_LINE_1)

たった3行で自分の好きな文字を表示させることができます。

先ほどのコードに1行追加して2行目も表示させることができます。

import i2clcda as lcd

lcd.lcd_init()
lcd.lcd_string("METAELE 12345#", lcd.LCD_LINE_1)
lcd.lcd_string("lcd Display", lcd.LCD_LINE_2)

まとめ

今回は、ラズパイでLCDディスプレイを使う方法についてまとめてみました。

LCDディスプレイは他のセンサーなどと組み合わせて使うと面白い使い方ができます。
そんなときは、今回紹介したモジュールのインポートを使ってコードを書いてみてください。

前回、温度センサーをラズパイで使う方法についてまとめてみましたが、温度センサーの値を表示するようなプログラムを作ったら面白そうですね。

では!