ラズパイでCUIモードでも画面描画したい
ラズパイでX-Window使うのも良いのですが、CPUリソースをより多く使うプログラムなどを稼働させる場合はCUIモードで使いたい。
ただ、CUIモードだと文字しか表示できないし、何か表示するにも少し物足りない。
何か良い方法はないかと調べてみたら、フレームバッファ(/dev/fb0)に画像表示など描画できるらしい。
画像の表示するには、fbiというコマンドを使う。
インストールされてなければ、aptコマンドでインストールする。
$ sudo apt install fbi
画像表示のコマンドは、以下のように実行する。
$ sudo fbi -nocomments -noverbose -a -T 1 -d /dev/fb0 JPEGファイル等
これはいい。
フォトフレームとかなら、非力なラズパイZEROでもすぐ作れちゃいますね。
任意のテキスト文字も表示してみたい
画像表示できるなら、テキスト文字だって出力できるライブラリくらいあるよね。やるならpythonがいいかな。
で、調べてみたら、pygameライブラリを使うと簡単に出来そうです。
ついでに、日本語フォントも使ってみたい。
フォントは、pygame.font.Font でフォントファイルを指定すればいいみたい。
ここは、PAexフォントを使ってみます。
https://moji.or.jp/ipafont/ipafontdownload/
ダウンロードしたファイルは、適当なところに保管して、pygame.font.Fontで保管パスを含めてファイル名を引数で渡せばいい。
サンプルプログラム(デジタル時計表示)
環境が整ったので、デジタル時計でも表示してみます。背景画像を時間帯で切り替えるのもいいですね。今回はやらないけど。
import pygame, sys, os
import datetime
from pygame.locals import *
from time import sleep
import locale
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
FONT_PATH="/home/pi/ipaexg.ttf"
os.environ["SDL_FBDEV"] = "/dev/fb0"
pygame.init()
screen = pygame.display.set_mode((0, 0), 0, 32)
basicfont = pygame.font.Font(FONT_PATH, 200)
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
screen.fill((20, 20, 20))
now_dt = datetime.datetime.now()
now_d = str( now_dt.strftime('%Y年%-m月%-d日(%a)'))
now_t = str( now_dt.strftime('%H:%M:%S'))
text1 = basicfont.render(now_d, True, (200, 200, 200))
textrect1 = text1.get_rect()
textrect1.centerx = screen.get_rect().centerx
textrect1.centery = screen.get_rect().centery /2
screen.blit(text1, textrect1)
text2 = basicfont.render(now_t, True, (200, 200, 200))
textrect2 = text2.get_rect()
textrect2.centerx = screen.get_rect().centerx
textrect2.centery = screen.get_rect().centery + textrect1.centery
screen.blit(text2, textrect2)
pygame.display.update()
sleep(1)
表示された画面はこちら。


