概要

ArduinoにLCD(SC1602)を接続して、文字を表示する。

参考書
 
KKHMF 1602 LCDモジュール バックライト付き 2個
 
KKHMF 1602 LCD ブラック IIC/I2Cモジュール
 
WayinTop 1602 LCD バックライト付き + IIC/I2Cモジュール



LCDに文字を表示する

SC1602とは

SC1602の定格とピン配置は下図の通りである。
ピン番号が1から順番に、VSS, VDD, ...と表示している。


ArduinoとLCDを接続する

SC1602への接続方法を以下に記載する。

まず、電源は1番ピン~3番ピン、VSSとV0はGnd、VDDは+5.0[V]、バックライトの電源は15番ピン~16番ピン、
LED+(A)は+5.0[V]、 LED-(K)はGndにそれぞれ接続する。
5番ピンのR/Wは、LCDに表示(書き込み)を行うので、Gndに接続する。
7番ピン~10番ピンのDB0 - DB3は、4ビットで操作する(DB5 - DB8だけで制御する)ので使用しない。
その他のピンは、Arduinoへ接続する。


次の表と図を参考に接続する。

LCDピン Arduinoピン 説明
RS 4 Register Select Signal
E 6 Operation (データ R/W) Enable Signal
DB4 10 Data Bus Line
DB5 11 Data Bus Line
DB6 12 Data Bus Line
DB7 13 Data Bus Line



LCDに文字を出力する

ArduinoからLCDを利用するために、LiquidCrystalライブラリを使用する。
なお、LiquidCrystalライブラリは標準でインストールされている。

リファレンスを参照すると、LiquidCrystalのコンストラクタで次のようにピン番号を指定すればよい。

LiquidCrystal(rs, enable, d4, d5, d6, d7)


以下に、LiquidCrystalライブラリを使用して、ArduinoからLCDに文字を出力するサンプルコードを記述する。

 #include <LiquidCrystal.h>
 
 LiquidCrystal lcd(4, 6, 10, 11, 12, 13);
 
 void setup()
 {
    lcd.begin(16, 2);
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Hello, world!");
 }
 
 void loop()
 {
 
 }


また、ArduinoとLCDを接続して、スケッチをダウンロードすると次のようになる。



SC1602 I2Cアダプタを利用する

上記では、 SC1602を直接制御して文字を表示したが、電源や制御信号、データ信号の送信等のために約10本の配線が必要であるが、
GPIOピンが少ないマイコンを使用する時は扱い辛い。
そこで、SC1602 I2Cアダプタを使用すると、電源とI2C(SDA/SCL)で接続が可能となり単純化できる。(I2Cはプルアップが必要)

ここでは、SC1602 I2Cアダプタの使用方法を記載する。
まず、I2Cアダプタは次のようなものである。上がSC1602、下がSC1602 I2Cアダプタである。
(同様のモジュールが各社から販売されているが、各社の仕様は違う可能性があるのでデータシートをよく読むこと)


SC1602 I2Cアダプタのピンアサインは次の通りである。

左側のGnd/Vccは、基本的にジャンパでショートされているが、バックライトを無効化する場合はオープンにする。
オープンにすると必ずバックライトがオンになるのではなく、プログラムから制御が可能である。

中央のポテンショメータは画面のコントラスト調整用である。

ジャンパA0 - A2はアドレス選択用で、全てオープンにすると0x27となる。
ジャンパの設定により、A2 - A0で表される3ビット値を0x27から引いたアドレスにシフトする。
例えば、A2をショート(1)、A1をオープン(0)、A0をショート(1)にした場合、0b101 = 0x5なので、0x27 - 0x5 = 0x22となる。

右側の4本のピンは、上からGnd、Vcc、SDA、SCLである。

I2CインターフェイスSDA、SCLは、Arduino UnoではそれぞれA4、A5である。

Arduino Uno R3
SDA A4
SCL A5


また、I2Cはプルアップが必要である。
次の項目では、LiquidCrystal_I2Cライブラリが内部でWireライブラリを使用しているが、
これは、SDA / SCLピンについて、Arduinoの内部プルアップをアクティベートするものである。


LiquidCrystal_I2Cライブラリ

I2Cアダプタを使用するサンプルコードでは、LiquidCrystal_I2Cライブラリを使用する。

LiquidCrystal_I2Cライブラリのインストール手順を以下に示す。

  1. まず、Arduino IDEから[ツール]メニューバー - [ライブラリを管理...]を選択してライブラリマネージャを起動する。
  2. 次に、検索欄に"LiquidCrystal I2C"と入力して、"LiquidCrystal I2C by Frank de Brabander"をインストールする。
    また、以下に示すWebサイトからダウンロードすることもできる。
    https://www.arduino.cc/reference/en/libraries/liquidcrystal-i2c/
    https://github.com/marcoschwartz/LiquidCrystal_I2C
  3. zipファイルをダウンロードした場合、Arduiono IDEから、[スケッチ]メニューバー - [ライブラリをインクルード] - [.zip形式のライブラリをインストール]を選択して、
    LiquidCrystal_I2Cライブラリを取り込む。

    取り込んだライブラリは、以下のディレクトリに保存される。
    • Linux
      ~/Arduino/libraries
    • Windows
      C:\Users\ユーザ名\Documents\Arduino\libraries
  4. もし、同一の名前のライブラリが同じディレクトリに存在しており、コンパイルが失敗する場合は、不要なライブラリを削除する。


以下にサンプルコードを記述する。

 #include <Wire.h>  // I2Cライブラリ
 #include <LiquidCrystal_I2C.h>
 
 // LCD : 16x2, IC : PCF8574T
 LiquidCrystal_I2C lcd(0x27, 16, 2);
 
 // LCD : 16x2, IC : PCF8574AT
 // LiquidCrystal_I2C lcd(0x3F, 16, 2);
 
 // LCD : 20x4, IC : PCF8574T
 // LiquidCrystal_I2C lcd(0x27, 20, 4);
 
 // LCD : 20x4, IC : PCF8574AT
 // LiquidCrystal_I2C lcd(0x3F, 20, 4);
 
 void setup()
 {
    lcd.init();       // LCDの初期化
    lcd.backlight();  // LCDバックライトの点灯
 }
 
 void loop()
 {
    lcd.setCursor(0, 0);  // 1行目の先頭にカーソルを移動
    lcd.print("Hello,");
    lcd.setCursor(0, 1);  // 2行目の先頭にカーソルを移動
    lcd.print("world!");
    
    delay(1000);
    
    lcd.clear();  // 表示をクリア
    
    delay(1000);
 }




I2CScanner

I2CScannerというプログラムを使用することにより、LCDのI2Cアドレスを確認することができる。
これは、ArduinoにI2C対応機器を接続して、シリアルモニタからI2Cアドレスを確認するものである。


 #include <Wire.h>
 
 void setup()
 {
 #ifdef _ESP32_HAL_I2C_H_
    Wire.begin(26, 25);
 #else
    Wire.begin();
 #endif
 
    Serial.begin(115200);
    while (!Serial); // シリアルモニタが起動するまで待機
    Serial.println("\nI2C Scanner");
 }
 
 void loop()
 {
    byte error    = 0x00,
         address  = 0x00;
    int  nDevices = 0;
 
    Serial.println("Scanning...");
 
    for (address = 1; address < 127; address++) {
       // I2CScannerは、Write.endTransmisstionメソッドの戻り値を利用して、デバイスがそのアドレスに認識(確認応答)したかどうかを確認する
       Wire.beginTransmission(address);
       error = Wire.endTransmission();
 
       if (error == 0) {
          Serial.print("I2C device found at address 0x");
          if (address < 16) {
             Serial.print("0");
          }
          Serial.print(address, HEX);
          Serial.println("  !");
 
          nDevices++;
       }
       else if (error == 4) {
          Serial.print("Unknown error at address 0x");
          if (address < 16) {
             Serial.print("0");
          }
          Serial.println(address, HEX);
       }
    }
 
    if (nDevices == 0) {
       Serial.println("No I2C devices found\n");
    }
    else {
       Serial.println("done\n");
    }
 
    delay(5000);  // 次のスキャンまで5秒待機
 }