LCDのバックライト(5V)を制御する


Raspberry PiのGPIO出力は3.3Vです。
ピン#2とピン#4には5Vも出ていますが、これを制御するためには以下の方法があります。
LCDのバックライトはほとんどが5Vなので、バックライトをON/OFFする場合には、このような回路を作る必要があります。

@フォトカプラーを使ってBackLightのAnode側(プラス側)をON/OFFする
回路図を以下に示します。



ブルーのラインが制御用のラインで、このラインをONにすると、フォトカプラーの出力側(コレクター・エミッター側)に電流が流れて
LCDのバックライトが点灯します。

フォトカプラーの入力側(Anode・Cathod側)は一種のLEDなので、LEDと同様に定格電圧、定格電流が決まっています。
たとえばTLP621の場合、定格の電圧=1.15V、電流=10mAなので、抵抗値はLEDの計算と同じ
抵抗値=(3.3V-1.15V)/0.01A=215Ω
となります。
フォトカプラーの出力側(Emitter/Collector側)には50mA程度の電流が流れます。

Aトランジスターを使ってBackLightのCathode側(マイナス側)をON/OFFする
回路図を以下に示します。



トランジスターのBase(ブルーのライン)をONにすると、トランジスターのCollectorがGndに落ちてLCDのバックライトが点灯し ます。

バックライト制御付きのコードは以下の様になります。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <wiringPi.h>
#include <lcd.h>

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

#define BACKLIGHT 6
#define DEBUG    0

int main(int argc, char **argv) {
    int fd_lcd;
    int stlen;
    int i;
    char string1[17];
    char string2[17];

    if(wiringPiSetup() == -1) {
        printf("Setup Fail\n");
        exit(1);
    }
    pinMode(BACKLIGHT,OUTPUT);
    fd_lcd = lcdInit(2,16,4,4,5,0,1,2,3,0,0,0,0);

if(DEBUG)printf("argc=%d\n",argc);
    if(argc == 1) {
        lcdClear(fd_lcd);
        digitalWrite(BACKLIGHT,0);
    } else {
        digitalWrite(BACKLIGHT,1);
if(DEBUG)printf("argv=%s\n",argv[1]);
        memset(string1,0,sizeof(string1));
        memset(string2,0,sizeof(string1));
        stlen=strlen(argv[1]);
if(DEBUG)printf("stlen=%d\n",stlen);
        if (stlen < 17) {
            strcpy(string1,argv[1]);
        } else if (stlen < 32) {
            strncpy(string1,argv[1],16);
            argv[1]=argv[1]+16;
            strncpy(string2,argv[1],stlen-16);
        } else {
            strncpy(string1,argv[1],16);
            argv[1]=argv[1]+16;
            strncpy(string2,argv[1],16);
        }
        lcdClear(fd_lcd);
        lcdPuts(fd_lcd,string1);
        lcdPosition(fd_lcd,0,1);
        lcdPuts(fd_lcd,string2);
    }
}

引数つきで実行するとバックライトをONにした上で、LCDに文字を表示します。
引数なしで実行するとLCDの表示をクリアしてバックライトをOFFにします。
$ sudo ./lcd "Hello World"
$ sudo ./lcd

B最近、電流制限用の抵抗が内蔵されているディジタル・トランジスターという製品を知りました。
こちらに ディジタル・トランジスターの概要が紹介されていますが、ディジタル・トランジスターを使うと、電流制限用の抵抗が不要になります。
トランジスターと同様にBackLightのCathode側(マイナス側)をON/OFFします。
回路図を以下に示します。



ディジタル・トランジスターには内蔵抵抗が10KΩ 4.7KΩ 2.2KΩの物がありますが、なぜか10KΩの物しか正しく動きませんでした。
計算上は4.7KΩや2.2KΩの方がたくさん電流を流せるはずなので、電源制御は奥が深いです。

<おまけ>
2SC1815を使って、入力抵抗(R1)とEB間抵抗(R2)を色々変えて実験してみました。
Ic(コレクター電流)はこ ちらの計算式を使って
Vin=3.3V Hfe=20 R1のばらつき=最大+30% R2のばらつき=最小-20% Vbe=0.75
として計算したものです。
R1 R2 Ic[mA] バックライト制御
2.2K 10K 16.39 OK
2.2K 4.7K 14.76 OK
2.2K 2.2K 11.28 NG(=DTC123EAS)
4.7K 10K 6.90 OK
4.7K 4.7K 5.28 NG(=DTC143EAS)
4.7K 2.2K 1.79 NG
10K 10K 2.48 OK(=DTC114EAS)
10 4.7K 0.85 NG
10K 2.2K 0.00 NG
手元の1602LCDだけの特性かもしれません。
</おまけ>