DreamerDreamのブログ

夢想家の夢です。

PiTFTのバックライトを画面スリープと同時に消す

 以前に書いたPiTFTのバックライトがスリープ時にも消えない。

dreamerdream.hateblo.jp

 このままでも使えるんだけどもLEDの寿命と発熱の問題が出てきそうなのでスリープと同時にバックライトを消すスクリプトを書いた。

 

Raspbianで画面スリープを検知する方法が見当たらなかったので前回書いた画面スリープ時に書き出される/dev/shm/sleep_displayファイルを参照するという方法を利用することにした。

 

dreamerdream.hateblo.jp

 

 

-- /usr/local/lib/pitft_backlightd.py --

#!/usr/bin/python

import RPi.GPIO as GPIO
import time, sys, os, atexit
import file_mng

LED = 18

Hz = 100.0
DUTY = 100.0

DUTY_etc = "/etc/pitft_backlight"
SLEEP = '/dev/shm/sleep_display'


def end():
    GPIO.cleanup()

def init():
    atexit.register(end)
    GPIO.setmode(GPIO.BCM)
    GPIO.setup(LED, GPIO.OUT)

def pwm():
    global DUTY
    dt = DUTY
    init()
    p = GPIO.PWM(LED,Hz)
    p.start(0)
    p.ChangeFrequency(Hz)
    while 1:
        data = file_mng.load_line(DUTY_etc, 1)
        if('not Load' != data):
            try:
                dt = float(data)
                if(dt < 0):
                    dt = 0.0
                if(100 < dt):
                    dt = 100.0
            except:
                dt = 100.0
        data = file_mng.load_line(SLEEP, 1)

        if("1" == data):
            p.ChangeDutyCycle(0.0)
        else:
            p.ChangeDutyCycle(dt)

            time.sleep(0.3)

    p.stop()

def fork():
    pid = os.fork()

    if pid > 0:
        f = open('/var/run/pitft_backlightd','w')
        f.write(str(pid)+"\n")
        f.close()
        sys.exit()

    if pid == 0:
        pwm()

    if __name__=='__main__': 
        pwm()

 

100HzでPWMを出力、/dev/shm/sleep_displayを参照して1ならGPIO18にDuty0を、0、もしくはファイルが無いならDuty100を出力するという単純な動作。

Duty0って出力OFFじゃないの?って思ったが違うらしい。よくわからないがPWM出力しないとOFFにならなかった。また、ラズパイをOFFにするとPWM出力されないのでバックライト点灯しっぱなしになる。この辺りはマイコンとかで主電源を制御する必要がありそう。

 

また/etc/pitft_backlightにDuty値を設定することでアクティブ時の照度を設定出来るようにした。しかしPythonでのPWMはあまり正確ではないらしく、チラチラするので100か0で使うのがベターだと感じた。

file_mngは以前に書いたものを利用

dreamerdream.hateblo.jp

 

これをデーモンとして動作させることでPiTFTのバックライトLEDを制御できるようになった。