広報部自由研究 ー Raspberry Pi+1602A(16×2行LCD)でハマる(2)

広報部です。こんばんは。

前回の続きです。

何故かうまくいかない

とりあえず落ち着いて、コマンドを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アドレスの表示だからまだ先は長い
実はレベル変換は不要だったんじゃないか?
ひとまず忘れて今回はここまで!

One Reply to “広報部自由研究 ー Raspberry Pi+1602A(16×2行LCD)でハマる(2)”

  1. 通りすがりのものです。タイムリーなコメントでなくすみません。
    >なぜ4bitモードじゃないとダメなのか
    I2C基板(コバンザメのような基板)とLCDを制御するコントローラ(1602)との間が4bit分しか接続されていないからです

    なぜ4bit分しか接続されないのか?
    マイコン側からコントローラ(1602)を制御するために必要となる、RS(RegisterSelect)やEnable信号に4bit分を使ってしまっているから(LCDのバックライトOn/Offにも1bit使われています)。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です