构建一个小型终端模拟器
难道你不觉得,把显示器和键盘一直连接到服务器上,却只用来显示某个其他状态仪表盘的 `htop`,这简直是浪费金钱吗?
因此我制作了这个小巧的终端模拟器。它使用的是Makerfabs ESP32-S3并行TFT触摸屏,配备3.5英寸ILI9488显示屏。一款专为无头Linux设备设计的物理串行控制台,基于Makerfabs ESP32-S3并行TFT触摸屏(3.5英寸,ILI9488)。
将主板的原生USB-C接口插入服务器,然后在/dev/ttyACM0上运行getty,屏幕就会变成该机器的控制台:一个全彩80×24的VT100/xterm终端。点击屏幕可使用虚拟键盘输入命令,htop、vim和less等工具均可正常使用。
硬件
该产品为Makerfabs出品的ESP32-S3并行TFT触摸屏,尺寸为3.5英寸。
此固件适用于 v2.0 版本。无需其他操作——无需焊接,无需额外零件,只需一块电路板和一根 USB-C 数据线即可。
•MCU:ESP32-S3-WROOM-1-N16R2(16 MB 四倍闪存,2 MB 四倍 PSRAM),240 MHz
•显示屏:ILI9488 320×480,16位 Intel-8080 并行总线,支持横屏 480×320
•触摸:电容式 FT6236 @ 0x38 或电阻式 NS2009 @ 0x48(自动检测)
两个 USB-C 接口,两个任务:
•原生 USB-OTG → CDC-ACM,终端连接(主机上的 /dev/ttyACM0)
•CP2104 → UART0,用于刷写和 ESP-IDF 日志输出
刻意将两者分开:调试输出永远不会进入终端流,且 USB CDC 没有波特率上限,因此全屏 htop 重绘几乎是即时完成,而非在 115200 波特率下需要约 1 秒。
原生的USB接口也能够为电路板供电,因此只需一根连接服务器的线缆即可——这一点在v2.0版本的电路板上已得到确认。如果某个电路板版本的原生接口无法提供电源(例如没有VBUS连接到5V电源轨,或没有CC下拉引脚),系统仍然可以正常工作;此时仅需使用UART线缆或Y型连接线来供电即可。
该设备是终端,它不会为主机模拟USB键盘。
刷机设备
1. 克隆 esp32 终端仓库
2. 在 VS Code 中使用 Platformio 打开
3. 构建项目并刷入设备
使用 VS Code/Platformio 的图形界面,或输入
配置服务器
你需要配置服务器,将此设备设置为终端 `tty` 设备。所有说明都在 readme 文件中。readme 文件内容较长,但别被吓到,其中大部分是命令的复制粘贴。建议具备一定的命令行操作经验。
首先,在您的 Linux 电脑上输入以下内容:
现在你应该能看到登录界面了。如需获取颜色或设置自动重新连接,请按照 readme 中的说明操作。
连接
连接后,您将看到登录界面。
输入文字时,会显示一个屏幕键盘。用手指打字比较困难(不过练习有助于提高),而使用电容式触控笔则更方便。
登录后,您可以运行任何命令,例如 `htop`,它会显示最重要的系统状态。
使用磁铁,您可以将其固定在服务器或服务器机柜上。
现在您可以将其连接到服务器、机架或机柜上。
终端
•尺寸为 80×24,对应 6×13 的单元格(面板尺寸为 480×312),正好与 Linux 串行 getty 的默认尺寸一致,因此无需进行尺寸协商。
•字体为 X11 misc-fixed 6x13 及其真正的粗体版本 6x13B — 公共领域,位于 tools/fonts/ 目录中。包含约 2000 个字符:拉丁字母-1、希腊文、西里尔文、方框绘图、块状元素、箭头、数学符号等。
•颜色支持:16 种 ANSI 颜色、256 色立方体以及 24 位真彩色(38:2:r:g:b,包括 tmux 和 kitty 发出的 38:2::r:g:b 分号格式)。
•属性支持:粗体(一种真正不同的字体,而非模糊效果)、变暗、下划线、反色、删除线、闪烁(如同粗体)、斜体(被解析但被忽略)——在 6 像素宽的显示区域中没有空间容纳斜体。
•其他功能:替代屏幕(?1049)、滚动区域、插入/删除行和字符、DEC 特殊图形(ESC ( 0))、UTF-8(正确处理双宽)、REP(即 ncurses 绘制 htop 指示条的方式)、以及光标位置报告,确保重新调整大小时正常工作。
•底部 8 像素为状态栏:链接状态、网格大小及粘性修饰符状态——一旦键盘被关闭,这些信息将无法再显示。
•未实现的功能:鼠标报告(模式被接受,但事件从未发送)、六进制字符(sixel)、斜体以及回滚功能。TERM=xterm-256color 保证了其中一些功能;它们会安静地降级。
屏幕键盘
在终端任意位置轻点即可弹出;点击 ⌄ 键或键盘上方任意位置可将其关闭。
虽然终端被固定在上方的行上,并随着光标移动而平移,因此提示符始终位于按键正上方——你永远不会盲目地输入。
通过123 / abc键输入两层内容(字母/数字和符号)。
⇧ 和 Ctl 键具有粘性:单击一次用于激活下个按键,双击锁定,三击清除。激活和锁定状态以不同颜色显示,并在状态栏中镜像呈现。
方向键、Tab、Esc、Enter、Backspace。在应用程序光标模式下,方向键发送 ESC O A,因此它们在 vim 和 bash 中均有效。
Enter 发送 CR 而非 LF — tty 的 ICRNL 会将其转换,readline 也期望收到此格式。
Ctrl+字母发送控制代码(Ctl 后接 c 会中断)。
1x / 2x 切换缩放:在 2× 缩放下,单元格尺寸为 12×26,显示区域变为一个 40×12 的窗口,覆盖相同的 80×24 终端,可随光标移动平移。在 165 DPI 下,6×13 实际上约为 6 点大小字体——近距离可读,当未启用时即为退出通道。
方向键、Backspace 和 Space 按住时自动重复;字母则不重复。
关于显示驱动的说明
此板使用的是 LovyanGFX 驱动,而非 ESP-IDF 的 esp_lcd。esp_lcd 的 i80 驱动无法驱动此面板(引脚、初始化和几何参数均已验证,但屏幕始终空白)。LovyanGFX 的 Bus_Parallel16 与相同的 LCD_CAM + GDMA 集成芯片通信,但配置方式不同,这种组合已被证实在此处有效。触摸操作也通过 LovyanGFX 实现,使用其传统的 I²C 驱动;如果混合使用较新的 i2c_master 驱动,则在启动时会中断。LovyanGFX 的组件已打包在 components/ 目录下(其中包含的 CJK 字体已被移除,仅保留空壳版本,因未被使用)。
传递给 lcd_raw_push* 的像素缓冲区是字节交换后的 RGB565 格式,因为这是通过 LovyanGFX 时无需逐像素转换的唯一路径。请使用 lcd_rgb() 或 lcd_rgb565() 构建颜色,而不是直接写入 0xF800 并期望得到红色。
板卡修改:本设备的显示控制引脚为 WR=35、RS=36、CS=37(参见 main/lcd.cpp),与 v2.0 模块/出厂固件设置(18/17/46)不同。如果您的面板始终空白,请首先检查该引脚设置。
触摸轴:在开发该功能的FT6236设备上,默认映射(offset_rotation = 0,即screen_x = raw_y,screen_y = 319 − raw_x)已被确认正确。如果遇到触控层方向不同的电路板,请在复位时按住BOOT键进行十字光标诊断:它会根据推测的触摸位置绘制,并通过UART端口记录原始坐标和映射坐标;点击屏幕顶部边缘可循环Touch::offset_rotation,从而无需重新刷写即可找到正确的数值。所有可用的方法都将被传入lcd_init()函数中。
本文编译自hackster.io





