GPIO接続のLCDへ表示する(シフトレジスタを使う)


今回はIOエクスパンダではなくシフトレジスタを使ってLCDを表示する方法を紹介します。
使用するシフトレジスタは74HC595です。
以下のページでRaspberry Piでの使い方が紹介されています。
http://wiringpi.com/extensions/shift-register-74x595/
シフトレジスタなので出力しかできません。

この製品はTEXAS INSTRUMENTS(通称TI)の74595がご先祖の様ですが、TIだけでなく、いろいろなメーカから互換品が多く出ています。
型番にxxx595と付く互換品でも同様に使えます。
ちなみに74シリーズについては、こ ちらに解説が紹介されています。
また東芝の74シリーズの一覧は、こ ちらの汎用ロジックICで見ることができます。

回路図は以下のようになります。
74HC595は左下が1番ピンです。
74HC595のデータシートによると、供給電圧が4.5Vの時の入力信号のHIGH/LOW閾値は2.1Vから2.4Vなので
5Vで駆動しても、RaspberryのGPIO出力(3.3V)でHIGHと認識します。
74HC595からRaspberryへの入力信号はないので5Vで動かしても問題ありません。
単一電源で使えるのは扱いやすいです。
DataPinはGPIO23、ClockPinはGPIO24、LatchPinはGPIO25に接続しています。
sr595Setup()で指定するのはGPIO番号ではなく、WiringPiのピン番号なので、GPIO23=4、GPIO24=5、 GPIO25=6となります。



コードは以下のとおりです。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <wiringPi.h>
#include <lcd.h>
#include <sr595.h>

/*
 cc -o lcd-74x595 lcd-74x595.c -lwiringPi -lwiringPiDev
*/

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

    if(wiringPiSetup() == -1) {
        printf("wiringPiSetup Fail\n");
        exit(1);
    }

    if(sr595Setup(100,8,4,5,6) == -1) {
        printf("sr595Setup Fail\n");
        exit(1);
    }

    fd_lcd = lcdInit(2,16,4,104,105,100,101,102,103,0,0,0,0);
    lcdClear(fd_lcd);
    lcdPuts(fd_lcd,"ABCDEFGHIJKLMNOP");
    lcdPosition(fd_lcd,0,1);
    lcdPuts(fd_lcd,"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_lcd,0);
                sleep(1);
                lcdDisplay(fd_lcd,1);
                sleep(1);
            }
        }

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

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





出力しか行わないので、IOエクスパンダではなく、1個10円以下(10個で$0.64でした)で入手できる安価なシフトレジスタが適していま す。
各チャンネルから供給できる電流が20mA程度なので、バックライトを制御するときは、Cathode側(マイナス側)をON/OFFした方が確 実です。
こちらでバックライト制御のやり方を紹介しています。

なおシフトレジスタについては以下のページが楽しめます。
http://www.hiramine.com/physicalcomputing/arduino/shiftregister.html
GPIOのLCDでずいぶん楽しめましたが、LCDと一緒に使えそうなチップは一通り試したようなので、このシリーズは今回で終わりの予定です。