配送経路上で何らかの手違いがあったようで、
受け取り場所に指定したコンビニには一昨日朝の時点で届いていながら
こちらに通知が来ず、ヤマトの諸君に問い合わせて
ようやくさっき物件を受領できた…。ううむ。
まーとにかく、そんなワケで、RasPi用を謳っている
3.2インチLCDディスプレイ(タッチパネルつき)を開封。
…予想通り、見事に取説、データシートの類は無し。
別の業者から調達すれば
何らかの資料が付属してたりするんかもだけど、まあいい。
とにかく、この時点でハードルは高いですな。
尼レビューとか見てても、このテの商品はこれに限らず、
「資料が全然無いから届いたけど動作確認もできねえよ!」
ってな怒りの声が多いけど、そんなことでお怒りになってしまうレベルでは
手を出してはいけません。
とはいえ資料が無いことにはわしも手が出せんので、
まずは調査。
…尼の商品情報をよく見ると、DropBox経由で資料が調達できるっぽいリンクがあったけど、
現物の基板に「WaveShare」ってシルク印刷されとるのに気がついたので、
これをキーワードにぐぐって、調査自体も楽しむことにw。
で、現状のRaspbianではドライバが付属していないので、
何らかのドライバを調達する必要あり。
fbtftちうフレームバッファドライバ(これはAdafruit系LCDとかいろいろ対応しているらすい)を組み込んで、
設定を頑張ればまず出力系は何とかなるっぽい。
(結果的には設定で頑張る必要はそれほどなかったw)
そしてfbtftドライバについてあれこれ調べていたら、
ちょうど数日前からドライバがこのデバイスにも対応していて、
カスタム設定をゴリゴリする必要はなくなっていたこととか、
fbtft導入キットに付属するドライバでタッチパネルも使用できるらすいこととか判明。
っつーワケで、ドライバと対応カーネルを突っ込んで、試行錯誤しつつ設定&再起動して、LCDは/dev/fb1として、タッチパネルは/dev/input/mouse1として
認識されるようになったことを確認。
fbiでの静止画表示にも成功。
結局のところ、ドライバ導入と設定の方法は以下の通りであった。
(この手順の場合はカーネルも更新される。
ドライバのみの導入も可能だがカーネルとの不整合を起こすおそれに注意。
詳細は
fbtft公式wiki参照のこと)
- /usr/share/X11/xorg.conf.d/99-fbturbo.confを他のディレクトリに退避させ無効化するか、
当該ファイル内の
fb0
をfb1
に変更する。
(Xを使わないなら放置でもいい)
- /etc/modprobe.d/raspi-blacklist.confの
blacklist spi-bcm2708
行を
コメントアウトするなり削除するなりで無効化する。(SPIドライバの無効化を無効化することでSPIドライバを有効にする)
- sudo REPO_URI=https://github.com/notro/rpi-firmware rpi-updateでドライバ導入&カーネル更新。
- /etc/modulesに
fbtft_device name=waveshare32b rotate=90
行を追加する。
rotateオプションはお好みで(値は0,90,180,270が使用可能らすい)。
- さらに
ads7846_device model=7846 cs=1 gpio_pendown=17 speed=1000000 keep_vref_on=1 swap_xy=1 pressure_max=255 x_plate_ohms=60 x_min=200 x_max=3900 y_min=200 y_max=3900
行も
/etc/modulesに追加する。こっちはタッチパネルドライバ。後半部の設定値をあれこれ弄ることでキャリブレーションになるんかな。今んとこはこのままにしてる。
- 再起動後にはfb1やmouse1が有効になる…はず。
なお試していないのでXやコンソールをこのデバイスで使う手順は略。ぐぐれば情報はある(基本的にはfb1として認識される他のデバイスと同じでいいはず)。
※追記:fbtft側のrotate
設定に合わせて、ads7846側のswap_xy
も適宜設定(値は0または1)すること。またタッチパネルから取得できる座標はどう設定しても画面側の座標系と反対向きになってしまう場合があり、これについてはアプリ側での対応が必要となる。根本的な解決をするには現状ではタッチパネルドライバのads7846.cを修正するしかなさげ。
後日、Perl用SDLモジュール(
sudo apt-get install libsdl-perlで入れられる)を使ってLCDに表示を行ったり
(
$ENV{SDL_VIDEODRIVER} = 'fbcon'; $ENV{SDL_FBDEV} = '/dev/fb1';
すればSDLからfb1を扱うことができる)、
タッチパネルからの入力を受け取ったりできる
(普通にSDL_MOUSE系イベントが発行されるが、前述のとおり座標系に注意。無改造のads7846ドライバとの組み合わせでは、SDL内蔵のマウスカーソル表示機能は使い物にならないため、
show_cursor(SDL_DISABLE)
し、必要があればさらにマウスカーソル表示を自前で実装することになる)ことも確認できた。
まあ、ちょっと高度なアプリケーションを組もうとすると、
むしろSDLモジュールの癖が強いってのにやられるワケですがががw。
特にSDLモジュールがithreads safeでないのか、
ithreadsは使い物にならない(子スレッドのjoinやdetachをすると暗黙的にSDL_quit()されてしまうっぽい)。
といいつつ、ithreads自体オーバーヘッドがかなり大きかったりもして(噂に聞いてはいたが今回使ってみてよくわかったw)、
Perlで並行処理をするならithreadsよりSysV共有メモリとforkを使った方がどのみち応答はずっとマシである。
ちなみにこのfbtftキットに付属するrpi-power-switchドライバも組み込むと、
お手軽にGPIO経由でシャットダウンやリブートを発動させることができる。
例えば、/etc/modulesに
rpi_power_switch gpio_pin=18 mode=0
行を追加すれば
ディスプレイ横のK1スイッチでシャットダウンができる。mode値を1にすればリブート動作となる。
gpio_pin
の値を23にすればK2、24にすればK3に対応する。
なお複数のポートをアサインすることはできないっぽい。
残念なのは、今まで使っていたケースが閉められなくなったことだなw。
まあ将来的には別の筐体に組み込む予定でいるから別にいいけど。