2021年1月19日火曜日

LCDへCUI,GUIを出力する HDMIコピーを出力する方法【Raspberry Pi Zero】

 先日やっとRaspberry Pi Zero WHを手に入れまして、早速LCDを接続してミニPCを作ろうと思ったのですが、案外手こずったのでここに手順を記します。



ここではLCDにCUI(コマンドライン)を表示させる、GUI(デスクトップ)を表示させる方法と、HDMIディスプレイの複製をLCDに表示させる方法を紹介します。

0.目次

    1.準備するもの
    2.LCDにデスクトップを表示する編
    3.HDMI出力のコピーをLCDに表示する編

1. 準備するもの

・ラズパイzero (他のラズパイでもできるかもしれません)
・グラフィックLCD(今回はILI9341というコントローラ搭載のものを使用します)
    最近だとAmazonでも1000以下で入手することができます。
・Raspberry Pi OS(Raspbian)の入ったSD
・ディスプレイ(テレビ)+HDMI or SSH環境
    ここではディスプレイを用いて進めます。


2.LCDにデスクトップを表示する編

OSの導入などの手順は省きます。

OSのバージョンの差等によってうまくいく、行かないあるかもしれませんが、当環境はこの投稿時点の最新verです。


https://www.instructables.com/Rasberry-Pi-Zero-W-With-Arduino-TfT-ili9341/

これからの手順はほとんど上のサイトを参考にしています。

上のサイトでは若干いらないのでは?と思う部分があったので省略して、自分がいると思った部分だけ載せます。


Step.1

LCDとラズパイzeroを下の通り、ワイヤリングしていきます。

MOSIピンをGPIO 10 (SPI_MOSI)

MISOピンをGPIO 09 (SPI_MISO)

SCKピンをGPIO 11 (SPI_CLK)

CSピンを GPIO 08 (SPI_CE0_N)

DCピンをGPIO 24

ResetピンをGPIO 23

またLCDには3.3Vを供給します。

LCDのLEDピンには5Vと抵抗(1kくらい)で繋ぎます。


Step.2

ターミナルを起動し、下のコマンドでラズパイコンフィグを開きます.

sudo raspi-config

3 Interface Options -> P4 SPIよりSPIを有効化(enabled)します。

また、ここを参考に起動時にGUIが立ち上がらないようにしてください。


Step.3

次に下のコマンドを実行し、ファイルをnanoエディタで開きます。

自分はnanoが分かりやすいので使っていますが、他のでも大丈夫です。

エディタの使い方等は他のサイトを参照ください。

sudo nano /boot/config.txt

下にスクロールし、"dtparam=i2c_arm=on" , "dtparam=spi=on" の2文のコメントを外します。


最後に、ファイルの最後の部分に下の文を追記します。

dtparam=rotate=90
dtparam=speed=48000000
dtparam=xohms=100
dtparam=debug=4
gpu_mem=64

ここまで終わったらこのファイルを保存して閉じてください。

Step.4(重要)

次に下のコマンドで別のファイルを開きます。
sudo nano /boot/cmdline.txt

ファイルを開き、"root wait"の後に、スペースを挟んで下の一文を挿入します。

この文の後に改行はいれず、スペースだけにしてください。

fbcon=map:10 fbcon=font:ProFont6x11

これを挿入したらファイルを保存して閉じます


次に下のコマンドでファイルを開きます。

sudo nano /etc/modules

ファイルを開いたらファイルに下の5行を追加します。

spi-bcm2835
snd-bcm2835
i2c-bcm2708
flexfb
fbtft_device

ここでひとまず再起動します。

ここまでの手順をミスなく行えれていれば、下の図のように、LCDにカーネル読み込みが表示され、最終的にコマンドラインが表示されます。

(HDMIディスプレイには起動時のカーネル読み込みみたいな部分だけ表示されると思います。)


この画面でCUIの操作はできるのですが、"startx"を打ってGUIに以降するにはもう少し作業が必要です。ここでstartxを打つとフリーズします。

Step.5

下のコマンドでファイルを開きます。

sudo nano /usr/share/X11/xorg.conf.d/99-fbturbo.conf

ファイルを開くとどこかに"fb0"という表記があると思います。

ここを"fb1"に変更し、保存してファイルを閉じます。

"reboot"コマンドで再起動すると、このLCDでGUIを表示できるようになります。

この手順はGUIを起動するにあたって、ディスプレイを選択するようなもので、fb0にあたるのがHDMI,fb1にあたるのがこのLCDです。

なのでこのLCDでGUIを起動するにはfb1に変更する必要があり、逆に元の状態に戻す(ディスプレイで表示するように戻す)にはfb0にまた変更する必要があります。

ここで"startx"コマンドを入力し、デスクトップを表示してみた結果が下の画像です。


ここまでで、自分なりに少しまとめたいと思います。

最初、CUI画面をLCDで見るのではなく、HDMIで出力したくなった場合どこをどうすればいいのか分からなかったのですが、いろいろ試すとStep.4で追記した"fbcon=map:10"という部分が肝心なようで、これを追記することによってCUIがLCDに移行しているようです。


3.HDMI出力をLCDへコピーする編

ここで、先程の手順の状態のまま、HDMI出力をLCDへコピーすると、操作しなければならないコマンドラインがコピーの出力で見えなくなってしまいます。

なので、コマンドライン,CUIの表示をHDMI側に戻す必要があり、そのためには先述の通りStep.4で追記した"fbcon=map:10"を削除するのと、Step.5で述べたように"fb0"に変更します。

その上でStep.6へ進みます。

Step6.

以下の6コマンドを順に実行するだけです(要ネット環境)

sudo apt-get install cmake
sudo git clone https://github.com/tasanakorn/rpi-fbcp.git
mkdir build
cd build
cmake /home/pi/rpi-fbcp
make
sudo install fbcp /usr/local/bin/fbcp

すべてエラーなく完了したら、下のコマンドを実行してください。

fbcp &

すると、LCDにディスプレイのコピーが表示されると思います。

下の画像は実際に表示してみた画像です。

先程のデスクトップ画像より、HDMIをコピーしている分アイコンが小さいのがわかります。