雨が降っていて出かけるのが億劫だ。パッとみたら、使っていないラズパイが何台かでてきた。タダであげるといっても引き取り手がいない。大学生たちに渡したとしても使い道がなければ興味もないだろうしと思って、放置していた。使えなかったらもう捨ててしまおうかと。確かに電気消費量が少ないのだが、3台とか起動すると、ほぼNUC10と同じくらいの電気を使うし、サーバ管理という管理工数が普通に増える。この2台は残存決定。いわば、1つ秀でた能力があるものは生き残るということで。
閑話休題
Bookworm (2026) の Raspberry Pi OS Lite で、今回の ILI9486 + XPT2046 の3.5インチ液晶を動かす最短手順をまとめた。
以下の ILI9486 + XPT2046 デバイス

今回使用したのは、ベンダー名や型番が一切分からない3.5インチSPI LCDである。だいぶ昔に長野にいる同僚、知人から譲り受けたもので、当時よく流通していたILI9486 + XPT2046系の互換品と思われる。同じような基板が多数存在するものの、配線や部品配置は微妙に異なり、全く同じ基板は見つからなかった。当時は高価だったらしいが、今だと、4000-5000円程度で買えるかもしれない。TFT液晶で画質はいいのだが、画面サイズが小さいので、写真とかは難しい。
もらった当時に少し触ってみたのだが、手順がたくさんあり、簡単に動かせそうになかったので、一度試した後、お蔵入りしていた。最近発掘?されたので最新のRaspbery PI OSでは動くでないのかと一か八かでやってみた。
今回、一番時間を使ったのはソフトウェアではなく、「どの情報を信じるか」だった。Web上には、この手の3.5インチSPI LCD向けの記事が数多く存在するが、その多くは Raspberry Pi OS Bullseye以前や、Kernel 5.x時代のものだった。
そのため、
-
LCD35-show を実行する
-
config.txt を丸ごと置き換える
-
cmdline.txt を書き換える
-
fbcp をビルドする
-
X11 を設定する(やりたくないw)
-
fbturbo を導入する
といった手順が紹介されている。
しかし、Bookworm (2026) の Raspberry Pi OS Liteでは、これらは全く不要だった。Hifiberryと同様に必要だったのはOverlayだけだった。
実際に必要だったのは、
-
SPIを有効化
-
tft35a.dtboを配置 -
dtoverlay=tft35a:rotate=270を追加
という最小限の設定だけである。
逆に古い手順をそのまま実行すると、現在の環境ではかえって動作しなくなる可能性もある。
1. Raspberry Pi OS Liteをインストール
環境
Raspberry Pi 3 Model B Rev 1.2 + 3.5inch SPI LCD (ILI9486 + XPT2046)
Raspberry Pi OS Lite (64-bit) 2026-06-18
パッケージの追加はごくわずかなので動かすだけなら大きなSDカードは不要。
Raspberry Pi Imager (2.0.10)で
-
OS -> Raspberry Pi OS (Other) -> Raspberry Pi OS Lite (64bit)
-
SSH有効
-
ユーザー作成
-
Wi-Fi(必要なら。11nまでしか繋がらない。)
まで設定して、書き込み。
2. 起動
起動時には、電源容量が少なくとも2.4A以上、できれば3Aのアダプタと良質なUSBケーブルを利用し、しっかりLCDモジュールが接続されていることを確認すること。
正しく接続されていれば、電源オンをしたときにバックライトが光る。
sudo apt update
sudo apt full-upgrade -y
sudo reboot
3. SPI有効
sudo raspi-config
3 Interface Options
I4 SPI
Enableにする
任意だが、ついでに以下も設定しておく。
5 Localisation Options
L1 Locale
お好きなロケールを追加
L4 WLAN Country
JP Japanにする。(電波法を守るため)
6 Advanced Options
A1 Expand Filesystem
これはしなくてもディスクが拡張されているが念の為。
raspi-configを終了すると自動的に再起動が起きる。
再起動後ログインをして、SPIが認識されているかを確認
ls /dev/spidev*
/dev/spidev0.0
/dev/spidev0.1
この表示は、overlayが適用されていない時だけ見える。overlayが適用されるとls /dev/spidev*は表示されなくなる。
4. LCD-showからOverlayだけを取得
git clone https://github.com/goodtft/LCD-show.git は不要で、また、その中のスクリプトの実行も不要。単にoverlayだけが欲しい。
sudo curl -L https://github.com/goodtft/LCD-show/raw/refs/heads/master/usr/tft35a-overlay.dtb \
-o /boot/firmware/overlays/tft35a.dtbo
ls /boot/firmware/overlays/tft35a.dtbo
5. config.txt編集
バックアップ
sudo cp /boot/firmware/config.txt /boot/firmware/config.txt.org
dtparam=spi=onが設定されていることを確認
grep “dtparam=spi=on” /boot/firmware/config.txt
競合をさけるためにVC4を止める
sudo sed -i -e “s/dtoverlay=vc4-kms-v3d/#dtoverlay=vc4-kms-v3d/g” /boot/firmware/config.txt
overlayの設定を追加
sudo tee -a /boot/firmware/config.txt > /dev/null << ‘EOF’
# 3.5 inch SPI TFT
dtoverlay=tft35a:rotate=270
EOF
ちなみに以下で表示は90度単位で回転できる。
dtoverlay=tft35a:rotate=0
dtoverlay=tft35a:rotate=90
dtoverlay=tft35a:rotate=180
dtoverlay=tft35a:rotate=270
縦表示の場合 rotate=0、横表示の場合 rotate=270 とすると、ラズパイの本体コネクタと干渉せずに机などに置いて使える。(このページのログやキャプチャには、初期にテスト利用していたrotate=90が混じっているので注意。)
また、タッチパネルの座標変換も一緒に設定される。
6. 起動時にコンソール表示するためにcmdline.txt編集
/dev/fb1 がLCDなので、Linuxコンソールをfb1へ向ける。バックアップ
sudo cp /boot/firmware/cmdline.txt /boot/firmware/cmdline.txt.org
sudo vi /boot/firmware/cmdline.txt
コマンドラインの末尾に以下を追加
fbcon=map:1 fbcon=font:VGA8x16
7. 再起動
sudo reboot
8. 確認
起動時に、バックライトが点灯し、ブートメッセージが見えている、コンソールが見えている。IPアドレスも表示されているはずある。この時点で十分感動。

USBキーボードを接続するとそのまま、コンソールとして利用できる。
もし、バックライトが点灯していない場合は、一度OSをシャットダウンして、コネクタが正しい位置に接続されているかを確認する。ズレて入るともちろん点灯しない。
ログイン後
dmesg | grep -Ei ‘ads|ili|fb|spi’
[ 0.000000] Kernel command line: coherent_pool=1M 8250.nr_uarts=0 snd_bcm2835.enable_headphones=0 cgroup_disable=memory snd_bcm2835.enable_headphones=1 snd_bcm2835.enable_hdmi=1 bcm2708_fb.fbwidth=720 bcm2708_fb.fbheight=480 bcm2708_fb.fbswap=1 vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000 console=ttyS0,115200 console=tty1 root=PARTUUID=3379c6db-02 rootfstype=ext4 fsck.repair=yes rootwait ds=nocloud;i=rpi-imager-1782539644899 cfg80211.ieee80211_regdom=JP fbcon=map:1 fbcon=font:VGA8x16
[ 0.000000] Built 1 zonelists, mobility grouping on. Total pages: 242688
[ 0.000936] LSM: initializing lsm=capability
[ 1.532960] bcm2708_fb soc:fb: FB found 1 display(s)
[ 1.546908] bcm2708_fb soc:fb: Registered framebuffer for display 0, size 720×480
[ 7.646990] systemd[1]: Listening on systemd-initctl.socket – initctl Compatibility Named Pipe.
[ 10.406754] ads7846 spi0.1: supply vcc not found, using dummy regulator
[ 10.411983] fbtft: module is from the staging directory, the quality is unknown, you have been warned.
[ 10.415967] ads7846 spi0.1: touchscreen, irq 185
[ 10.416511] input: ADS7846 Touchscreen as /devices/platform/soc/3f204000.spi/spi_master/spi0/spi0.1/input/input0
[ 10.516757] fb_ili9486: module is from the staging directory, the quality is unknown, you have been warned.
[ 10.517379] SPI driver fb_ili9486 has no spi_device_id for ilitek,ili9486
[ 10.517594] fb_ili9486 spi0.0: fbtft_property_value: regwidth = 16
[ 10.517611] fb_ili9486 spi0.0: fbtft_property_value: buswidth = 8
[ 10.517621] fb_ili9486 spi0.0: fbtft_property_value: debug = 0
[ 10.517629] fb_ili9486 spi0.0: fbtft_property_value: rotate = 90
[ 10.517638] OF: /soc/spi@7e204000/tft35a@0: Read of boolean property ‘bgr’ with a value.
[ 10.517661] fb_ili9486 spi0.0: fbtft_property_value: fps = 30
[ 10.517669] fb_ili9486 spi0.0: fbtft_property_value: txbuflen = 32768
[ 11.132496] graphics fb1: fb_ili9486 frame buffer, 480×320, 300 KiB video memory, 32 KiB buffer memory, fps=31, spi0.0 at 16 MHz
LCDの確認
ls /dev/fb*
/dev/fb0
/dev/fb1
sudo apt install -y fbset
fbset -fb /dev/fb1
mode “480×320”
geometry 480 320 480 320 16
timings 0 0 0 0 0 0 0
nonstd 1
rgba 5/11,6/5,5/0,0/0
endmode
LCDの動作確認
赤を表示
sudo python3 – <<‘PY’
fb = “/dev/fb1”
width, height = 480, 320
# RGB565: Red
color = b”\x00\xf8″
with open(fb, “wb”) as f:
f.write(color * width * height)
PY
画面全体が赤くなれば成功。
緑を表示
sudo python3 – <<‘PY’
fb = “/dev/fb1”
width, height = 480, 320
# RGB565: Green
color = b”\xe0\x07″
with open(fb, “wb”) as f:
f.write(color * width * height)
PY
画面全体が緑になれば成功。
他の色を出したい場合は、
青
color = b”\x1f\x00″
白
color = b”\xff\xff”
タッチパネルの確認
ls /dev/input/event*
/dev/input/event0
設定の確認
cat /proc/bus/input/devices
I: Bus=001c Vendor=0000 Product=1ea6 Version=0000
N: Name=”ADS7846 Touchscreen”
P: Phys=spi0.1/input0
S: Sysfs=/devices/platform/soc/3f204000.spi/spi_master/spi0/spi0.1/input/input0
U: Uniq=
H: Handlers=mouse0 event0
B: PROP=0
B: EV=b
B: KEY=400 0 0 0 0 0
B: ABS=1000003
タッチパネルの動作確認
タッチ入力を試す
sudo apt -y install evtest
sudo evtest
0 を入力して、
ADS7846 Touchscreen を選択No device specified, trying to scan all of /dev/input/event*
Available devices:
/dev/input/event0: ADS7846 Touchscreen
Select the device event number [0-0]: 0
あるいは、以下のようにデバイスを直接指定
sudo evtest /dev/input/event0
画面をタッチ
座標イベントが流れればタッチも正常動作
Testing … (interrupt to exit)
Event: time 1782592125.868350, type 1 (EV_KEY), code 330 (BTN_TOUCH), value 1
Event: time 1782592125.868350, type 3 (EV_ABS), code 0 (ABS_X), value 1899
Event: time 1782592125.868350, type 3 (EV_ABS), code 1 (ABS_Y), value 2307
Event: time 1782592125.868350, type 3 (EV_ABS), code 24 (ABS_PRESSURE), value 60
Event: time 1782592125.868350, ————– SYN_REPORT ————
Event: time 1782592125.880384, type 3 (EV_ABS), code 0 (ABS_X), value 1785
Event: time 1782592125.880384, type 3 (EV_ABS), code 1 (ABS_Y), value 2347
Event: time 1782592125.880384, type 3 (EV_ABS), code 24 (ABS_PRESSURE), value 96
確認ができたら、CTRL-Cで終了
検証結果
今回、同一と思われるLCDモジュールを2枚検証した。
1台目は
-
LCD表示
-
タッチパネル
ともに正常動作した。
一方、2台目は
-
LCD表示は正常
-
バックライト正常
-
/dev/fb1作成 -
ADS7846認識
-
/dev/input/event0作成
まで正常だったにもかかわらず、
evtestではタッチイベントが一切発生しなかった。Raspberry Pi本体やOSを変更しても症状は変わらなかったため、タッチパネル側(フレキケーブル、抵抗膜パネル、またはADS7846周辺)のハードウェア故障と判断した。
表示専用LCDとしては問題なく利用できるため、2台目はそのまま表示専用機として利用することにした。
さらに、LCDモジュールをつけた場合、電源の消費量が高くなる。demsgやvcgencmd get_throttledで確認することをお勧めする。
結果
こんな感じで使うことに。
テレビ裏に押し込めたEVO-X2の状態が見えるようになった。まぁ、Raspbery Pi 3だからメモリもないし、こういうAPIからステータスを表示する用途がちょうどいい。
GPU、NPUの動き、GTTとRAMの容量、電気消費量が見える。さらにGPUやNPUが動くと炎演出。

しかし、ここにもHAL3がいるとは、まるで、2001年宇宙の旅にでてきた、HAL9000みたいになってきた。あと、カメラ、スピーカー、マイクを付けたらHAL9000だな。こいつはHAL3だが。