The Fool In The Valleyの雑記帳

-- 好奇心いっぱいのおじいちゃんが綴るよしなし事 --

Raspberry PiにLCDをI2Cでつなぐ

Raspberry Piでシステムを構築するとき、状態が表示される機能があるとなにかと便利です。そこでRaspberry PiLCDキャラクタ・ディスプレイを付けることにしました。
接続のための線が少なくて済むようにI2Cタイプのものを探すと、I/Fモジュールを利用してI2Cで制御できるようにしたものがAmazonから安価で入手できるのでそれを利用することにしました。
Amazon.co.jp: WayinTop 2004 LCD ディスプレイモジュール 20×4キャラクタ 緑 バックライト付き + IIC/I2C/TWI/SPI シリアルインターフェイス シリアルI/F モジュールポート : 産業・研究開発用品

I/Fモジュールは、写真のように、LCDの基板の裏側にはんだ付けで取り付けられるようになっています。
f:id:tfitv:20220314134844j:plain

I/Fモジュールを使うことにより、Raspberry Piとの接続は4本だけになります。
LCDのバックライト端子を短絡するとオンになるのですが、それだと明るすぎます。330Ω程度の抵抗を入れると丁度いいようです。また、100kΩの可変抵抗でコントラストを変えることができますが、調整できる範囲が狭いので少し使いにくさがあります。
f:id:tfitv:20220314160324j:plain

Raspberry Piにおいて、Raspberry Piの設定>インターフェイスでI2Cを有効化し、i2cdetectコマンドを使うと、接続のアドレスが分かります。0x27です。

pi@raspberrypi:~ $ i2cdetect -l
i2c-20	i2c       	Broadcom STB :                  	I2C adapter
i2c-1	i2c       	bcm2835 (i2c@7e804000)          	I2C adapter
i2c-21	i2c       	Broadcom STB :                  	I2C adapter
pi@raspberrypi:~ $ i2cdetect -y 1
     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: -- -- -- -- -- -- -- --                         
pi@raspberrypi:~ $ 

LCDに送るコマンドやデータの書き込み方を探すと、下記のOSOYOOのサイトに参考になる記事があります。
Raspberry Pi Starter Kit Lesson 13: I2C 1602 LCD « osoyoo.com
その中にi2c1602_lcd.pyというPythonのコードも紹介されています。中身を解析すると、
I2C_ADDR = 0x3F
LCD_WIDTH = 16
の部分を
I2C_ADDR = 0x27
LCD_WIDTH = 20
と変更してやれば使えそうなので、利用させてもらうことにしました。
i2c1602_lcd.pyをi2clcd2004.pyと名前を変えて保存し、同じディレクトリの中に下記のテスト用のプログラム lcdtest.py を作ります。

import i2clcd2004 as lcd
lcd.lcd_init()
lcd.lcd_string(" March 14 is Pi Day", lcd.LCD_LINE_1)
lcd.lcd_string("   3/14 --> 3.14", lcd.LCD_LINE_2)
lcd.lcd_string("I celebrate it with", lcd.LCD_LINE_3)
lcd.lcd_string("  Raspberry Pi 4B!", lcd.LCD_LINE_4)

下のビデオはその lcdtest.py を実行した結果です。
今日3月14日は「πの日」ですので、テストでこういう文言を表示させてみました。
www.youtube.com
ーーーーーーーーー
f:id:tfitv:20220314160028p:plain