GPIO接続のLCDへ表示する(基本的な接続)


Raspberry Piを使って、i2c接続のLCDモジュールへの表示はいくつか紹介されていますが、
GPIO接続のLCDモジュールへの表示に関するページはなかなか見 つからなかったので紹介します。
使用するLCDはHD44780のコントローラを搭載した一般的な16文字2行表示のLCDです。
秋月電子で売られているSUNLIKE社製のSC1602BSLB(バッ クライト付き)/SC1602BS*B(バッ クライト無し)などもこれに該当します。
同じくSUNLIKE社製3.3V駆動のSC1602BBWBも 電源電圧だけ変更すれば動きます。

全体

【STEP1】Raspberryとの結線

こ のページを参考にして結線を行いましたが、RSとEnable Signalのピン番号は変更しています。
4ピン接続と8ピン接続の例が載っていますが、私は結線が楽な4ピンを選びました。
注意する点として、LCDによっては1番ピンがVss(GND)、2番ピンがVdd(供給電源)のものと、
1番ピンがVdd(供給電源)、2番ピンがVss(GND)のものがありますので、ここはお使いのLCDのデータシートで確認してください。
私が使用したLCDは1番ピンがVss(GND)、2番ピンがVdd(供給電源)で、バックライトは15番と16番か ら供給しますので結線は以下のよ うになります。
コントラスト調整用には10KΩの可変抵抗器を使いました。



LCDのピン番号 LCDのピンのSymbol Raspberryのピン番号 WringPiでの番号 GPIOの番号
1 Vss(GND) GND

2 Vdd(※1) 5V

3 Vo(Contrast Adj)(※2) 可変抵抗器

4 RS(Register Select) 16 4 23
5 R/W(Read/Write) GND

6 Enable Signal(Clock) 18 5 24
7 DB0 N/C

8 DB1 N/C

9 DB2 N/C

10 DB3 N/C

11 DB4 11 0 17
12 DB5 12 1 18
13 DB6 13 2 27
14 DB7 15 3 22
15 BackLight A(※1) 5V

16 BackLight K GND


(※1)駆動電圧が3.3Vのモジュール(低電圧版)と5Vのモジュールが有ります。5V版は3.3Vでは動きません
(※2)個体差があるかもしれませんがGNDでも大丈夫なぐらい低電圧です。
(※3)低電圧版は3.3V、5Vモジュールは5Vが基本ですが、5Vモジュールでも3.3Vで点灯するものとしないものがあります。5Vなら間 違いなく点灯します。

【STEP2】開発環境の準備

Raspberry Piに以下の開発環境をインストールします。
$ sudo apt-get install git-core
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ ./build

【STEP3】ソースコード

こ のページを参考に以下のコード(lcd-gpio.c)を書きました。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <lcd.h>

int main(int argc, char **argv) {
    int fd;
    int c;
    int i;

    if(wiringPiSetup() == -1) {
        printf("Setup Fail\n");
        exit(1);
    }
    fd = lcdInit(2,16,4,4,5,0,1,2,3,0,0,0,0);

    lcdClear(fd);
    lcdPuts(fd,"ABCDEFGHIJKLMNOP");
    lcdPosition(fd,0,1);
    lcdPuts(fd,"abcdefghijklmnop");

    while (1){
        printf("0:lcdDisplay test\n");
        printf("1:lcdCursor test\n");
        printf("2:lcdBlink test\n");
        printf("q:End\n");
        c=getchar();
        if(c == 'q') break;

        if(c == '0') {
            for(i=0;i<10;i++) {
                lcdDisplay(fd,0);
                sleep(1);
                lcdDisplay(fd,1);
                sleep(1);
            }
        }

        if(c == '1') {
            for(i=0;i<16;i++){
                lcdPosition(fd,i,0);
                lcdCursor(fd,1);
                sleep(1);
            }
            lcdCursor(fd,0);
        }

        if(c == '2') {
            for(i=0;i<16;i++){
                lcdPosition(fd,i,1);
                lcdCursorBlink(fd,1);
                sleep(1);
            }
            lcdCursorBlink(fd,0);
        }
    }
    lcdClear(fd);
}

悩んだのはリンク方法です。
上記のページではWiringPiのライブラリ(WiringPi Library)にはLCDライブラリが含まれてるように見えますが、
LCDライブラリは「WiringPi Devices Library」に含まれていて、これを使うときには下線部分の指 定が 必要になります。
$ cc -o lcd-gpio lcd-gpio.c -lwiringPi -lwiringPiDev

実行するとLCDに文字が表示され以下のメニューが表示されますので選んでください。
$ sudo ./lcd-gpio
0:lcdDisplay test
1:lcdCursor test
2:lcdBlink test
q:End

拡大

i2c接続に比べGPIO接続の場合、たとえば20文字*4行のLCDなど、LCDの選択肢は増えますが、接続のためのワイヤーが多くなるのが欠 点です。
そこで、次回はi2c、またはSPIのI/OエクスパンダICを入手して、 i2c、またはSPI経由での表示を試してみたいと思います。