基于Arduino与3D打印的传送门人格核心机器人制作全攻略
1. 项目概述与核心思路
如果你和我一样,既是《传送门2》的忠实粉丝,又对机器人制作和嵌入式开发充满热情,那么这个项目绝对会让你兴奋不已。我们这次要做的,是一个能真正动起来的“人格核心”机器人。在游戏里,这些核心——无论是话痨的Wheatley、刻板的GLaDOS,还是其他性格各异的AI——都以其标志性的球形外观和灵动的“眼球”表情深入人心。把它们从虚拟世界带到现实,看着它在你面前转动眼球、眨动眼皮,那种成就感远超组装一个普通的静态模型。
这个项目的核心目标,是打造一个高度还原、可交互的实体机器人。它不仅仅是一个外壳,更要具备灵魂。为了实现这一点,我选择了以 Arduino Uno 作为大脑, 六个微型伺服电机 作为肌肉, 3D打印部件 作为骨骼,再通过 蓝牙 与手机连接,实现无线控制。手机屏幕则扮演了核心的“眼球”和“瞳孔”,显示动态图像甚至播放语音,让交互体验更加生动。整个制作过程,实际上是一次对机械结构设计、嵌入式系统编程和无线通信技术的综合实践。无论你是想深入学习Arduino多舵机协同控制,还是探索如何将3D打印模型转化为可动机构,这个项目都能提供一条清晰的路径。
2. 核心机械结构与3D打印要点
人格核心的机械结构是整个项目的基础,也是最容易出问题的环节。原设计者Cerb在Thingiverse上分享的关节式模型是一个绝佳的起点,但直接使用会遇到空间严重不足的问题,这也是我踩的第一个大坑。
2.1 模型选择与关键修改
我使用的原始模型是Cerb设计的“Articulated Wheatley Core”。这个模型本身已经具备了基础的球形外壳、内部支撑结构以及眼皮、眼球联动机构的预留位置,设计非常精妙。但是,它最初是为静态展示或极简内部结构设计的,当我们试图塞进一个Arduino Uno、一块面包板、六个舵机以及一堆线缆时,空间立刻变得捉襟见肘。
我的首要建议是: 务必进行放大处理 。我直接将模型整体缩放至 300% 。这个比例是经过多次试验得出的:200%空间依然紧张,400%则会让成品过于庞大,失去精巧感。放大后,你不仅获得了容纳电子元件的宝贵空间,更重要的是,为舵机驱动的传动机构(如齿轮、齿条)提供了充足的运动行程,能有效避免机构卡死。
除了整体缩放,还需要对模型进行一些“外科手术”式的修改:
- 内部支撑筋清理 :使用Tinkercad或Fusion 360等软件,仔细检查模型内部。原模型为了确保打印强度,内部有很多支撑网格和加强筋。你需要将这些非必要的内部结构 选择性删除或镂空 ,为电路板和舵机安装座腾出位置。
- 开孔与走线槽设计 :在后壳面板上,需要设计电源线、充电线的出口。在左右半球壳内部,可以设计一些细小的线槽或卡扣点,用于固定和规整F杜邦线,防止线缆缠绕到运动部件中。
- 舵机安装座加固 :原模型的舵机安装点可能比较薄弱。我建议在打印后,用 环氧树脂胶 或 CA胶加爽身粉(制作补土) 对关键受力点进行局部加固,特别是负责眼球上下、左右转动的舵机安装座。
2.2 打印策略与材料选择
打印质量直接决定了机构的流畅度和最终外观。以下是我的经验总结:
打印机与材料 :我使用的是创想三维Ender 3,这是一台非常普及的FDM打印机,完全够用。材料上,主体外壳需要约2公斤的 白色PLA ,这是最经济、易打印的选择。如果你希望核心有游戏中的金属质感,可以后期喷涂金属漆。另备约500克 黑色PLA ,用于打印齿轮、齿条等内部传动件。黑色部件即使有磨损也不显眼,且PLA材质自身有一定的润滑性。
核心打印参数与顺序 :
- 外壳部分(左/右半球) :层高0.2mm,壁厚2.4mm(3圈), 填充率建议25%-30% 。我最初用20%填充,发现壳体在受力点(如手柄安装处)强度略有不足。提高填充率能增加整体刚性。打印时务必使用 支撑材料 ,特别是球体内侧和面板的复杂曲面部分。支撑结构需要仔细拆除并打磨。
- 传动机构部件(舵机摇臂、齿轮、齿条) :这是受力核心,必须坚固。层高0.16mm(以提高精度),壁厚3.2mm(4圈), 填充率必须提高到60%以上 。我第一批齿轮用30%填充打印,在测试时直接扫齿(齿轮牙被打磨平)了。高填充能极大增加零件的抗剪切强度。
- 打印顺序建议 :先打印 后盖板、所有传动部件(齿轮、齿条、舵机座) 。这样,在漫长的外壳打印过程中(每个半球可能需要20小时以上),你可以同步进行传动机构的组装测试和电子部分的焊接调试,极大提升效率。
后处理是关键 :
- 打磨 :所有结合面、轴孔都需要仔细打磨。特别是齿轮的齿牙,用细砂纸(600目以上)轻轻打磨掉毛刺,能显著提升传动顺滑度并降低噪音。
- 试装配 :打印完每个关键部件后,立即进行试装配。用手转动齿轮,检查是否有干涉;将舵机装入舵机座,检查是否匹配。早期发现问题,可以通过扩孔、打磨等方式微调,避免全部打印完成后才发现无法组装。
注意 :3D打印的部件存在一定的收缩和变形误差。设计时要在运动副(如轴和孔)之间预留0.2-0.3mm的间隙。如果打印后发现过紧,可以使用手钻或锉刀进行精密修整。
3. 电子系统设计与电路搭建
电子系统是机器人的神经中枢,需要稳定、整洁且易于调试。我们的目标是实现6个舵机的独立控制,并通过蓝牙接收指令。
3.1 元器件清单与选型考量
除了项目正文中提到的,这里补充一些关键细节和备选方案:
- 主控板:Arduino Uno R3 :选择Uno是因为其接口丰富,有6个独立的PWM引脚可直连舵机,且社区资源庞大。如果追求极致紧凑, Arduino Nano 是更优选择,但需要一定的焊接技巧来制作定制PCB或使用转接板。
- 舵机:SG90 / MG90S 微型舵机 :共需6个。SG90经济实惠,但扭矩较小(1.8kg/cm); 强烈推荐使用金属齿轮的MG90S ,扭矩更大(2.5kg/cm),且更耐用,能有效应对机构可能产生的卡顿阻力。价格相差不大,但可靠性提升明显。
- 蓝牙模块:HC-06 :这是最经典的Arduino蓝牙从机模块。注意区分HC-05(主从一体)和HC-06(仅从机)。我们只需要从机模式接收手机指令。务必购买 带底板和电平转换 的版本,可直接连接Arduino的5V和RX/TX引脚。
- 电源系统 :这是最容易被忽视却至关重要的部分。6个舵机同时动作时,电流峰值可能超过2A。 绝对禁止仅用电脑USB口或一个简单的9V电池为整个系统供电 ,这会导致电压骤降,Arduino重启,舵机乱转。
- 方案一(原作者方案):外置USB电源 。使用一个输出能力 5V/2.4A以上 的多口USB充电宝。从充电宝引出USB线,剪开后接一个 DC2.1母座 到核心内部,再通过一个 LM2596等降压模块 (可调,设为5V)给Arduino和舵机供电。充电宝可放在口袋。
- 方案二(进阶推荐):内置锂电池 。使用一块 7.4V 2S锂聚合物电池 ,搭配一个 5V/3A的降压模块 给舵机和Arduino供电。同时,电池电压(7.4V)可直接接入Arduino的Vin引脚(需通过一个开关)。这样一体化程度更高,��需要处理电池充电和安全问题。
- 其他 :迷你面包板、大量公对公/公对母杜邦线、开关、热熔胶枪、扎带。
3.2 电路连接详解与布局技巧
电路原理并不复杂,但实际搭建时的布局决定了稳定性和可维护性。
连接示意图(文字描述) :
- 电源总线 :在面包板上建立两条垂直的总线:一条接 5V ,一条接 GND 。所有元件的正负极都就近接入这两条总线。
- Arduino供电 :外接5V电源的正极接Arduino的
5V引脚(注意:不是Vin),负极接GND。如果使用7.4V电池,则正极接Vin,负极接GND。 - 舵机连接 :6个舵机的 红线(正极) 接5V总线, 棕线(负极) 接GND总线, 橙线(信号线) 分别接Arduino的数字引脚 9, 10, 11, 3, 5, 6 (这些引脚都支持PWM)。
- 蓝牙模块连接 :HC-06的
VCC接5V,GND接GND,TXD接Arduino的RX(引脚0),RXD接Arduino的TX(引脚1)。 注意 :上传代码时,需暂时断开HC-06的TXD/RXD,否则会与串口通信冲突。
内部布局与安装心得 :
- 先规划,后固定 :在正式安装前,用纸板剪出Arduino和面包板的大小,在球壳内模拟摆放,找到最合理的重心位置,确保核心能平稳放置。
- 分层布置 :最底层(靠近后盖)固定面包板,中间层用热熔胶或尼龙柱固定Arduino,最上层布置舵机。电源模块和线束尽量放在侧面空腔。
- 线束管理 :这是保持内部整洁、防止干涉的灵魂。使用 细扎带 或 线缆缠绕管 将同一方向的舵机线捆在一起。过长的线要折叠并用胶带固定,绝不能任由其散落。
- 防干扰措施 :舵机电机在启停时会产生电火花噪声,可能干扰蓝牙或Arduino。可以在每个舵机的电源正负极之间,就近焊接一个 10uF-100uF的电解电容 ,能有效平滑电流,减少干扰。
4. 软件编程与蓝牙控制逻辑
编程部分是将硬件赋予生命的关键。核心任务有两个:一是精确控制6个舵机协同运动,模拟眼球的各种动作;二是通过蓝牙串口接收指令,并解析执行。
4.1 Arduino舵机控制程序解析
Arduino IDE自带 Servo.h 库,最多可控制12个舵机,但我们只需要6个。程序的核心思路是:定义每个舵机对应的动作函数,并在主循环中监听串口指令,调用相应的函数。
#include <Servo.h>
// 定义6个舵机对象
Servo servoX; // 眼球左右转动
Servo servoY; // 眼球上下转动
Servo servoRotateL; // 整体左旋转
Servo servoRotateR; // 整体右旋转
Servo servoEyelidL; // 左眼皮
Servo servoEyelidR; // 右眼皮
// 定义每个舵机的初始位置(中位)和极限位置
// 这些值需要根据你的实际机械安装进行校准!
int posX_center = 90;
int posX_left = 60;
int posX_right = 120;
int posY_center = 90;
int posY_up = 70;
int posY_down = 110;
int posRotate_center = 90;
int posRotate_left = 60;
int posRotate_right = 120;
int posEyelid_open = 180; // 眼皮舵机角度,具体取决于安装方式
int posEyelid_close = 90;
void setup() {
Serial.begin(9600); // 初始化串口通信,与HC-06匹配
// 将舵机对象绑定到具体引脚
servoX.attach(9);
servoY.attach(10);
servoRotateL.attach(11);
servoRotateR.attach(3);
servoEyelidL.attach(5);
servoEyelidR.attach(6);
// 初始化所有舵机到中心/默认位置
centerAll();
delay(1000);
}
void loop() {
if (Serial.available() > 0) {
char command = Serial.read(); // 读取一个字符指令
executeCommand(command);
}
}
void executeCommand(char cmd) {
switch(cmd) {
case 'C': centerAll(); break;
case 'L': lookLeft(); break;
case 'R': lookRight(); break;
case 'U': lookUp(); break;
case 'D': lookDown(); break;
case 'O': extendAll(); break; // “伸展所有活塞”,即眼球突出表情
case 'I': retractAll(); break; // 收回
case 'Q': rotateLeft(); break;
case 'q': unrotateLeft(); break; // 取消左旋
case 'E': rotateRight(); break;
case 'e': unrotateRight(); break;
case 'Y': openEyelids(); break;
case 'T': closeEyelids(); break;
// 可以添加更多自定义命令
}
}
// 示例函数:眼球向左看
void lookLeft() {
for (int pos = servoX.read(); pos >= posX_left; pos--) {
servoX.write(pos);
delay(15); // 控制运动速度,值越大越慢
}
}
// 示例函数:中心化所有舵机
void centerAll() {
servoX.write(posX_center);
servoY.write(posY_center);
servoRotateL.write(posRotate_center);
servoRotateR.write(posRotate_center);
// 眼皮可以保持半开或全开,根据喜好设定
servoEyelidL.write(posEyelid_open);
servoEyelidR.write(posEyelid_open);
}
关键校准步骤(决定成败) :
- 上传一个简单的测试程序,让每个舵机依次运动到0度、90度、180度。
- 机械零点校准 :手动安装舵机摇臂。先将舵机通过程序置于90度,然后 断电 ,将摇臂以垂直或水平(取决于你的设计)的位置安装到舵机输出轴上。这是所有角度计算的基准。
- 极限位置校准 :通过串口监视器发送角度值(如
servoX.write(60)),缓慢调整,观察机械结构。找到 不发生卡滞、且能达到最大运动范围 的左右/上下极限角度,记录下来,更新到程序中的posX_left等变量里。 切记不可让舵机长时间堵转(到达机械极限后仍在试图转动) ,这会迅速烧毁舵机。
4.2 手机端控制与交互设计
原作者提到了“Bluetooth Electronics”这款App。它是一个通用的蓝牙串口调试工具,可以自定义按钮发送特定字符。设置起来很简单:配对HC-06(默认密码1234或0000),在App里创建按钮,每个按钮关联一个字符命令(如‘L’、‘R’)。
更进阶的交互方案 : 如果你想让核心更“智能”,可以开发一个简单的Android App(使用MIT App Inventor或Android Studio)。这个App可以实现:
- 虚拟摇杆控制 :一个摇杆控制眼球上下左右,更加直观。
- 表情序列 :预设一组动作,如“好奇”(快速左右看)、“惊讶”(睁大眼睛后缩)、“困倦”(缓慢眨眼),一键触发。
- 语音播放 :点击按钮,通过手机扬声器播放游戏中人格核心的经典台词音效,实现声画同步。
手机作为“眼球”的优化 :
- 准备一张高分辨率的瞳孔/虹膜图片,背景为纯黑。
- 使用“屏幕常亮”类App防止手机锁屏。
- 将屏幕亮度调到最高,并在图片查看器中全屏显示。
- 可以考虑制作一个简单的网页,用HTML5 Canvas画一个动态的、会轻微缩放或移动的瞳孔,增加生动感。
5. 总装、涂装与调试实录
当所有部件准备就绪,最后的组装是见证奇迹的时刻,也是最需要耐心的环节。
5.1 机械总装步骤
- 安装内部骨架 :首先,将X轴滑轨(负责眼球左右转动)用热熔胶或环氧树脂胶固定在左、右半球壳内部设计好的卡槽内。确保滑轨平行且运动顺畅。
- 固定Y轴与后盖 :将Y轴机构(负责眼球上下转动)粘在右半球壳的“赤道”位置。然后将后盖板对准位置,用 电钻配合小钻头 钻出两个导孔,再用 细长的自攻螺丝 从外部将其紧固在球壳上。后盖板是所有内部机构的基准面,必须牢固。
- 安装传动机构 :按照设计图,将6个舵机通过打印的舵机座安装到后盖板内部的相应位置。然后连接舵机摇臂、齿轮和齿条。 这里需要反复调试 :用手转动齿轮,检查眼皮开合是否顺滑,有无错齿;检查眼球连杆机构是否在X/Y轴滑轨上自由移动,无任何干涉点。在关键转动关节处可以涂抹少量 白色润滑脂 。
- 安装手机支架与前面板 :将手机支架(固定手机用的结构)与眼球连杆机构连接。然后将前面板(带眼窗的盖板)对准手机支架,钻四个导孔,用螺丝固定。确保手机屏幕正好位于眼窗中央。
- 合壳与最终接线 :将手机放入支架,运行一个纯白色的图片以方便观察。小心地将左右半球壳合拢,透过眼窗观察,微调手机位置,确保“眼球”居中。确认无误后,将两半壳体扣紧,最后拧上顶部和底部的手柄。所有线缆应通过后盖板的开口引出。
5.2 旧化涂装技巧
游戏中的核心充满了岁月感和工业废土风格,旧化涂装能极大提升质感,并能巧妙掩盖打印层纹和结合缝。
- 底色处理 :如果使用白色PLA打印,可以跳过这一步。如果想改色,先整体喷涂一层灰色或浅金属色作为底漆。
- 渗线洗涂 :这是关键步骤。使用 黑色或深棕色丙烯颜料 ,加大量水稀释成“墨水”状。用旧画笔将颜料涂满模型表面,特别是凹槽、缝隙、螺栓细节处。趁颜料未干,用 蘸湿并拧干的棉布或棉签 ,快速擦去平坦表面的颜料,只让颜料留在凹处。这能瞬间凸显所有细节,营造阴影和污渍感。
- 干扫提亮 :等待渗线颜料完全干透(至少24小时)。用一支平头干画笔,蘸取极少量的 银色或浅灰色丙烯颜料 ,在纸巾上反复擦拭直到几乎看不出颜色。然后以极轻的力度,快速扫过模型的边缘、凸起和高点。这能模拟金属磨损掉漆的质感。
- 粉彩修饰 :使用 棕色、土黄色等模型专用粉彩 ,用刀刮下粉末,用软毛刷蘸取,轻轻弹刷在模型下半部、缝隙周围,模拟灰尘和泥土堆积的效果。完成后,可以喷一层 消光保护漆 固定所有旧化效果。
5.3 系统联调与问题排查
组装完成后,接通电源,打开手机蓝牙连接,开始最终调试。
常见问题与解决方案速查表 :
| 问题现象 | 可能原因 | 排查与解决步骤 |
|---|---|---|
| 蓝牙连接不上 | 1. HC-06未供电 2. 波特率不匹配 3. 配对密码错误 |
1. 检查VCC/GND连接,用串口监视器看Arduino是否正常。 2. 确保手机App和Arduino代码的 Serial.begin() 波特率一致(常用9600)。 3. 尝试默认密码“1234”或“0000”。 |
| 舵机不动作或乱转 | 1. 电源功率不足 2. 信号线接触不良 3. 舵机中位未校准 |
1. 首要怀疑对象! 用万用表测量舵机动作时5V总线电压,若低于4.8V,必须换用更大电流的电源。 2. 检查信号线是否插牢,尝试更换引脚测试。 3. 重新进行舵机中位校准,确保机械安装零点正确。 |
| 某个方向运动卡顿 | 1. 机械干涉 2. 舵机扭矩不足 3. 齿轮啮合过紧 |
1. 断电,手动推动机构,找到摩擦点,进行打磨或调整。 2. 更换为扭矩更大的金属齿轮舵机(MG90S)。 3. 轻微调整齿轮间距离,确保有微小间隙。 |
| 动作不同步或不到位 | 1. 程序中的延时( delay )参数不当 2. 舵机响应速度有差异 3. 结构存在虚位 |
1. 调整动作函数中的 delay 值,使运动速度看起来协调自然。 2. 购买同一品牌批次的舵机,或单独为每个舵机微调极限角度值。 3. 在连杆接头处增加垫片或使用可调连杆。 |
| 合壳后机构被压迫 | 1. 内部线缆或元件过高 2. 壳体打印变形 |
1. 重新整理线缆,确保所有元件在合壳线以下。 2. 检查球壳是否圆润,如有变形可用热风枪局部加热矫正。 |
最终测试流程 :
- 发送‘C’命令,让所有舵机回中,确认眼球居中,眼皮处于预定状态。
- 依次测试‘L’、‘R’、‘U’、‘D’,观察眼球转动是否平滑、极限位置是否合理。
- 测试‘Y’、‘T’,观察眼皮开合是否完全,有无刮擦手机屏幕。
- 测试‘O’、‘I’(伸展/收回)和‘Q’、‘E’(旋转),观察复合动作是否顺畅。
- 进行压力测试:快速随机发送一系列指令,观察系统是否稳定,电源电压是否保持平稳。
当你的核心机器人能流畅地跟随指令转动眼球、眨动眼睛,甚至做出一些俏皮的表情时,之前所有的努力都值了。这个项目最难的不是某一步,而是机械、电子、软件三者之间的协同与妥协。每一次调试,都是对耐心和解决问题能力的考验。我强烈建议你在每个阶段都拍照记录,特别是内部走线和机械安装,这对后续排查问题和进行版本迭代至关重要。想象一下,当你拿着这个自己制作、会动会“看”的人格核心,它不再只是游戏里的一个形象,而是凝结了你创造力与工程能力的一个伙伴。
更多推荐


所有评论(0)