I2Cシリアル・パラレルインタフェースボード付きのLCD(液晶ディスプレイ)2個セットを購入し、I2Cで複数のLCDを接続してみた。
購入したLCDは裏面にPHILIPS社のPCF8574が搭載されたI2Cシリアル・パラレルI/Fが接続されているものだった。
裏側にこのI/Fがあると操作しにくいので、ハンダを外して表面に移動した。
I2Cシリアル・パラレルインタフェースボードには、黄色線で囲んだA0・A1・A2のジャンパ端子があり、PCF8574の同名のピンに接続されている。各ジャンパの上側は赤色線で囲んだ抵抗でVccにプルアップされ、PCF8574に接続されている。各ジャンパの下側はGNDに接続されている。ジャンパがオープンの状態で”HIGH”、ジャンパを短絡すると”LOW”に設定される。
A0・A1・A2のうちA0を短絡して、LCDの複数接続をためしてみる。
PCF8574のデータシートの記載ではジャンパ設定とI2Cアドレスは次のとおりである。
A2 | A1 | A0 | アドレス |
HIGH | HIGH | HIGH | 27h |
HIGH | HIGH | LOW | 26h |
HIGH | LOW | HIGH | 25h |
HIGH | LOW | LOW | 24h |
LOW | HIGH | HIGH | 23h |
LOW | HIGH | LOW | 22h |
LOW | LOW | HIGH | 21h |
LOW | LOW | LOW | 20h |
A0を短絡してI2Cのアドレスを26hにしたLCDと、デフォルトのアドレス27hのLCDをArduinoに接続して別々の表示をしてみる。ソースは次のとおり。
#include <LiquidCrystal_I2C.h> void setup(){ } void loop(){ LiquidCrystal_I2C lcd26(0x26,16,2); // アドレス0x26でインスタンス生成 lcd26.begin(); // LCD初期化 lcd26.clear(); // LCDクリア lcd26.setCursor(0,0); // カーソルを0,0にする lcd26.print("LCD Multi disp"); // LCD表示 lcd26.setCursor(0,1); // カーソルを0,1にする lcd26.print("Address 0x26"); // LCD表示 LiquidCrystal_I2C lcd27(0x27,16,2); // アドレス0x27でインスタンス生成 lcd27.begin(); // LCD初期化 lcd27.clear(); // LCDクリア lcd27.setCursor(0,0); // カーソルを0,0にする lcd27.print("LCD Multi disp"); // LCD表示 lcd27.setCursor(0,1); // カーソルを0,1にする lcd27.print("Address 0x27"); // LCD表示 while(1); }
プログラムの内容は、ハードで設定したI2Cのアドレスを指定して、アドレス毎にインスタンスを生成し、それぞれのインスタンスに対して出力するものだ。
実行すると次のとおり、LCDに個別の表示を行うことができる。
ArduinoとLCDの接続は次のとおり。
LCD(27h) | LCD(26h) | Arduino |
Vcc | Vcc | 5V |
GND | GND | GND |
SDA | SDA | A4 |
SCL | SCL | A5 |
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |
![]() | ![]() | ![]() |