Raspberry Pi 4 & Python で I2C LCD Display を動かしてみる
ラズパイ4で遊びながらPythonを勉強していきます。
勉強と言ってもとりあえず、サンプルで付属していたコードを読み解いて、動かすだけです。最初は、他人のコード見てみる→真似するでも十分プログラミングの勉強にはなりますよね。
初歩過ぎてラズパイ4でやった記事をみかけませんでした(笑)
そういう意味でも、自分の記録用として残します。
今回の題材:I2C LCD Display
既にご紹介済みの電子工作キットに付属していた『I2C LCD Display』を利用します。
最終的には、こんな感じに表示されます。
配線
4端子 接続します。
- VCC
- GND
- SDA1
- SCL1
配線は、至ってシンプル簡単です。
端子名は、付属してるGPIO拡張ボードに書いてあるので、よく確認して接続しましょう。
一応安全のため、電源切れた状態で接続することをおススメします。
ラズパイ環境設定
I2C通信の有効化
ターミナルで設定する記事を見かけました。今回はGUI上からでもできたのでそちらを紹介します。
RaspberryPiの設定を起動し、インターフェスのタブにある、I2Cを有効にします。
[RapberryPiの設定]
[インタフェース-I2C]
ライブラリのインストール
既に最新版がインストール済みかもしれませんが、念のため、ターミナルで次のコマンドを実行し、インストールされていることを確認しました。
sudo apt-get install -y python-smbus i2c-tools
I2C通信のアドレス確認/接続確認
I2C通信で利用されているアドレスを確認します。
ターミナルで下記コマンドを実行し、確認できました。( 最後 1ではなく、0を指定するパターンもあるそうです)
sudo i2cdetect -y 1
実行後に下記のように表示され、番号が表示されているところが利用するアドレスとなるようです。「0x27」でした。ハードによって違うことがあるみたいなので自分で確認しましょう。
[実行結果]
Pythonコードの確認
付属するディスクにPythonのソースコードが有りましたので、こちらを使います。
ファイル名:i2c1602.py
ソースコードを見ていくとこんな感じ。
#定数定義 #・・・ #I2Cインタフェースオープン def LCD初期化関数(): #初期化コマンド1 #初期化コマンド2 #左寄せに設定 #カーソル表示なし・点滅なし設定 #4bit 2Line設定 #ディスプレイクリアコマンド def LCDバイトデータ送信関数(1byteデータ, モード): #1byteデータから上位4ビットを抽出し、モードを設定する #1byteデータから下位4ビットを抽出し、モードを設定する #上位4bitを書込み #LCD送信データ確定関数(上位4ビット) #下位4bitを書込み #LCD送信データ確定関数(下位4ビット) def LCD送信データ確定関数(送信データ): #0.0005sディレイ #送信データ+ENABLE High 書き込み #0.0005sディレイ #送信データ+ENABLE Low書き込み #0.005sディレイ def LCD表示文字列設定関数(メッセージ, 表示行): #入力メッセージ左寄せにして、16バイト長にし、空きはスペースで埋める #LCDバイトデータ送信関数(表示行, コマンドモード) #16バイト分ループ #LCDバイトデータ送信関数(メッセージXバイト目, 文字モード) def main(): #LCD初期化関数 呼び出し #無限ループ: #LCD表示文字列設定関数("表示したい文字列1", 1行目) #LCD表示文字列設定関数("表示したい文字列2", 2行目) #3s待機 #LCD表示文字列設定関数("表示したい文字列3", 1行目) #LCD表示文字列設定関数("表示したい文字列4", 2行目) #3s待機 if __name__ == '__main__': try: main() except KeyboardInterrupt: pass finally: #ディスプレイクリアコマンド
LCDのコマンドは、下記を参考にさせていただきました。
https://mil.ufl.edu/3744/docs/lcdmanual/commands.html
まだまだ簡単なので読みやすいですねぇ。
ソースコードは、コンソールで下記を実行することで、ほぼ同様のソースコードが入手できるようです。
wget http://osoyoo.com/driver/i2clcda.py
注意点としては、定数定義部分を書き換えることです。
「I2C_ADDR = 0x3F」の部分を事前に調べたI2C通信アドレスに書き換えましょう。
私の場合、0x27になります。
おまけ
日付と現在時刻表示してみました。
Pythonでの日付・時刻の扱い、型変換もついでに勉強できた。