以前に書いたPiTFTのバックライトがスリープ時にも消えない。
このままでも使えるんだけどもLEDの寿命と発熱の問題が出てきそうなのでスリープと同時にバックライトを消すスクリプトを書いた。
Raspbianで画面スリープを検知する方法が見当たらなかったので前回書いた画面スリープ時に書き出される/dev/shm/sleep_displayファイルを参照するという方法を利用することにした。
-- /usr/local/lib/pitft_backlightd.py --
#!/usr/bin/python
import RPi.GPIO as GPIO
import time, sys, os, atexit
import file_mngLED = 18
Hz = 100.0
DUTY = 100.0DUTY_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は以前に書いたものを利用
これをデーモンとして動作させることでPiTFTのバックライトLEDを制御できるようになった。