ラズパイで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)
表示された画面はこちら。