ラズパイにつなげたVFDにXの画面を表示させることができました。
これに至るまでには結構いろいろなことをやったので、何をやったかを備忘録として残しておきます。
(2021/3/11 追記)GitHubのドキュメントにまとめましたのでご覧ください。
(1)レベル変換用基板の作成
VFDの信号が5Vなのに対しラズパイは3.3Vなのでレベル変換が必要です。
ラズパイ→VFDがD0~7, WR#の9本、VFD→ラズパイがRDYの1本。
VFD側はLV374とかで受けているので、3.3Vの信号でも動くような気がしますが、データシートの推奨条件から外れるので真面目に変換することにしました。
VFD→ラズパイのRDYも抵抗分圧でも良さそうですが、周波数が高いと真面目に変換した方がよさそうだったので、ワンゲートロジックを使うことにしました。
回路図はこちら。
https://github.com/ryomuk/gu3000/raw/main/hardware/schematics.pdf
(2)ライブラリの作成
8年ぶりにプログラムを書きました。
仕事ではCとperlばかりだったので、C++で書くのは実は初めてだったりします。
GitHubで公開することにしました。
(3)ラズパイのフレームバッファの設定
/boot/config.txtに下記を記述。
これだとHDMIと共存出来ないような気がしますが、使っていないのでとりあえずこれで済ませました。
framebuffer_height=128
framebuffer_width=256
hdmi_cvt=256 128 60 3 0 0 0
hdmi_group=2
hdmi_mode=87
hdmi_force_hotplug=1
framebuffer_depth=16
(2022/8/6追記:上記で、'framebuffer_depth=16'はkernel5.10で必要になったので追加しました)
depthが16bitなので、8bitにしようと
framebuffer_depth=8
と書いたらbootしてくれなくなり、リモート接続も出来なくなってハマり。SDメモリ上の/boot/config.txtをwindows機で書き直して無事直りました。
(4)Xの設定
Xorgの設定ファイルを探したところ、/etc/X11/にxorg.confが無く、
/usr/shar/X11/xorg.conf.dがあってそれを使っているらしいことが判明。
下記内容のxorg.confを/etc/X11/xorg.confに置いてstartxを起動したら動きました。
Section "Device"
Identifier "testdevice"
Driver "fbdev"
Option "fbdev" "/dev/fb0"
EndSection
Section "Monitor"
Identifier "testmonitor"
EndSection
Section "Screen"
Identifier "screen"
Device "testdevice"
Monitor "testmonitor"
EndSection
Section "ServerLayout"
Identifier "default"
Screen 0 "screen" 0 0
EndSection
(5)window managerの設定
ラズパイ標準のopenboxなるwindow managerは大画面が想定されていて、設定もGUIで行うことが想定されているらしく、端末接続で設定ファイルをいじる方法がわからなかったので、昔懐かしいtwmを使うことにしました。
~/.xsessionに以下を記述
#/bin/sh
xrdb -merge $HOME/.Xresources
twm &
exec xterm -geometry 40x8+0+0
(6)フレームバッファをVFDにコピーするサービスの設定
/dev/fb0をVFDに逐次表示するコマンド(showfb)を作成。
フォントの設定と上記コマンドを起動するシェルスクリプトshowfb.shを作成。内容は下記の通り。
(フォントの作成については後日書きます。)
#!/bin/bash
setfont /usr/share/consolefonts-extra/Noritake6x8.psf
exec /usr/local/bin/showfb
/usr/local/binに置く。
上記スクリプトをサービスとして起動
/etc/systemd/system/showfb.service を作成、下記を記述。
[Unit]
Description=Show /dev/fb0 on VFD module
After=console-setup.service
[Service]
ExecStart=/usr/local/bin/showfb.sh
#ExecStart=/usr/local/bin/showfb
WorkingDirectory=/tmp
#StandardOutput=null
#StandardInput=null
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctrl enable showfb.service
で、サービスを有効化。
以上で、冒頭の画像のような状態になりました。