読者です 読者をやめる 読者になる 読者になる

Raspberry Pi でTFT液晶モジュールを使用する

概要

f:id:jakalada:20141013230519j:plain

SPIインターフェースのTFT液晶ディスプレイを、Framebufferという仕組みを経由して利用します。

この記事は以下のページに記述されているセットアップ方法の、ローダブルモジュールを使用する場合の抜粋が主です。

Home · notro/fbtft Wiki
https://github.com/notro/fbtft/wiki#install

この記事でディスプレイの使用準備をしたあとで、画像などを表示したい場合は以下の記事を参考にしてください。

Raspberry Pi でTFT液晶モジュールにいろいろ表示する - jakaladaのブログ

fbtftについて

notro/fbtft
https://github.com/notro/fbtft

Adafruit、SainsmartなどがSPIインターフェースのTFT液晶ディスプレイを販売しています。fbtftが提供してくれるカーネルモジュールは、そのようなディスプレイに、Framebufferという仕組みを経由して表示処理を行えるようにしてくれます。

サポートしているディスプレイは以下のページに記載されています。記載されていないディスプレイでも、カーネルモジュールの読み込み設定を調整することで利用できる場合があります。

LCD Modules · notro/fbtft Wiki
https://github.com/notro/fbtft/wiki/LCD-Modules

各液晶ディスプレイの制御コマンドなどを自分で調べて表示を行わせることも可能ですが、MPlayerなどの既存のソフトウェアがFramebufferへの出力をサポートしているため、過去の資産を有効に活用できます。

Raspberry Piの設定

ファイルシステムを拡張しているか確認し、拡張していない場合は拡張してください。

$ sudo raspi-config
「Expand Filesystem」を選択して拡張する。

SPI機能を有効にします。

$ sudo nano /etc/modprobe.d/raspi-blacklist.conf
"blacklist spi-bcm2708"を削除する。

設定変更後、再起動します。

$ sudo reboot

カーネルモジュールのインストール

以下のコマンドでインストールします。

$ sudo REPO_URI=https://github.com/notro/rpi-firmware rpi-update

インストール後、再起動します。

$ sudo reboot

起動完了後、以下のコマンドでカーネルモジュールをロードできるか試します。(adafruit22の部分は使用するディスプレイによって変更してください)

$ sudo modprobe fbtft_device name=adafruit22

dmesgで以下のような出力が確認できれば、ロードが完了しています。

fbtft_device:  SPI devices registered:
fbtft_device:      spidev spi0.0 500kHz 8 bits mode=0x00
fbtft_device:      spidev spi0.1 500kHz 8 bits mode=0x00
fbtft_device:  'fb' Platform devices registered:
fbtft_device:      bcm2708_fb id=-1 pdata? no
fbtft_device: Deleting spi0.0
fbtft_device:  GPIOS used by 'adafruit22':
fbtft_device:    'reset' = GPIO25
fbtft_device:    'led' = GPIO23
fbtft_device:  SPI devices registered:
fbtft_device:      spidev spi0.1 500kHz 8 bits mode=0x00
fbtft_device:      fb_hx8340bn spi0.0 32000kHz 8 bits mode=0x00
graphics fb1: fb_hx8340bn frame buffer, 176x220, 75 KiB video memory, 16 KiB buffer memory, fps=20, spi0.0 at 32 MHz

以下のコマンドを実行し、起動コンソールが表示されれば成功です。

$ con2fbmap 1 1

カーネルモジュールのロードについて

起動時にロードする

/etc/modulesの一番下に以下の行を追加します。

    fbtft_device name=任意のデバイス名

任意のデバイス名は、以下のページの「FBTFT devices」に記載されている表から、使用するディスプレイモジュールに対応するデバイス名を指定してください。

LCD Modules · notro/fbtft Wiki
https://github.com/notro/fbtft/wiki/LCD-Modules#fbtft-devices

画面を回転する

/etc/modulesに追加した行に、rotateというパラメータを追加します。

    fbtft_device name=任意のデバイス名 rotate=90

rotateの値を、0、90、180、270、に変更することで、画面を回転できます。

サポートされていないディスプレイを使用する

個人の方が開発、提供されているディスプレイを使用している場合などは、カーネルモジュールのロード時にデバイス名を指定するだけでは利用できません。

そのような状況では、以下のページに記述されているパラメータを指定して、使用するディスプレイの仕様に合わせる必要があります。

fbtft_device · notro/fbtft Wiki
https://github.com/notro/fbtft/wiki/fbtft_device

例えば、adafruit18と解像度(128x160)とコントローラ(ST7735R)が同じで、PIN配置が違うものを使用する場合、以下のような指定で使用できました。(解像度は160x128で逆だったのですが、画面を回転させることで対応できました)

fbtft_device name=adafruit18 rotate=90 gpios=reset:27,dc:17 speed=15000000

ディスプレイの詳細な仕様を理解できる方であれば、上述のように既存のデバイスの設定に上書きするような形式ではなく、カスタムデバイスを定義することも可能なようです。