Arduino しようぜ!I2CのLCD編

「Arduino しようぜ!」の6回目、I2CのLCD実践編です。(「Arduino しようぜ!」は大谷選手の「野球しようぜ!」へのオマージュです。)
今回は、I2CのLCDを実際にArduinoへつなぎ、Arduino IDEでスケッチを作成して、LCDディスプレイに文字を表示します。
(前回のパラレルLCD編は、以下をクリック)

ハードウエア

LCDの種類

LCDには、キャラクタとグラフィックの種類があります。
キャラクタは文字数が決まった表示機です。1行に16文字などと決まりがあります。
グラフィックは細かなドットが集まった表示機で、文字だけではなく、好きな図形や絵なども表示できます。
今回、使用するのはキャラクタのLCDです。

左 キャラクタ、 右 グラフィック

キャラクタLCDにもインターフェースで2種類あります。
OLEDの時に使用したI2Cと、パラレルです。

Arduino IDEでライブラリを使ってスケッチを作るなら特に難しい処理を自分で作る必要もないので、2本の信号線で済み、コントラストもソフトウエアで調整できるI2Cが便利です。
(I2CのLCDの例)

パラレル接続のLCDについての詳細は、前回説明したので省略します。

I2CのLCD

今回紹介するI2CのLCDは、ドライバICに「ST7032」を使用しているので、その動作の概略です。(I2C-パラレル変換器は「PCF8574」を使用していますが、項目を別にして後記します。)

I2C用のドライバIC「ST7032」は、ざっくり説明するとパラレルLCDで説明したドライバIC「HD44780」にI2Cインターフェースを追加したものになります。
フォントも日本語のカタカナが内蔵されていますし、記憶できる文字数も80文字までです。
ライブラリを使えば、前回のパラレルLCDと同じようにすれば文字が表示できます。
自分で1からやるには、I2C用の初期化などの処理を行わなければなりませんが、今回はライブラリを使用するので初期化などの詳細は省略します。

ハードウエア的には外付け部品として、I2C用にプルアップ抵抗が2つ、電源用(3.3 Vから5 Vへ昇圧用)にコンデンサが3つ必要です。
配線はOLEDと同じで、電源2本と信号2本(SDA、SCL)です。
入手が容易なI2CのLCDは、形状や端子の順番は異なりますが、Arduinoとの配線は次図のとおりです。
(配線は4本だけなので、回路図は作りませんでした。)

Arduino側LCD側配線色
5 VVCC赤色
GNDGND黒色
A4SDA緑色
A5SCL黄色

この後紹介するLCDは、一般的に入手が容易なものです。色々なデータシートを見るのが面倒なので、手元にあるLCDを忘備録としてまとめました。

AQM1602A

16文字✕2行
I2Cアドレス:0x3E
サイズ:横 66 mm、縦 28 mm(LCDのみ)
プルアップ抵抗:あり(出荷時はオープン)
秋月電子で入手しました。(販売コード:108896)

秋月電子のI2CのLCDは、型番の頭に「AQ」が付くものは端子幅が2.54 mmか、2.54 mmへの変換基盤が付いています。(LCD本体はハーフピッチ(1.28 mm)ですが、2.54 mmへの変換基盤が付属します。)

「AQM1602A」の端子

AQM1602Y

16文字✕2行
I2Cアドレス:0x3E
サイズ:横 42 mm、縦 23 mm
プルアップ抵抗:なし
外付けコンデンサが必要
これも秋月電子です。(販売コード:111916)ピン幅は2.54 mmです。

「AQM1602Y」の端子

ATD1602CP

16文字✕2行
I2Cアドレス:0x3E
サイズ:横 39 mm、縦 20 mm
プルアップ抵抗:なし
aitendoの商品です。(ドライバIC:SPLC792A(ST7032互換)
注意
1 電源は3.3 Vです。
2 一番右側の「RST」端子にArduinoのRESET(または3.3 V)をつながないと表示されません。(故障したかと思いました。)

取り付け方法に合わせて、LCDのSHLとDIRC端子で表示の向きを決められます。

「AQM1602Y」の端子

「SHL」と「DIRC」の組み合わせのイメージです。通常は「H L」ですね。

AQM0802

8文字✕2行
I2Cアドレス:0x3E
サイズ:横 35 mm、縦 21 mm(基盤込み)
プルアップ抵抗:あり(出荷時はオープン)
これも秋月電子です。(販売コード:106795)
(LCD本体はハーフピッチ(1.28 mm)ですが、2.54 mmへの変換基盤が付属します。)

「AQM0802」の端子(写真左のCN1)

I2C-パラレル変換器

パラレルのLCDに取り付けるとI2Cインターフェースになる変換器があります。(パラレルLCDとセットでI2CのLCDとして販売されていることもあります。)

パラレルLCDにも種類があるので、どれにでも付けられるわけでは有りませんが、自宅にある色々なパラレルLCDで上部に端子があるタイプ全てで動作確認が出来ました。(16文字 × 2行だけではなく20文字 × 4行も)
4本線(電源込み)でLCDが接続できるので取り回しが楽です。

コントラストの調整は、ソフトウエアではなく基板上のVRで行います。
左にあるジャンパは、LCDバックライト点灯の設定用です。(外すとバックライトがOFF)

I2Cアドレス:0x27
aitendoの型番:IFB-I2C-8574

「I2C-パラレル変換器」の端子(右側上から)

ドライバICには「PCF8574」が使われています。
今まで紹介したドライバICに「ST7032」を使ったLCDでは、ライブラリに「LCD ST7032」用を使いますが、当然、このドライバIC用のライブラリではこのLCDは動作しません。
後述する「I2C-パラレル変換器で名前の表示」でソフトウエアについて解説しているので、このLCDを使う場合は「ST7032」の項目を飛ばして、そちらを確認してみてください。

ソフトウエア

「ST7032」用のライブラリ読み込み

OLEDディスプレイと同様に、LCDへ名前を表示してみます。
I2CのLCDに表示するためには、それ用のライブラリが必要なのでArduino IDEのライブラリで登録します。
「ライブラリマネージャー」を開き、「LCD ST7032」と入力します。
表示されたライブラリを「インストール」します。

LCDテスト用スケッチ

LCDテスト用のスケッチを読み込みます。
「ファイル」「スケッチ例」の「カスタムライブラリのスケッチ例」の「LCD_ST7032」から「HelloWorld」を選びます。

LCDテスト用のスケッチの内容です。
コメントが入っているので非常に長くなっています。

/*
  LiquidCrystal Library - Hello World
 
 Demonstrates the use a 16x2 LCD display.  The LiquidCrystal
 library works with all LCD displays that are compatible with the 
 Hitachi HD44780 driver. There are many of them out there, and you
 can usually tell them by the 16-pin interface.
 
 This sketch prints "Hello World!" to the LCD
 and shows the time.
  
 Library originally added 18 Apr 2008
 by David A. Mellis
 library modified 5 Jul 2009
 by Limor Fried (http://www.ladyada.net)
 example added 9 Jul 2009
 by Tom Igoe
 modified 22 Nov 2010
 by Tom Igoe
 modified 21 Aug 2012
 by Noriaki Mitsunaga for I2C LCD
 
 This example code is in the public domain.

 http://www.arduino.cc/en/Tutorial/LiquidCrystal
 */

// include the library code:
#include <I2CLiquidCrystal.h>
#include <Wire.h>

// initialize the library
// uncomment next line if you are using a LCD from Straberry Linux
I2CLiquidCrystal lcd(20, (bool)true);
                  //  |          +--- set true if the power suply is 5V, false if it is 3.3V
                  //  +-------- contrast (0-63)
// uncomment next line if you are using a LCD from Akizuki denshi
// I2CLiquidCrystal lcd;

// uncomment next line if you are using a OLED from Akizuki denshi(SO1602 series)
// I2CLiquidCrystal lcd(0x3c, (uint8_t)127);
                  //  |             +--- contrast (0-255)
                  //  +-------- I2C ADDR (SA0=L: 0x3c, SA0=H: 0x3d)

// uncomment next line if you are using a Grove RGB Backlight LCD
// I2CLiquidCrystal lcd(LCD_GROVE_RGB);

void setup() {
  // uncomment next line if you want to use Wire1 with Arduino Due
  // lcd.setWire(&Wire1);
  // set up the LCD's number of columns and rows: 
  lcd.begin(16, 2);
  // uncomment next line if you want to change backlight color 
  // (Grove RGB backlight LCD only)
  // lcd.setRGB(0, 255, 0); // specify PWM of Red, Green, and Blue in 0-255
  // Print a message to the LCD.
  lcd.print("hello, world!");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis()/1000);
}

LCDの接続試験

それぞれのLCDごとに端子部分が異なるので、ハードウエアの項で紹介したつなぎ方を参考にして、ArduinoとLCDを接続したら、「検証」してエラーが出ないことを確認して「書き込み」をしてください。
問題なく表示が出るはずです。
表示されない場合は、配線を再確認してください。

LCDが黒豆腐(四角い黒の塊が並んでいる状態)になってしまったら、コントラストの値が大きすぎます。
「lcd.setcontrast(24);」の数字を少しずつ減らしてください。
問題なければ、1行目に「Hello World」が、2行目に数字が表示されます。

LCDテスト用スケッチの内容説明

OLEDと同じ様に、各項目の細部を確認しながら、必要なものを「void setup() {」へ移動します。
移動する前に、書いてある内容を説明します。

#include <LCD_ST7032.h>
LCD用のライブラリを読み込む設定です。消してはいけません。

LCD_ST7032 lcd;
「LCD_ST7032」を「lcd」と読み替えています。以後「lcd」と出てきたら「LCD_ST7032」の意味になります。(この文字の置き換え部分は、英字の小文字を使います。)

lcd.begin();
LCDの開始を意味しています。

lcd.setcontrast(24);
LCDはOLEDと異なり「コントラスト」の調整が必要です。動作電圧や環境によっても変化するので、ちょうど良い値を探してください。(数字を減らすと薄くなり、増やしすぎると黒豆腐になります。)

static int counter = 0;
「counter」と名付けた入れ物に「0」を入れました。
「static」は、他の人がいじれない書き込み禁止の設定です。
「int」は、整数のみを使うと宣言しています。
これは名前表示には必要ないので消します。

lcd.setCursor(0, 0);
LCDの表示位置を設定します。
OLEDと同じく、最初の「0」は1行目を、2個めの「0」は1文字目を表します。
これは上に移動します。

lcd.print(“Hello World”);
LCDに「Hello World」と表示させます。
「”」で表示したい文字を囲みます。
これは上に移動します。

// Write the counter on the second line…
から
counter++;
までは名前の表示には必要ないので消します。

名前の表示

LCDテスト用スケッチを新規で作ったスケッチにコピペして、LCDに名前を表示するスケッチを作成します。
こんな感じになります。(コメントは日本語にして、「Hello World」は「Yatte Miyoh!」と書き換えました。)

#include <I2CLiquidCrystal.h>
#include <Wire.h>

I2CLiquidCrystal lcd(20, (bool)true); // ライブラリの初期化とコントラストを 20
                  //  |          +--- set true if the power suply is 5V, false if it is 3.3V

void setup() {
  lcd.begin(16, 2); // LCDの表示文字設定 16文字×2行 
  lcd.print("Yatte Miyoh!");
}

void loop() {
}

書き換えが終了したら、「検証」してエラーがなければ「書き込み」をします。
今度は、1行目に「Yatte Miyoh!」だけが表示されます。

AQM1602Aの表示例
AQM1602Yの表示例
ATD1602CPの表示例(「SHL」と「DIRC」の組み合わせは「H L」)
AQM0802の表示例

「I2C-パラレル変換器」で名前の表示

「I2C-パラレル変換器」で使用しているドライバICは「PCF8574」で、今までのICとは違うので「LCD ST7032」ライブラリでは表示できません。
パラレルLCD用のライブラリと名前が似ている「LiquidCrystal_I2C」を使います。

ライブラリの読み込み

似た名前はたくさんありますが、Arduino IDeのライブラリを開きArduinoのHPでも紹介されている「Frank de Brabander」さんによる「LiquidCrystal_I2C」を読み込みます。

動作例の読み込み

ライブラリを読み込んだら、Arduino IDEの「ファイル」「スケッチ例」に現れる「LiquidCrystal I2C」の「HelloWorld」を読み込みます。

ところが、このライブラリは古いためか、動作例の中のファイルの拡張子が「」です。(通常、Arduino IDEの拡張子は「ino」)そのため、直接読み込めない場合があるかもしれません。
その時は、ライブラリが入っているフォルダから直接「HelloWorld」を読み込みます。

「ファイル」「開く」で「C:\Users\◯◯\Documents\Arduino\libraries\LiquidCrystal_I2C\examples\HelloWorld」内の「HelloWorld.pde」です。

このような注意が出ますが、問題なく動作するので「後で」で構いません。
改造した新規のスケッチを、通常どおり名前をつけて保存しましょう。
「HelloWorld」の内容は、このようになっています。

//YWROBOT
//Compatible with the Arduino IDE 1.0
//Library version:1.1
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,20,4);  // set the LCD address to 0x27 for a 16 chars and 2 line display

void setup()
{
  lcd.init();                      // initialize the lcd 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(3,0);
  lcd.print("Hello, world!");
  lcd.setCursor(2,1);
  lcd.print("Ywrobot Arduino!");
   lcd.setCursor(0,2);
  lcd.print("Arduino LCM IIC 2004");
   lcd.setCursor(2,3);
  lcd.print("Power By Ec-yuan!");
}

void loop()
{
}

スケッチの変更

この動作例のスケッチでは、20文字 × 4行のLCD用に設定されているので

LiquidCrystal_I2C lcd(0x27,20,4);
の部分を16文字 × 2行に変更します。
LiquidCrystal_I2C lcd(0x3E,16,2); // LCDアドレス 0x27、16文字×2行

LCDに表示する文字の内容も変えました。
(動作例は4行分ありますが、接続したのは2行のLCDなので表示内容も2行分です。)

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x3E,16,2);  // LCDアドレス 0x27、16文字×2行

void setup() {
  lcd.init();                        // initialize the lcd 
  // Print a message to the LCD.
  lcd.backlight();
  lcd.setCursor(0,0);
  lcd.print("Yatte Miyoh!");
  lcd.setCursor(0,1);
  lcd.print("2nd line 123456789");
}  

void loop() {
}

LCDへ名前の表示

スケッチの準備ができたら、Arduinoと接続します。
配線は4本だけなので簡単ですが、電源ラインは間違わないように接続しましょう。

新規スケッチを「検証」して問題なければ書き込みます。
こんな感じで表示されます。
バックライトも自動で点灯します。

コメント