ブログの練習

ブログを書く練習です。
最近はレトロな計算機(電卓、マイコン、パソコンなど)
に関することを書き始めました。

VFDにXの画面を表示させるまでのメモ(1)

2021-03-08 15:17:03 | VFDモジュール

ラズパイにつなげたVFDにXの画面を表示させることができました。
これに至るまでには結構いろいろなことをやったので、何をやったかを備忘録として残しておきます。

(2021/3/11 追記)GitHubのドキュメントにまとめましたのでご覧ください。
OGPイメージ

ryomuk/gu3000

Library for Noritake Itron GU3000 series (GU3100 and GU3900) VFD modul...

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で公開することにしました。
OGPイメージ

ryomuk/gu3000

Library for Noritake Itron GU3000 series VFD module for Raspberry pi 4...

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
で、サービスを有効化。

以上で、冒頭の画像のような状態になりました。


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Noritake itron GU256x128-3100 VFD (その2)

2021-02-17 23:24:56 | VFDモジュール

先日の動画だけだとVFDの美しさがわかりにくいので、拡大写真を載せてみます。
液晶ディスプレイやOLEDに比べて物理的な質感があり、ドットの1粒1粒が輝いているのがとても味わい深いです。


ドット数 32,768 (256x128)
表示範囲 83.1mm x 41.5mm
ドットサイズ 0.225mm x 0.225mm
ドットピッチ 0.325mm x 0.325mm
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Noritake itron GU256x128C-3100 VFD

2021-02-10 14:14:06 | VFDモジュール

ノリタケの高画素(256x128)のVFDで遊んでいます。このVFDの醍醐味はパラレルインターフェース接続のグラフィックDMAモードです。メーカーサイトでシリアルインターフェース用のサンプルはいろいろ提供されているのですが、とにかく遅い。アニメーション的なことをやろうとしたらパラレル接続が必須なのですが、パラレルインターフェースを使った例は見つからなかったので自分で作ってみました。

線や文字の描画はRaspberry pi zero側で行い、VFDのメモリにビットマップを転送して表示しています。
↓動画です

Noritake itron GU256x128C-3100 VFD Wireframe Utah Teapot

ノリタケのVFDでやかんを回してみました。
パラレルインターフェースのグラフィックDMAモード。
線や文字の描画はRaspberry pi ...

youtube#video

 


こちらは、Raspberry pi 4上のffmpegでmp4動画をデコードしながらVFDにバッファを転送して表示しています。120FPSと出ていますが、これはラズパイからVFDへの転送速度です。VFD自体は65FPSで表示しているのでコマは飛んでいます。

Bad Apple!! on Noritake 256x128 VFD graphic DMA mode full speed(no audio)

Raspberry pi 4上のffmpegでmp4動画をデコードしながらVFDにバッファを転送して表示しています。120FPSと出ています...

youtube#video

 



画像データの転送速度なんですが、ハードウェアマニュアルには上記のようなタイミングが書かれています。1byte送る毎に15μs待つ(RDY監視不要)とか書いてあるんですが、
1画面256x128=32768bit = 4Kbyte
4Kbyte * 15μs/byte = 60ms
なので、それだと15FPSぐらいしか出ません。
試行錯誤の結果、書き込み後のdelayMicroseconds(1)と、書き込み前のRDY監視で十分だったので、いまのところそれで済ましています。ちなみに、nanosleep(1000)だと動かないです。
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする