ArduinoでLCDに文字表示
こんなことやります。
- LCD1602をI2C化してシリアル通信できるようにする
- ArduinoとLCDをI2C接続して文字を表示する
つかうもの
本記事で「つかうもの」を紹介します。
LCD(1602)ディスプレイモジュール
KKHMFの2個セットで販売されているLCD1602ディスプレイモジュールを使用しました。
LCDとは
LCDとは、Liquid Crystal Displayの略で、いわゆる液晶ディスプレイのことです。液晶に電圧を加えることで、光の屈折具合が変化し文字表示などに利用されます。液晶そのものが発光するわけではないので、見やすくするためにバックライトが必要です。 一方で、文字そのものが発光する「OLED」も最近ではよく利用されます。OLEDについて詳しくは 【Arduino】OLEDに文字表示【Seeeduino】 をご覧ください。
LCD用I2Cシリアル変換モジュール
LCDモジュールはそのままですとパラレル通信なため、Arduinoとの配線が10本程度にもなってしまいます。そこで、LCDをI2C接続できるようにシリアル変換モジュールを使います。こちらのシリアルインタフェースを介せば、わずか4本線でLCDを制御できます。
▼ シリアル変換モジュールとセットのLCDも販売されてます。
Arduinoボード
ここではArduinoボードとして、Arduino Uno Rev3を使用しました。
▼ もちろん、他のArduinoを使ってもらっても構いません。
まだ、Arduinoをお持ちでないようでしたら、 おすすめArduinoどれを選べばいい?Arduinoで電子工作をはじめる方へ をご覧ください。
その他の電子部品
ブレッドボードやジャンプワイヤをお持ちでない方は揃えておくと良いでしょう。
準備
LCDとArduinoの準備を行います。
LCDとシリアル変換モジュールのはんだ付け
写真のように、LCDとシリアル変換モジュールをはんだ付けします。 シリアル変換モジュールのLEDジャンパ線は、バックライトになりますので短絡します。 また、シリアル変換モジュールについている半固定抵抗は文字表示のコントラスト調整になります。ここを適切に調整しないと文字表示されても見えませんので覚えておいてください。
ArduinoとLCDシリアルインタフェースモジュールの配線
ArduinoとLCDシリアルインタフェースモジュールを、それぞれ次のように繋いでください。
I2Cモジュール | Arduino |
---|---|
GND | GND |
VCC | 5V |
SDA | A4 |
SCL | A5 |
Arduino UNO Rev3でI2Cを使う場合には、A4がSDA、A5がSCLに指定されているため配線に注意してください。 下図のように、A4とA5はそれぞれ2つづつピンが用意されてますので、どちらの配線でも構いません。
ライブラリのインストール
ArduinoからI2C通信でLCDに文字表示するため、「LiquidCrystal I2C」というライブラリを使用します。ライブラリマネージャーから「LiquidCrystal I2C」で検索してインストールしてください。
I2Cアドレスの設定
今回使用するLCDシリアル変換モジュールのI2Cアドレスは、デフォルトで0x27に設定されてます。 シリアル変換モジュールのジャンパピンA0、A1、A2を短絡することで、I2Cアドレスを0x20〜0x27の間で変更できるようです。
A2 | A1 | A0 | I2Cアドレス |
---|---|---|---|
0 | 0 | 0 | 0x20 |
0 | 0 | 1 | 0x21 |
0 | 1 | 0 | 0x22 |
0 | 1 | 1 | 0x23 |
1 | 0 | 0 | 0x24 |
1 | 0 | 1 | 0x25 |
1 | 1 | 0 | 0x26 |
1 | 1 | 1 | 0x27 |
0はジャンパピンを短絡、1はジャンパピンが開放状態を意味します。
ArduinoでLCDに文字表示
次のアニメーションのような文字表示をプログラミングします。
ソースコード
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
float count = 1.0;
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Ready...");
delay(3000);
}
void loop(){
char line1[15] = "Hello, world!";
char line2[15];
char floatString[4];
dtostrf(count, 3, 1, floatString);
snprintf(line2, 15, "Count: %s", floatString);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(line1);
lcd.setCursor(0, 1);
lcd.print(line2);
count = count + 0.1;
delay(100);
}
プログラムの解説
LiquidCrystal_I2C lcd(0x27,16,2);でLCDを初期化します。I2Cアドレスはデフォルトで0x27、2行16文字のLCDを使うのでこのように設定します。 文字が表示されない場合は、I2Cアドレスが正しいか確認してください。また、コントラストの関係で文字が見えない場合は、I2Cモジュールの半固定抵抗を回して調整してください。 lcd.setCursor(列番号、行番号)で文字表示を開始する位置を指定できます。 float型の変数をLCDに表示させるには、ソースコードのように少し工夫が必要です。dtostrf関数でfloat型のような小数点を含む数値を文字列へ変換させます。dtostrf(変換する値, 小数点や符号を含んだ変換後の文字数, 小数点以下の桁数, 変換後の文字列を格納する変数)のように指定します。そして、snprintf関数でchar型の配列へ格納し、lcd.printでLCDに文字表示させました。さいごに
今回はじめてLCDをArduinoで使ってみました。パラレル接続のLCDは配線がややこしいので今まで嫌厭していましたが、I2Cのシリアルインタフェースを利用するととても簡単に配線ができ、プログラミングも簡単でした。 CUI型のディスプレイには、他にもOLEDがあります。
OLEDは、文字表示の表現がLCDより広く自由です。その代わり、キレイに文字を並べようとするとカーソルの移動などに苦労します。 一方で、LCDは文字表示される位置が決められているので、プログラミングが容易です。値段も安いので、今後はLCDをもっと活用していきたいと思いました。