GPIO接続のLCDへ表示する(MCP23017を使う その2)


前回は簡単なサンプルでIOエクスパンダ(MCP23017)の使い方を紹介しま した。
今回はIOエクスパンダ(MCP23017)を使ってLCDを表示する方法を紹介します。
回路図は以下のようになります。
Raspbeeryからの配線は5本と少なくなりますが、ブレッドボード上の配線が複雑になります。
MCP23017は左下が1番ピンです。
5V駆動のLCDを使いましたので、LCD駆動電圧(5V オレンジ)とMCP23017駆動電圧(3.3V 赤)が混在しています。
5V電圧を抵抗などで3.3VにレベルシフトしてMCP23017に供給すれば、電源電圧は5Vだけで済みます。

i2cのSDAラインには双方向に信号が流れます。
MCP23017は1.8Vから5.5Vの範囲で動きますが、5Vで駆動すると、RPiのSDAに5Vが流れ込んでくるので、
RPiを壊すことになります。

コードは以下のとおりです。
こちらで紹介したコードから下線の部分だけ変更しています。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <lcd.h>
#include <mcp23017.h>

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

    if(mcp23017Setup(100,0x20) == -1) {
        printf("Setup Fail\n");
        exit(1);
    }
    fd_lcd = lcdInit(2,16,4,104,105,100,101,102,103,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);
}





続く...