ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

树莓派 Touch Display 2 实战:从 DSI 接线到 Python 全屏触摸开发

树莓派 Touch Display 2 实战:从 DSI 接线到 Python 全屏触摸开发 关注树莓派生态的玩家应该都有一个感觉官方那块 7 英寸触摸屏在很长一段时间里几乎没有太大变化。很多人在做桌面小主机、智能家居中控或者便携式仪表时宁愿绕开 DSI 屏去选择 HDMI 接口的显示器或者第三方面板方案。直到 Raspberry Pi Touch Display 2 出现才把“官方触摸屏”这个话题重新拉回了选型列表。本文不打算只做开箱展示而是围绕 Touch Display 2 从硬件选型、接线、系统准备到触摸设备识别、Python 事件读取和全屏 GUI 实战尽量完整地跑通一条可以复用的流程。无论你是想给树莓派配一块桌面副屏还是想做一个全屏 HMI 项目这套踩坑笔记都能直接参考。1. 背景为什么 Touch Display 2 值得关注1.1 它是树莓派生态里的“正统”官方触摸屏树莓派主板除了常见的 HDMI 接口之外还有一个专用的 DSI 显示接口。DSI 是面向嵌入式显示的一种串行接口协议它在带宽、延迟、功耗和布线复杂度上比普通 HDMI 更适合小尺寸屏幕。最初的官方 7 英寸触摸屏就是通过 DSI 接口直接连接树莓派主板的玩家不需要再单独给屏幕接一根电源线和视频线整套设备看起来更像一个完整的嵌入式产品。不过初代产品服役的时间确实比较久了。这么多年里树莓派主板已经换了好几代桌面图形环境也从 X11 逐步走向 Wayland显示栈也全面迁移到了 DRM/KMS。老屏幕在系统驱动层面虽然有比较成熟的补丁但硬件本身的亮度、可视角度、外观厚度和触摸玻璃工艺已经明显追不上新一批学习设备和工业 HMI 屏幕的水准。Touch Display 2 作为官方在七英寸触摸屏产品线上的更新产品解决了“官方屏生态仍然可用但新品缺乏”的尴尬问题。如果你想用树莓派做一类长期通电、需要稳定交互的设备比如家庭信息看板、智能门禁面板、桌面控制台那么和市面上杂牌 DSI 屏相比官方 Touch Display 2 最大的价值在于兼容性更可控。官方会持续在 Raspberry Pi OS 内核与驱动中维护这块屏的支持用户不需要到处找第三方内核模块或闭源驱动这在实际项目里能省下大量维护成本。1.2 和普通 HDMI 便携屏有什么区别很多人会把树莓派接一个 HDMI 小显示屏再接一条 USB 触摸框当作触摸屏使用。这种方式确实也能用但它有几个比较明显的短板HDMI 屏幕通常还需要独立供电如果不使用质量较好的电源容易出现画面闪烁或触摸供电不足。电源线和 HDMI 线梳理起来比较麻烦不满足嵌入式外观要求。在开机自检、内核引导阶段HDMI 屏幕常常会先显示主板 LOGO再到桌面而 DSI 屏幕在树莓派官方系统下和显示链路绑定得更紧密。DSI 屏直接由主板驱动不占用 HDMI 输出方便后期做双屏扩展或镜像输出。当然Touch Display 2 这类官方 DSI 屏并不是没有局限例如面板尺寸固定、只有树莓派主板能直接驱动如果接到其他单板电脑上需要自己适配设备树和驱动。对大多数树莓派使用者来说这种“专一”反而简化了搭建过程。1.3 哪些场景最适合使用从社区热词和搜索习惯来看使用树莓派做桌面小主机、智能小车、家庭服务器的人很多而 Touch Display 2 天然适合下面几类需求桌面迷你终端树莓派 5 加上触摸屏放在桌面上做天气、日历、音乐控制面板。智能家居中控通过 Home Assistant 或其他 Web 控制台全屏显示控制页面。工业 HMI 原型验证用 Python 写按钮、仪表盘、日志界面快速验证触摸交互逻辑。教学实验硬件在学校实验室里树莓派配合 GPIO、摄像头、屏幕组成一个完整嵌入式实训平台。这里要特别提醒如果你希望屏幕可以随时拆下来当普通显示器用Touch Display 2 并不是最合适的选择它更适合“屏幕 主板”长期绑定在一起的嵌入式形态。2. 硬件准备与选型建议2.1 硬件清单在做实物接线之前先把需要的硬件准备齐全。下面是一份基础清单部件作用注意事项树莓派主板主控建议使用树莓派 4B 或树莓派 5不同版本对触控屏驱动的支持会有差异建议使用较新型号Raspberry Pi Touch Display 2显示与触摸面板购买时确认包装内有配套的 DSI 排线和必要接插件microSD 卡安装系统建议 16GB 以上读写速度不要太低树莓派官方电源或优质 5V/3A 电源为主板和屏幕稳定供电避免使用手机旧充电器低电压会引发触摸失灵、屏幕闪白新版 Raspberry Pi OS 镜像系统运行环境先使用官方 Imager 工具写入后续用 apt 升级鼠标、键盘、网线或 Wi-Fi首次配置如果用桌面镜像也可直接通过屏幕操作2.2 系统镜像选择Touch Display 2 的驱动支持依赖于新版内核和设备树文件。如果使用过旧的 Raspberry Pi OS 镜像系统很可能无法自动识别新屏幕。最稳妥的做法是到树莓派官网下载页面使用 Raspberry Pi Imager 工具写卡选择最新的 Raspberry Pi OS64 位桌面版。桌面版自带图形环境插上屏幕后第一次开机就能通过触摸操作排障成本更低。如果你的项目最终想使用 Lite 无桌面版本后面也可以自己安装轻量图形环境。但第一次验证硬件时我强烈建议先用官方桌面环境跑通避免一开始就把问题集中在“驱动有没有加载”和“图形服务有没有配置正确”之间。这里也要说明树莓派生态的软件版本迭代非常快本文以“近期的 Raspberry Pi OS 默认环境”为例不把命令细节绑定到某个特定旧版本。实际使用中如果你的系统已经是很早之前写入的请先完成系统更新。2.3 连接端口的预判树莓派主板的接口布局并不完全一致。例如树莓派 4B 和树莓派 5 的 DSI 屏幕接口都位于板子一侧但具体方向和主板丝印可能不同。Touch Display 2 配套的排线通常也能直接兼容这些接口。第一次接线时最好准备一个手电筒先观察主板上 DSI 连接器的卡扣方向再对照屏幕说明书插入。不要凭感觉硬插。DSI 排线一旦插反或错位强行锁紧卡扣很容易损坏连接器。如果排线方向不对可以考虑轻轻把卡扣打开后翻面重新插入一般不会对硬件造成影响。3. 系统准备先把驱动和依赖更新到较新状态3.1 进入系统并完成更新将写好的系统卡插入树莓派后建议在还未连接触摸屏前先通过 HDMI 显示器或 SSH 方式进入系统完成一次完整的升级。这样能避免屏幕驱动相关补丁还没更新导致的黑屏问题。# 切换到国内镜像源后执行如果你在 apt 下载速度较慢 sudo apt update sudo apt full-upgrade -y sudo rebootfull-upgrade和普通的upgrade差别在于它不仅升级已有软件包还会处理依赖关系变化导致的软件包升级。树莓派官方在发布新版硬件后通常会把相关设备树、内核模块和桌面配置推送到raspberrypi-kernel软件包中所以升级这一步很重要。之后再确认一下内核版本和系统版本uname -a cat /etc/os-release只需要记录输出信息即可不需要手动固定版本。如果后续排查驱动问题这些信息会很有用。3.2 接入 Touch Display 2 的步骤连接 Touch Display 2 时不要给树莓派通电。建议按照下面的顺序操作第一步先把树莓派关机并断开所有电源线同时拔出连接着的 HDMI 显示器避免开机时显示栈在两个输出之间切换干扰你判断屏幕是否被正确识别。第二步找到树莓派主板上的 DSI 显示接口。在最新几代树莓派上这个接口通常在电源接口或音频接口附近是一个带有卡扣的小型扁平座。第三步取出 Touch Display 2 包装内的 DSI 排线注意两端接口方向。插排线时要先轻轻向上翻开连接器上的黑色卡扣把排线放入插槽确保金手指露出方向和卡扣方向匹配然后压下卡扣锁紧。第四步确认屏幕驱动板与树莓派主板之间不需要额外供电线时就可以直接通电开机。实际上不同批次的屏幕配件可能略有差异第一次通电后观察屏幕背光是否亮起即可。有一点要让新手特别注意DSI 排线非常薄弯折角度不能太大。布线时不要用胶带强行折成直角否则后期可能会出现接触不良表现为启动时屏幕有背光但不显示画面。3.3 第一次开机观察接好 Touch Display 2 后开机正常情况会看到树莓派启动过程输出到屏幕然后进入桌面。最新系统的图形登录界面应该会出现触摸光标点击登录框时能正常输入。如果你接入了 HDMI 显示器和 DSI 屏两套设备树莓派桌面默认可能把主界面输出到其中任意一路。为了简化验证第一次建议只接 Touch Display 2。如果开机后屏幕完全没有画面但系统其他功能正常可以按第 6 章的排查步骤继续处理。4. 确认显示链路通过命令查看 DSI 与触摸设备系统启动成功后我们可以从显示和输入两个方面确认 Touch Display 2 是否被完整识别。以下是适合终端执行的检查方法SSH 同样可以用。4.1 查看内核日志中的 DSI 面板信息打开终端执行sudo dmesg | grep -Ei dsi|panel|touch | tail -n 60这条命令会把内核启动日志中包含 dsi、panel、touch 的行过滤出来。如果 Touch Display 2 被正确识别输出中通常会出现像panel或者屏幕型号名的信息。如果日志中完全没有相关内容说明设备树没有加载成功或者系统内核版本太旧。还可以用下面的命令查看 DRM 显示设备的连接状态cat /sys/class/drm/card0-*/status 2/dev/null | head -20如果该目录下存在card0-DSI-1且状态为connected说明 DSI 链路已经建立。这条命令的输出在不同版本中稍有差异可作为辅助判断。4.2 查看触摸输入设备触摸屏在 Linux 中会被注册成一个 input 设备节点通常是/dev/input/eventX。我们可以先看设备列表ls -l /dev/input/由于 event 编号会随启动顺序变化更可靠的方式是通过by-id或by-path查找设备ls -l /dev/input/by-id/在 Raspberry Pi OS 中Touch Display 2 的触摸设备名称通常带有 “Raspberry Pi” 或 “touchscreen” 关键字。只要能看到对应设备就足以说明输入链路是正常的。4.3 使用 evtest 查看原始触摸事件evtest是 Linux 下查看输入事件的经典工具。先安装sudo apt install -y evtest然后运行sudo evtest程序会列出所有输入设备输入对应编号后回车再用手在屏幕上点击或滑动终端会不断输出触摸事件。这是一个非常有用的硬件检测方法。如果你看到类似“ABS_MT_POSITION_X”“ABS_MT_POSITION_Y”“BTN_TOUCH”这样的事件代码说明触摸屏工作正常后面做软件就能基于这些事件开发。5. Python 实战触摸坐标读取与全屏 UI 示例系统层面的识别正常后很多开发者接下来要做的就是编写自己的界面程序。这一节使用 Python 的evdev库读取触摸设备再结合tkinter做一个简单的全屏画点程序。5.1 安装 Python evdevevdev是 Linux 下直接读取输入设备事件的 Python 库。在树莓派官方软件源中可以直接安装sudo apt install -y python3-evdev如果你的系统是精简版且没有这个包也可以使用 pipsudo apt install -y python3-pip pip3 install --user evdev安装完以后先用一小段代码确认模块能正常导入并且可以列出所有输入设备。下面这个示例会扫描/dev/input/eventX并打印设备名称方便你确定触摸设备的路径。# 文件路径tools/list_inputs.py #!/usr/bin/env python3 import glob import evdev for path in sorted(glob.glob(/dev/input/event*)): try: dev evdev.InputDevice(path) except (PermissionError, OSError): continue if dev.name: print(path, \t, dev.name)运行sudo python3 tools/list_inputs.py你会看到类似下面的结果/dev/input/event0 ... /dev/input/event1 ...先记录触摸设备对应的/dev/input/eventX路径后面程序需要用到。5.2 读取触摸坐标下面这个程序可以从指定的触摸设备节点读取事件并打印按压位置的绝对坐标。老版本屏幕有两种触摸事件协议一种是传统的绝对坐标ABS_X/ABS_Y另一种是多点触控协议ABS_MT_POSITION_X/ABS_MT_POSITION_Y因此程序里同时做了兼容。# 文件路径tools/trace_touch.py #!/usr/bin/env python3 import sys import select import evdev from evdev import ecodes # 默认设备路径可以通过命令行参数覆盖 event_path /dev/input/event0 if len(sys.argv) 1: event_path sys.argv[1] dev evdev.InputDevice(event_path) print(打开输入设备:, dev.name, event_path) x, y 0, 0 while True: r, _, _ select.select([dev], [], [], 1) if not r: continue for event in dev.read(): if event.type ecodes.EV_ABS: if event.code ecodes.ABS_X or event.code ecodes.ABS_MT_POSITION_X: x event.value elif event.code ecodes.ABS_Y or event.code ecodes.ABS_MT_POSITION_Y: y event.value elif event.type ecodes.EV_KEY and event.value 1: print(f手指按下: x{x}, y{y})运行sudo python3 tools/trace_touch.py /dev/input/event0然后用手指在 Touch Display 2 上点击如果终端能输出对应坐标说明 Python 已经可以拿到触摸事件。这段代码本质上是把evtest的核心逻辑在 Python 里实现了一遍后续写业务功能可以直接从这里扩展。有一点要注意程序的坐标是触摸控制器的原始坐标它不一定与屏幕像素一一对应。在绝大多数官方驱动里内核会通过计算把触摸坐标映射到对应的显示分辨率因此桌面端拿到的坐标通常已经是屏幕逻辑坐标绘制 UI 时比较省心。如果后续你发现坐标和画面存在偏移优先检查旋转角度和设备树配置不要直接对源码里的坐标值随便做缩放那样容易留下不少隐藏问题。5.3 用 tkinter 做一个触摸画板拿到触摸事件后一个更直观的验证方法是把触摸屏当成画笔在屏幕上画点。下面的 tkinter 程序会创建一个全屏画板当手指点击时会在对应位置画出圆形标记点击“退出示例”按钮可以结束程序。# 文件路径tools/touch_draw.py #!/usr/bin/env python3 import tkinter as tk root tk.Tk() root.title(Touch Display 2 演示) root.attributes(-fullscreen, True) # 全屏显示 root.config(bgblack) canvas tk.Canvas(root, bgblack, highlightthickness0) canvas.pack(fillboth, expandTrue) def draw_dot(event): # 在按下位置画一个 8 像素半径的圆点 canvas.create_oval( event.x - 8, event.y - 8, event.x 8, event.y 8, fill#00ff88, outline ) def exit_app(): root.destroy() canvas.bind(Button-1, draw_dot) exit_btn tk.Button( root, text退出示例, commandexit_app, font(Sans, 20), bg#222222, fgwhite ) exit_btn.pack(sidebottom, pady20) root.mainloop()运行程序python3 tools/touch_draw.py在 Touch Display 2 上点击时如果看到绿色的圆点跟随手指出现说明从内核输入到桌面图形环境再到 Python GUI 的三层链路已经完全打通。5.4 自动启动应用实际项目中我们通常希望设备开机后直接进入自己的程序不需要手动打开终端。在树莓派桌面版中最常用的方法是创建一个 autostart 的.desktop文件。使用下面的命令创建入口文件mkdir -p ~/.config/autostart nano ~/.config/autostart/touch-demo.desktop内容可以写为[Desktop Entry] TypeApplication NameTouchDrawDemo Exec/usr/bin/python3 /home/pi/tools/touch_draw.py X-GNOME-Autostart-enabledtrue注意调整/home/pi/tools/touch_draw.py为你实际存放脚本的绝对路径。保存后重启树莓派系统进入桌面时就会自动运行这个全屏演示程序。这个方式的好处是简单直接适合原型验证。缺点是完全依赖桌面图形会话如果程序崩溃桌面上会继续显示原来的画面。工业产品中更稳妥的做法是用 service 或看门狗机制控制程序的重启和异常记录但那是后话了。6. 常见问题与排查思路树莓派和 Touch Display 2 的组合出现问题时现象可能比较相似很多新手容易误判为硬件损坏。这里整理了一张排查表问题现象常见原因处理思路接上后没有任何背光屏幕全黑排线没插好、供电不足、损坏重新插拔排线换官方电源试检查系统内核版本屏幕有背光但不显示桌面内核缺少设备树、系统过旧升级系统并重启查看 dmesg 是否有 panel 相关错误触摸没有反应画面正常输入设备没加载、权限不够用 evtest 看事件把用户加入 input 组确认设备路径界面可以显示但点击位置偏移旋转配置、驱动映射或排线接触不良先恢复默认旋转方向检查是否在 config.txt 中手动加过 overlay接了 HDMI 和 DSI 两块屏桌面跑到了 HDMI 上显示输出优先级问题物理拔掉 HDMI 后重启必要时通过系统设置配置主显示器开机偶尔黑屏拍一下排线又恢复DSI 排线接触不良关机后重新插排线避免直角弯折检查排线锁扣是否压紧下面针对几个高频问题做一点展开。如果你看到屏幕没有任何背光优先怀疑硬件接线。请先关机重新打开 DSI 连接器卡扣将排线拔出后仔细对比排线两端的金手指方向。许多排线外观上看起来对称但插反后并不能工作。重新插入时要保证排线完全插入连接器底部再合上卡扣。如果触摸事件始终无法通过 evtest 看到可以检查一下当前系统是否为最新版本。由于 Touch Display 2 相对较新旧镜像中的内核设备树很可能还没有包含对应的触摸节点此时不要手动去下载来源不明的 dtbo 文件先从官方源更新系统或者直接用官方 Imager 重新刷写最新镜像。还有一个经常出现的问题很多玩家之前在/boot/firmware/config.txt中写入了旧官方触摸屏的dtoverlay。Touch Display 2 的驱动控制逻辑与初代产品可能不完全相同如果你手动添加过旧的 overlay建议先把它注释掉再通过原生 KMS 显示栈识别设备。现在的官方系统对 DSI 屏幕的自动检测已经比较完善绝大多数情况不需要手动加 overlay。7. 工程建议与最佳实践7.1 供电与散热不能忽视Touch Display 2 的背光功耗并不算低树莓派主板的 USB、GPIO、Wi-Fi 也会同时拉电流。很多触摸失灵问题都是因为供电能力不足尤其当树莓派同时接了散热风扇、USB 外设和触摸屏时普通手机充电器很容易触发电压跌落。建议使用树莓派官方电源或至少选购支持 5V/3A 以上稳定输出的品牌电源。另外树莓派 5 等型号发热比较明显如果长时间全屏显示固定画面并运行后台服务要给 CPU 加上散热片或风扇。触摸屏本身不需要额外散热但主板长期高温会导致 SD 卡老化更快建议把系统装到性能较好的 SD 卡或在正式项目中使用 NVMe 和 SSD 方案。7.2 屏幕旋转要统一处理如果你把 Touch Display 2 竖起来使用就会遇到显示方向和触摸方向需要同时变换的问题。只是在应用窗口里把画面旋转 90 度远远不够触摸坐标不会自动跟随最终会出现“画面竖过来了但触摸还是按横屏坐标工作”的现象。在树莓派官方桌面系统中比较好的方式是从系统显示设置里统一配置屏幕旋转让内核和图形栈同步处理输出方向与触摸方向。应用层代码尽量保持面向“逻辑横屏”开发不要自己在程序里写一套坐标旋转。否则后续更换系统版本或分辨率很容易引入不可预期的 bug。7.3 用户态程序要处理异常退出原型运行仅仅是一个开始。如果要把 Touch Display 2 用于持续运行的课程设计或项目演示请务必考虑异常恢复。Python 脚本在运行过程中可能因为分辨率变化、输入设备掉线、网络断开等原因退出此时系统如果只停留在桌面用户可能无法察觉。简单做法是使用.desktopautostart 配合 shell 循环启动#!/bin/bash while true; do python3 /home/pi/tools/touch_draw.py sleep 2 done这样即使程序意外退出也会在 2 秒后重新拉起。不过要注意给循环加入退出逻辑避免调试阶段反复重启导致无法停掉。7.4 保持 SD 卡读写健康频繁全屏绘制和日志输出会加大对 SD 卡写入长期运行可能导致卡损坏。建议在代码中把日志写入内存路径或者减少高频日志输出。例如/var/log和/home/pi都位于 SD 卡上如果每秒打印一次日志一天就是几万次写入。可以将日志输出到/dev/shm这类内存文件系统或者只在状态变化时打印。7.5 权限与安全性从 USB 和输入设备读取事件默认需要 root 权限。如果希望普通用户直接运行 Python 触摸程序可以把用户加入input组sudo usermod -aG input $USER修改后需要重新登录或重启后再试。这里也提醒一下如果设备会暴露到公网或者部署在实验室公共环境不要直接使用 root 运行 GUI 程序。尽量让普通用户运行应用层代码权限控制在最小范围。7.6 用录制思路提高调试效率开发触摸界面时很多人会直接看屏幕和终端输出来判断问题。但当你同时使用 GPIO、摄像头等外设时桌面环境很容易被占满。更高效的调试方式是打开 SSH 服务然后用另一台电脑远程查看树莓派的 dmesg、系统日志和程序输出。这样即使屏幕上运行的是全屏 GUI你仍然可以实时观察日志避免反复切换界面。8. 写在最后下一步可以做什么从树莓派系统更新、硬件接线、触摸设备识别再到 Python evdev 和 tkinter 的联合使用现在你已经能够把 Touch Display 2 完整点亮并能与它交互了。接下来如果继续深入可以考虑以下几个方向第一把触摸屏与树莓派 GPIO 结合起来做一个全流程的智能控制面板。例如在屏幕上显示按钮点击按钮控制 LED、舵机或继电器这是树莓派小车和智能家居项目里很典型的外设组合。第二研究轻量级 GUI 框架比如 LVGL、PyGame、Qt for Raspberry Pi。相比 tkinter这些框架在性能、动画和工业 HMI 设计上更有优势尤其适合需要复杂界面的场景。第三尝试接入摄像头模块做视觉交互。Touch Display 2 作为界面显示层摄像头作为视觉输入层树莓派可以把两者融合起来完成人脸识别、物体分类等实训项目。第四如果你需要嵌入式量产形态可以进一步研究如何裁剪 Raspberry Pi OS关闭不需要的服务提高开机速度把自研程序做成 systemd 服务并加入看门狗。那将是比原型演示更接近真实产品的一步。硬件外设的升级速度通常比软件生态慢所以官方每一次更新其实都值得认真对待。Touch Display 2 的意义不仅是把旧屏幕参数换了一遍更是把树莓派官方触摸屏的体验拉回到当前开发者的习惯里。对于正在做树莓派项目的开发者来说建议先按本文流程点亮一块屏幕把触摸、显示、启动链路都验证清楚再决定后续的界面设计和项目架构。如果你在接线或系统配置中遇到其他问题也欢迎照着上面的排查思路对照检查多数情况下问题都出在系统版本、排线方向和电源质量这三个环节。
返回列表