Raspberry Piを使ってプロジェクトを構築する際、情報を表示する手段としてLCDディスプレイがよく用いられます。
1602 LCDディスプレイは、16文字x2行の表示領域を持つ人気のあるLCDモジュールで、非常に安価で入手でき、システムのステータス表示などさまざまな用途に利用できます。
この記事では、Raspberry PiとI2C接続の1602 LCDディスプレイを使用して文字列を表示する方法を解説します。
Raspberry Pi(ラズベリーパイ)とは
Raspberry Pi(ラズベリーパイ)はイギリスのラズベリーパイ財団が教育用に開発したボードコンピュータです。
最新のRaspberry Pi 4では、ARMアーキテクチャを採用したBroadcom製の高性能SoC BCM2711を搭載しており、1.5GHzで動作するARM Cortex-A72が4コアとマイコンボードの中では非常に高速な処理能力を持っています。また、ユーザーがアクセス可能な40ピンのGPIOも搭載しており、外部ハードウェアを制御することが可能です。
詳細なスペック等は以下の記事で解説していますので、あわせてご覧ください。
今回使用するRaspberry Pi
今回使用するハードウェア はRaspberry Pi 3 Model A +です。
世代としては2023年5月現在、最新の1世代前であるRaspberry Pi 3Bと同じプロセッサを搭載しているモデルとなりますが、価格が5000円程度という非常に安価な設定となっているモデルです。
カメラを接続してガンガンディープラーニングのモデルをリアルタイムで動かしたい、といった高負荷の用途でなければ十分すぎるスペックなのでおすすめです。
使用するLCDモジュール
今回使用するLCDモジュールはこちらです。
同じICを使用しているLCDモジュールであれば、別メーカーの別製品でも同様の接続方法、プログラムで使用できます。
仕様
詳細な仕様は以下となります。
ライブラリのインストール
python3-smbusは、Python言語でI2Cバスを操作するためのライブラリです。
I2C (Inter-Integrated Circuit) は、2本の配線(シリアルデータ線SDAとシリアルクロック線SCL)を用いたシリアル通信プロトコルで、主に短距離での低速通信に用いられます。
コマンドプロンプトで以下のコマンドを実行してください。
sudo apt-get install python3-smbus
I2Cバスの確認
Raspberry Piに接続されたI2Cデバイスを検出するため、以下のコマンドを実行してください。
sudo i2cdetect -y 1
以下のようにI2Cデバイスのアドレス一覧が表示されます。0x27または0x20~0x27の範囲内にデバイスが表示されることを確認してください。もし表示されない場合は、配線が正しいか確認し、必要に応じて修正してください。
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
作成したPythonコード
ここからは実際にLCDに文字を表示するためのPythonの実装方法について解説します。
Pythonコード解説
今回は機能ごとに以下の関数を作成しました。
lcd_init(bus)
この関数は、LCDディスプレイの初期化を行います。引数にはSMBusオブジェクトが渡されます。初期化処理では、4ビットモードに設定し、2行表示、5×8ドットのフォントを設定します。その後、ディスプレイをオフにし、画面をクリアし、エントリモードを設定した後、ディスプレイをオンにします。
lcd_send(bus, data, mode)
この関数は、データをLCDディスプレイに送信します。引数にはSMBusオブジェクト、送信するデータ、および送信モードが渡されます。データは上位4ビットと下位4ビットに分割され、それぞれバックライト設定とともに送信されます。
lcd_toggle_enable(bus, value)
この関数は、EnableピンをトグルしてLCDディスプレイにデータを送信するために使用されます。引数にはSMBusオブジェクトと送信する値が渡されます。Enableピンをオンにした後、短い待ち時間を置いてからオフにします。
lcd_set_cursor(bus, col, row)
この関数は、LCDディスプレイのカーソル位置を設定します。引数にはSMBusオブジェクト、列番号、および行番号が渡されます。カーソル位置は、DGRAMアドレスを設定することで変更されます。
lcd_print(bus, text)
この関数は、LCDディスプレイに文字列を表示します。引数にはSMBusオブジェクトと表示するテキストが渡されます。テキストの各文字をループ処理し、lcd_send()関数を使ってLCDディスプレイに送信します。
main()
この関数は、プログラムのメイン処理です。まず、SMBusオブジェクトを作成し、LCDディスプレイを初期化します。次に、表示するテキストを用意し、lcd_set_cursor()関数でカーソル位置を設定した後、lcd_print()関数でテキストをLCDディスプレイに表示します。2行目にも同様にテキストを表示します。10秒間表示を維持した後、lcd_send()関数を使用してディスプレイをクリアします。
全体のソースコード
作成した全体のソースコードは以下の通りです。
import smbus
import time
# LCDの設定
LCD_ADDR = 0x27 # LCDのI2Cアドレス
LCD_WIDTH = 16 # LCDの文字数
LCD_BACKLIGHT = 0x08 # バックライトの設定
# HD44780コマンド
LCD_CLEAR_DISPLAY = 0x01
LCD_RETURN_HOME = 0x02
LCD_ENTRY_MODE = 0x06
LCD_DISPLAY_ON = 0x0C
LCD_DISPLAY_OFF = 0x08
LCD_CURSOR_ON = 0x0E
LCD_BLINK_ON = 0x0F
LCD_SET_DDRAM = 0x80
# PCF8574に接続されたLCDのピン
RS = 0x01
RW = 0x02
EN = 0x04
# LCDの初期化
def lcd_init(bus):
# 初期化シーケンス
lcd_send(bus, 0x33, 0) # 4ビットモードに設定
time.sleep(0.005)
lcd_send(bus, 0x32, 0) # 4ビットモードに設定
time.sleep(0.005)
# コマンド設定
lcd_send(bus, 0x28, 0) # 2行表示、5x8ドット
time.sleep(0.00015)
lcd_send(bus, LCD_DISPLAY_OFF, 0) # ディスプレイオフ
time.sleep(0.00015)
lcd_send(bus, LCD_CLEAR_DISPLAY, 0) # ディスプレイクリア
time.sleep(0.002)
lcd_send(bus, LCD_ENTRY_MODE, 0) # エントリモード設定
time.sleep(0.00015)
lcd_send(bus, LCD_DISPLAY_ON, 0) # ディスプレイオン
time.sleep(0.00015)
# データ送信
def lcd_send(bus, data, mode):
high = mode | (data & 0xF0) | LCD_BACKLIGHT # 上位4ビット
low = mode | ((data << 4) & 0xF0) | LCD_BACKLIGHT # 下位4ビット
# データを送信
bus.write_byte(LCD_ADDR, high)
lcd_toggle_enable(bus, high)
bus.write_byte(LCD_ADDR, low)
lcd_toggle_enable(bus, low)
# トグル処理
def lcd_toggle_enable(bus, value):
bus.write_byte(LCD_ADDR, value | EN) # Enable ON
time.sleep(0.0005)
bus.write_byte(LCD_ADDR, value & ~EN) # Enable OFF
time.sleep(0.0005)
# カーソル位置設定
def lcd_set_cursor(bus, col, row):
addr = LCD_SET_DDRAM | (col + 0x40 * row)
lcd_send(bus, addr, 0)
# 文字列出力
def lcd_print(bus, text):
for char in text:
lcd_send(bus, ord(char), 1)
# メイン処理
def main():
bus = smbus.SMBus(1)
lcd_init(bus)
# 文字列を表示
text_line1 = "Hello, world!"
text_line2 = "Raspberry Pi"
lcd_set_cursor(bus, 0, 0)
lcd_print(bus, text_line1)
lcd_set_cursor(bus, 0, 1)
lcd_print(bus, text_line2)
time.sleep(10) # 10秒間表示を維持
lcd_send(bus, LCD_CLEAR_DISPLAY, 1) # 表示をクリア
if __name__ == "__main__":
main()
実行結果
実行結果は以下の通りです。
Raspberry Pi にジャンパーワイヤーでLCDモジュールを接続し、先ほどのPythonプログラムを実行します。
main処理の中でtext_line1
、text_line2
の変数に設定した文字列がCLD上に正しく表示されました。
\ Pythonを自宅で好きな時に学べる! /
まとめ
今回は、Raspberry Piを使用してI2C接続の1602 LCDディスプレイに文字列を表示する方法を解説しました。
マイコンの内部情報をUIとして出力できるLCDは組込みシステムに非常に役立ちますので、ぜひ活用してみてください。
また、以下の記事で効率的にPythonのプログラミングスキルを学べるプログラミングスクールの選び方について解説しています。最近ではほとんどのスクールがオンラインで授業を受けられるようになり、仕事をしながらでも自宅で自分のペースで学習できるようになりました。
スキルアップや副業にぜひ活用してみてください。
スクールではなく、自分でPythonを習得したい方には、いつでもどこでも学べる動画学習プラットフォームのUdemyがおすすめです。
講座単位で購入できるため、スクールに比べ非常に安価(セール時1200円程度~)に学ぶことができます。私も受講しているおすすめの講座を以下の記事でまとめていますので、ぜひ参考にしてみてください。
それでは、また次の記事でお会いしましょう。
コメント