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


前回前々回と少 し脱線しましたが、新しいIOエクスパンダを入手しましたので紹介します。
今回はSPI接続のMCP23S17を 使ってLCDを表示する方法を紹介します。
以前に紹介したMCP23017のI/Fがi2cからSPIに変わっているだけの チップです。

回路図は以下のようになります。
Raspbeeryからの配線は7本となります。
MCP23S17は左下が1番ピンです。
5V駆動のLCDを使いましたので、LCD駆動電圧(5V オレンジ)とMCP23S17駆動電圧(3.3V 赤)が混在しています。
5V電圧を抵抗などで3.3VにレベルシフトしてMCP23S17に供給すれば、電源電圧は5Vだけで済みます。

MCP23S17は1.8Vから5.5Vの範囲で動きます。
今回は出力(MOSI)しか使わないので、5Vで駆動しても(多分)問題ありませんが、MCP23S17からの入力(MISO)を使った場合、
RPiのMISOに5Vが流れ込んでくるので、RPiを壊すことになります。


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

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

    if(mcp23s17Setup(100,0,0) == -1) {
        printf("wiringPiSetup 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);
}



続く...