●Arduinoで1602 I2C液晶モジュールを使う

■ディスプレイとI2C液晶モジュールの接続

I2Cシリアルインターフェイスモジュールと1602ディスプレイ
KKHMF DC 5V 1602 LCD ディスプレイモジュール 16×2キャラクタ LCDブルーブラックライト
EasyWordMall 1602 LCD ブラック IIC/I2C/TWI/SPI シリアル インタフェース ボード モジュール
この二つをAmazonで購入しました。


背中合わせにしてこの様に取り付けます


裏から見た図


はんだ付けで取り付けました。



■Arduinoとの接続

I2Cシリアルインターフェイスモジュールから出ているVCCをArduinoの5Vに、GNDをArduinoのGNDに接続します。
VCCとGNDを逆に接続すると壊れますので注意が必要です。
ArduinoにSDAとSCLのピンが無い場合にはA4、A5の汎用ピンを使いI2C通信を行います
A4、A5はライブラリによって指定されているようです。

GNDをArduinoのGND
VCCをArduinoの5V
SDAをArduinoのA4
SCLをArduinoのA5

以上の4本の線を接続します。
これでArduinoとの接続ができました。


■ライブラリの準備

LiquidCrystal I2Cライブラリを利用することで簡単に文字を出力することができます。

開発環境のArduino IDEを起動させて、メニューのツール→ライブラリを管理...を開くとライブラリマネージャが起動します。
検索をフィルタ...の所に LiquidCrystal I2C を入れて
LiquidCrystal I2C by Frank de Brabander
を探してインストールボタンを押します。

これでライブラリの準備ができました。


■動作させるプログラム

#include <LiquidCrystal_I2C.h>

//アドレス0x27 16文字2行の液晶
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("abc");
  lcd.setCursor(3, 1);
  lcd.print("DEF");
}

void loop() {
}

上記のプログラムを実行すると、LCDに文字が現れます。
もし、動作しない場合にはI2Cアドレスが間違っているかもしれません(赤文字の部分)
チップの違いによりアドレスが違いますので、0x3Fに変更すると動作するかもしれません。



■数字を表示する

文字は表示できましたが変数の値が表示できないと意味がありません。
そこで数字を表示したいと思います。

lcd.print(i,進数);
とすると変数 i が進数に従って出力されます。
進数はHEXやDECやBINと入力しても良いですが、任意の数字を入れると見かけない進数でも出力されます。


▼10進数の表示

符号付きと符合無しが自動的に判断されるみたいです。
#include <LiquidCrystal_I2C.h>

//アドレス0x27 16文字2行の液晶
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  int i=0xFFFF;
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(i,DEC);
  lcd.setCursor(0, 1);
  lcd.print((unsigned int)i,DEC);
}

void loop() {
}




▼16進数と8進数の表示

#include <LiquidCrystal_I2C.h>

//アドレス0x27 16文字2行の液晶
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  unsigned int i=0xFFFF;
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(i,OCT);
  lcd.setCursor(0, 1);
  lcd.print(i,HEX);
}

void loop() {
}




▼2進数と5進数の表示

任意の数字を入れると任意の進数で表示されます。
#include <LiquidCrystal_I2C.h>

//アドレス0x27 16文字2行の液晶
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  unsigned int i=0xA5;
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(i,BIN);
  lcd.setCursor(0, 1);
  lcd.print(i,5);
}

void loop() {
}




▼LCDに最初から登録されている文字

LCDには通常必要と思われるキャラクタが最初から登録されています。



横が上位ビット、縦が下位ビットの値を表しています。
例えば、「 万 」の文字を表示する場合には、 lcd.write( 0xFB ) のようにします。
LCDを実際に動作させて全てのキャラクタを表示して写真を撮り、この表を作成しました。
表の作成時に使用したプログラムを置いときます。
#include <LiquidCrystal_I2C.h>

//アドレス0x27 16文字2行の液晶
LiquidCrystal_I2C lcd(0x27, 16, 2);

byte str[16] = {0x10, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0};

void setup() {
  lcd.init();
  lcd.backlight();
}

void loop() {
  for (int i = 0; i < 16; i++) {
    lcd.setCursor(0, 0);
    for (int j = 0; j < 16; j++) {
      lcd.write(byte(str[j] | (byte)i));
    }
    delay(1000);
  }
}


▼文字の作成

登録されている文字では目的が達せられない時には、オリジナルの文字を作成する事が出来ます。
CG RAMというキャラクタパターンを定義できるエリアがあり、アドレスは0x00〜0x07の範囲で最大8個の文字を作成する事が出来ます。
0x08〜0x0Fもアクセスできますが、0x00〜0x07と同じ場所を示しています。
#include <LiquidCrystal_I2C.h>

byte data_1[8] = {
  0b00011111,
  0b00010001,
  0b00010001,
  0b00010001,
  0b00010001,
  0b00010001,
  0b00010001,
  0b00011111,
};

//アドレス0x27 16文字2行の液晶
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  lcd.init();
  lcd.createChar(0x00, data_1);
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.write(byte(0x00));
}

void loop() {
}

アドレス0x00にキャラクタを登録して表示しています。
表示箇所のlcd.writeは本来は数字のアドレスのみで良いはずですが、なぜかコンパイルが通らないので、 lcd.write(byte(0x00)) このようにbyteをかませてありますが、本来ならば必要ないはずです。
実行するとこのように表示されます。

I2C以外の接続方法では、lcd.begin( 16, 2 );の後にlcd.createChar(0x00, data_1);をすると外字が登録できます。


▼全てのドットを点灯させる

LCDを購入すると、販売業者によって接触が悪くて画面表示がうまくいかない商品が送られて来ることがあります。
大抵の場合には裏面の金具を引っ張りながらねじると直るのですが、それを確認するために全てのドットを点灯させてみます。
#include <LiquidCrystal_I2C.h>

//アドレス0x27 16文字2行の液晶
LiquidCrystal_I2C lcd(0x27, 16, 2);

char c[17]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF
           ,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00};

void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(c);
  lcd.setCursor(0, 1);
  lcd.print(c);
}

void loop() {
}






▲トップページ > マイコンなど