広報部です。こんばんは。
前回の続きです。
何故かうまくいかない
とりあえず落ち着いて、コマンドを1つずつ送ってみよう。
> i2cset -y 1 0x3F 0x00 0x38 > i2cset -y 1 0x3F 0x00 0x39 > i2cset -y 1 0x3F 0x00 0x14 > i2cset -y 1 0x3F 0x00 0x70 > i2cset -y 1 0x3F 0x00 0x56 > i2cset -y 1 0x3F 0x00 0x6c ・・・
i2cset は前回インストールしたi2c-toolsの中にあるI2C通信をするコマンド、0x3Fはつながっているデバイス(LCD)のアドレス、0x00はコマンドを表し(0x80は表示する文字)、その後が実際のコマンドのようです。
0x38、0x39くらいまではうまく言ってそうなのですが、0x14を送った辺りから、LCDのバックライトが消えてしまい、その後何も表示されず…
参照したサイトが違うLCD(8×2行LCD)だったので、コマンド体系が違うのかと思い、他のいろんなサイトを参照したり、データシートと思われる英文を読んだりして見ましたが、コマンド自体はそんなに間違っていないようにみえる…
I2C電圧レベル変換モジュールを使ってみる
調べていくと、ラズパイのプルアップ抵抗が小さいので、チップ抵抗を外せだのバスリピーターを使えなどという情報を見つけました。これで波形がきっちりHigh/Lowが出ずに誤動作しているのか?
さすがにラズパイ自体を改造するのは怖すぎるので、これを使って電圧レベルを安定させよう作戦に出ます。
それを繋いだのが、冒頭の写真にあるブレッドボードの部分です。
ラズパイの5V端子を電源にして、ラズパイ側からは3.3Vに、LCDには5Vを、という感じで回路を組んで、いざ、再挑戦!
結果:変化なしorz
間違いに気づく
どうしていいか途方に暮れつつ、Google先生に聞きまくります。
何度も同じサイトがヒットして、有力な情報がない中途方にくれていた時に、以下のサイトで気になる情報を見つけました。
LCD制御ICは4bitバスモードで接続することになります。
な、なんだってー!!
今まで必死になって、ハード要因も疑っていたのにそもそもの前提が間違っていたなんて!
よく見ると、
ここのサイトも4bitバスモードでやってますね…。
仕様書を見て4bitバスモードが有ることは知っていましたが、参照サイトが軒並み8bitでやっていたので、流石に4bitはないだろーとスルーしていました。
4bitモードで再挑戦
4bitモードだと8bitの場合のように簡単ではないようです。考えればできそうですが面倒です。
ここのサイトのPythonのコードは4bitバスモードでやっているっぽいので、これを流用させてもらった結果…
キタ━━━━(゚∀゚)━━━━!! できたー
ひとまず期待する結果が出てよかった!
なぜ4bitモードじゃないとダメなのかとか、コマンドの送り方とか詳しいことはまだよくわかりませんが、ひとまずうまく言った例ができてよかったです。
あ、でも本当の目的はIPアドレスの表示だからまだ先は長い
実はレベル変換は不要だったんじゃないか?
ひとまず忘れて今回はここまで!
通りすがりのものです。タイムリーなコメントでなくすみません。
>なぜ4bitモードじゃないとダメなのか
I2C基板(コバンザメのような基板)とLCDを制御するコントローラ(1602)との間が4bit分しか接続されていないからです
なぜ4bit分しか接続されないのか?
マイコン側からコントローラ(1602)を制御するために必要となる、RS(RegisterSelect)やEnable信号に4bit分を使ってしまっているから(LCDのバックライトOn/Offにも1bit使われています)。