汎用キャラクタLCDのI2C化(4) LiquidCrystal互換ドライバ

I2C化LCDで使うドライバ(ライブラリ)は「ArduinoでI2C制御LCD ACM1602を使う(1)~ 」でACM1602に使ったものと同じものですが、初期化の部分がことなるため、まとめておきます。

●ライブラリの使用

使用するライブラリは”wI2cLcd”です。このライブラリは”wDisplay”に含まれています。またこのライブラリを使用する場合は、”Wire”の併用が必要です。リンク部分の例を示します。

#include <Wire.h>        // I2C
#include <wDisplay.h>    // wI2cLcdが含まれるライブラリのグループ

また、初期化時にWireの初期化も必要です。

  Wire.begin();       // I2C初期化
  // ToDo:wI2cLcdのインスタンスの初期化(後述)

●LCDの違いによるインスタンスの設定方法

コンストラクタの引数には”LCD_8BITMODE”と”LCD_4BITMODE”の2つがあります。

C51549とACM1602は”LCD_8BITMODE”、一般的な14ピンのLCDは”LCD_4BITMODE”を使います。

40文字×2行や、20行×4行というLCDもありますが、これらのLCDは一般的な16文字×2行のLCDと同じ14ピン構成で、4ビットモードで作動させられるため、”LCD_4BITMODE”となります。

インスタンス生成コードの例を示します。

// インスタンス定義の例
wI2cLcd lcd_acm(LCD_8BITMODE);   // ACM1602
wI2cLcd lcd(LCD_4BITMODE);       // 一般型
wI2cLcd lcd404(LCD_8BITMODE);    // 40文字×4行タイプ

●LCDの違いによる初期化の方法

初期化の引数はカラム数、行数、I2Cのスレーブアドレスの3つになります。この部分がLiquidCrystalと異なる部分です。この連載で掲載しているプログラムでは、一般型のI2C化LCDのI2Cアドレスは0×20、40文字×4行型のI2Cアドレスは0×30としています。これらはコントロール・プログラム(I2C化LCDセットのファームウェア)を修正すれば変更可能です。ACM1602は0×50固定で変更できません。

インタンスの初期化処理の例を示します。

// 初期化の例
lcd_acm.begin(16, 2, 0x50);    // ACM1602
lcd.begin(16, 2, 0x20);        // 一般型
lcd404.begin(40, 4, 0x30);     // 40文字x4行タイプ

●実際のプログラム(test_MulLcd.ino)

ACM1602、I2C化した16文字×2行のLCD、I2C化した40文字×4行のLCDを1つのI2Cバスに接続し、1つのノードからそれぞれに表示させる処理を掲載しておきます。

//
// 3つのI2C制御LCDを同時に使う場合のサンプルプログラム
//    copyright (c) 2013   http://www.wsnak.com
//
//    12/05/10
//

#include <Wire.h>       // I2C
#include <wDisplay.h>   // wI2cLcd

#define I2C_LCD_GENERAL  LCD_4BITMODE
#define I2C_LCD_ACM1602  LCD_8BITMODE
#define I2C_LCD_C51549   LCD_8BITMODE

// インスタンス生成
wI2cLcd lcd_acm(I2C_LCD_ACM1602);   // ACM1602
wI2cLcd     lcd(I2C_LCD_GENERAL);   // 一般型
wI2cLcd  lcd404(I2C_LCD_C51549);    // 40文字×4行タイプ

/*
  I2Cスレーブアドレス
    ACM1602 0x50
    I2C化LCD(一般型) 0x20
    I2C化LCD(40文字×4行型) 0x30
*/

char StrBuf[17];

void setup(void) {
  Wire.begin();       // I2C初期化

  lcd_acm.begin(16, 2, 0x50);
  lcd.begin(16, 2, 0x20);
  lcd404.begin(40, 4, 0x30);

  // 全クリア
  lcd_acm.clear();
  lcd.clear();
  lcd404.selectArea(2);     // 両エリア指定
  lcd404.clear();           // 全クリア

  // 文字列表示
  lcd_acm.print("ACM1602");
  lcd.print("S*1602");
  lcd404.selectArea(0);     // エリア0指定
  lcd404.print("C51549");
  lcd404.selectArea(1);     // エリア1指定
  lcd404.print("40x4");

  // カーソル位置指定
  lcd_acm.setCursor(5, 1);
  lcd.setCursor(5, 1);
  lcd404.setCursor(5, 1, 2);          // 両エリア

  // 文字列表示
  lcd_acm.print("TEST01");
  lcd.print("TEST02");
  lcd404.print("TEST03");
}

void loop(void) {
}

8、9行目でライブラリをリンクしています。

16~13行目で各I2C-LCDオブジェクトのインスタンスを生成しています。

30行目でWireを初期化しています。また、32~34行目でI2C制御LCDを初期化しています。

37~40行目で各LCDの画面をクリアしています。

43~48行目で各LCDへ固定の文字列を表示しています。

51~53行目で各LCDのカーソル位置を設定してます。

56~58行目で再びLCDへ文字を表示させています。

下写真は3つのI2C制御のLCDを1個のArduino(WSN282)で操作している様子です。この写真では、WSN282の上にWSN283が付いていますが、プログラム書き込み後は不要です。

I2cLcdMal

I2Cアドレスを変えれば、I2C制御のLCDを更に増やすこともできます。当然ながら、I2C制御の温度計なども接続できます。


Arduinoを使ったLCDや7セグメントLEDのI2C化の記事は書籍「Arduino実験キットで楽ちんマイコン開発」でも取り扱っています。なお、同書籍では上記写真のように試作機をブレッドボードで製作しましたが、現在は次のような専用の小型基板を用意しています。それぞれ、Arduinoを専用コントローラとして使っていますが、プログラムは通常のArduinoとして作成し、そのまま作動します。

参考文献

コメントは受け付けていません。