<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>嵌入式 on 诺亚的小站</title><link>https://www.noahland.cn/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/</link><description>Recent content in 嵌入式 on 诺亚的小站</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Thu, 01 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.noahland.cn/tags/%E5%B5%8C%E5%85%A5%E5%BC%8F/index.xml" rel="self" type="application/rss+xml"/><item><title>熊导游：一个按键就能唤起 AI 讲解的景区导览设备</title><link>https://www.noahland.cn/p/travelbear-ai-guide/</link><pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.noahland.cn/p/travelbear-ai-guide/</guid><description>&lt;p&gt;最近和几个同学做了一个叫「熊导游」（TravelBear）的项目：一台树莓派 4B 上的 AI 景区导览设备。按一下按键，摄像头拍下眼前的展品，定位模块告诉它你在哪，云端大模型生成一段讲解，然后用语音播报出来。&lt;/p&gt;&#10;&lt;p&gt;整个流程听起来简单，真要把每一环都做实，还是踩了不少坑。项目开源在 &lt;a class="link" href="https://github.com/RichLi4307/Travelbear" target="_blank" rel="noopener"&#10; &gt;GitHub&lt;/a&gt;，这里记录几个最有意思的技术决策。&lt;/p&gt;&#10;&lt;h2 id="整体架构"&gt;整体架构&#10;&lt;/h2&gt;&lt;p&gt;设备端五个模块：定位、识图、LLM、TTS、按键状态机。主程序用有限状态机控制状态流转，&lt;code&gt;trigger()&lt;/code&gt; 是按键入口，支持打断——讲解员讲到一半再按一下就能换题。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;识图&lt;/strong&gt;：Qwen-VL-Max，置信度低于 0.05 的画面直接丢弃，不让模型瞎编&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;LLM&lt;/strong&gt;：阿里云 qwen-plus，实测 2.4 秒生成 127 字讲解，语速刚好&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;TTS&lt;/strong&gt;：小米 MiMo，云端兜底，实测尾音完整&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;ASR&lt;/strong&gt;：本来想做语音问答，冻结了——设备定位是「一按一讲」，先把核心体验做扎实&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="最难的问题展厅里-gps-不可信"&gt;最难的问题：展厅里 GPS 不可信&#10;&lt;/h2&gt;&lt;p&gt;室外定位用的是 NEO-M8N GPS 模块，本地围栏两档判定（景区级宽松、点位级严格），未命中再走高德在线反解兜底。这套方案在室外工作得很好——实测 9 星、HDOP 2.87，准确命中「上海大学（宝山校区）」。&lt;/p&gt;&#10;&lt;p&gt;但展厅里完全是另一回事：GPS 会漏进弱 fix，漂移几十米，青铜器和陶瓷的讲解能讲串。&lt;/p&gt;&#10;&lt;p&gt;我们的解法是给每个展位布一个 ESP32-C3 的 iBeacon 蓝牙信标，树莓派板载蓝牙扫描 RSSI，中值滤波加阈值过滤后映射到展位。关键是&lt;strong&gt;仲裁策略&lt;/strong&gt;：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;BLE 信标新鲜命中无条件最高优先——信标固定在展位的米级物理证据前，GPS（包括点位级）不插嘴；信标信号消失 10 秒后才落回 GPS。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;这个策略有 9 条行为测试锁死（&lt;code&gt;test_ble_priority.py&lt;/code&gt;），消除了展厅内 GPS 漏入导致的讲解串味。&lt;/p&gt;&#10;&lt;h2 id="状态"&gt;状态&#10;&lt;/h2&gt;&lt;p&gt;截至 2026-09-28，硬件全链路已经实测闭环：GNSS 室外定位、BLE 室内定位、识图、LLM、TTS、按键热键、服务锁、打断全部通过真实验收。剩下的是现场工作：信标进馆布点、阈值标定和供电方案。&lt;/p&gt;&#10;&lt;p&gt;从「按一下键」到「听见讲解」，全链路延迟压在可接受范围内——对一个靠电池和 4G 跑的设备来说，每一毫秒的云端往返都是省出来的。&lt;/p&gt;&#10;</description></item><item><title>给树莓派 3.5 寸屏写了个 Rust 系统仪表盘</title><link>https://www.noahland.cn/p/pi-dashboard-rust/</link><pubDate>Sun, 20 Sep 2026 00:00:00 +0000</pubDate><guid>https://www.noahland.cn/p/pi-dashboard-rust/</guid><description>&lt;p&gt;之前给树莓派 4B 买外壳时，顺手给配了一块微雪 3.5 寸 TFT 屏。最初简简单单用 Python 写了个系统仪表盘,显示 CPU、温度、内存、磁盘、IP、Docker 容器和 Tailscale 状态，但监控的数据越来越多，很快摸到性能天花板，最后我不得不用 Rust 重写了整个东西（&lt;a class="link" href="https://github.com/RichLi4307/pi-dashboard" target="_blank" rel="noopener"&#10; &gt;pi-dashboard&lt;/a&gt;，v0.2.2）。&lt;/p&gt;&#10;&lt;h2 id="为什么-python-不够"&gt;为什么 Python 不够&#10;&lt;/h2&gt;&lt;p&gt;起初我只是计划做一个0.5FPS的监控屏幕程序，后面发现监控速度太慢，很多程序都是脉冲式的负载。为了更客观反应小派的实际硬件状态，我打起了rust的主意。&lt;/p&gt;&#10;&lt;h2 id="rust-版做额外做的几件事"&gt;Rust 版做额外做的几件事&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;脏区刷新&lt;/strong&gt;。核心思路是每次渲染都先保留上一帧画面，只把画面里变化的矩形区域写入帧缓冲。静止状态下 SPI 写入量远小于全屏，动态画面下的流畅度立刻不一样了。为此自己实现了 RGB565 帧缓冲层和一套几何原语。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;字体渲染&lt;/strong&gt;。因为要监测的数据很多，但屏幕太小，字体必须和像素足够对齐才能保证清晰度。为此我写了一个字体级 baseline 锚定的文本引擎，现在多行混排稳定得多。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;SPI 超频到 48MHz&lt;/strong&gt;。微雪屏官方建议频率偏保守，考虑到我的脏区刷新的平均带宽需求并不大，所以树莓派和这块屏的配合在 48MHz 下稳定，主循环跑到 15 FPS。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;裸解析触摸事件&lt;/strong&gt;。彻底重写触摸协议和校准方式。现在不依赖任何触摸框架，直接读 &lt;code&gt;input_event&lt;/code&gt;,在保持轻量的同时保持了可控性。现在支持点击容器列表翻页，但是重启按钮还是有点难按。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;双通道指标采集&lt;/strong&gt;。考虑不同监控指标的变化速度差异显著，我让CPU 这类变得快的指标走快通道，磁盘、IP 这类变得慢的走慢通道,同时保证帧率与低功耗。&lt;/p&gt;&#10;&lt;h2 id="最有意思的部分让聊天机器人也能看屏"&gt;最有意思的部分：让聊天机器人也能看屏&#10;&lt;/h2&gt;&lt;p&gt;仪表盘内置了一个 Unix Domain Socket 的 IPC server，配套写了 &lt;a class="link" href="https://github.com/RichLi4307/pi-dashboard-mcp" target="_blank" rel="noopener"&#10; &gt;pi-dashboard-mcp&lt;/a&gt;——一个 MCP server，让 AstrBot（我部署的聊天机器人）可以直接查询系统状态、截屏、切换显示模式。&lt;/p&gt;&#10;&lt;p&gt;也就是说，机器人不用问人「服务器现在什么状态」，它自己看一眼屏幕就知道了。&lt;/p&gt;&#10;&lt;h2 id="尾巴"&gt;尾巴&#10;&lt;/h2&gt;&lt;p&gt;这个仪表盘是树莓派时代的遗物——2026 年 9 月底我把整套服务迁到了一台小新笔记本上，树莓派正式退役。项目代码和这段折腾的记录都留在 GitHub 和本站里，权当纪念。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;树莓派退役之后这块屏我还留着。虽然有些硬件退役了，但它教会我的东西会一直跟着我。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item></channel></rss>