LCD(I2C接続の液晶表示)

ここで紹介するのは I2Cで接続可能な2種の小型(8文字、2行)の液晶表示器です。

  1. I2C液晶表示器(1602B)

     先に紹介したパラレル接続の液晶表示器は電源以外に7本の配線が必要でした。また、携帯型にするには少し大型です。ここでは、I2C接続でき、16文字2行が表示できる小型のバックライト付き液晶表示器を紹介します。表示部のサイズは 36mm*14mmです。I2Cの詳細については、別項を参照してください。
     
      1602B

     このLCDは 3.3V の電源が標準ですが、5Vでも利用できます。端子は10本ありますが、接続には左の5端子のみを利用します。バックライト付きもあります。

     1:^reset :リセット端子で、使用しないときは電源5Vに接続
     2:SCL 3:SDA  :I2Cの端子
     4:GND 5:VCC :電源
     消費電流 250μA

     ここでは、LCD の端子SCL を ArduinoのA5(SCL)、SDAをArduinoのA4(SDA) 端子に接続します。他に、Arduinoの電源端子とLCDの電源(5VとGND)を接続します。コントラストはプログラムで設定できます。
    一番上の行には内部定義されたアイコンが表示できます。

  2. I2C液晶表示器(AQM0802A)

     8文字2行表示のさらに小型(表示画面サイズ 28mm*9mm)の表示器もあります(AQM0802A)。これもI2C接続で利用できます。端子がmm間隔なのでブレッドボードに実装するには別売りされているソケットが必要です。
     
      ソケットに接続した AQM0802A

     端子は 1ピン(上側)がVCC(3.3V)、5ピンがGNDです。2ピンがReset、3ピンがSCL,4ピンがSDAになります。電流は最大1.5mAです。Reset は接続不要です。コントラストはプログラムで設定できます。

  3. I2C型LCD接続回路

     ここでは、信号線としては LCD の端子 SCL を Arduino MINI の A5、SDA を Arduino MINI のA4 端子に接続します。MINI の A4、A5 端子は、上の端子ではなく、A3,A2 の端子の下にあります。ブレッドボードで接続するには、接続用の ピンソケット を半田ずけする必要があります。また、MINI の電源端子(3.3V) にLCDの電源(VCC:5VとGND)を接続します。MINI の電源端子は 上部左から4番目、GND 端子は下部左から4番目にあります。SCLが緑、SDAは白の配線です。

       Arduno MINI とLCD1602B のI2C接続

     AQM0802 のソケットは端子が縦並びのため、ブレッドボードには90度回転して差し込みます。図で1ピンが右になります。5ピンのGND の配線は LCD の下に隠れています。

      MINI と AQM0802 のI2C接続

  4. LCD表示プログラム

     I2Cの接続には、標準では Wire.h を利用した、LCD表示用の関数を利用します。まず、lcd_begin(); で LCD を初期化します。lcd_print(buf); で 文字配列 buf[] の文字列を LCD に送ります。lcd_setCursor(clm,row); で表示する列と行を指定できます。clm は 表示を開始する列番号、row は行番号で、row=0 で第一行、row=1 で第2行を指定します。整数は lcd_print(int num); で表示します。lcd_clear() で全文字を消去できます。
     以下のプログラムでは、1行目に ”I2CLCD”、2行目に数字を表示します。
    なお、中間にある CONTRAST の定義では 使用するLCDに合わせてください。
     
    #include <Wire.h>
    
    byte val = 0;
    char Msg[17] = "I2C LCD";
    //char buf[10]="";
    
    void setup(){
      Serial.begin(9600);
      delay(100);
      Wire.begin(); 
      lcd_begin();//初期設定
      Serial.println("setup");
    }
    
    void loop()
    {
      lcd_setCursor(0,0);//カーソルを0行に位置設定
      lcd_print(Msg);//文字列表示
      lcd_setCursor(0,1);//カーソルを0行に位置設定
      lcd_print(val);//数字を表示
      val++;
      Serial.println(".");
      delay(500);
    }
    
    // LCD 1602A、AQM0802
    //接続 
    //LCD.CL:3 LCD.DA:4
    //LCD.VCC:1 3.3V LCD.5:GND GND
    //LCD.Reset:2 PU必要
    
    #define LCDA 0x3E //lcd address
    //LCD によりどちらか選択
    //#define CONTRAST 0x20 //for 3.3V AQM0802
    #define CONTRAST 0x30 //for 3.3V LCD1602A
    //byte val = 0;
    
    char lcdbuf[10]="";
    
    // 液晶へ1コマンド出力
    void lcd_cmd(byte cmd)
    {
      Wire.beginTransmission(LCDA);
      Wire.write((byte)0x00); // コマンド指定
      Wire.write(cmd); // コマンド出力
      Wire.endTransmission(); // ストップ
     //I2c.write((byte)LCDA,(byte)0,cmd);
    /* ClearかHomeか */
      if((cmd == 0x01)||(cmd == 0x02))
        delay(2); // 2msec待ち
      else
        delayMicroseconds(30); // 30μsec待ち
    }
    
    //データを送る
    void lcd_data(byte data)
    {
      Wire.beginTransmission(LCDA); // スタート
      Wire.write(0x40); // 表示データ指定
      Wire.write(data); // 表示データ出力
      Wire.endTransmission(); // ストップ
      delayMicroseconds(30); // 遅延
    }
    
    void lcd_setCursor(byte clm,byte row){
      //row=0 or 1
      if(row==0) lcd_cmd(0x80+clm);
      if(row==1) lcd_cmd(0xc0+clm);
    }
    
    // 初期化
    void lcd_begin(void)
    {
      Serial.println("lcd_begin");
      //I2c.begin(); // begin I2C master
      delay(10);
      lcd_cmd(0x38); // 8bit 2line Normal mode
      lcd_cmd(0x39); // 8bit 2line Extend mode
      lcd_cmd(0x14); // OSC 183Hz BIAS 1/5
    
      /* コントラスト設定 */
      lcd_cmd((byte)(0x70 + (CONTRAST & 0x0F)));//下位4bit
      lcd_cmd((byte)(0x5C + (CONTRAST >> 4)));//上位2bit
      lcd_cmd((byte)0x6B); // Follwer for 3.3V
      delay(1);
    
      lcd_cmd((byte)0x38); // Set Normal mode
      lcd_cmd((byte)0x0C); // Display On
      lcd_cmd((byte)0x01); // Clear Display
      delay(1);
      Serial.println("end of lcd_begin");
    }
    
    //全消去関数
    void lcd_clear(void)
    {
      lcd_cmd(0x01); //初期化コマンド出力
      delay(2);
    }
    
    //文字列表示関数
    void lcd_print(char* ptr)
    {
      while(*ptr != 0) //文字取り出し
        lcd_data(*ptr++); //文字表示
    }
    
    void lcd_print(int num){
       sprintf(lcdbuf,"%d",num);
       lcd_print(lcdbuf);
    }

  5. 発展

     
    1. バッテリー動作可能ですか

      2.7Vから動作し、低消費電流(250μA)ですから、バッテリーで利用できます。

    2. カタカナは表示可能ですか

      半角カナのコードで表示できます