2016年8月13日土曜日

Raspberry Pi 3 + 小型TFT液晶 (ILI9325 + XPT2046)

概要

ラズパイ3で小型液晶を使うプロトタイプ。

なるべくGUIでの操作を行う。
慣れてないから間違いに気づかない、何がどう変化したのかわからない、確認する術もわからない…みたいな事になるからね。
本来はDebianを使う以上CUIでの操作に慣れるべきなんだろうが。

関連:TFT S95417AAAの場合

スペック

・Raspberry Pi 3 Model B [2016.07.19 購入]
 Raspbian 8.0 Jessie (May 2016) (NOOBS 1.9.2 (2016.05.27))
M028C9325TP [2016.07.31 購入]
 2.8インチTFT (240x320)、LCDコントローラ:ILI9325、タッチコントローラ:XPT2046

参考

Raspberry Pi 3 でRaspberryPI用タッチ液晶(LCD)を使う / Qiita
RaspberryPiでLIRCする(2015/02仕様変更?) / Umbrella
Raspberry Pi に液晶(LCD)を繋いでみました / 三日坊主な私が~
Raspberry Pi でタッチパネル / 三日坊主な私が~
Raspberry Pi 2 Model B で安いRaspberry用タッチ液晶(LCD)を使う / Qiita

1. 液晶モジュール加工

デフォルトで16bit (Parallel)になっている為、8bitに変更する。
1005(かな?)0Ωチップ抵抗を半田ごてで付けようというのはこりゃ無理だわ。
外したはいいが、つつく内にはねて一瞬の内にどこかに消える。

2. ラズパイとの接続

ここでは以下のようにつなぐ。
(ドライバの設定の際にピン配列をパラメーターとして渡せる為、一律ではない)。
GithubでITDB02-2.8として記載されているアサインから変えた線をオレンジ(黄色)で表現している。
接続全体
DB、タッチ以外 抜粋
LCD データバス 抜粋
タッチパネル 抜粋
実際


補足
データシートによるとVccは2.6~3.3V。
RD=リード・イネーブル:アクティブLow…つまりインアクティブで良い為High(Vcc)固定。
DB8がGPIO9(タッチパネルで使うSPI_MISO)とかぶっている為、GPIO13に変更する。
DB9、DB14、DB15も同様に変更。
LEDはITDB02-2.8においては直接駆動できない為トランジスタを使えと書いてある。
GPIOに流せる絶対最大定格は16mAらしいのでとりあえず保護のため500Ωくらいの抵抗を挟んでおくか。思いの外暗い為、100Ω (4.63[mA] 実測) くらいがよさそう。
D_RQはGPIOnとなっている為GPIO22とした。

3. タッチパネルドライバの設定

3-1. /boot/config.txtの編集

3-1-1. GPIOの設定
「Raspberry Piの設定」-「インターフェイス」タブからSPIを有効に、I2Cとシリアルを無効にする。
試しに/boot/config.txtをテキストエディタ(Leafpad)で開いてみるとdtparam=spi=onのコメントアウトが外れ、enable_uart=0になっている。

3-1-2. タッチパネルドライバの読込設定
/boot/config.txtのパーミッションが755になっていてrootでしか編集できない為ターミナルに以下を入力。スーパーユーザーで編集する。
sudo leafpad /boot/config.txt
最後の行に下を追記する。
dtoverlay=ads7846,cs=1,penirq=22,penirq_pull=2,swapxy=1,xmin=500,ymin=400,xmax=3800,ymax=3700,pmin=0,pmax=255,xohms=60

補足
詳細は/boot/overlays/READMEによる。 
xpt2046はads7846同等と見ていいのかな。
cs:1。CE1(GPIO7)にしたからね。
speed:デフォルト2MHz~Max 3.25MHzなんじゃとりあえずデフォルトとし未記入。
penirq:22。GPIO22にしたからね。
penirq_pull:2。うーむ…とりあえず2にしとく?
swapxy:1。XYを反転する。今回は必要。
以降のパラメータはおそらくキャリブレートしてみないとわからないだろうから、
xmin:400 ymin:300 xmax:3700 ymax:3600 pmin:0 pmax:255 xohms:60とかにしとく。

3-2. Y方向反転問題の解決
sudo leafpad usr/share/X11/xorg.conf.d/10-evdev.conf
最後のセクション(Identifierが"evdev touchscreen catchall"となっている)で、
"EndSection"(最後の行)の直前に下を追記する。
Option "InvertY" "true"
Raspberry Pi フォーラム 凄いね…

3-3. キャリブレーション
タッチパネルについて
保留

補足
apt-getのオプション
-y:すべての問い合わせを"y"にする。

4. LCDドライバの設定 (fbtft.confの作成)

4-1. /etc/modules-load.d/fbtft.conf

例によってmodules-load.dも755なのでターミナルから、
sudo touch /etc/modules-load.d/fbtft.conf
sudo leafpad /etc/modules-load.d/fbtft.conf
空のファイルテキストエディタ(Leafpad)で開かれる為、下を記入後保存。
spi-bcm2835
flexfb
fbtft_device

4-2. /etc/modprobe.d/fbtft.conf
こいつも、
sudo touch /etc/modprobe.d/fbtft.conf
sudo leafpad /etc/modprobe.d/fbtft.conf
下を記入後保存。
# for M028C9325TP
options fbtft_device name=flexpfb rotate=90 gpios=reset:17,dc:3,wr:2,cs:27,db00:13,db01:19,db02:18,db03:23,db04:24,db05:25,db06:5,db07:6,led:4
options flexfb width=240 height=320 regwidth=16 setaddrwin=1 init=-1,0x00E3,0x3008,-1,0x00E7,0x0012,-1,0x00EF,0x1231,-1,0x0001,0x0100,-1,0x0002,0x0700,-1,0x0003,0x1018,-1,0x0004,0x0000,-1,0x0008,0x0207,-1,0x0009,0x0000,-1,0x000A,0x0000,-1,0x000C,0x0000,-1,0x000D,0x0000,-1,0x000F,0x0000,-1,0x0010,0x0000,-1,0x0011,0x0007,-1,0x0012,0x0000,-1,0x0013,0x0000,-2,200,-1,0x0010,0x1690,-1,0x0011,0x0223,-2,50,-1,0x0012,0x000D,-2,50,-1,0x0013,0x1200,-1,0x0029,0x000A,-1,0x002B,0x000C,-2,50,-1,0x0020,0x0000,-1,0x0021,0x0000,-1,0x0030,0x0000,-1,0x0031,0x0506,-1,0x0032,0x0104,-1,0x0035,0x0207,-1,0x0036,0x000F,-1,0x0037,0x0306,-1,0x0038,0x0102,-1,0x0039,0x0707,-1,0x003C,0x0702,-1,0x003D,0x1604,-1,0x0050,0x0000,-1,0x0051,0x00EF,-1,0x0052,0x0000,-1,0x0053,0x013F,-1,0x0060,0xA700,-1,0x0061,0x0001,-1,0x006A,0x0000,-1,0x0080,0x0000,-1,0x0081,0x0000,-1,0x0082,0x0000,-1,0x0083,0x0000,-1,0x0084,0x0000,-1,0x0085,0x0000,-1,0x0090,0x0010,-1,0x0092,0x0600,-1,0x0007,0x0133,-3

補足
fbtft.confについて
上記の更に先のリンクにあるfbtft.confについてのマニュアル(?)にはあまり具体的な事が書かれていない。
ネット上ではその投稿日に応じて新旧の情報が入り交じって何が何だかわからない。

modprobeのオプション
fbtft_deviceのパラメータ
ili9325使用の240x320液晶ITDB02-2.8用のパラメータ、Landscape exampleをベースにしている。
今回、ili9325を8bit Parallelで接続する為の"name"は"flexpfb"で良いようだ。
"flexfb" (pなし) はそのgpios関数(?)から察するに8bit SPI用に見受けられる

regwidth:???なんかしらんが…16?
setaddrwin:ili9325は1?
init:初期化コード。検討を行ったページ
なお、冒頭の写真の向きだと、rotate=90、initの0x0003は0x1018になった。

5. LCDへの画面切替え

5-1. 一時的な切替え (冒頭写真 左)
メインのモニタがHDMI接続されており、併せてgpioにLCDを接続している事が前提。

①"Ctrl + Alt + F1"でコンソール画面にする
②下を入力する
con2fbmap 1 1

HDMI接続の液晶に戻る場合は
③下を入力する
con2fbmap 1 0
④"Alt + F7"でXwindowに戻る

補足
コンソールの切り替え

6. 蛇足

LCDに画面を表示させることができず、1週間程寝不足になりながらも格闘していた。
"con2fbmap 1 1"を行っても無反応、"FRAMEBUFFER=/dev/fb1 startx"に至っては"user not authorized"と返ってくる。
ロジアナなんかない。高いから買えない為、秋月キットオシロをgpioにつなげながら起動してもみたが、起動時に出力がある事から何らかの初期化コードが送られているのは間違いなかった。
ただそれ以降は一切、信号が出ていない…。
LCDとgpioとの接続は何度も確認し、SPI用のポートを避けたり、ラズパイ上でI2Cを使用しないようにしたりした。
初期化コードの妥当性も検証した。
Githubのnotroさんのところでソースコードを何度も眺めた。
dmesgは何度も繰り返し読んだ。
もう別のLCDコントローラを乗せた液晶やSPI接続なんかで試してみて問題点を切り分けたほうが良いか…などと思いながら、単に"fbtft"で検索したページ達を眺めていた時、ふいに見つける。
ん?
何故ほとんどのページでこのたった3ワードが書かれないのか…。
これだから17時まぎわの役人の様な空気などと揶揄されるのだ…。
いや、Linux界隈では当然コンソール利用がメインで、こんなこと当たり前に誰もが知っているか、すぐに気づくからあえて書こうとする事を忘れるんだ。きっと。

補足
デスクトップ(Xwindow)から起動させるターミナルエミュレータ(LXTerminal)上で無闇に
"sudo FRAMEBUFFER=/dev/fb1 startx"
してはいけない
元に戻す術が実はあるのかもしれないが、再起動後ログイン画面から一向に進まなくなる。
何度もOSをインストールし直した。


0 件のコメント :

コメントを投稿