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


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

全体

【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側のピンのSymbol LCD側のピン番号 Raspberry側のピン番号 WringPiでの番号 GPIOの番号
Vss(GND) 1 GND

Vdd 2 5V

Vo(Contrast Adj) 3 (可変抵抗器の真ん中の足)

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

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

DB1 8 N/C

DB2 9 N/C

DB3 10 N/C

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

BackLight K 16 GND


【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経由での表示を試してみたいと思います。