はじめに

20桁×4行のLCD LCD2004をArduinoで制御してHelloWorldしました。
検索するとよくヒットするLiquidCrystal_I2C.hを使用するタイプです。

使ったもの

  • LCD2004
  • I2Cアダプタ(PCF8574T)
  • Arduino UNO R2

LCD2004

アリエクで以下のLCDを1500円程度で購入しました。I2Cアダプタ付きです。
ビッグサイズを謳っており、iPhone12miniと同じくらいのサイズです。

https://ja.aliexpress.com/item/1005007298503814.html
alt text

LCDの制御ICは商品説明に

hd44780,st7066,eqvチップ

とあるので、業界標準になっている日立の超ロングセラー液晶コントローラーであるHD44780の互換ICが載っていると思われます。
I2CアダプタとLCDははんだ付けされておらず、別々で届きました。
LCDは18pinで以下のピンアサインになっています。

alt text

I2Cアダプタは16pinなので、pin1から合わせて、pin17,18がNCとなります。

alt text

alt text

I2Cアダプタ基板の表面しかパターンを追えてませんが、おそらく回路は以下記事と同じと思われます。

PCF8574Tを使ったLCD制御

DB0 から DB3は未接続で、DB4 から DB7は繋がっているため4bitモードだと思われます。

I2Cアダプタ(PCF8574T)

PCF8574TはI2C接続のI/Oエキスパンダです。
alt text

青いポテンショメーター下のA0,A1,A2の空きランドでI2Cのスレーブアドレスを決定しますが、デフォルトでは3つとも開放なのでアドレスは0x27となります。

PCF8574Tのデータシートの7.1.1 Address mapsをみるとI2Cアドレス(A0から6の7bit)のA0,A1,A2がHIGH(開放でVDDとなりHIGH)となり、7-bit hexadecimal address without R/Wが27h(=0x27)となることがわかります。A3~6のbitは固定です。

Arduino IDEのスケッチ例-Wire-i2c_scanner.inoを使用して、アドレスが0x27であることが確認できました。

他のデバイス(STM32など)はアドレスはR/Wも含めた8bitで送信しますが、ArduinoはR/Wを含めず7bitです。Wire.hがそのようになっています。(LiquidCrystal_I2C.hではWire.hを使用しています)

また、I2Cは信号線のプルアップが必要ですが、Wire.hでは内部プルアップしてくれるので外付け抵抗が不要です。 なので、ただ線をつなぐだけでOKです。

接続

ArduinoとI2Cアダプタを4本接続するだけです。

Arduino UNO R2I2Cアダプタ
A4(SDA)SDA
A5(SCL)SCL
5VVCC
GNDGND

alt text

プログラム

色々書きましたが、LiquidCrystal_I2C.hを使う場合は細かいことは意識することなく表示することができます。(LiquidCrystal_I2C.hがいい感じにやってくれます)

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4); // スレーブアドレス0x27 20桁4行

void setup() {
  lcd.init(); 
  lcd.clear();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("0 Hello, world!");
  lcd.setCursor(0, 1);
  lcd.print("1 Hello, world!");
  lcd.setCursor(0, 2);
  lcd.print("2 Hello, world!");
  lcd.setCursor(0, 3);
  lcd.print("3 Hello, world!");

}

void loop(){
  lcd.setCursor(0, 0);
  lcd.print("0 Hello, world!");
  delay(1000);
  lcd.setCursor(0, 0);
  lcd.print("1 world, world!");
  delay(1000);
}

alt text

ハマったところ

コントラスト調整しておらず表示が出ない。

表示が出ないと思ったら、コントラストが悪く出ていませんでした。I2Cアダプタのポテンショメーターで調整します。

参考

参考にさせていただき、ありがとうございました。

おわり:)