GPIO接続のLCDへ表示する(PCF8574を使う)


またまた、新しいIOエクスパンダを入手しましたので紹介します。
今回はi2c接続のPCF8574を 使ってLCDを表示する方法を紹介します。
以下のページで使い方が紹介されています。
http://wiringpi.com/extensions/i2c-pcf8574/

5V仕様のLCDを使った場合の回路図は以下のようになります。
Raspberryのi2cは3.3V仕様なので、PCF8574は3.3Vで駆動する必要が有ります。
5V電圧を3.3VにレベルシフトしてPCF8574に供給すれば、電源電圧は5Vだけで済みます。



3.3V仕様のLCDを使った場合の回路図は以下のようになります。
PCF8574もLCDも3.3Vの単一電源で駆動することができます。



コードは以下のとおりです。
pcf8574Setup()の2番目の引数でi2cアドレスを指定します。
PCF8574 シリーズは、色々なメーカから提供されています。
メーカにより少しずつ型番が違い、例えばNXPではPCF8574/8574A、
PHILIPSではPC8574P/8574AP/8574T/8574AT/8574TS となっていて、一部のチップではi2cアドレスの範囲が違います。

address map
PCF8574 0x20-0x27
PCF8574P 0x20-0x27
PCF8574A 0x38-0x3F
PCF8574AP 0x20-0x27

使う前にi2cdetectでi2cアドレスを確認した方がいいです。
今回使用したチップは「PCF8574P」の刻印があるチップなので、i2cアドレスは0x20になります。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <wiringPi.h>
#include <lcd.h>
#include <pcf8574.h>

/*
 cc -o lcd-pcf8574 lcd-pcf8574.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(pcf8574Setup(100,0x20) == -1) {
        printf("pcf8574Setup Fail\n");
        exit(1);
    }

    fd_lcd = lcdInit(2,16,4,100,102,104,105,106,107,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);
}





このチップは8チャンネルとチャンネル数が少ないので、6チャンネルしか使わないLCDを制御するのには適しています。
各チャンネルから供給できる電流が25mA程度なので、バックライトを制御するときは、Cathode側(マイナス側)をON/OFFした方が確 実です。
こちらでバックライト制御のやり方を紹介しています。



パラレルの1602LCDをi2c化するモジュールが発売されています。
PCF8574Tが実装されていて、1602のLCDの背面に直接はんだ付けする製品で、BackPackと呼ばれています。


こちらに Board Schematic が公開されていますので、ブレッドボード上で等価の回路を組んでみました。
8050はピン配置が国産の物とは違っていてE-B-C配列になっています。
こちら
のコードを試してみましたが、バックライト制御が正しく動きません。



BackPackでは、8050のBaseを4.7Kの抵抗でPullUpしていますが、バックライトが消灯したままになります。
以下の様にBase抵抗の位置を変えると、バックライト制御が正しく動くようになりました。
つまりBackPackは3.3VのRaspberryでは動かないことになります。



続く...