ArduinoでI2C制御LCD ACM1602を使う(2) LiquidCrystal互換ライブラリ

今回は、Arduino標準のLiquidCrystalと互換性のあるドライバを紹介します。これを使うと、I2Cを意識する必要もなく、ほとんどLiquidCrystalと同じように使うことができます。

関連記事 「汎用キャラクタLCDのI2C化(1)

●互換ドライバ wI2cLcd

このドライバは前回の共通関数をライブラリ形式で呼び出せるようにしたものです。また、ArduinoライブラリのWireを併用します。このあたりは共通関数のときと同じです。
書籍「Arduino実験キットで楽ちんマイコン開発」で説明していますが、ACM1602のほか、I2C化した汎用16行×2行のLCDや40文字×4行の大型LCDにも対応しています。

なお、複数のライブラリを1つのヘッダファイルにまとめている関係で、ライブラリ名とヘッダファイル名が同じではありません。このwI2cLcdライブラリは”wDisplay.h“をリンクする必要があるので注意してください。

ライブラリのリンク部分のコードは次のようにします。Wireが必要です。注意してください。

#include <Wire.h>      // I2Cライブラリ
#include <wDisplay.h>  // I2C-LCDライブラリ

インスタンス生成は次のようにします。ここではインスタンス名は”lcd”としています。

wI2cLcd lcd(LCD_8BITMODE);         // ACM1602

このwI2cLcdは、親オブジェクトの”Print”を継承しているため、LiquidCrystalと同様に”print()”が使えます。共通関数の”string()” と単純に置き換え可能です。

余談ですが、”print()”にはオーバロード関数がいくつかあり、次のような記述が可能です。

lcd.print('a');     // 文字表示
lcd.print("abcd");  // 文字列表示
lcd.pirnt(123);     // 数値表示
lcd.print(5, 2);    // 2進数表示
lcd.print(string);  // 文字列表示

また、LiquidCrystalとほぼ互換性があります。ここが重要なのですが、LiquidCrystalで作った既存のプログラムは、一部を変更するだけでそのまま使用可能となります。

このライブラリはLiquidCrystalとはコンストラクタと”begin()”の働きで相違点があります。

Wireとの関係で、wI2cLcdACM1602()(コンストラクタ)内ではLCDの初期化処理ができないため、begin()で初期化するようにしてあります。そのため、”begin()”は省略はできません。見かけ上はLiquidCrystalと同じようになりますが、働きがすこし異なります。黙っていればわからないというような話ですが。

●サンプル・プログラム(test_ACM1602.ino)

前回掲載した共通関数型のものをライブラリを使用するように変更して少し手を加えたものを示します。

このスケッチは、ライブラリの”wDisplay”フォルダ内の”examples_wI2cLcd”フォルダに入っています。文字コードがUTF-8ですのでテキスト・エディタで開くときは注意してください。

//
//	汎用 I2C制御LCDドライバ (ACM1602,I2C化LCD) テスト
//		copyright (c) 2012,2013 http://www.wsnak.com
//		12/04/28
//
//		Wireと併用
//

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

//wI2cLcd lcd(LCD_4BITMODE);       // I2C化LCD
wI2cLcd lcd(LCD_8BITMODE);         // ACM1602

char StrBuf[17];

void setup(void) {
  byte adrs, i;

  Wire.begin();       // I2C初期化
  lcd.begin(16, 2);   // LCD初期化

  lcd.clear();        // 全クリア
  lcd.noBlink();      // カーソル点滅なし
  lcd.noCursor();     // カーソル表示なし

  delay(1000);

  byte num = 0;
	char ch;
  for(i = 0; i < 16; i++) {
		ch = 0x30 + num;
    lcd.print(ch);
    num = (num + 1) % 10;
  }

  lcd.setCursor(5, 1);          // カーソル位置
  for(i = 0; i < 10; i++) {
		ch = 0x30 + num;
    lcd.print(ch);
    num = (num + 1) % 10;
  }

  delay(1000);

  // 表示OFF/ON
  lcd.noDisplay();
  delay(1000);
  lcd.display();

  delay(1000);

  // 文字列表示
  lcd.clear();            // 全クリア
  lcd.print("test1");     // 文字列表示

  lcd.setCursor(5, 1);    // カーソル位置指定
  lcd.print("test2");     // 文字列表示

  delay(1000);

  // 数値文字列表示
  byte val = 0x56;
  sprintf(StrBuf, " 0x%02X", val);
  lcd.print(StrBuf);

  lcd.setCursor(6, 0);
  lcd.print("123 ");      // 文字列表示
  lcd.print(45);          // 数値表示
  lcd.print(' ');         // 文字表示
  lcd.print(5, 2);        // 2進数表示
}

void loop(void) {
}

共通関数使用時の”writeData()”、”string()”は”print()”に変更しています。直接数値を設定すると、文字としてではなく数値と認識されるため、一旦char型の変数”ch”へ代入してそれを渡しています。

67行目からは”Print”が正常に継承されて、オーバロードが生きているかを確認しています。

実行時の写真を示します。”101″は”5″が2進数で表示されたものです。

acm1602-2


参考文献 ACM1602の記事があります。
書籍「Arduino実験キットで楽ちんマイコン開発」 → 書籍紹介ページ

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