はじめに
20桁×4行のLCD LCD2004をArduinoで制御してHelloWorldしました。
検索するとよくヒットするLiquidCrystal_I2C.h
を使用するタイプです。
使ったもの
- LCD2004
- I2Cアダプタ(PCF8574T)
- Arduino UNO R2
LCD2004
アリエクで以下のLCDを1500円程度で購入しました。I2Cアダプタ付きです。
ビッグサイズを謳っており、iPhone12miniと同じくらいのサイズです。
LCDの制御ICは商品説明に
hd44780,st7066,eqvチップ
とあるので、業界標準になっている日立の超ロングセラー液晶コントローラーであるHD44780の互換ICが載っていると思われます。
I2CアダプタとLCDははんだ付けされておらず、別々で届きました。
LCDは18pinで以下のピンアサインになっています。
I2Cアダプタは16pinなので、pin1から合わせて、pin17,18がNCとなります。
I2Cアダプタ基板の表面しかパターンを追えてませんが、おそらく回路は以下記事と同じと思われます。
DB0 から DB3は未接続で、DB4 から DB7は繋がっているため4bitモードだと思われます。
I2Cアダプタ(PCF8574T)
PCF8574TはI2C接続のI/Oエキスパンダです。
青いポテンショメーター下の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 R2 | I2Cアダプタ |
---|---|
A4(SDA) | SDA |
A5(SCL) | SCL |
5V | VCC |
GND | GND |
プログラム
色々書きましたが、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);
}
ハマったところ
コントラスト調整しておらず表示が出ない。
表示が出ないと思ったら、コントラストが悪く出ていませんでした。I2Cアダプタのポテンショメーターで調整します。
参考
参考にさせていただき、ありがとうございました。
おわり:)