Monthly Archives: 4月 2016

Raspberry Pi 3 Raspbian Jessie で Waveshare 3.5インチ タッチ液晶を動かす

Raspberry Pi3のついでにWaveshare 3.5インチ タッチパネル付き液晶を購入したのですが動作させるのに結構苦戦したので手順を残すためにメモしておきます。

このタッチパネル付き液晶モデル(3.2インチ版も含む)の使用方法を紹介しているサイトの多くは
メーカー?が提供しているISOを使ったりLCD-show.tar.gzを使っていたりしますがPi3では起動しなくなるようです・・・

Raspbian JessieのインストールはNOOBSを使いました。
インストール後はLANへの接続と日本語フォントの追加とSSHが有効であるかの確認を行っています。

SPIの有効化とBOOT時のGUIの無効化(CUI+自動ログイン)に変更します。

$ raspi-config

必要なパッケージ群をインストール。

$ sudo apt-get install xinput evtest libts-bin
$ sudo apt-get install fbi

タッチパネル付き液晶への出力設定

何も設定していない場合はfb0しか無いはずです。

$ ls -al /dev/fb*
crw-rw---- 1 root video 29, 0  4月  2 12:41 /dev/fb0

FBTFT関連のカーネルモジュールをロードさせます。
以前は自力で導入する必要があったようですが、現在は標準で含まれているようです。

$ sudo modprobe flexfb width=320 height=480 regwidth=16 init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3
$ sudo modprobe fbtft_device debug=3 rotate=90 name=flexfb speed=16000000 gpios=reset:25,dc:24

カーネルモジュールをロードするとデバイスファイルが増えるはずです。

$ ls -al /dev/fb*
crw-rw---- 1 root video 29, 0  4月  2 12:41 /dev/fb0
crw-rw---- 1 root video 29, 1  4月  2 12:41 /dev/fb1

後から追加されたfb1がタッチパネル付き液晶なので試しに画像を表示してみます。

$ wget https://kernel.org/theme/images/logos/tux.png
$ sudo fbi -d /dev/fb1 -T 1 -a tux.png

image3

起動時に自動でモジュールを読み込むように指定します。

$ sudo vi /etc/modules-load.d/waveshare.conf
spi-bcm2835
flexfb
fbtft_device

$ sudo vi /etc/modprobe.d/waveshare.conf
options flexfb width=320 height=480 regwidth=16 init=-1,0xb0,0x0,-1,0x11,-2,250,-1,0x3A,0x55,-1,0xC2,0x44,-1,0xC5,0x00,0x00,0x00,0x00,-1,0xE0,0x0F,0x1F,0x1C,0x0C,0x0F,0x08,0x48,0x98,0x37,0x0A,0x13,0x04,0x11,0x0D,0x00,-1,0xE1,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0xE2,0x0F,0x32,0x2E,0x0B,0x0D,0x05,0x47,0x75,0x37,0x06,0x10,0x03,0x24,0x20,0x00,-1,0x36,0x28,-1,0x11,-1,0x29,-3
options fbtft_device debug=3 rotate=90 name=flexfb speed=16000000 gpios=reset:25,dc:24

起動時からフォントを指定してfb1に出力させるように行末へ以下を追記します。
何だろうと少し調べてみましたが、このfbcon=map:1の役割はcon2fbmapコマンドと同じようですね。

$ sudo vi /boot/cmdline.txt
fbcon=map:1 fbcon=font:ProFont6x11 # 行末に追記します

image1

デスクトップをfb1に出力させながら起動するとタッチパネル付き液晶に表示されるはずです。

$ sudo FRAMEBUFFER=/dev/fb1 startx

image2

デスクトップの出力先をfb1に変更すると再起動後もタッチパネル付き液晶に表示されるようになるのですが
この方法だと、画面が小さすぎて色々と辛いのとHDMIが表示されなくなるので変更しない方法を探しました。

$ sudo vi /usr/share/X11/xorg.conf.d/99-fbturbo.conf
# This is a minimal sample config file, which can be copied to
# /etc/X11/xorg.conf in order to make the Xorg server pick up
# and load xf86-video-fbturbo driver installed in the system.
#
# When troubleshooting, check /var/log/Xorg.0.log for the debugging
# output and error messages.
#
# Run "man fbturbo" to get additional information about the extra
# configuration options for tuning the driver.

Section "Device"
        Identifier      "Allwinner A10/A13 FBDEV"
        Driver          "fbturbo"
        Option          "fbdev" "/dev/fb0" # <- fb0からfb1に変更する方法もあるけど今回はそのまま

        Option          "SwapbuffersWait" "true"
EndSection

色々と調べてみたんですが
フレームバッファをコピーするfbcpコマンドをインストールすることにより
fb0(HDMI)をfb1(タッチパネル付き液晶)に映せる事が分かったので利用することにしました。

これにより、HDMIに接続して起動しても画面が真っ暗って事もなく
ウインドウ幅が小さすぎて操作が困難という問題を解消できます。

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

起動時に実行させる方法で少し悩んだのですが
とりあえず安直にrc.localへ追記しておきます・・・

$ sudo vi /etc/rc.local
su -l pi -c fbcp &

最初で設定したのと逆にraspi-configでデスクトップに自動でログインするように設定を直すと
起動が完了するとタッチパネル付き液晶にデスクトップが映るようなります。

image2(1)

タッチパネルの有効化

このままだとタッチパネルが使えないので設定します。

マウスとキーボードをRaspberry Piに接続している場合は以下のようになっているはずです。

$ ls -al /dev/input/event*
crw-rw---- 1 root input 13, 64  4月  2 14:13 /dev/input/event0
crw-rw---- 1 root input 13, 65  4月  2 14:13 /dev/input/event1

以前はads7846_deviceだったらしいですがads7846に変わったようなので以下のように追記します。

$ sudo vi /boot/config.txt
# 末尾に追加
dtoverlay=ads7846,cs=1,penirq=17,penirq_pull=2,speed=1000000,keep_vref_on=1,swapxy=1,pmax=255,xohms=60,xmin=200,xmax=3900,ymin=200,ymax=3900

キャリブレーションの設定を行うついでに、画面長押しで右クリックになるように追記しておきます。

$ sudo vi /usr/share/X11/xorg.conf.d/99-calibration.conf
Section "InputClass"
    Identifier "calibration"
    MatchProduct "ADS7846 Touchscreen"
    Option "Calibration" "3873 272 236 3868"
    Option "SwapAxes"    "1"
    # Enable press and hold for right-clicking
    Option "EmulateThirdButton" "1"
    Option "EmulateThirdButtonTimeout" "750"
    Option "EmulateThirdButtonMoveThreshold" "30"
EndSection

ちなみに、waveshare35a-overlay.dtbというデバイスツリーを設置する方法も紹介されていたりいますが
特に設置せずとも動いているようなので私の環境では設置しておりません。

再起動するとタッチパネルを認識してデバイスファイルが増えており、タッチ操作が可能になっていると思います。

$ ls -al /dev/input/event*
crw-rw---- 1 root input 13, 64  4月  2 14:13 /dev/input/event0
crw-rw---- 1 root input 13, 65  4月  2 14:13 /dev/input/event1
crw-rw---- 1 root input 13, 66  4月  2 14:13 /dev/input/event2

image1(2)

その他、スクリーンキーボードのインストール等ありますが、そこら辺は割愛します。。。。

以下、参考サイト
raspberry pi LCDシールド(3.5) [RPiLCD035TP] [3.5inch RPi LCD (A)] 導入 waveshare – Qiita
3.5inch RPi LCD (A) – Waveshare Wiki
Home · notro/fbtft Wiki · GitHub
Raspberry Pi2 3.5inchタッチスクリーンディスプレイの設定 | 猫から星まで
Waveshare3.2インチLCDのセットアップ
Raspberry Piの小さな液晶のPiTFTを仮想画面スクロールで広く使いたかったけど挫折 | matoken’s meme
Raspberry Pi 2にディスプレイをつないでみた! | TONGARISM.COM
千石の4inchタッチディスプレイをRaspberryPi 2 につなぐ – yuki-sato.com
I am getting "FATAL: Module ads7846_device not found." · Issue #260 · notro/fbtft · GitHub
Adafruit customer service forums • View topic – [SOLVED ! ] 3.5" PiTFT resistive Touchscreen – Right-click a