書籍に掲載されていたLCDを使用するケース。
表示確認はけっこう前にしたのだけど、ライブラリやドライバの中身の確認がようやくできたので整理しておく。
so1602aはほかの方も結構掲載しているので、作業最初は省略。
◆接続確認、機器のアドレスの確認
i2cdetect -y 1
説明書にも書いてあるけど、接続するi2cアドレスは0x3c
◆ラズパイの結線
こんな感じ。
◆実行の概要(用意するプログラム)
・ライブラリ
・LCD表示の実行
上記の2段構え
◆so1602のライブラリ
当初は書籍のライブラリを使っていたけど、ちょっと難解だったのでgithubで公開されていたものを使うことにした。こっちのほうがシンプルで分かりやすい。
ただ、sysでバージョン確認したり、ユニコードのライブラリは必要ないのでコードから消しちゃった。まいっか、動くし。
スクリプトはこっちにまとめておく
◆実行結果の様子
◆感想
初心者はつらいな…ある程度スクリプトを触ったことがあるといっても、VBAをちょっと触った程度の人では無理だよな…こういう類はハードルが高いってのもうなずける。
触っていく中で以下のようなことを同時に調べたりするので、やっている最中は頭がパニックになる。。。
・ライブラリの中身
→pythonのクラス概念
→for分の中で配列から1つずつ取り出している、、、など。
・データシート把握
→2進数(ビット立てる)
→i2cのデータ送信のイメージ
→IS,RE,SDって何よ?(書いてあったけど、使わなくてもいいので今回はパス)
→そもそもすべて英文…読むの疲れる。
ビットの立て方がいまいち掴みづらくて・・・
で、やっぱり読んでいってようやくって感じ。
この辺はしっかり読んだ方がいいよな。
↑ これが一番キモだと思う。
Slave address=機器のi2c接続アドレスで「0x3c」
R/W#:ReadかWriteするかだけど、表示はwriteだけなので気にせず「0」で。
Co:ControlByteと表記されているけど、要はここが命令で使用するところ。
Co:後に続く命令が複数の場合は「1」って書いてあるけど、基本的にひとまとまり1回ずつなので気にせず「0」で。
D/C#:Data/Commandで、データシートを見ると、writeの時に「1」を立てるくらいで、ほかはあんまり使ってない(詳細設定では使ってるけど)。なので、ここでは、書き込みの際は「1」で、あとは「0」と捉えるだけでいい。
となると、あとは単純なDataByteだけ。
◆データ送信の簡単なイメージ
[SlaveAddress][R/W#][ack]~
[Co][D/C#][0][0][0][0][0][0][ack]~
[0][0][0][0][0][0][0][0][ack]
上記のように1列の数珠つながりの塊のデータ(パケット?)が送信されて、受け取ったCPUが良い感じ~に処理してくれる。
で、書き込みの場合、
SlaveAddress=0x3c, D/C#=1なので、
[0000011][0][ack]~
[0][1][0][0][0][0][0][0][ack]~
[0][0][0][0][0][0][0][1][ack](←この8bitは任意の文字列データ)
Clear(0x01)コマンドの場合、
SlaveAddress=0x3c, D/C#=0,
[0000011][0][ack]~
[0][0][0][0][0][0][0][0][ack]~
[0][0][0][0][0][0][0][1][ack](←ここがコマンド)
コマンドはほかに下記がある。
Return home = 0x02 =10b
Display On = 0x0c = 1100b
Set DDRAM address = 0x80 = 1000000b
※詳細はデータシート参照
▼具体的に、1行目の先頭に文字を書き込む場合は
・まずは書き込み場所の指定から。
「0x80 + 0x00」・・・0x80はDDRAM address指定するコマンド、0x00は場所。
[0000011][0][ack]~(←0x3c,0)
[0][0][0][0][0][0][0][0][ack]~
[1][0][0][0][0][0][0][0][ack](←0x80 + 0x00)
・次に書き込み命令をする
書き込み=0x40 =1000000b
文字=0x41 =1000001b
ビットのイメージは↓
[0000011][0][ack]~(←0x3c,0)
[0][1][0][0][0][0][0][0][ack]~(←書き込み0x40)
[0][1][0][0][0][0][0][1][ack](←文字0x41)
▼2行目、左側の先頭に文字列を入れる場合は、
「0x80 + 0x20」・・・になる。
[0000011][0][ack]~(←0x3c,0)
[0][0][0][0][0][0][0][0][ack]~
[1][0][1][0][0][0][0][0][ack](←0x80 + 0x20)
▼文字の書き込み
ただ、ライブラリでは
としているので、文字をいったん配列へすべて格納してから、最後にどーんとディスプレイに書き込みをしている。(1文字ずつ書き込む方法もある)
◆DDRAM address
表示する場所はこんな感じ
↑ 説明書に書いてあるが、とにかくよみづらい…老眼にはつらいな。
◆主要データシート抜粋
↑ この表について、
D0~D7で8bitというのは理解したけど、その上のR/W#、D/C#とか、これらはどこでビット立てているのだろう・・・と最初ハマった。どこやねん!
って、
Figure5-7 i2c bus data formatにしっかり書いてあったね…。
資料はなめるようにしっかり読みなさいってことか。
今回購入したのはこちら。
ここをちゃんと読んだほうがいいよね。そりゃそうだ。
有機ELキャラクタディスプレイモジュール 16×2行 白色: ディスプレイ・表示器 秋月電子通商-電子部品・ネット通販 (akizukidenshi.com)
・データシート…抜粋って感じ
・コントローラIC(US2066)のデータシート(参考資料)…これが詳しく書いてある
・取り扱い説明書(秋月電子作成)…文字がつぶれて一部分かりづらい
◆深堀すると難しいが、基礎は身につく。
ラズパイでLCDディスプレイ工作は簡単っぽいけど、実はけっこうハードル高いかも。
ブレッドボード上の結線は抵抗を入れる必要もなくただ接続するだけなのでそんなに難しくない。いや、ま・っ・た・く・簡・単・だっ・・・て感じ。
しかし、実際にはライブラリがどうなっているのか、LCDを動かしているデータシートを把握して、どのようにスクリプトに落とし込んでいるのか、などをゼロから考えようとするとかなーりヤバい。あって良かったライブラリ、サンキュー作成者様だ。
道筋を先駆者の方々が作って頂いているので、結果を確認しながら原理を勉強していけるのは非常に助かるね。今回は、pythonのclass概念、i2c通信の原理、などがかなーり勉強になった。
あ~疲れた。ビット立てるところはホントに疲れた。
かなりカロリー消費した…瘦せたかな?
◆SUNLIKEって?
台湾(台中)にある会社さんみたい。
台湾のIT技術力ってすごいよね。