さて。ここ数年、スマートウォッチのブームがもたらした最大の恩恵は、超ちっさいLCDパネルが安価に入手できるようになった事だと思ってるKichitaroです。
というわけで、今回は、解像度が240x240、液晶サイズ1.3インチと言う、超ちっちゃいIPS液晶ディスプレイをRaspberry Piにつなげて、画面出力するための方法について書きたいと思う。
なお、おそらく他のブログでは紹介しているのを見た事が無い、「CS端子が無いIPS液晶をラズパイで使う」方法をメインで書くので、かなり有用な情報になるんじゃないかと。
これ書いたことで値上がりしたらサムいけど、許してね(笑)
※Raspbian Busterだとデスクトップ画面の表示が以下の手順ではうまくいかないとの情報があります。いずれ、解決策探りますが、現時点ではRaspbian Stretchでお試しください。
Raspbian Stretch(2019-04-09)の入手先
注意!!ラズパイでちっちゃいIPS液晶を使う場合のチェックポイント。
さて、ちっちゃいIPS液晶を手に入れて、Raspberry Piからなんらか画面だったり、情報、動画を表示して遊んでみたいと思う人も結構いるんじゃないかと思う。
だけど、Raspberry Piで使用する際には、一点注意が必要なポイントがあって、同じIPS液晶パネルを採用していても、Amazon等で安価に流通しているものの多くが、「ラズパイで使用する上での問題点」を抱えているため、この点を理解した上で購入しないと、買ったはいいが使い方がわからない、なんてことになってしまうと思う。
なお、今回使う、「安いヤツ」はこのタイプ。日本だと500円以下、中国直だと数ドルで買える。激安。
では、いったいこの液晶にどういう問題があるのか?
それは、SPI通信で用いる「CS(Chip Select)」端子がない、という点だ。
この安い液晶基板になぜCS端子が無いまま流通しているのかは、よくわからないのだけど、Arduinoで用いる際には特に問題にならないようなので、固定用のねじ穴を確保した上で、最小限のサイズ(幅)に抑えるために省略したというのが、おそらくその理由だろう。
で、Raspberry Piでこの「安いヤツ」を使用する際に、これがどういう問題を引き起こしているかというと、CSが内部でGNDに接続されてしまっているために、「一般的なSPI接続で液晶を接続するやり方」が使えないという状況を引き起こしてしまっている。
※SPIにおけるCS端子の役割はマスター/スレーブの切り替えを制御することなのだけど、これが制御できないことで問題が発生するという話。詳細は割愛。
結果、この「CS無しの」IPS液晶はラズパイでは改造しないと使えないとまで思われている始末だったりするんだけど、、、お安いの、皆さん、使いたいですよね?(爆)
安心してく、、、、古いな。やめとこう。使う方法、あるよ(笑)
ちっちゃなIPS液晶をラズパイに接続する
なお、参考にする手順は、同じIPS液晶を使用しているWaveshareの「1.3inch LCD HAT」の手順で必要な物をパク、、、参考にして、「CS無し」で使うためにちょこっとだけいじってやる事にする。
Waveshare - 1.3inch LCD HAT
まずは接続という事で、IPS液晶側の端子のシルクを見て、適切につないでやろう。ボクの試した際の接続方法は以下の通り。
GND→20番ピン
VCC→17番ピン
SCL→23番ピン(P11:SCLK)
SDA→19番ピン(P10:MOSI)
RES→13番ピン(P27)
DC→22番ピン(P25)
BLK→18番ピン(P24)
なお、ここで「xx番ピン」と書いているのは、物理ピンの番号なので注意。上記がどこのGPIOを指しているのかが分からない方は、「Raspberry Pi Zero GPIO」などのキーワードでGoogle検索して、図で確認すると良いかと。
上記の接続が終わったら、今回はRaspbianで試すので、RaspbianのイメージをSDカードに焼き、起動してやろう。なお、本題からズレるので、ここではRaspbianについては特に説明はしない。
ちっちゃなIPS液晶を使用するための設定手順
というわけで、さっそく設定に入るため、SSHで接続をする。モジュールの有効化
fbtftドライバーを有効化して画面表示をするため、「/etc/modules」を編集する。(なお、ボクはvimを愛用しているのでviと記述しているけど、nanoでも問題なし)
$ sudo vi /etc/modules
以下行を追加する
spi-bcm2835 flexfb fbtft_device
fbtft設定の追加
fbtftの設定を行うため、以下の手順で「/etc/modprobe.d」配下に「fbtft.conf」を作る。
なお、ここで重要なのが、赤字で示した「mode=3」を追記する点。これがCS無し液晶を使用する際に必須の設定になる。そして、Waveshareのマニュアルと見比べてもらうとわかるけど、CSのGPIO設定は不要なため、削除している点もポイント。画像も添付しておくけど、options行は改行をいれずに、こんな感じで2行に書いてね。
$ sudo vi /etc/modprobe.d/fbtft.conf
options fbtft_device name=flexfb gpios=reset:27,dc:25,led:24 speed=40000000 bgr=1 fps=60 custom=1 height=240 width=240 mode=3
options flexfb setaddrwin=0 width=240 height=240 init=-1,0x11,-2,120,-1,0x36,0x70,-1,0x3A,0x05,-1,0xB2,0x0C,0x0C,0x00,0x33,0x33,-1,0xB7,0x35,-1,0xBB,0x1A,-1,0xC0,0x2C,-1,0xC2,0x01,0xFF,-1,0xC3,0x0B,-1,0xC4,0x20,-1,0xC6,0x0F,-1,0xD0,0xA4,0xA1,-1,0x21,-1,0xE0,0x00,0x19,0x1E,0x0A,0x09,0x15,0x3D,0x44,0x51,0x12,0x03,0x00,0x3F,0x3F,-1,0xE1,0x00,0x18,0x1E,0x0A,0x09,0x25,0x3F,0x43,0x52,0x33,0x03,0x00,0x3F,0x3F,-1,0x29,-3
※ここで入れている「mode=3」という設定は、SPIモードを3に指定して起動させる目的の指定となる。その他の手法でもSPIモードを3にさえ指定できれば画面表示は可能となるはず。
※optionsの2行目はなんか意味の分からない呪文みたいになっているけど(笑)、これはinitパラメータと言うもので、詳細はflexfbのWikiなんかを見て理解しておくのも良いかも。ボクは過去に一度理解したけど忘れた(笑)
SPIの有効化
上記の設定の後、raspi-configでSPIを有効にしておこう。
$ sudo raspi-config
5 Interfacing Option -> P4 SPI -> Yesを選択
再起動および「/dev/fb1」の確認。
ここまでで、まずはSPI経由でこのIPS液晶を使用する準備は整ったので、いったん再起動を行う。
$ sudo reboot
再起動後、「/dev」配下にfb1がfb0とは別にできている事を確認する。
fbcpの導入
デスクトップ画面をこのちっちゃな液晶画面に表示するために、fbcpというアプリケーションの導入を行う。なお、このfbcpは動作としてはHDMI出力であるfb0への出力内容を、fb1にコピーしてくれるアプリケーションとなっている。
※そのため、HDMI出力をOFFにしてると画面が出ないという罠も(笑)
必要なツールを以下のコマンドで導入。
$ sudo apt-get update $ sudo apt-get install cmake git
以下の手順でfbcpのソースを入手し、コンパイルしてやる。
$ cd ~ $ git clone https://github.com/tasanakorn/rpi-fbcp $ cd rpi-fbcp/ $ mkdir build $ cd build/ $ cmake .. $ make $ sudo install fbcp /usr/local/bin/fbcp
自動起動の設定
fbcpをOS起動時に自動起動させてやるために、「/etc/rc.local」中の「exit 0」行の直上に「fbcp &」という行を追加してやる。
$ sudo vi /etc/rc.local
fbcp &
※なお、Debian Strech以降はSystemdにより、多くのプロセスが一斉に立ち上がる仕様になったために、fbcpの起動タイミングで他の必要プロセスの準備ができておらず、画面が出てこないという事が時々発生する。正しくやるならfbcpサービスを定義して、順序をきっちり書くか、雑にやるなら、30秒ほどスリープさせてからfbcpを起動してやるとうまくいくのを、経験則として得ている(これ、超重要な情報)
出力画面設定
さて、先ほど書いた通り、fb1にはHDMIで出力された画面が「縮小コピーされて」表示されることになる。というわけで、以下の通り、HDMIの設定を追加する。
$ sudo vi /boot/config.txt
hdmi_force_hotplug=1 hdmi_cvt=300 300 60 1 0 0 0 hdmi_group=2 hdmi_mode=1 hdmi_mode=87 display_rotate=3
なお、画面を回転させたい場合は、「display_rotate 」の指定を、以下の通り変更してやればよい。
0 no rotation
1 時計回りに90°回転
2 時計回りに180°回転
3 時計回りに270°回転(つまり反時計回りに90°回転)
hdmi_cvtの設定もここでは300x300で表示するように設定しているけど、どうせ240x240に縮小表示されるので、用途に合わせて、好みの解像度を入れれば良いと思う。
というわけで、再起動。画面、出たよね!
$ sudo reboot
めっちゃ苦労した内容もまとめると何の変哲もない話
解像度がさすがに240x240あるのでちっさい文字もちゃんと読めるよね。
さて、今回のTIPS、実際は、英語サイトも含めてどこを探しても見つからず、ボクも数週間悩んで、やっとのことでこの設定を見つけた経緯があったりするのだけど、今日からはフツーの情報になるかと思う(笑)
まあ、とは言え、情報は共有して、みんなで楽しむことが重要。Twitterでも共有したけど、動画再生も結構ヌルヌルいけます。ちっちゃなテレビとか作ってみる?
というわけで、過去に試した手順の再確認のため、激安で買える240x240の500円玉サイズのIPS液晶をラズパイゼロWHにSPI接続して、Raspbianのデスクトップ表示&720pの動画再生する実験。— Kichitaro (@TaroKichijo) August 1, 2019
結構ヌルヌルで問題なしね。 pic.twitter.com/XssiYggUJu
なお、同様のTIPSでLibreELEC(Kodi)だったり、RetroPieなんかも画面を出すことができるようになるかと。
というわけで、皆様も激安液晶を入手して、是非遊んでみてください!
スポンサーリンク
スポンサーリンク