Arduino入門編の記事も今回で第17回まで来ました。
サーボモーターを動かしたり、LEDの点灯を制御したり・・・ある程度形になってきたかと思います。
今回はArduinoを使ってLCD(Liquid Crystal Display)モジュール、つまり液晶ディスプレイに文字を表示させてみようと思います。
LCDは数字や文字などを表示出来ることからキャラクターディスプレイなどと呼ばれることもあります。
これまでArduinoに繋いだセンサーなどの情報をシリアルモニタを使いPC上に表示させたりしましたが、LCDディスプレイを使えばPCにArduinoを接続することなくそれ単体でセンサーから取得した情報などを表示させることが出来るので便利となります。
今回は『1602 LCDモジュール』という液晶ディスプレイを使いArduinoと接続し文字を表示させてみたいと思います。
16文字×2行表示ができるLCDディスプレイとなり、Arduinoスターターキットにも付属している電子工作用途でよく見かけるLCDモジュールとなります。
目次
【Arduino】LCDディスプレイに文字を表示させてみる!
今回の目的
これまでシリアルモニタを使いArduinoが取得したセンサー情報やジョイスティックの位置などをPC上(シリアルモニタ)に表示させたり、シリアルモニタから文字列をArduino側に送りLEDを点灯させたりサーボモーターを制御するなどをやってきました。
今回はLCDディスプレイをArduinoと接続し文字や数字を表示させてみたいと思います。
Arduinoと接続することによりそれ単体で文字の表示が可能となりシリアルモニタとの併用で便利に使えるようになります。
LCDディスプレイの表示には、その接続(通信)方法として「パラレル通信方式」やI2C通信などの「シリアル通信方式」があります。
今回は基本となる「パラレル通信方式」で接続し表示させてみたいと思います。
パラレル通信方式でディスプレイに表示させるにはArduino-LCDモジュール間の配線が多くなります。
複数のGPIOピン(入出力ピン)をLCDディスプレイ接続のために使ってしまうためもともとGPIOピンの数が少ないArduinoの場合、他のデバイス(センサーやモーターなど)接続のためのピンが限られてしまいます。
本来はI2C通信などシリアル通信方式で接続すれば使うピンの数もSDAとSCLの2本の信号線のみ(VccとGND合わせて計4本)と少なく接続できるのですが、今回は理解を深めるため基本的な接続方法となるパラレル通信方式でArduinoと接続し文字を表示させてみたいと思います。
接続の配線が多くなってしまいますが、LCDモジュールの表示にはArduino IDE標準ライブラリとなる『LiquidCrystalライブラリ』が用意されているので比較的簡単にディスプレイに表示させることが出来ます。
基本的な接続方法&LiquidCrystalライブラリの使い方を理解し、自由にLCDディスプレイに文字を表示させる事が出来るまでを今回の目標としたいと思います。
そして今後、I2C通信を使い配線をシンプルに接続したものもご紹介したいと思います。
LCDモジュール(ディスプレイ)
文字や数字などを表示させるためのLCDモジュール(ディスプレイ)を今回使ってみたいと思います。
LCDモジュールにはArduinoからの信号を表示させるためのコントローラーが付いています。
Arduino(こちらではArduino Unoで解説していきます)と接続し、LCDに文字を表示させるにはこのコントローラーに命令を出すことにより指定した文字を表示させる形となります。
Arduinoを使った電子工作用途でよく使われる『1602 LCDモジュール』を今回使います。
そして複数の配線を使ってデータの送受信を行うパラレル通信方式によりディスプレイに文字を表示させてみたいと思います。
シリアル通信 or パラレル通信とは?
まず簡単にArduinoのデータのやり取り、つまり通信方式についてご説明しておきます。
データ通信の方法はいろいろとあります。
その中で主となる「シリアル通信」と「パラレル通信」について簡単に見ていきます。
今回LCDモジュールとの接続に「パラレル通信方式」で接続しようと考えています。
パラレル通信方式とは、複数本の信号線を使う通信方式となります。
対応したピン(ポート)が1対1の関係なので接続自体は対応したピンに接続するだけなので理解しやすいかと思いますが、複数本の信号線を使うためGPIOピンの数が少ない(限られた)Arduinodボードでは他のデバイスとの接続が制限されてしまうなどデメリットもあります。
それに対しシリアル通信方式では、HIGHとLOWのデータを1本の通信線を使って連続的にやり取りする方式となり信号線が少なくなります。
シリアル通信のシリアルとは「連続した(Serial)」という意味があります。
I2C通信やSPI通信、UART通信がそれにあたります。
今回パラレル通信によりLCDモジュールを接続しますが、データ信号線だけでもにDB0-DB7の計8本(4ビット接続の場合は4本)、RS(ラッチピン)・RW(リード/ライトピン)・E(Enableピン)と多くのGPIOピンを使います。(後述します)
また、同じLCDディスプレイでもこのようなI2C通信用のシリアルインターフェースボードを接続して表示させることも出来ます。
2本の信号線(SDA/SCL)とVcc・GNDの計4本と非常に少ない配線でArduinoと接続できるのがシリアル通信の特徴となります。
1602 LCDモジュール
LCDモジュールやパラレル通信に関して雰囲気が分かったところで、1602 LCDモジュールを見ていきます。(後述するArduinoスターターキットにも同封されています)
1602 LCDモジュールにはHD44780LCDコントローラーが内蔵されています。
今回使うライブラリ「LiquidCrystalライブラリ」は、Hitachi HD44780とその互換チップセットをベースにしたLCDを制御することが出来るライブラリとなります。(4ビット or 8ビット両サポート)
今回ArduinoとLCDモジュールとは「LiquidCrystalライブラリ」を使ってパラレル通信でデータを送り文字や数字を表示させてみます。
1602 LCDモジュールに搭載されているコントローラー端子の主な役割はこのようになります。
1602 LCDモジュール端子構成 | |
ピン(端子) | 機能 |
VSS | GND(電源) |
VDD | 5V(電源) |
V0 | コントラスト調整(電源) |
RS | ラッチピン (コントローラーにデータを入れる) |
RW | リード/ライトピン (読み込み/書き込みの選択) |
E | Enableピン (変更を許可するかを選択) |
DB0~DB7 | データビット(8ビット) (4ビットモードでは上位ビットDB4-DB7のみ使用) |
A | LEDバックライト(アノード) : 5V |
K | LEDバックライト(カソード) : GND |
データ送信量(4ビット or 8ビット)
LCDモジュールにはDB0~DB7までの8本のデータバスがあります。
ArduinoからLCDに送る1回のデータ量を4ビットまたは8ビットで使うことが出来ます。
今回Arduino IDE標準ライブラリ『LiquidCrystalライブラリ』を使用しますが、データ信号は4ビットと8ビット両方使うことが出来ます。
今回は4ビットでのデータのやり取りで使用します。
4ビットでのデータのやり取りでは上位ビットDB4~DB7での接続となり、2回に別けてデータを送信する形となります。(DB0~DB3は使いません)
とは言っても『LiquidCrystalライブラリ』がこのあたりの処理は代わりにやってくれるので難しいことは考えなくてもできちゃいます!
データ信号ピンDB4~DB7ピン(4本)とRSピン・RWピン・EnableピンをArduinoの適切な位置に接続するだけです。
それぞれのピンはデジタル信号でのやり取りとなります。
Arduino Unoの場合、デジタル入出力ピンはD0~D13までの計14本あります。
またA0~A5までの計6本のアナログ入力ピンもデジタル出力ピンとして使うことが出来ます。
特別な理由がない限り使わないのが望ましくなります。
Arduinoとの接続
それではArduinoにLCDモジュールを接続していきます。
このような接続イメージとなります。
LCD電源およびバックライト部分
まずはLCDの電源です。
LCD用の電源は、VDD(5V)とVSS(GND)、そしてコントラスト調整用のV0端子があります。
V0には可変抵抗器を繋いでコントラストを調整する事ができます。
またこのLCDモジュールにはLEDバックライトが搭載されています。
A端子(バックライトLEDのアノード)を5V、K端子(LEDのカソード)をGNDに接続する形となります。
基本的にこれらの端子に電源を接続することによりLCDパネルが起動し表示できる状態になります。
データ信号部分
次にArduinoからのデータを送るためのデータ信号線です。
DB0~DB7の8ビット分の信号線がありますが、今回は4ビットでの操作となるので使用するのはDB4~DB7の上位4ビット分のみ使用となります。
制御信号部分
そしてLCDパネルに文字を表示させるには、RS(ラッチ)端子・RW(リード/ライト)端子・E(Enable)端子から制御する形となります。
RW(リード/ライト)端子は今回LCDディスプレイに書き込む(文字を表示させる)のでLOW、つまりGNDに接続します。
次にRS(ラッチ)端子・E(Enable)端子ですが、これもそれぞれGPIOピンに割り振ります。
これらピンに関してはタイミングチャートを見て頂いてもいいのですが、少し話が複雑になるため今回は割愛します。
『LiquidCrystalライブラリ』が代わりに処理してくれるため接続さえ出来ていれば特に意識する必要はありません。
上記を踏まえこのようにArduino UnoとLCDモジュールを接続しました。
Arduinoとの接続
LCDモジュール | Arduino Uno |
VDD | 5V |
VSS | GND |
R0 | 可変抵抗器 (今回2kΩの固定抵抗を使いました) |
RS | D7 |
RW | GND |
E | D8 |
DB4 | D9 |
DB5 | D10 |
DB6 | D11 |
DB7 | D12 |
A | 5V |
K | GND |
【テストスケッチ①】文字を表示させる
上記回路を使い数パターンのテストスケッチを動かしてみたいと思います。
まずは基本となる文字の表示です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | // Arduino入門編⑰ LCDディスプレイに文字を表示させる1 // https://burariweb.info #include <LiquidCrystal.h> // LCD ←→ Arduinoのピンの割り当て // rs → D7 // rw → GND // enable → D8 // d4 → D9 // d5 → D10 // d6 → D11 // d7 → D12 // [構文]LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { lcd.begin(16, 2); // LCDの桁数と行数を指定する(16桁2行) lcd.clear(); // LCD画面をクリア lcd.setCursor(0, 0); // カーソルの位置を指定 lcd.print("Hello!"); // 文字の表示 lcd.setCursor(0, 1); // カーソルの位置を指定 lcd.print("Arduino Uno"); // 文字の表示 } void loop() { } |
上記スケッチを実行するとLCDディスプレイにこのように表示されます。
それではスケッチの一連の流れを見ていきます。
①LiquidCrystalライブラリのインクルード
まずは『LiquidCrystalライブラリ』のインクルードです。
Arduino IDE標準ライブラリなので、[スケッチ]→[ライブラリをインクルード]から[LiquidCrystal]を選択します。
4 | #include <LiquidCrystal.h> |
②ピンの割り当て
LCDモジュールに接続したピンの割り当てです。
Arduino側のピン配列を指定します。
【構文】
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
※RWピンはGNDに接続しているので省略
※4ビットでのやり取りなのでd0~d3は省略
177 | LiquidCrystal lcd(7, 8, 9, 10, 11, 12); |
③文字列をLCDディスプレイに表示
文字を表示させる位置をlcd.setCursor()で指定し、lcd.print()で表示させています。
21 22 23 24 25 26 | lcd.begin(16, 2); // LCDの桁数と行数を指定する(16桁2行) lcd.clear(); // LCD画面をクリア lcd.setCursor(0, 0); // カーソルの位置を指定 lcd.print("Hello!"); // 文字の表示 lcd.setCursor(0, 1); // カーソルの位置を指定 lcd.print("Arduino Uno"); // 文字の表示 |
LiquidCrystalライブラリ 使用コマンド(関数)
【LiquidCrystal(引数)】
LiquidCrystal型の変数を生成。
ディスプレイには4本または8本(4ビット or 8ビット)のデータラインでコントロールされます。
[構文] LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)
rs: LCDのRSピンに接続するArduino側のピン番号
rw: LCDのRWピンに接続するArduino側のピン番号
enable: LCDのE(Enable)ピンに接続するArduino側のピン番号
d0~d7: LCDのdataピンに接続するArduino側のピン番号
※d0~d3はオプションで、省略すると4ビット(d4~d7)だけで制御します。
※rwピンをGNDに接続(書き込み動作)すれば引数を省略できます。
【lcd.begin(cols, rows)】
ディスプレイの桁数と行数を指定。
cols: 桁数(横方向の文字数)
rows: 行数
【lcd.clear()】
LCDの画面をクリアしカーソルを左上に移動させる。
【lcd.print(data)】
テキストをLCDに表示させる。
【テストスケッチ②】文字を点滅させる
LiquidCrystalライブラリには多数のコマンド(関数)が用意されています。
いくつかのコマンドを使い表示させてみたいと思います。
次は文字を点滅させて表示してみます。
lcd.display()関数とlcd.noDisplay()関数を使っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | // Arduino入門編⑰ LCDディスプレイに文字を表示させる2(点滅) // https://burariweb.info #include <LiquidCrystal.h> // LCD ←→ Arduinoのピンの割り当て // rs → D7 // rw → GND // enable → D8 // d4 → D9 // d5 → D10 // d6 → D11 // d7 → D12 // [構文]LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { lcd.begin(16, 2); // LCDの桁数と行数を指定する(16桁2行) lcd.clear(); // LCD画面をクリア lcd.setCursor(0, 0); // カーソルの位置を指定(0桁0行の位置) lcd.print("Hello!"); // 文字の表示 lcd.setCursor(0, 1); // カーソルの位置を指定(0桁1行目の位置) lcd.print("Arduino Uno"); // 文字の表示 } void loop() { lcd.display(); // 画面を表示 delay(500); lcd.noDisplay(); // 画面を非表示 delay(500); } |
【テストスケッチ③】カーソルを点滅させる
次にカーソルを点滅させてみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | // Arduino入門編⑰ LCDディスプレイに文字を表示させる3(カーソルを点滅) // https://burariweb.info #include <LiquidCrystal.h> // LCD ←→ Arduinoのピンの割り当て // rs → D7 // rw → GND // enable → D8 // d4 → D9 // d5 → D10 // d6 → D11 // d7 → D12 // [構文]LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { lcd.begin(16, 2); // LCDの桁数と行数を指定する(16桁2行) lcd.clear(); // 画面のクリア lcd.setCursor(0, 0); // カーソルの位置を指定(0桁0行の位置) lcd.print("Hello!"); // 文字の表示 lcd.setCursor(0, 1); // カーソルの位置を指定(0桁1行目の位置) lcd.print("Arduino Uno"); // 文字の表示 lcd.blink(); // カーソルを点滅させる } void loop() { } |
lcd.blink()関数を使います。
このようにカーソルが表示され点滅します。
【テストスケッチ④】アンダーラインカーソルを点滅させる
アンダーラインカーソルの点滅です。
lcd.cursor()関数とlcd.noCursor()関数を使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | // Arduino入門編⑰ LCDディスプレイに文字を表示させる4(アンダーラインカーソルを点滅) // https://burariweb.info #include <LiquidCrystal.h> // LCD ←→ Arduinoのピンの割り当て // rs → D7 // rw → GND // enable → D8 // d4 → D9 // d5 → D10 // d6 → D11 // d7 → D12 // [構文]LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal lcd(7, 8, 9, 10, 11, 12); void setup() { lcd.begin(16, 2); // LCDの桁数と行数を指定する(16桁2行) lcd.clear(); lcd.setCursor(0, 0); // カーソルの位置を指定(0桁0行の位置) lcd.print("Hello!"); // 文字の表示 lcd.setCursor(0, 1); // カーソルの位置を指定(0桁1行目の位置) lcd.print("Arduino Uno"); // 文字の表示 } void loop() { lcd.cursor(); // アンダーラインカーソルを表示 delay(500); lcd.noCursor(); // カーソルを非表示 delay(500); } |
LiquidCrystalライブラリにはこれ以外にもたくさんの関数が用意されています。
詳しくはArduino日本語リファレンスを参考にして下さい。
【応用例】 超音波センサーを使い距離を表示させてみる
LCDディスプレイの基本的な表示方法が分かれば今回の目標は達成です。
折角なのでこれまでやってきたものと組み合わせて表示させてみたいと思います。
デジタル入出力ピンの空きがまだあるので超音波センサーで距離を測定しディスプレイに表示させてみたいと思います。
超音波センサー(HC-SR04)の使い方はこちらを参考にして下さい!
HC-SR04のトリガーピン(Trig)をデジタル入出力ピンD2、エコーピン(Echo)をD3に接続し上記記事で作ったスケッチと組み合わせてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | // Arduino入門編⑰ 超音波センサーの値をLCDに表示させる // https://burariweb.info #include <LiquidCrystal.h> // LCD ←→ Arduinoのピンの割り当て // rs → D7 // rw → GND // enable → D8 // d4 → D9 // d5 → D10 // d6 → D11 // d7 → D12 // [構文]LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal lcd(7, 8, 9, 10, 11, 12); #define trigPin 2 #define echoPin 3 float Duration = 0; float Distance = 0; void setup() { lcd.begin(16, 2); // LCDの桁数と行数を指定する(16桁2行) lcd.clear(); // LCD画面のクリア lcd.print("Distance"); // 文字を表示 pinMode(echoPin,INPUT); // エコーピンを入力に pinMode(trigPin,OUTPUT); // トリガーピンを出力に } void loop() { digitalWrite(trigPin,LOW); // 計測前に一旦トリガーピンをLowに delayMicroseconds(2); digitalWrite(trigPin,HIGH); // トリガーピンを10μsの時間だけHighに delayMicroseconds(10); digitalWrite(trigPin,LOW); Duration = pulseIn(echoPin,HIGH); // エコーピンからの入力 Duration = Duration / 2; // 距離を1/2に Distance = Duration*340*100/1000000; // 音速を掛けて単位をcmに if(Distance >= 400 || Distance <= 2){ // センサーの測定範囲外の処理 lcd.setCursor(0, 1); // カーソルの位置を指定 lcd.print("Error "); // Error表示 } else{ lcd.setCursor(0, 1); // カーソルの位置を指定 lcd.print(Distance); // センサーの値(cm)を表示 lcd.print(" cm "); } delay(100); } |
この投稿をInstagramで見る
今回使ったアイテム
1602 LCDモジュール
Arduinoでよく使われるポピュラーなLCDモジュールとなります。
下記Arduinoスターターキットにも含まれています。
また、I2Cシリアルインターフェースボードモジュールが付属したタイプのものも販売されています。
Arduino UNO
Arduinoはオープンソースのハードウェアなので正規品以外にも互換品が多数メーカーから販売されています。
互換品でも正規品と比べて特に問題なく使用でき数百円程度で購入が可能なのでArduino学習用としていいですね!
Arduino スターターキット
これからArduino学習を進めていくにあたりArduino UNO(互換品)やブレッドボード、ジャンパーピンなどがセットになったスターターキットが販売されています。
私はGeekcreit製のスターターキットを使っていますが、ELEGOO製のものは国内Amazonなどでも購入可能で人気があるようです。(セット内容はほぼ同じです!)
そしてELEGOOのサイトからスターターキット用サンプルスケッチのダウンロードも可能です。(Geekcreitのキットでも使えます)
参考 チュートリアルダウンロードELEGOO基本的にこれからこのセットで出来るものから紹介していこうと考えていますが、かなり多くのことが出来ます。
電子工作を始めるにはまずブレッドボードやジャンパーピン、メインとなるArduino UNOやサーボ、LEDなどの基本的なパーツがないと実際に動かすことが出来ませんが、個々にパーツを購入して回路を組んでとなるとかなりの手間がかかります。
スターターキットがあればArduinoの初歩的なことはかなりの数こなすことが出来るのでオススメです!
そこからスキルアップに伴い個別でセンサーなど必要なものを増やしていくのがいいと思います。
今回使った1602 LCDモジュールはArduinoスターターキットに含まれています。
最後に!
ArduinoでLCDモジュールを使い文字を表示させることが出来ました。
配線は少し大変ですが「LiquidCrystalライブラリ」を使うことにより比較的簡単に表示させることが出来ました。
今回パラレル通信でArduinoからデータを送信しLCDディスプレイに文字を表示させてみました。
パラレル通信ではArduinoとの接続ケーブルが多くなりますがライブラリを使い対応したピンを接続するだけなので理解しやすいかと思います。
また、同じ1602 LCDモジュールでもシリアル通信であるI2C通信を使えばArduinoとの接続はデータピン2本とVcc・GNDの計4本で接続することが出来ます。
GPIOピンの数が少ないArduinoなので他のセンサーやデバイスを接続することを考えるとI2C通信による接続が配線も少なくて良いのですが、今回は基本となるパラレル通信方式での接続を行い理解が深まればと思います。
そして後日、I2Cでの接続方法もご紹介できればと思います。
【追記】
I2C通信を使いLCDモジュールに文字を表示させる方法を[後編]記事として追記しました!
コメントを残す