「Arduino しようぜ!」の6回目、I2C の LCD 実践編です。(「Arduino しようぜ!」は大谷選手の「野球しようぜ!」へのオマージュです。)
今回は、I2C の LCD を実際に Arduino へつなぎ、Arduino IDE でスケッチを作成して、LCD ディスプレイに文字を表示します。
(前回のパラレル LCD 編は、以下をクリック)
ハードウエア
LCD の種類
LCD には、キャラクタとグラフィックの種類があります。
キャラクタは文字数が決まった表示機です。1行に16文字などと決まりがあります。
グラフィックは細かなドットが集まった表示機で、文字だけではなく、好きな図形や絵なども表示できます。
今回、使用するのはキャラクタの LCD です。

キャラクタ LCD にもインターフェースで数種類ありますが、今回の解説では OLED の時に使用した I2C と、パラレルを解説します。(他にも手軽に使用できるインターフェースとしては SPI などがあります。)
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 UNO との配線は次図のとおりです。
(配線は4本だけなので、回路図は作りませんでした。)
Arduino側 | LCD側 | 配線色 |
5 V | VCC | 赤色 |
GND | GND | 黒色 |
A4 | SDA | 緑色 |
A5 | SCL | 黄色 |

この後紹介する 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!」だけが表示されます。




「I2C – パラレル変換器」で名前の表示
「I2C-パラレル変換器」で使用しているドライバICは「PCF8574」で、今までの IC とは違うので「LCD ST7032」ライブラリでは表示できません。
パラレル LCD 用のライブラリと名前が似ている「LiquidCrystal_I2C」を使います。
ライブラリの読み込み
似た名前のドライバはたくさんありますが、Arduino IDeのライブラリを開きArduinoのHPでも紹介されている「Frank de Brabander」さんによる「LiquidCrystal_I2C」を読み込みます。

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

ところが、このライブラリは古いためか、動作例の中のファイルの拡張子が「pde」です。(通常、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 UNO と接続します。
配線は4本だけなので簡単ですが、電源ラインは間違わないように接続しましょう。
新規スケッチを「検証」して問題なければ書き込みます。
こんな感じで表示されます。
バックライトも自動で点灯します。

コメント