news 2026/6/13 11:29:05

告别命令行:用NanoPi NEO和1.69寸屏打造你的迷你桌面终端(基于Framebuffer)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
告别命令行:用NanoPi NEO和1.69寸屏打造你的迷你桌面终端(基于Framebuffer)

用NanoPi NEO打造迷你终端:1.69寸屏的Framebuffer创意实践

在创客的世界里,总有些令人兴奋的项目能将看似普通的硬件组合变成实用又有趣的工具。今天我们要探讨的,就是如何将NanoPi NEO这块信用卡大小的开发板与1.69寸的ST7789V2驱动屏幕结合,打造一个完全独立运行的迷你信息终端。这个终端不需要HDMI显示器,也不需要SSH连接,它本身就是个完整的显示系统,可以实时展示服务器状态、智能家居数据或者任何你想监控的信息。

1. 硬件准备与环境搭建

1.1 选择合适的硬件组合

NanoPi NEO以其小巧的体积和完整的Linux系统支持成为这个项目的理想选择。搭配中景园的1.69寸LCD屏幕(ST7789V2驱动),这个组合既经济实惠又足够强大。屏幕的240×280分辨率对于显示文本和简单图形界面绰绰有余。

所需硬件清单

  • NanoPi NEO开发板(H3处理器版本)
  • 中景园1.69寸LCD屏幕(ST7789V2驱动芯片)
  • 杜邦线若干
  • 5V电源适配器
  • 可选:3D打印外壳或自制亚克力外壳

1.2 引脚连接与物理组装

屏幕与NanoPi NEO的连接相对简单,主要使用SPI接口。以下是具体的引脚对应关系:

屏幕引脚NanoPi NEO引脚功能说明
GNDGND地线
VCC3.3V电源
SCLPC2SPI时钟
SDAPC0SPI数据
RESPG11复位
DCPA1数据/命令选择
CSPC3片选
BLKPA0背光控制

提示:连接时务必确认电源极性正确,错误的连接可能会损坏屏幕或开发板。

1.3 开发环境配置

为了编译内核模块和驱动,我们需要搭建交叉编译环境。友善之臂官方提供了完整的工具链:

# 下载交叉编译工具链 wget http://wiki.friendlyarm.com/download/linux/toolchain/arm-linux-gnueabihf-gcc-4.9.3.tar.xz tar xvf arm-linux-gnueabihf-gcc-4.9.3.tar.xz # 下载Linux内核源码 git clone https://github.com/friendlyarm/linux.git -b sunxi-4.14.y --depth 1

2. 内核驱动配置与编译

2.1 设备树修改

要让内核识别我们的屏幕,需要修改设备树文件。找到linux/arch/arm/boot/dts/sun8i-h3-nanopi.dtsi,在spi0节点下添加屏幕配置:

&spi0 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&spi0_pins &spi0_cs_pins>; pitft: pitft@0 { compatible = "sitronix,st7789v"; reg = <0>; status = "okay"; spi-max-frequency = <96000000>; rotate = <90>; fps = <33>; buswidth = <8>; dc-gpios = <&pio 0 1 GPIO_ACTIVE_HIGH>; /* PA1 */ reset-gpios = <&pio 6 11 GPIO_ACTIVE_HIGH>; /* PG11 */ led-gpios = <&pio 0 0 GPIO_ACTIVE_LOW>; /* PA0 */ debug = <0x0>; }; };

2.2 内核配置与编译

进入内核源码目录,启用ST7789V驱动:

make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

导航至:

Device Drivers → Staging drivers → Support for small TFT LCD display modules → FB driver for the ST7789V LCD Controller

编译内核和模块:

make zImage dtbs modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

2.3 部署新内核

将编译好的内核和设备树文件拷贝到NanoPi NEO上:

scp arch/arm/boot/zImage root@[板子IP]:/boot scp arch/arm/boot/dts/sun8i-h3-nanopi-neo.dtb root@[板子IP]:/boot

重启后,屏幕应该会显示Linux控制台输出。

3. Framebuffer基础应用

3.1 验证Framebuffer工作

首先确认framebuffer设备已正确创建:

ls /dev/fb*

通常会是/dev/fb0。我们可以用简单的工具测试显示:

# 安装fbi(framebuffer image viewer) apt-get install fbi # 显示一张测试图片 fbi -noverbose -a test.jpg

3.2 基本文本显示

对于终端应用,我们可以直接重定向控制台输出到我们的屏幕:

con2fbmap 1 0

这个命令将tty1的控制台输出映射到fb0(我们的屏幕)。现在,屏幕应该显示Linux登录提示。

3.3 自定义信息显示

创建一个简单的shell脚本,定期显示系统信息:

#!/bin/bash while true; do clear > /dev/fb0 echo "CPU温度: $(cat /sys/class/thermal/thermal_zone0/temp)" > /dev/fb0 echo "IP地址: $(hostname -I)" > /dev/fb0 echo "内存使用: $(free -m | awk 'NR==2{printf "%.1f%%", $3*100/$2}')" > /dev/fb0 sleep 5 done

4. 高级显示技巧与实用脚本

4.1 使用Python进行图形绘制

Python的pygame库可以直接操作framebuffer,实现更复杂的显示效果。首先安装所需库:

apt-get install python3-pygame

然后创建一个简单的状态显示器:

#!/usr/bin/python3 import pygame import time import os # 初始化pygame pygame.init() # 设置显示表面为framebuffer os.environ["SDL_FBDEV"] = "/dev/fb0" os.environ["SDL_VIDEODRIVER"] = "fbcon" # 创建显示表面 size = (pygame.display.Info().current_w, pygame.display.Info().current_h) screen = pygame.display.set_mode(size, pygame.FULLSCREEN) # 字体设置 font = pygame.font.Font(None, 24) def get_cpu_temp(): with open("/sys/class/thermal/thermal_zone0/temp", "r") as f: temp = int(f.read()) / 1000 return temp def get_mem_usage(): with open("/proc/meminfo", "r") as f: lines = f.readlines() total = int(lines[0].split()[1]) free = int(lines[1].split()[1]) used = total - free return (used / total) * 100 while True: # 获取系统信息 cpu_temp = get_cpu_temp() mem_usage = get_mem_usage() ip_addr = os.popen("hostname -I").read().strip() # 清屏 screen.fill((0, 0, 0)) # 绘制信息 temp_text = font.render(f"CPU温度: {cpu_temp:.1f}°C", True, (255, 255, 255)) mem_text = font.render(f"内存使用: {mem_usage:.1f}%", True, (255, 255, 255)) ip_text = font.render(f"IP地址: {ip_addr}", True, (255, 255, 255)) screen.blit(temp_text, (10, 10)) screen.blit(mem_text, (10, 40)) screen.blit(ip_text, (10, 70)) pygame.display.flip() time.sleep(1)

4.2 创建简易菜单系统

对于更复杂的交互,我们可以实现一个简单的菜单系统:

#!/usr/bin/python3 import pygame import os import subprocess # 初始化 pygame.init() os.environ["SDL_FBDEV"] = "/dev/fb0" os.environ["SDL_VIDEODRIVER"] = "fbcon" size = (240, 280) screen = pygame.display.set_mode(size, pygame.FULLSCREEN) font = pygame.font.Font(None, 24) # 菜单项 menu_items = [ "系统状态", "网络信息", "重启系统", "关机" ] current_selection = 0 def draw_menu(): screen.fill((0, 0, 0)) for i, item in enumerate(menu_items): color = (255, 255, 255) if i != current_selection else (255, 255, 0) text = font.render(item, True, color) screen.blit(text, (20, 20 + i * 30)) pygame.display.flip() def show_system_status(): screen.fill((0, 0, 0)) cpu_temp = subprocess.getoutput("cat /sys/class/thermal/thermal_zone0/temp") cpu_temp = f"{int(cpu_temp)/1000:.1f}°C" mem_usage = subprocess.getoutput("free -m | awk 'NR==2{printf \"%.1f%%\", $3*100/$2}'") font_large = pygame.font.Font(None, 32) temp_text = font_large.render(f"CPU: {cpu_temp}", True, (255, 255, 255)) mem_text = font_large.render(f"内存: {mem_usage}", True, (255, 255, 255)) screen.blit(temp_text, (20, 50)) screen.blit(mem_text, (20, 100)) back_text = font.render("按B键返回", True, (255, 255, 255)) screen.blit(back_text, (20, 200)) pygame.display.flip() while True: for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_b: return running = True draw_menu() while running: for event in pygame.event.get(): if event.type == pygame.KEYDOWN: if event.key == pygame.K_DOWN: current_selection = (current_selection + 1) % len(menu_items) draw_menu() elif event.key == pygame.K_UP: current_selection = (current_selection - 1) % len(menu_items) draw_menu() elif event.key == pygame.K_RETURN: if current_selection == 0: # 系统状态 show_system_status() draw_menu() elif current_selection == 3: # 关机 os.system("poweroff") running = False elif event.key == pygame.K_q: running = False

5. 项目优化与实用技巧

5.1 降低系统资源占用

作为常驻终端,我们需要尽量减少资源占用:

# 关闭不需要的服务 systemctl disable --now avahi-daemon systemctl disable --now triggerhappy systemctl disable --now console-setup # 使用轻量级init系统(如runit) apt-get install runit

5.2 自动启动显示脚本

创建systemd服务,让我们的显示脚本开机自动运行:

# /etc/systemd/system/miniterm.service [Unit] Description=Mini Terminal Display After=network.target [Service] ExecStart=/usr/local/bin/miniterm.py Restart=always User=root [Install] WantedBy=multi-user.target

然后启用服务:

systemctl enable miniterm.service systemctl start miniterm.service

5.3 物理按钮集成

为增强交互性,可以添加几个物理按钮连接到GPIO,用于菜单导航:

# 在Python脚本中添加GPIO检测 import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setup(17, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 上 GPIO.setup(22, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 下 GPIO.setup(27, GPIO.IN, pull_up_down=GPIO.PUD_UP) # 选择 while running: if GPIO.input(17) == False: # 上 current_selection = (current_selection - 1) % len(menu_items) draw_menu() time.sleep(0.2) elif GPIO.input(22) == False: # 下 current_selection = (current_selection + 1) % len(menu_items) draw_menu() time.sleep(0.2) elif GPIO.input(27) == False: # 选择 # 处理选择逻辑 time.sleep(0.2)

5.4 外壳设计与电源管理

为了让项目更加完整,可以考虑:

  1. 3D打印或激光切割一个外壳,将屏幕和开发板整合在一起
  2. 添加锂电池和充电电路,实现便携使用
  3. 使用PWM控制屏幕背光,根据环境光线自动调节亮度
# 控制背光亮度的示例 echo 50 > /sys/class/backlight/backlight/brightness
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/13 11:28:46

终极指南:5种简单方法一键安装Windows包管理器Winget

终极指南&#xff1a;5种简单方法一键安装Windows包管理器Winget 【免费下载链接】winget-install Install WinGet using PowerShell! Prerequisites automatically installed. Works on Windows 10/11 and Server 2019/2022. 项目地址: https://gitcode.com/gh_mirrors/wi/w…

作者头像 李华
网站建设 2026/6/13 11:24:58

多租户 MCP 控制平面——隔离、配额与计费

一、从单租户到多租户在 MCP 的早期应用中&#xff0c;控制平面通常服务于单一团队或单一业务线。一个 MCP 网关、一套策略、一套审计日志&#xff0c;足够支撑几十个 Agent 和几百个 Skill。这种单租户模式简单直接&#xff0c;运维负担小。然而&#xff0c;随着 MCP 在企业内…

作者头像 李华
网站建设 2026/6/13 11:23:28

影刀RPA实操指南_TEMU跨境电商数据采集从零到自动化的完整方案

影刀RPA实操指南&#xff1a;TEMU跨境电商数据采集从零到自动化的完整方案 TEMU是近年跨境电商里增速最快的平台之一。对于做TEMU的运营来说&#xff0c;商品数据监控、竞品价格跟踪、店铺表现分析&#xff0c;这些每天都要做。 手动点几十个页面查数据的效率太低了。 真正需…

作者头像 李华
网站建设 2026/6/13 11:21:51

ComfyUI 部署 FLUX.1 GGUF 量化模型完整技术教程

一、FLUX.1 模型简介 FLUX.1 是由 Black Forest Labs 团队研发的文生大模型&#xff0c;该团队核心成员为原 Stable Diffusion 项目主创人员。模型参数规模达 120 亿&#xff0c;采用多模态 Transformer 扩散模型混合架构&#xff0c;在语义理解、图像生成表现上有显著优化。…

作者头像 李华
网站建设 2026/6/13 11:21:50

PyTorch-NPU/dpt_large在自动驾驶中的应用:3个实际案例解析

PyTorch-NPU/dpt_large在自动驾驶中的应用&#xff1a;3个实际案例解析 【免费下载链接】dpt_large 项目地址: https://ai.gitcode.com/hf_mirrors/PyTorch-NPU/dpt_large PyTorch-NPU/dpt_large是基于PyTorch框架优化的深度估计模型&#xff0c;专为NPU&#xff08;神…

作者头像 李华