[ラズパイ] LCD1602をI2C接続し日本語(カナ)を表示させる

 最近、注文した部品が立て続けに届き始めたかな。たぶん即位礼正殿の儀が終わって、税関の流れがスムーズになったせいかなと勝手に思ってるw。


 上のキットにはLCD1602(LEDバックライト付…後から知った)が入っている。

 単品購入だとこのあたりと思う。しかし、この商品、I2Cにつなげるためのシリアルインターフェイスがついていない。I2Cでなくてもつなげることはできるけど、何か、結構大変そうだし、いかんせん情報が古い。やっぱしI2Cでつなげたい。

 I2Cのインターフェースボードを別途購入する必要がありそう。安いやつは、中国・台湾発送なので忘れるぐらい遅いから注意してね(20日はかかる)。急ぎなら、国内発送のものを注文したほうがいいね(何回も言ってるけどw)。あと、セットのもあるからそっちのほうが手っ取り早いかも。迷わず、中華・台湾発送をポチるww

 下調べで見つけた上のサイトを見ると・・5VのI2Cをラズパイに直結やないかーいww。まぁ、こういうサイトは結構あって、結果動けばいいんだけど、複数デバイスをI2Cにつないだ場合の動作不良とかラズパイ本体が不安。LCDのI2Cインターフェースは、ほとんどがArduino対応品の5Vなので、ラズパイのI2Cにつなげるには3.3Vの双方向のロジックレベルコンバータを挟むのがセオリーとのことでアマゾンを捜索。

 早速購入も相変わらず安さにつられ、中華・台湾発送をポチリ待ちぼうけを食らうw。でもいいんです!LCDはキットに入ってたし、136円+360円/5個 = 208円で遊べるんだからっ

 上のサイトをよく読んで接続。このロジックレベルコンバーターは4チャンネルだけど、今回はI2CでSCA、SDLの2線のみなので、5V側HV3とHV4にシリアルインターフェイスのSCA、SDLをつないで3.3V側のLV3、LV4から対応するSCA、SDLをラズパイにつなぐ。HVには5V、LVには3.3Vの電源をつないでGNDを取り廻せば完成。

 でもこれ、ほんとに3.3Vと5Vを変換してるんでしょうか?w。確認にはオシロスコープしかないと思うんですが、持ってないんでわかりません。購入したらチェックしてみますけど、信じて次行きますwww

 LCD1602とシリアルインターフェースは半田でつけたかったけど、すでに両方ともにピンヘッダがついていたので外すのも面倒だったからブレッドボードで結線した。LCD1602の表面の傷防止フィルムがついたままという貧乏臭さは許してください。で、配線を確認してラズパイ電源オン!!

 とりあえず、LCDのバックライトが光りました。この時点で初めてバックライト付きだと気づきますw。で、I2Cをつないだ時の儀式を行います

 そいで、ちゃんと認識されているかを確認します。0x27で認識しているようです。このシリアルインターフェースのI2Cアドレスは0x27と0x3fの2パターンがあります。今回は0x27でした。とりあえず、なんでもいいんで最初に文字を表示させたいですね。

上のサイトも接続が・・・5V-I2C直結ですが・・・、まぁいいとして・・w、参考としてテストプログラムをダウンロードしてみます。0x27なので

ちなみに0x3fの場合は

 ターミナル開いた時のカレントフォルダにダウンロードされてしまうので、デスクトップに任意のフォルダでも作って、そこでターミナルを開くか移動して上のコマンドを実行しましょう。i2clcda.pyができるので、ThonnyでもMuでもいいから開いて実行してみましょう。

動画のように交互表示されればOK。見えないときはシリアルインターフェースにある濃度調整の可変抵抗を回してみよう。

次に、自分の好きな文字を簡単に表示させるお手軽なライブラリをさがす(オイw)。

こんなん見つかったので、早速導入。LCD.pyのみをダウンロードしてもいいだろうし、任意のディレクトリで

でクローンして、どこでもいいのでLCD.pyをインポートしてやればいいと思う。下の例は./LCD1602I2C/LCD.pyをインポートした例。

 このライブラリは外人さんが作ったので日本語には対応していない。カタカナを入れても文字化けやら正常に表示できない。これを解決するのに参考にしたのが下のサイト。

 このサイトを参考に、LCD.pyのLCDクラスのmessageメソッドを若干改造する。ついでに全角・半角カナどちらでもOK、表示できない文字の場合は塗りつぶし表示という仕様にした。とりあえずmessageメソッド純正コードと日本語に対応させたjmessageメソッドを掲載します。

 jmessageメソッドを実装するにあたり、codesのコード列がズレてた部分があった(LCD1602の種類差なのかも…)ので修正している(不躾ながらコメントに連絡させていただいた所、訂正して頂いたようです)。このcodesは半角カナ、全角数字に対応してないので前処理用に半角・全角変換のライブラリmojimojiをインストールしておく必要がある。

でインストール後、「import mojimoji」で使えるようになる。

 jmessageメソッドをLCD.pyに付け加えてmojimojiインポート・インストールをして、以下のコードを実行。LCD1602I2CmodのフォルダにLCD.pyを改変したものを入れておいてある。

「千」「円」とかは、コード表にある文字なので使える(参考サイトにコード表があるので参考にされたし)。全角半角カナ、全角数字も表示で来ているようなので、良しとした。ハイエナ的コード感があるけど、参考にしたサイト様には感謝です。

後日・・・・

なんか、ライブラリのLCD.pyを、直いじりはやっぱり気になってしょうがないので、LCDを継承したJLCD.pyを作り、messageメソッドをオーバーライドしときました。基本ハイエナは変わってませんが…w

JLCD.py

lcdtest.py

これで、LCDクラスと同じように使えて日本語が表示できるようになった。