ラズパイ4デジカメ計画①〜格安の(サポートの終了したWiringPI系)液晶タッチパネルを使えるようにする


※ 当ページには【広告/PR】を含む場合があります。
2024/02/05
2024/02/14
ラズパイ4デジカメ計画②〜NodejsとGPIOでラズパイの起動・シャットダウンを操作する
蛸壺の中の工作室|格安の(今はなきWiringPI系)液晶タッチパネルを使えるようにする

ラズパイOS周りが大きく変化し、この数年でも、
「Raspberry Pi OS Bookworm」が正式リリースになっています。

そのため、これまでラズパイのGPIO制御によく採用されてきた
「WiringPI」も既に開発サポートがなくなっており、WiringPIをライブラリで使っているブレークアウト基板製品なども大いに影響を受けるような状況です。

            + Bookworm以前、以降でシステムの中身におおきな壁がある
+ WiringPiはもうサポートされないため、BookwormやRPi5だと論外
        
とはいえ、他の汎用のタッチパネルと比較しても、3000円前後で買えるラズパイ専用のタッチパネルはとても魅力的な価格と言えます。

今回は、ラズパイ専用の「WiringPI」ベースの周辺装置を利用する上で、問題となっている課題に触れつつ、その対処法を考えていきます。


ラズベリーパイ4B 4GB 技適対応品

ラズパイマガジン 2019年12月号 カメラ&センサー工作入門

ラズパイ専用3.5インチ液晶タッチスクリーン

(破滅の道とは分かっていても...)Bookwormで液晶タッチパネルを試したい!

せっかくですので現状の「WiringPI」を使うとどうなるかを見を持って体験するため、「
ラズパイ専用3.5インチ液晶タッチスクリーン
」をRPiOS Bookwormで動かすことを目指して作業していきます。

なお、そんな動作しないことの試行錯誤なんて興味ない方は、
次の節からお読みください。

Bookwormにタッチパネルドライバをインストール

手順としてはメーカーの公開しているインストールマニュアルからやっていきます。

参考|OSOYOO 3.5 Inch SPI Touch Display for RPi

まずはドライバのインストールから現状の対象のラズパイ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)を以下のように追加してみます。

参考|fatal error: bcm_host.h: No such file or directory compilation terminated

            $ sudo apt install libraspberrypi-dev raspberrypi-kernel-headers
        
これで不足していたライブラリを追加できましたので、もう一度ビルドし直します。

            $ ./lcd35b-show
#もしくは
sudo apt --fix-broken install
        
これでエラーがでなければドライバーがインストールできたように見えます。

問題なさそうなので一旦電源を落とし、タッチパネルを装着してみましょう。

合同会社タコスキングダム|蛸壺の中の工作室

...はい、真っ白です。

これ以上はオンラインマニュアルに何も解決のヒントがなさそうでしたので、ドライバーのソースコードをしげしげと眺めてみることにします。

GitHub | osoyoo/LCD-show

するとドライバーインストールのシェルスクリプトからガッツリと今はなき
「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を公開してくれていました。

参考|WiringPi/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が使えないことが確定してしまいます。


ラズベリーパイ4B 4GB 技適対応品

ラズパイマガジン 2019年12月号 カメラ&センサー工作入門

ラズパイ専用3.5インチ液晶タッチスクリーン

ラズパイのLegacyイメージでBullseyeで試す

さきほどの節でつれづれと解説してきたように、「RPiOS Bookwormではwiringpiが使えない」という事実を理解できるまで、個人的に半日費やしてしまいました。

なんとも骨折り損でしたが、気を取り直してBookwormを一つ下げて
「Bullseye」で対応できるかを確認します。

BookwormからBullseyeへダウングレードすることができないので、一旦SDカードをフォーマットし、再度「rpi-imager」等でRPiOS Bullseye(レガシー)をインストールします。

「rpi-imager」からのインストールは以下の記事を参考にしてください。

合同会社タコスキングダム|タコツボの中の工作室
【Raspberry Piセットアップ方法(最新)】Raspberry Pi Imagerで初回のSSH接続環境を整える

現在の初回のSSH接続設定方法をRaspberry Pi 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のイメージが公式からは拾えなくなるおそれがあります。

あくまでも、延命措置の一環と考えておきましょう。

とにかく、これで役者が揃ったので、一旦ラズパイの電源を切り、液晶タッチパネルを取り付けて起動してみましょう。

合同会社タコスキングダム|蛸壺の中の工作室

う、動くぞコイツ!

ということで、めでたしめでたしです。

ラズパイ用液晶タッチパネルで注意すべきこと〜「rpi-update」ダメ絶対

繰り返しますが、現行のRPiOSの最新デストリビューションは「Bookworm」です。

ラズパイには簡単に次のディストリビューションへ移行してくれるアップグレード・ユーティリティの
「rpi-update」が備わっていますが、既存のラズパイでGPIO周辺機器が挿さって正常に使えている場合に、これをやってしまうともう後戻りが効きません。

一部のひとからすると、まさに「破滅の呪文」となるので、注意が必要です。

参考|Rapberry-Pi の更新で GPIO が動かない

余談〜タッチパネルの反応がおかしくなったときの対処法

後日、いろいろと別のドライバをいじっていたら、突然、タッチパネルの反応が上下逆さになる症状になりました。

どうもペンでタッチしている座標と、カーソルの位置が180度反転している困った挙動になりました。

そんなときには、
lcd35b-showコマンドで、表示するモニターの方向を調整することが可能です。

            $ cd LCD-show/
$ sudo ./lcd35b-show 180
        
これで液晶タッチパネルの表示も180度回転して、ポインティングデバイスとのズレを無くすことができました。


ラズベリーパイ4B 4GB 技適対応品

ラズパイマガジン 2019年12月号 カメラ&センサー工作入門

ラズパイ専用3.5インチ液晶タッチスクリーン

ソフトウェアキーボードをSSHから設定する

通常、ラズパイにはキーボードによる入力が想定されていますが、デジカメ用途で利用するのにキーボードを付けて持ち運びなんかどう頑張っっても厳しいです。

そこで、メーカー公式でも説明があるように、
「matchbox-keyboard」という仮想キーボードアプリから、文字入力できるようにします。

参考|matchbox-keyboard

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コマンドからスクリーンキャプチャしてみたのが以下です。

合同会社タコスキングダム|蛸壺の中の工作室

デフォルトのキーボードレイアウトだと、ちょっとボタンもでかいし、もう少しキーの種類がないと使い物になりません。

サンプルのキーボードレイアウトは
/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
        
再起動して、スタートメニューから立ち上げてみると、

合同会社タコスキングダム|蛸壺の中の工作室

といった感じに多少はキーボードらしくなります。

このキーボードでは、矢印キーや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
        
これで、好きなタイミングでキーボードが表示・非表示の切り替えができるようになりました。

なお本記事ではこれ以上深入りしませんが、もう少し使える仮想キーボードにカスタマイズしたい方は、詳しく解説されている技術ブログのほうを参考にしてみてください。

参考|Raspberry Pi メモ (49) 本気でタッチスクリーン


ラズベリーパイ4B 4GB 技適対応品

ラズパイマガジン 2019年12月号 カメラ&センサー工作入門

ラズパイ専用3.5インチ液晶タッチスクリーン

まとめ

さて、今回は最近のラズパイのGPIO事情について実作業を持ってまとめてきました。

            + Bookworm以前、以降でアーキテクチャレベルにシステムの中身におおきな違いがある
+ WiringPiはサポートされないため、BookwormやRPi5以降は動かない
+ ラズパイでGPIOを使った開発を行いたい場合、別のライブラリの利用を検討する
+ WiringPiを使い続けたい場合にはRaspberry Pi OS Bullseyeをレガシーインストールする
        
ラズパイ専用の液晶タッチパネルは安価でガジェット好きには愛用の一品でしたが、メーカー側が今後も製品サポートされるならば、ドライバーもいち早く更新していただきたいものです。

特典〜matchbod-keyboardのキー全部出しサンプル

参考|How to change the default matchbox-keyboard layout

上記の記事内容を元に、以下は矢印キー等のオプションを追加するキーボードレイアウトのサンプルを作成していきます。

まずは
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="&amp;" />
          <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="&lt;" />
    </key>
    <key>
      <default display="." />
      <shifted display="&gt;" />
    </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
        
これを適用したキーボードは以下のようになります。

合同会社タコスキングダム|蛸壺の中の工作室