LoginSignup
0
1

More than 3 years have passed since last update.

LCD 1602A をRaspberryPiで使う

Last updated at Posted at 2021-02-26

1602Aとは

電子工作キットとかに良く入っている(らしい)
ちっちゃい表示器。LCDと呼ばれるもの。
image.png

こんなやつ

使い方

I2Cシリアルインターフェイスがついているという事を前提に進める
(I2Cがついていない場合は、はんだ付けとかして付けた方が良い)
image.png

こんなやつ

I2C有効化

ここが参考になる

接続

  • VCC - pin2(5Vならどこでも良い)
  • GND - pin39(GNDならどこでも良い)
  • SDA - pin2
  • SCL - pin3

※上記はGPIOピンの番号
raspberrypi-gpio-04.png

コード

参考サイトのコードを少しいじってみた

sample.py

from LCD_1602A import LCD

lcd = LCD()
lcd.show_message("Hello World",1)
lcd.show_message("Good Night Japan",2)
input()

show_messageの第一引数に表示させたい文字(今のところ英数字のみ)、第二引数に表示させる列(1602Aの場合は1行目か2行目か)

inputはただ待ってるだけ
(デストラクタによって画面がクリアされるようにしているため)
(何かしら待つ処理が無いと一瞬文字が表示されて終わるだけ)

LCD_1602A.py
import smbus
import time

MAX_WIDTH = 16

ENABLE = 0x04

BYTE_TYPE = {"data": 1,
             "command": 0, }

LINE_ADDRESS = {"1": 0x80,
                "2": 0xC0, }

BACKLIGHT_SWITCH = {"on": 0x08,
                    "off": 0x00, }

TIMING = {"pulse": 0.0005,
          "delay": 0.0005, }


class LCD:

    def __init__(self, i2c_address=0x27, i2c_detect_number=1):
        self.i2c_address = i2c_address
        self.bus = smbus.SMBus(i2c_detect_number)
        self.init_lcd()

    def __del__(self):
        self.init_lcd()

    def init_lcd(self):
        self._send_byte(0x33, BYTE_TYPE["command"])
        self._send_byte(0x32, BYTE_TYPE["command"])
        self._send_byte(0x06, BYTE_TYPE["command"])
        self._send_byte(0x0C, BYTE_TYPE["command"])
        self._send_byte(0x28, BYTE_TYPE["command"])
        self._send_byte(0x01, BYTE_TYPE["command"])
        time.sleep(TIMING["delay"])

    def show_message(self, message, line):
        if (line == 1) or (line == 2):
            show_line = LINE_ADDRESS[str(line)]
        else:
            show_line = LINE_ADDRESS["1"]
        self._send_byte(show_line, BYTE_TYPE["command"])

        message = message.ljust(MAX_WIDTH, " ")
        for i in range(MAX_WIDTH):
            self._send_byte(ord(message[i]), BYTE_TYPE["data"])

    def _send_byte(self, _bytes, mode):
        bits_high = mode | (_bytes & 0xF0) | BACKLIGHT_SWITCH["on"]
        self.bus.write_byte(self.i2c_address, bits_high)
        self._enable_lcd(bits_high)

        bits_low = mode | ((_bytes << 4) & 0xF0) | BACKLIGHT_SWITCH["on"]
        self.bus.write_byte(self.i2c_address, bits_low)
        self._enable_lcd(bits_low)

    def _enable_lcd(self, bits):
        time.sleep(TIMING["delay"])
        self.bus.write_byte(self.i2c_address, (bits | ENABLE))
        time.sleep(TIMING["pulse"])
        self.bus.write_byte(self.i2c_address, (bits & ~ENABLE))
        time.sleep(TIMING["delay"])

もし、日本語を表示させたいなら
self._send_byte(ord(message[i]), BYTE_TYPE["data"])ここら辺の仕組みを考え直すことになりそう

文字が表示されない!!とき

I2Cシリアルインターフェイスのプラスねじ部分を回してバックライトの調整をする

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1