我们如何用 Gemma 4 和树莓派打造桌面陪伴机器人
LEGO 桌面机器人 DinoDesk AI 用树莓派加本地网关,在 Gemma 4 与 Gemini Flash 间切换,无摄像头、本地对话零成本。
中文
复制

你是否想过在桌上摆一个小伙伴——它有复古游戏角色的手感魅力,能陪你聊天、帮你盯着桌面计时器,或者陪你一起梳理某个棘手的 bug——而且没有摄像头整天盯着你?
这个问题催生了 DinoDesk AI:我们的 LEGO Dino AI Companion Robot。

我和同事 Shama 决定做一台聪明、低功耗的桌面机器人:把 8 位音画和 LEGO Technic 机械结构带来的怀旧感,和现代的混合 LLM 切换架构(本地 ↔ 云端) 结合起来。桌面上放一台 Raspberry Pi,本地 PC 上跑一个网关,同时挂着 Gemma 4 和 Gemini Flash——这样一个桌面伙伴就成型了:100% 视觉隐私(没有摄像头)、零成本的本地即时对话,需要时还能调用云端做深度推理。
下面是 DinoDesk AI 从设计、接线到编程的完整幕后过程。
1. 混合大脑:本地 Gemma 4 ↔ 云端 Gemini
做 AI 硬件伴侣时最纠结的问题之一,就是大脑放在哪。全部跑在云端,那么每一句随口问的*“现在几点了?”*都要消耗 API token、增加网络延迟,还得把语音数据传出去。反过来,如果严格限制在设备上的小模型,一旦你让它在一个庞大的代码库里加个新功能,或者解释一个复杂话题,它立刻就撑不住了。
所以我们决定做一套混合 LLM 架构,在用户的主 PC 上跑一个统一 LLM 网关(路由器)。桌面上的 Raspberry Pi 通过 Wi-Fi 发出格式完全相同的 OpenAI 兼容请求,不管当前用的是哪个引擎:
┌─────────────────────────────────────────────────┐
│ [ Main PC / Local Gateway ] │
│ │
│ ┌─────────────────────────────────────────┐ │
│ │ Dynamic Model Router / Switch │ │
│ └────────────────────┬────────────────────┘ │
│ │ │
│ ┌──────────────────┴──────────────────┐ │
│ v v │
│ [ LOCAL ENGINE ] [ CLOUD ENGINE ] │
│ LM Studio / Gemma 4 Gemini Flash / │
│ (Zero Latency, Private) Gemini Live │
└────────────────────────┬────────────────────────┘
│
│ Wi-Fi (Unified OpenAI-Compatible Stream)
v
┌─────────────────────────────────────────────────┐
│ [ DinoDesk AI (RPi) ] │
│ - Pirate Audio LCD & I2S Beep Speaker │
│ - Push Button & Optional Sensors │
└─────────────────────────────────────────────────┘
三种智能模式
| 模式 | 启用的模型 | 优势与主要用途 | 切换方式 |
|---|---|---|---|
| 🟢 本地模式 (默认) | Gemma 4(通过 LM Studio) | 零成本、离线、100% 私密。 闲聊、桌面计时、快速查状态时首 token 延迟约 200 ms。 | 双击 Pirate Audio Button X、在电容触摸传感器上长按 3 秒,或用语音指令(“切换到云端模式”) |
| 🟡 云端模式 | Gemini Flash / Gemini Live | 强推理与复杂问题求解。 适合写代码、复杂数学、深入讲解或语言辅导(首 token 约 800 ms)。 | 同上 |
| ⚡ 自动混合模式 | 自动路由 | 默认走本地的 Gemma 4。当复杂度分类器检测到多步推理关键词(“解释”、“比较”、“写代码”)时,会透明地把请求升级到 Gemini Flash。 | 系统自动路由 |
当 Auto-Hybrid Mode 将问题升级至云端时,机器人的指示灯会暂时从 🟢 常亮绿色 变为 🟡 常亮金色,并持续整个响应过程,随后恢复绿色——这样你一眼就能看出是哪个大脑在回答。
2. 硬件与触觉机械结构:LEGO 遇上 Pirate Audio
我们希望 DinoDesk AI 摸起来像一件实体玩具,而不是一台冷冰冰的智能音箱。我们没有用 3D 打印一个封闭的塑料外壳,而是用 基础 LEGO 积木和 Technic 杠杆机构 搭出机身,这样谁都能自己改装或维修。
核心物料清单(BOM)
- 主控: Raspberry Pi + 32GB MicroSD
- 显示与音频扩展板: Pimoroni Pirate Audio Speaker(1.3" 240×240 ST7789 IPS LCD + I2S 1W 扬声器 + 4 个轻触按键)
- 红色按钮: 一个迷你按键开关,按下时那声清脆的咔哒声很解压,用来开始或停止语音采集
- 音频输入: 紧凑型 USB Mini Microphone
- 运动系统: 驱动颈部转动和尾巴摇摆的电机
在搭建完整机身之前,我先用 Raspberry Pi 和一套简单的 LEGO 验证了逻辑。

物理按键控制
即便有语音和传感器触发,专用硬件按键带来的即时物理控制依然很舒服:
- Button A(GPIO 5)— 取消 / 静音: 立即停止当前响应流,关闭音频,让机器人回到
Idle。 - Button B(GPIO 6)— 回中: 把所有舵机复位到中位,不打断当前状态。
- Button X(GPIO 16)— 表情与引擎切换: 单击手动循环切换面部表情;双击切换 Local ↔ Cloud Mode。
- Button Y(GPIO 24)— 尾巴测试与音量: 短按触发一次摇尾动作,用来检查机械对齐;长按 2 秒循环切换提示音音量(
Low → Medium → High → Mute)。
3. 让恐龙活起来:5 状态有限状态机
陪伴机器人只有眼睛、声音和身体一起动起来,才让人觉得它是活的。我们设计了一个 5 阶段的有限状态机(FSM),用来协调 240×240 LCD 的眼睛表情、8-bit 提示音和电机动作:
┌──────────┐ button ┌───────────┐ release ┌──────────┐ stream ┌──────────┐
│ Sleeping │──────────> │ Idle │────────────>│Listening │─────────> │ Thinking │
└──────────┘ (wake) └───────────┘ (trigger) └──────────┘ (send) └──────────┘
^ │
│ ┌──────────┐ │
└──────────────│ Speaking │<───────────────────────┘
(done) └──────────┘ (tokens arrive)
| 状态 | 进入条件 | Pirate Audio LCD 表情 | 8-bit 音效反馈 | 电机动作(脖子 / 尾巴) |
|---|---|---|---|---|
| 1. 睡眠 | 3 分钟无操作,或房间变暗 | (- _ -)闭眼 + zzz | 静音(可选轻微鼾声) | 电机放松;头略微低垂 |
| 2. 待机 | 默认待机 | (• •)自主眨眼 | 偶尔的唤醒/眨眼提示音 | 头部回正;脖子缓慢摆动 |
| 3. 聆听 | 按下按钮或传感器触发 | (O O)眼睛睁大发亮 | “Beep-Boop!” 上扬音 | 头部朝用户倾斜 15° |
| 4. 思考 | 音频已发送;路由器推理中 | (º º)瞳孔旋转 + 模式徽标 | 不规则的运算滴答声(tick-teek-poh) | 脖子缓慢左右摆动 |
| 5. 说话 | 接收 SSE token 流 | 表情丰富的眨眼 + 滚动字幕 | 每个 token 一声 8-bit 打字机提示音 | 尾巴随文本长度同步摆动 |
做 DinoDesk AI 的过程让我们意识到,AI 不必被困在浏览器标签页或云端数据中心里。当你给 Gemma 4 这样的开放模型配上一对像素眼睛、一副 8-bit 嗓子、一条会扭的 LEGO 尾巴,还能在任务吃紧时调用 Gemini,你的桌面一下子就热闹多了。🦖✨
它还在开发中,离完善还有距离,但很快我会带着完整实现的语音对话功能回来!在那之前,请先享受每次按下按钮时那些有趣的 8-bit 音效。Beep-Boop!
在这里克隆仓库:https://github.com/google-gemma/dinodesk-ai-companion/
也欢迎留言说说你打算做点什么。