ラズパイ4デジカメ計画①〜格安の(サポートの終了したWiringPI系)液晶タッチパネルを使えるようにする
※ 当ページには【広告/PR】を含む場合があります。
2024/02/05
2024/02/14

ラズパイOS周りが大きく変化し、この数年でも、
そのため、これまでラズパイのGPIO制御によく採用されてきた
+ Bookworm以前、以降でシステムの中身におおきな壁がある
+ WiringPiはもうサポートされないため、BookwormやRPi5だと論外
とはいえ、他の汎用のタッチパネルと比較しても、3000円前後で買えるラズパイ専用のタッチパネルはとても魅力的な価格と言えます。
今回は、ラズパイ専用の「WiringPI」ベースの周辺装置を利用する上で、問題となっている課題に触れつつ、その対処法を考えていきます。
(破滅の道とは分かっていても...)Bookwormで液晶タッチパネルを試したい!
せっかくですので現状の「WiringPI」を使うとどうなるかを見を持って体験するため、「
なお、そんな動作しないことの試行錯誤なんて興味ない方は、
Bookwormにタッチパネルドライバをインストール
手順としてはメーカーの公開しているインストールマニュアルからやっていきます。
まずはドライバのインストールから現状の対象のラズパイOS(bookworm)で作業していきます。
$ mkdir touchpanel-driver
$ cd touchpanel-driver/
$ git clone https://github.com/osoyoo/LCD-show.git
Cloning into 'LCD-show'...
...
$ cd LCD-show/
$ chmod +x lcd35b-show
$ ./lcd35b-show
Reading package lists... Done
Building dependency tree... Done
#...中略
build
[ 50%] Building C object CMakeFiles/fbcp.dir/main.c.o
/home/**********/touchpanel-driver/LCD-show/usr/rpi-fbcp/main.c:9:10: fatal error: bcm_host.h: No such file or directory
9 | #include <bcm_host.h>
| ^~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/fbcp.dir/build.make:76: CMakeFiles/fbcp.dir/main.c.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/fbcp.dir/all] Error 2
make: *** [Makefile:91: all] Error 2
install: cannot stat 'fbcp': No such file or directory
#...中略
The system will reboot now!
という感じで、
cmake
なので、コケた原因のライブラリ(
bcm_host.h
$ sudo apt install libraspberrypi-dev raspberrypi-kernel-headers
これで不足していたライブラリを追加できましたので、もう一度ビルドし直します。
$ ./lcd35b-show
#もしくは
sudo apt --fix-broken install
これでエラーがでなければドライバーがインストールできたように見えます。
問題なさそうなので一旦電源を落とし、タッチパネルを装着してみましょう。
426x373

...はい、真っ白です。
これ以上はオンラインマニュアルに何も解決のヒントがなさそうでしたので、ドライバーのソースコードをしげしげと眺めてみることにします。
するとドライバーインストールのシェルスクリプトからガッツリと今はなき
「wiringpi」
cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb
という箇所で呼んでいるところが見つかります。
当然これでは動かないですよね。
WiringPiを強制的にインストールする
そもそもwiringpiが入っていると、gpioコマンドが使えるはずですので、下記のコマンドで確認します。
$ gpio -v
-bash: gpio: command not found
当然、インストールしていないので、使えません。
ちなみに、残念ながら本家(
http://wiringpi.com/index.html
This is wiringpi.com.
As of the end of 2023, you'll not find anything here anymore. It's gone.
Email if you want - if you know my email address. Work it out.
-Gordon
と見てのように
「ほしいなら直接メールしてくれ」
それでも直近の2023年くらいまでは、有志の方が非公式でバイナリ版のwiringpiを公開してくれていました。
こちらも残念ながら、以下のメッセージとともにサポート終了になっています。
As of 31st October 2023 nobody has shown an interest in properly maintaining it.
Between this, and changes to GPIO in Rasberry Pi OS Bookworm and on the Raspberry Pi 5,
this project is going nowhere.
It has been archived to more clearly indicate this status.
もうBookwormとRPi5以降はラズパイのGPIO制御するために、別のライブラリか、もしくは低レベルのプログラミングを自前で作成するしかなくなるようです。
とにかくダメ元で、Bookwormに公開されているwiringpiをインストールしてみましょう。
$ wget https://github.com/WiringPi/WiringPi/releases/download/2.61-1/wiringpi-2.61-1-armhf.deb
$ sudo apt install -y ./wiringpi-2.61-1-armhf.deb
gpio: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory
Bookwormだとアーキテクチャがマッチしていないという内容のエラーですので、dpkgのマルチアーキテクチャサポート機能から
armhf
$ sudo dpkg --add-architecture armhf
#アーキテクチャの確認
$ sudo dpkg --print-foreign-architectures
armhf
#armhf用ライブラリの追加
$ sudo apt install libcrypt1:armhf
ここで始めてBookwormでもwiringpiのインストールがひとまず成功します。
$ gpio -v
gpio version: 2.61
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Oops: Unable to determine board revision from /proc/cpuinfo
-> No "Hardware" line
-> You'd best google the error to find out why.
んー...wiringpiが動作はしたものの、
No "Hardware" line
この時点でwiringpiがBookwormを正しく認識してくれないため、GPIOが使えないことが確定してしまいます。
ラズパイのLegacyイメージでBullseyeで試す
さきほどの節でつれづれと解説してきたように、
なんとも骨折り損でしたが、気を取り直してBookwormを一つ下げて
BookwormからBullseyeへダウングレードすることができないので、一旦SDカードをフォーマットし、再度「rpi-imager」等でRPiOS Bullseye(レガシー)をインストールします。
「rpi-imager」からのインストールは以下の記事を参考にしてください。
問題なくBullseyeが焼けたかは以下で確認できます。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye
液晶タッチパネルのドライバーをインストールする
これは先程の節で述べた手順と同じです。
$ mkdir touchpanel-driver
$ cd touchpanel-driver/
$ git clone https://github.com/osoyoo/LCD-show.git
$ cd LCD-show/
$ chmod +x lcd35b-show
$ ./lcd35b-show
#...中略
The system will reboot now!
Bookwormの時と異なるのは、ライブラリのエラーが出ません。 wiringpi以外は、すんなりとドライバーの設定が完了します。
wiringpiをBullseyeにインストールする
最終リリース版のBullseyeには
wiringpi
$ wget https://github.com/WiringPi/WiringPi/releases/download/2.61-1/wiringpi-2.61-1-armhf.deb
$ sudo apt install -y ./wiringpi-2.61-1-armhf.deb
これで、Bullseyeからなら問題なくwiringpiが使えることが分かります。
$ gpio -v
gpio version: 2.61
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Raspberry Pi Details:
Type: Pi 4B, Revision: 01, Memory: 2048MB, Maker: Sony
* Device tree is enabled.
*--> Raspberry Pi 4 Model B Rev 1.1
* This Raspberry Pi supports user-level GPIO access.
いずれこの方法もRaspiOSが新しくリリースされていくたびに、Bookwormがレガシーとなったときには、Bullseyeのイメージが公式からは拾えなくなるおそれがあります。
あくまでも、延命措置の一環と考えておきましょう。
とにかく、これで役者が揃ったので、一旦ラズパイの電源を切り、液晶タッチパネルを取り付けて起動してみましょう。
619x502

う、動くぞコイツ!
ということで、めでたしめでたしです。
ラズパイ用液晶タッチパネルで注意すべきこと〜「rpi-update」ダメ絶対
繰り返しますが、現行のRPiOSの最新デストリビューションは「Bookworm」です。
ラズパイには簡単に次のディストリビューションへ移行してくれるアップグレード・ユーティリティの
一部のひとからすると、まさに「破滅の呪文」となるので、注意が必要です。
余談〜タッチパネルの反応がおかしくなったときの対処法
後日、いろいろと別のドライバをいじっていたら、突然、タッチパネルの反応が上下逆さになる症状になりました。
どうもペンでタッチしている座標と、カーソルの位置が180度反転している困った挙動になりました。
そんなときには、
lcd35b-show
$ cd LCD-show/
$ sudo ./lcd35b-show 180
これで液晶タッチパネルの表示も180度回転して、ポインティングデバイスとのズレを無くすことができました。
ソフトウェアキーボードをSSHから設定する
通常、ラズパイにはキーボードによる入力が想定されていますが、デジカメ用途で利用するのにキーボードを付けて持ち運びなんかどう頑張っっても厳しいです。
そこで、メーカー公式でも説明があるように、
Raspberry Pi OSへのインストールはパッケージマネージャだけでOKです。
$ sudo apt install matchbox-keyboard -y
日本語でのメッセージなどを表示させたい場合には、その都度、日本語フォントもインストールしましょう。
$ sudo apt-get install ttf-kochi-gothic xfonts-intl-japanese xfonts-intl-japanese-big xfonts-kaname -y
再起動させ、
scrot
480x320

デフォルトのキーボードレイアウトだと、ちょっとボタンもでかいし、もう少しキーの種類がないと使い物になりません。
サンプルのキーボードレイアウトは
/usr/share/matchbox-keyboard/
$ ls /usr/share/matchbox-keyboard/ | grep xml
base-fragment-ar_EG.xml
#...
keyboard-internet.xml
keyboard-lq1.xml
keyboard-numpad-extended.xml
keyboard-numpad-small.xml
keyboard-symbol.xml
keyboard.xml
このサンプルの中であれば、
keyboard-lq1.xml
デフォルトのキーボードレイアウトは
~/.matchbox
$ mkdir .matchbox
$ sudo cp /usr/share/matchbox-keyboard/keyboard-lq1.xml ~/.matchbox/keyboard.xml
$ sudo chown <ユーザーID>:<グループID> ~/.matchbox/keyboard.xml
再起動して、スタートメニューから立ち上げてみると、
480x320

といった感じに多少はキーボードらしくなります。
このキーボードでは、矢印キーやALTキー、CTRLキーなどもう少し欲しいキーが無いのですが、どうしても要りようの人は、本記事末尾の
現状使用頻度も低いので、もうこのまま妥協しても良いのですが、アイコンを連打すると仮想キーボードが無限増殖してしまうことを対処してみます。
/usr/bin
toggle-matchbox-keyboard.sh
$ sudo nano /usr/bin/toggle-matchbox-keyboard.sh
このスクリプトの内容は以下の通りです。
#!/bin/bash
PID=`pidof matchbox-keyboard`
if [ ! -e $PID ]; then
killall matchbox-keyboard
else
matchbox-keyboard &
fi
このスクリプトを保存したら、さらに実行権限を与えておきます。
$ sudo chmod +x /usr/bin/toggle-matchbox-keyboard.sh
次に
matchbox-keyboard
$ sudo nano /usr/share/applications/inputmethods/matchbox-keyboard.desktop
以下が、デスクトップアイコンの定義ファイルの中身になります。
[Desktop Entry]
Name=Keyboard
Comment=Virtual Keyboard
#Exec=matchbox-keyboard
#👇こっちに書き換え
Exec=toggle-matchbox-keyboard.sh
Type=Application
Icon=matchbox-keyboard.png
Categories=Panel;Utility;MB
X-MB-INPUT-MECHANSIM=True
これで、好きなタイミングでキーボードが表示・非表示の切り替えができるようになりました。
なお本記事ではこれ以上深入りしませんが、もう少し使える仮想キーボードにカスタマイズしたい方は、詳しく解説されている技術ブログのほうを参考にしてみてください。
まとめ
さて、今回は最近のラズパイのGPIO事情について実作業を持ってまとめてきました。
+ Bookworm以前、以降でアーキテクチャレベルにシステムの中身におおきな違いがある
+ WiringPiはサポートされないため、BookwormやRPi5以降は動かない
+ ラズパイでGPIOを使った開発を行いたい場合、別のライブラリの利用を検討する
+ WiringPiを使い続けたい場合にはRaspberry Pi OS Bullseyeをレガシーインストールする
ラズパイ専用の液晶タッチパネルは安価でガジェット好きには愛用の一品でしたが、メーカー側が今後も製品サポートされるならば、ドライバーもいち早く更新していただきたいものです。
特典〜matchbod-keyboardのキー全部出しサンプル
上記の記事内容を元に、以下は矢印キー等のオプションを追加するキーボードレイアウトのサンプルを作成していきます。
まずは
my-custom-keyboard.xml
$ sudo nano /usr/share/matchbox-keyboard/my-custom-keyboard.xml
このファイルには以下の内容を追加します。
<?xml version="1.0" encoding="UTF-8"?>
<keyboard>
<options>
<!-- not yet implemented -->
</options>
<layout id="default keyboard">
<row>
<space width="500" extended="true"/>
<key fill="true">
<default display="Esc" action="escape" />
</key>
<key width="1500">
<default display="1" />
<shifted display="!" />
<mod1 display="F1" action="f1"/>
</key>
<key width="1500">
<default display="2" />
<shifted display='@' />
<mod1 display="F2" action="f2"/>
</key>
<key width="1500">
<default display="3" />
<shifted display="#" />
<mod1 display="F3" action="f3"/>
</key>
<key width="1500">
<default display="4" />
<shifted display="$" />
<mod1 display="F4" action="f4"/>
</key>
<key width="1500">
<default display="5" />
<shifted display="%" />
<mod1 display="F5" action="f5"/>
</key>
<key width="1500">
<default display="6" />
<shifted display="^" />
<mod1 display="F6" action="f6"/>
</key>
<key width="1500">
<default display="7" />
<shifted display="&" />
<mod1 display="F7" action="f7"/>
</key>
<key width="1500">
<default display="8" />
<shifted display="*" />
<mod1 display="F8" action="f8"/>
</key>
<key width="1500">
<default display="9" />
<shifted display="(" />
<mod1 display="F9" action="f9"/>
</key>
<key fill="true">
<default display="0" />
<shifted display=")" />
<mod1 display="F10" action="f10"/>
</key>
<key fill="true">
<default display="-" />
<shifted display="_" />
<mod1 display="F11" action="f11"/>
</key>
<key fill="true">
<default display="=" />
<shifted display="+" />
<mod1 display="F12" action="f12"/>
</key>
<key fill="true">
<default display="Ins" action="insert"/>
</key>
<key fill="true">
<default display="Del" action="delete"/>
</key>
<space width="500" extended="true"/>
<key width="4000" extended="true">
<default display="Home" action="home"/>
</key>
<key width="4000" extended="true">
<default display="PgUp" action="pageup"/>
</key>
<space width="500" extended="true"/>
</row>
<row>
<space width="500" extended="true"/>
<key fill="true">
<!-- <default display="↹" action="tab"/> -->
<default display="Tab" action="tab"/>
</key>
<key>
<default display="`" />
<shifted display="~" />
</key>
<key obey-caps='true'>
<default display="q" />
<shifted display="Q" />
</key>
<key obey-caps='true'>
<default display="w" />
<shifted display="W" />
</key>
<key obey-caps='true'>
<default display="e" />
<shifted display="E" />
</key>
<key obey-caps='true'>
<default display="r" />
<shifted display="R" />
</key>
<key obey-caps='true'>
<default display="t" />
<shifted display="T" />
</key>
<key obey-caps='true'>
<default display="y" />
<shifted display="Y" />
</key>
<key obey-caps='true'>
<default display="u" />
<shifted display="U" />
</key>
<key obey-caps='true'>
<default display="i" />
<shifted display="I" />
</key>
<key obey-caps='true'>
<default display="o" />
<shifted display="O" />
</key>
<key obey-caps='true'>
<default display="p" />
<shifted display="P" />
</key>
<key>
<default display="{" />
<shifted display="[" />
</key>
<key>
<default display="}" />
<shifted display="]" />
</key>
<key>
<default display="\" />
<shifted display="|" />
</key>
<key fill="true">
<default display="Bksp" action="backspace"/>
</key>
<space width="500" extended="true"/>
<key width="4000" extended="true">
<default display="End" action="end"/>
</key>
<key width="4000" extended="true">
<default display="PgDn" action="pagedown"/>
</key>
<space width="500" extended="true"/>
</row>
<row>
<space width="500" extended="true"/>
<key fill="true">
<default display="Caps" action="modifier:caps"/>
</key>
<key obey-caps='true'>
<default display="a" />
<shifted display="A" />
</key>
<key obey-caps='true'>
<default display="s" />
<shifted display="S" />
</key>
<key obey-caps='true'>
<default display="d" />
<shifted display="D" />
</key>
<key obey-caps='true'>
<default display="f" />
<shifted display="F" />
</key>
<key obey-caps='true'>
<default display="g" />
<shifted display="G" />
</key>
<key obey-caps='true'>
<default display="h" />
<shifted display="H" />
</key>
<key obey-caps='true'>
<default display="j" />
<shifted display="J" />
</key>
<key obey-caps='true'>
<default display="k" />
<shifted display="K" />
</key>
<key obey-caps='true'>
<default display="l" />
<shifted display="L" />
</key>
<key>
<default display=";" />
<shifted display=":" />
</key>
<key>
<default display="'" />
<shifted display='"' />
</key>
<key fill="true">
<default display="Enter" action="return"/>
</key>
<space width="500" extended="true"/>
<space width="4000" extended="true" />
<space width="4000" extended="true" />
<space width="500" extended="true"/>
</row>
<row>
<space width="500" extended="true"/>
<key fill="true">
<default display="Shift" action="modifier:shift"/>
</key>
<key obey-caps='true'>
<default display="z" />
<shifted display="Z" />
</key>
<key obey-caps='true'>
<default display="x" />
<shifted display="X" />
</key>
<key obey-caps='true'>
<default display="c" />
<shifted display="C" />
</key>
<key obey-caps='true'>
<default display="v" />
<shifted display="V" />
</key>
<key obey-caps='true'>
<default display="b" />
<shifted display="B" />
</key>
<key obey-caps='true'>
<default display="n" />
<shifted display="N" />
</key>
<key obey-caps='true'>
<default display="m" />
<shifted display="M" />
</key>
<key>
<default display="," />
<shifted display="<" />
</key>
<key>
<default display="." />
<shifted display=">" />
</key>
<key>
<default display="/" />
<shifted display="?" />
</key>
<key fill="true">
<default display="Shift" action="modifier:shift"/>
</key>
<space width="500" extended="true"/>
<key width="4000" extended="true">
<default display="Up" action="up"/>
</key>
<key width="4000" extended="true">
<default display="Down" action="down"/>
</key>
<space width="500" extended="true"/>
</row>
<row>
<space width="500" extended="true"/>
<key width="4000" extended="true">
<default display="Ctrl" action="modifier:ctrl"/>
</key>
<key width="4000" extended="true">
<default display="Alt" action="modifier:alt"/>
</key>
<!-- <key fill="true"> -->
<key width="16000" extended="true">
<default display=" S p a c e B a r " action="space" />
</key>
<key width="5000" extended="true">
<default display="Func" action="modifier:mod1"/>
</key>
<space width="500" extended="true"/>
<key width="4000" extended="true">
<default display="Left" action="left"/>
</key>
<key width="4000" extended="true">
<default display="Right" action="right"/>
</key>
<space width="500" extended="true"/>
</row>
</layout>
</keyboard>
このキーボードレイアウトを再度アプリケーションへ適用してみましょう。
$ sudo cp /usr/share/matchbox-keyboard/my-custom-keyboard.xml ~/.matchbox/keyboard.xml
$ sudo chown <ユーザーID>:<グループID> ~/.matchbox/keyboard.xml
これを適用したキーボードは以下のようになります。
480x320
