基于Arduino与3D打印的BB-8球形机器人制作全攻略 1. 项目概述从电影到现实的BB-8机器人如果你和我一样是个《星球大战》迷同时又对动手制作机器人充满热情那么把电影里的BB-8搬到自家工作台上绝对是个让人兴奋不已的项目。这个项目不仅仅是一个简单的遥控玩具它融合了机械结构设计、3D打印制造、电子电路搭建和嵌入式编程控制是一个典型的跨学科创客实践。我最初接触这个项目是把它作为一个课程作业来完成的但整个制作过程带来的乐趣和挑战让它最终变成了一个让我投入大量心血的个人爱好项目。这个基于Arduino的BB-8遥控机器人的核心目标是制作一个1:1比例、能够通过遥控器灵活运动的BB-8复制品。它需要解决几个关键问题如何让一个球形身体稳定地滚动前进如何让头部既能独立转动又能与身体保持磁力连接如何实现稳定可靠的无线遥控整个系统可以拆解为三大模块由3D打印件构成的机械骨架、以Arduino为核心的控制系统以及负责动力输出的电机与驱动模块。无论你是想学习Arduino与电机控制的实战应用还是想深入了解3D打印如何从数字模型变为实体零件亦或是单纯想拥有一个独一无二的星战伙伴这个项目都能为你提供一条清晰的路径。接下来我将把我从设计、打印、组装到调试的全过程经验毫无保留地分享给你。2. 核心设计思路与方案选型制作一个能动的球形机器人听起来很酷但第一个拦路虎就是它的运动机制。BB-8在电影里是靠内部的“悬浮”重物来实现球体滚动的这在工程上称为“动量轮”或“倒立摆”原理。简单来说就是机器人的内部有一个可以高速旋转的重块电机配重当这个重块转动时会产生角动量为了抵消这个动量机器人的外壳就会向相反方向滚动。这和我们用手快速转动自行车轮子车把会跟着扭动是一个道理。2.1 驱动方案的选择为什么是双电机差分驱动对于这个项目我放弃了在球体内部安装复杂动量轮机构的方案。虽然那样更接近电影设定但控制算法极其复杂涉及到姿态传感器如陀螺仪、加速度计和精密的PID控制对新手来说门槛太高且稳定性难以保证。经过权衡我选择了更务实、更可靠的“双电机差分驱动”方案。这个方案的思路是将BB-8的球形外壳视为一个“笼子”在这个笼子内部我们搭建一个坚固的、承载所有电子设备的平台。在这个平台底部安装两个独立的驱动轮这两个轮子直接与球壳的内壁接触。通过控制两个轮子的转速和方向就能实现机器人的前进、后退、左转和右转。这就像仓鼠在它的滚轮里跑动仓鼠内部平台向前跑滚轮球壳就向后转看起来就是滚轮在前进。选择这个方案的理由非常充分控制简单逻辑清晰。左轮快、右轮慢机器人就右转两轮同速同向就直线运动。直接用Arduino的PWM信号控制电机速度即可无需复杂的姿态解算。稳定性高内部平台的重心很低电池、Arduino板等都集中在底部加上两个驱动轮提供的支撑使得整个系统在静止和运动时都非常稳定不易翻倒。易于实现所需的零部件都是标准件直流减速电机、电机驱动板电路和代码都有成熟的库和案例可以参考极大降低了实现难度。头部驱动独立BB-8的头部需要能独立旋转以表达“情绪”。这部分我使用了一个标准的微型舵机伺服电机来实现。舵机通过一根连杆与头部连接控制其左右摆动。而头部与身体之间的磁力连接则用了多颗强磁铁如钕铁硼磁铁来实现既保证了头部能跟随身体滚动又允许它在需要时被舵机驱动做出相对运动。2.2 通信与控制架构一对一的无线遥控为了让BB-8动起来我们需要一个遥控器。我选择了基于nRF24L01 2.4GHz无线模块的方案。这是一个非常经典且性价比极高的无线数传模块通信距离在开阔地带可达百米足够室内外玩耍。整个系统采用“一发一收”的架构发射端遥控器由另一个Arduino Nano控制连接两个摇杆分别控制前进/后退和转向以及必要的按键。它负责读取你的操控指令然后通过nRF24L01模块发送出去。接收端机器人本体主控Arduino我用了Arduino Mega因为引脚多负责接收无线信号解析出速度和控制命令然后生成相应的PWM信号给电机驱动板从而驱动两个主轮电机和头部的舵机。为什么不用蓝牙或者Wi-FinRF24L01在点对点、低延迟、不间断的数据流传输上更有优势且功耗相对较低非常适合这种实时性要求高的遥控应用。2.3 电源系统设计安全第一合理分配电源是机器人的心脏设计不当轻则功能异常重则烧毁元件。我的BB-8内部空间紧凑但耗电部件不少两个大扭矩的直流减速电机工作电压12V、多个舵机工作电压5V或6V、Arduino主板5V和无线模块3.3V。我的电源方案如下主电源一块大容量的3S锂聚合物电池标称电压11.1V满电12.6V。它能提供电机启动时所需的大电流。电压转换电机直接由电池通过电机驱动板供电。关键点舵机的标准电压通常是5V或6V直接接12V电池瞬间就会烧毁。因此必须使用一个DC-DC降压模块Buck Converter将电池的12V降至舵机安全的工作电压如6V。我强烈建议使用可调降压模块方便测试和调整。Arduino Mega可以通过其VIN引脚直接接收7-12V的电压内部稳压器会将其降到5V供自身和板上其他元件如nRF24L01需通过3.3V引脚供电使用。但要注意如果通过USB供电则不要同时连接VIN。重要提示务必在电源线上安装一个开关并在电池输出端加入一个保险丝例如10A。在调试阶段电机堵转或短路时有发生保险丝能有效保护电池和电路。永远不要在通电状态下插拔电机或舵机线。3. 机械结构制作3D打印实战全解析所有的设计最终都要落实到实体结构上。3D打印是实现个性化、复杂结构最便捷的工具。我的BB-8身体和内部框架全部采用3D打印制作。3.1 模型准备与切片设置首先你需要找到或自己设计BB-8的3D模型。网上有很多开源资源。模型通常包含几十个零件球壳由多个面板拼接而成内部有主框架、电机座、电池仓、头部连接件等。打印材料选择我强烈推荐使用ABS或PETG材料而不是最常见的PLA。PLA虽然容易打印但材质脆、不耐冲击、不耐温夏天车内可能变形不适合做经常运动碰撞的机器人外壳。ABS强度高、韧性好、耐温但打印时有气味且需要打印机有封闭舱室以防止翘边。PETG综合了PLA的好打性和ABS的强度韧性是我的折中推荐。它几乎没有气味层间结合力强成品非常坚固。切片参数建议以PETG为例层高0.2mm。在强度和打印时间间取得平衡。壁厚至少3层通常1.2mm以上顶部/底部厚度至少5层。确保结构坚固。填充密度对于承重的主框架、电机座建议25%-30%的网格填充。对于非承重的外壳面板15%-20%即可以减轻重量。支撑对于球壳内部、框架内部的悬空部分必须生成支撑。建议使用“树状支撑”它更省材料且容易拆除。打印温度喷嘴230-245°C热床75-85°C。具体需根据你的耗材品牌微调。3.2 打印与后处理要点打印是个需要耐心的过程一个完整的BB-8零件全部打完可能需要上百个小时。顺序规划先打印小的、核心的结构件如电机座、轴承座。用它们来测试装配尺寸是否准确。确认无误后再打印耗时的大件如球壳面板。球壳组装技巧BB-8的球体由多个面板拼接。为了便于内部维护我将其设计为上下两个半球。打印时确保面板接缝处平整。组装时可以从内部使用CA胶快干胶配合加速剂进行粘合速度快且牢固。也可以在接缝处设计卡扣或预留螺丝孔用螺丝从内部紧固这样更利于拆卸。内部框架组装这是机器人的“骨架”。按照设计图纸用大量的M3螺丝、螺母和垫片进行组装。在电机与电机座的连接处、轴承座等受力点一定要上紧必要时可以在螺丝上点一滴螺丝胶蓝色可拆卸型防止长期震动后松动。驱动轮处理驱动轮直接与球壳内壁接触需要足够的摩擦力。我推荐在打印好的驱动轮外圈套上一圈硅胶管或粘贴摩擦胶带如电工胶带。这能极大改善驱动效率减少打滑尤其是在光滑的打印表面。4. 电子系统搭建与电路连接当所有机械零件准备就绪就进入了电子部分。清晰的电路连接是项目成功的一半。4.1 核心元件清单与作用除了3D打印件你还需要准备以下电子和五金件类别元件名称规格/型号建议作用主控Arduino开发板Arduino Mega 2560接收端主控引脚多便于扩展。Arduino开发板Arduino Nano发射端遥控器主控小巧。无线无线收发模块nRF24L01 带PA/LNA2.4GHz通信带功放和低噪放版本距离更远。电机驱动电机驱动板L298N或TB6612FNG双H桥模块驱动两个直流减速电机。TB6612效率更高发热小。执行器直流减速电机12V转速100-200RPM带编码器更佳提供机器人滚动的动力。微型舵机SG90或MG90S扭矩1.5kg/cm以上驱动BB-8头部转动。电源锂电池3S Li-Po容量2200mAh以上主电源。降压模块DC-DC可调降压模块如LM2596将12V降至6V给舵机供电。电压表模块0-30V DC数字电压表监控电池电压防止过放。输入摇杆模块双轴模拟摇杆游戏手柄常用遥控器输入设备。连接杜邦线公对公、公对母、母对母若干电路连接。螺丝/螺母M3规格各种长度固定电路板、电机等。其他开关船型开关或拨动开关电源总开关。磁铁钕铁硼强磁铁直径6-10mm吸附头部与身体。4.2 电路连接详解这里给出接收端机器人本体的核心接线示意。接线时务必断开电池1. 电源分配部分3S电池正极 → 电源开关 → 电机驱动板的“12V输入”端子。电机驱动板的“12V输入-”端子接电池负极。从电机驱动板的“5V输出”端子如果它有的话或从降压模块的输出端引出5V和GND为Arduino Mega的VIN和GND供电注意如果使用驱动板的5V要确认其输出电流足够通常L298N的5V输出仅供逻辑电路电流不足。更稳妥的做法是使用一个独立的5V降压模块为Arduino供电。将电池的12V接入可调降压模块的输入调节输出至6V然后接给舵机供电正极和负极。2. 电机驱动部分以L298N为例ENA- Arduino PWM引脚如Pin 5IN1- Arduino数字引脚如Pin 6IN2- Arduino数字引脚如Pin 7IN3- Arduino数字引脚如Pin 8IN4- Arduino数字引脚如Pin 9ENB- Arduino PWM引脚如Pin 10电机A的两根线接OUT1和OUT2。电机B的两根线接OUT3和OUT4。3. nRF24L01模块连接VCC- Arduino的3.3V引脚严禁接5VGND-GNDCE- Pin 7CSN- Pin 8SCK- Pin 13MOSI- Pin 11MISO- Pin 124. 舵机连接信号线通常是黄色或橙色 - Arduino的任意PWM引脚如Pin 3。正极红色 - 降压模块输出的6V正极。负极棕色或黑色 - 6V的GND。务必确保此GND与Arduino的GND相连形成共地。发射端遥控器接线相对简单Arduino Nano通过USB或一个9V电池供电。两个摇杆的VRx和VRy引脚分别接Nano的模拟输入引脚A0-A3。nRF24L01的接法与接收端类似连接到Nano的对应数字引脚。布线经验在机器人内部使用尼龙扎带和热熔胶枪将线材和电路板妥善固定避免在运动过程中与轮子、传动部件发生缠绕或拉扯。对于电机和舵机这类大电流线路可以考虑使用更粗的硅胶线。5. 代码编写与核心逻辑剖析代码是机器人的大脑。我将代码分为发射端遥控器和接收端机器人两部分。这里使用Arduino IDE进行开发并需要安装RF24库来驱动无线模块。5.1 发射端代码读取摇杆并发送数据发射端的核心任务是读取两个摇杆的模拟值将其映射为电机速度指令和舵机角度指令然后打包通过无线模块发送出去。// Transmitter.ino #include SPI.h #include nRF24L01.h #include RF24.h // 定义摇杆引脚 #define JOYSTICK1_X A0 // 控制前进后退 #define JOYSTICK1_Y A1 // 未使用或可用于控制头部上下 #define JOYSTICK2_X A2 // 控制转向 #define JOYSTICK2_Y A3 // 未使用 // 定义nRF24L01引脚 RF24 radio(7, 8); // CE, CSN // 定义一个结构体来打包要发送的数据确保两端一致 struct DataPackage { int leftMotorSpeed; // 左电机速度范围 -255 ~ 255 int rightMotorSpeed; // 右电机速度范围 -255 ~ 255 int headServoAngle; // 头部舵机角度范围 0 ~ 180 }; DataPackage data; const byte address[6] BB8TX; // 通信地址 void setup() { Serial.begin(9600); // 初始化无线模块 if (!radio.begin()) { Serial.println(Radio hardware not responding!); while (1); // 停住 } radio.openWritingPipe(address); radio.setPALevel(RF24_PA_LOW); // 设置功率级别可选 LOW, HIGH, MAX radio.stopListening(); // 设置为发射模式 } void loop() { // 1. 读取摇杆值 (0-1023) int joy1X analogRead(JOYSTICK1_X); int joy2X analogRead(JOYSTICK2_X); // 2. 映射为电机速度 (-255 ~ 255) // 假设摇杆中值在512左右将其映射到速度。 // 这里实现一个简单的“差速转向”一个摇杆控制前进后退另一个控制转向差量。 // 基础速度前进后退 int baseSpeed map(joy1X, 0, 1023, -255, 255); // 转向偏移量 int turnOffset map(joy2X, 0, 1023, -100, 100); // 转向强度 // 3. 计算左右轮速度 data.leftMotorSpeed constrain(baseSpeed turnOffset, -255, 255); data.rightMotorSpeed constrain(baseSpeed - turnOffset, -255, 255); // 4. 读取头部控制这里假设用一个按键或摇杆的按钮简化处理 // data.headServoAngle map(analogRead(somePin), 0, 1023, 0, 180); data.headServoAngle 90; // 暂时设为中位 // 5. 发送数据 bool report radio.write(data, sizeof(DataPackage)); // 可选在串口监视器查看发送的数据 Serial.print(L: ); Serial.print(data.leftMotorSpeed); Serial.print( R: ); Serial.print(data.rightMotorSpeed); Serial.print( H: ); Serial.println(data.headServoAngle); delay(20); // 控制发送频率约50Hz }5.2 接收端代码解析数据并驱动电机与舵机接收端不断监听无线信号收到数据包后解析出左右电机速度和舵机角度然后通过PWM控制电机驱动板并设置舵机角度。// Receiver.ino #include SPI.h #include nRF24L01.h #include RF24.h #include Servo.h // 定义电机控制引脚 (以L298N为例) #define MOTOR_LEFT_ENA 5 #define MOTOR_LEFT_IN1 6 #define MOTOR_LEFT_IN2 7 #define MOTOR_RIGHT_ENB 10 #define MOTOR_RIGHT_IN3 8 #define MOTOR_RIGHT_IN4 9 // 定义舵机引脚 #define HEAD_SERVO_PIN 3 RF24 radio(7, 8); // CE, CSN 引脚需与发射端对应 Servo headServo; // 创建舵机对象 // 接收数据结构体必须与发射端一致 struct DataPackage { int leftMotorSpeed; int rightMotorSpeed; int headServoAngle; }; DataPackage data; const byte address[6] BB8TX; // 必须与发射端地址相同 void setup() { Serial.begin(9600); // 初始化电机控制引脚为输出模式 pinMode(MOTOR_LEFT_ENA, OUTPUT); pinMode(MOTOR_LEFT_IN1, OUTPUT); pinMode(MOTOR_LEFT_IN2, OUTPUT); pinMode(MOTOR_RIGHT_ENB, OUTPUT); pinMode(MOTOR_RIGHT_IN3, OUTPUT); pinMode(MOTOR_RIGHT_IN4, OUTPUT); // 初始化舵机 headServo.attach(HEAD_SERVO_PIN); headServo.write(90); // 初始位置置中 // 初始化无线模块为接收模式 if (!radio.begin()) { Serial.println(Radio hardware not responding!); while (1); } radio.openReadingPipe(0, address); radio.setPALevel(RF24_PA_LOW); radio.startListening(); } void loop() { if (radio.available()) { radio.read(data, sizeof(DataPackage)); // 控制左电机 controlMotor(MOTOR_LEFT_ENA, MOTOR_LEFT_IN1, MOTOR_LEFT_IN2, data.leftMotorSpeed); // 控制右电机 controlMotor(MOTOR_RIGHT_ENB, MOTOR_RIGHT_IN3, MOTOR_RIGHT_IN4, data.rightMotorSpeed); // 控制头部舵机 headServo.write(data.headServoAngle); // 可选串口打印接收到的数据 Serial.print(Received - L: ); Serial.print(data.leftMotorSpeed); Serial.print( R: ); Serial.print(data.rightMotorSpeed); Serial.print( H: ); Serial.println(data.headServoAngle); } // 如果没有收到信号可以添加安全机制比如让电机停止 // else { // controlMotor(MOTOR_LEFT_ENA, MOTOR_LEFT_IN1, MOTOR_LEFT_IN2, 0); // controlMotor(MOTOR_RIGHT_ENB, MOTOR_RIGHT_IN3, MOTOR_RIGHT_IN4, 0); // } } // 一个通用的电机控制函数 // speed: -255 ~ 255负值代表反转 void controlMotor(int enPin, int in1Pin, int in2Pin, int speed) { speed constrain(speed, -255, 255); // 限制速度范围 if (speed 0) { // 正转 digitalWrite(in1Pin, HIGH); digitalWrite(in2Pin, LOW); analogWrite(enPin, abs(speed)); } else if (speed 0) { // 反转 digitalWrite(in1Pin, LOW); digitalWrite(in2Pin, HIGH); analogWrite(enPin, abs(speed)); } else { // 停止 digitalWrite(in1Pin, LOW); digitalWrite(in2Pin, LOW); analogWrite(enPin, 0); } }代码逻辑解析数据打包使用结构体一次性发送所有控制数据避免了分开发送可能带来的数据不同步问题。摇杆映射发射端将摇杆的模拟值0-1023映射到电机PWM值-255到255。这个映射关系可以根据你的摇杆中值位置和操控手感进行调整。差速转向通过baseSpeed ± turnOffset的方式计算左右轮速度是实现转向的核心。turnOffset为正时左轮加速右轮减速机器人向右转。电机控制函数controlMotor函数封装了H桥驱动逻辑根据正负速度值设置正确的方向引脚并用绝对值控制PWM速度代码复用性高。舵机控制Arduino的Servo库使得舵机控制变得非常简单只需write(angle)即可。6. 系统总装、调试与问题排查当机械、电路、代码都准备就绪就到了最激动人心也最考验耐心的总装调试阶段。6.1 分步组装与测试流程千万不要一次性把所有东西都塞进球壳里再通电测试。务必遵循“分步组装分步测试”的原则。裸板测试在不安装到框架上的情况下连接好接收端的所有电路Arduino、电机驱动板、无线模块、舵机但电机和舵机先不接负载轮子、头部。上传接收端代码用串口监视器查看是否能打印出接收到的数据。同时给发射端上电看接收端数据是否随摇杆变化。这一步确保无线通信和基本逻辑正常。电机空载测试接上两个驱动电机先不装轮子。通过遥控器控制听电机声音是否正常正反转是否符合预期。用手轻轻捏住电机轴感受其扭矩。框架静态组装将电机、Arduino主板、驱动板、电池等全部安装到3D打印的内部框架上并连接好所有线缆。此时仍然不封闭球壳。再次进行遥控测试观察电机带动轮子空转是否正常。装入球壳测试将组装好的内部框架小心地放入下半球壳。此时驱动轮应该与球壳内壁良好接触。用手推动机器人应该能感觉到电机有一定的阻力因为驱动轮摩擦内壁。进行低速遥控测试观察球壳是否能够按照指令滚动。这个阶段很可能遇到打滑问题。头部安装将舵机安装到位并通过连杆与头部连接。在头部和身体对应位置粘贴强磁铁注意极性要相互吸引。测试舵机转动是否顺畅头部是否能在磁力吸附下跟随身体运动又能在舵机驱动下做出相对转动。封闭球壳最后合上上半球壳并用螺丝或卡扣固定。进行完整的功能测试。6.2 常见问题与解决方案实录在调试过程中我遇到了几乎所有新手都会碰到的问题。这里列出一个速查表问题现象可能原因排查与解决方案机器人完全不动1. 电源未接通或开关损坏。2. 电池电量耗尽。3. 主控板未正确供电或程序未上传。1. 用万用表检查开关通断电池电压。2. 检查Arduino上的电源指示灯是否亮起。3. 重新上传代码检查串口监视器是否有接收数据输出。只有一边电机转动1. 另一侧电机接线松动或损坏。2. 对应电机驱动通道的引脚定义错误或损坏。3. 代码中该电机的控制信号未发送或映射错误。1. 交换左右电机的接线如果问题跟随电机走则是电机问题如果问题留在原通道则是驱动板或代码问题。2. 用analogWrite函数直接测试驱动板的每个PWM和方向引脚。3. 检查发射端摇杆映射和接收端数据解析代码。运动时严重打滑1. 驱动轮与球壳内壁摩擦力不足。2. 机器人整体重量太轻下压力不够。3. 电机扭矩不足带不动。1.立即处理在驱动轮上套硅胶管或贴摩擦胶带。2. 在内部框架底部合理位置增加配重如铅块。3. 更换扭矩更大的减速电机注意尺寸是否合适。运动不直线跑偏1. 左右电机存在个体差异空载转速不一致。2. 左右驱动轮与球壳的接触压力或摩擦力不同。3. 球壳不圆或内部框架不平衡。1. 在代码中为左右电机设置一个微调系数。例如如果总是右偏可以将右轮速度乘以0.95。2. 调整电机安装位置确保两轮对称且压力均匀。3. 检查3D打印件是否有变形重新调整框架水平。无线控制距离短或时断时续1. nRF24L01模块天线损坏或接触不良。2. 电源干扰。电机工作时产生大的电压波动影响模块。3. 周围2.4GHz信号干扰如Wi-Fi。1. 使用带外置天线的PA/LNA版本模块。2.极其重要为无线模块的VCC引脚并联一个100μF以上的电解电容并尽量靠近模块引脚以滤除电源噪声。3. 在代码中尝试切换不同的通信频道(radio.setChannel(110))。舵机抖动或不动作1. 供电不足。舵机启动瞬间电流很大。2. 信号线干扰。3. 机械结构卡死。1. 确保降压模块输出电流足够至少2A且电压稳定在6V。检查所有电源接头是否牢靠。2. 在舵机信号线附近并联一个0.1uF的瓷片电容到GND。3. 断开舵机连杆测试舵机空载是否正常。头部磁力连接不可靠容易掉1. 磁铁磁性不够强。2. 磁铁数量或布局不合理。3. 球壳表面曲率导致接触面小。1. 更换为N52等更高等级的钕铁硼磁铁。2. 采用“多颗小磁铁阵列”代替单颗大磁铁增加吸附点和容错。3. 在头部连接件上增加一个轻微的“万向节”结构使其能自适应球面。6.3 进阶优化与个人心得完成基础功能后你可以考虑以下优化让你的BB-8更智能、更酷炫增加声音与灯光在头部安装一个WS2812B RGB LED灯环配合一个MP3播放器模块如DFPlayer Mini和一个小喇叭。你可以编程让BB-8在运动时发出经典的“哔哔”声并用灯光表达状态如蓝色常亮待机红色闪烁表示低电量。姿态稳定算法如果你安装了陀螺仪如MPU6050可以尝试编写简单的姿态稳定算法。当机器人停在斜坡上时通过控制内部平台的角度使球体保持静止而不滚落。这是向电影原版“动量轮”控制迈进的一大步。编码器反馈与PID速度控制如果电机带了编码器可以实现闭环速度控制。使用PID算法让机器人的速度控制更精准响应更平滑减少因电池电压变化或负载不同导致的速度波动。手机APP遥控用蓝牙模块如HC-05/06替换nRF24L01并编写一个简单的手机APP可以用MIT App Inventor或Blynk实现手机触控遥控甚至加入重力感应控制。我个人最深刻的体会是耐心和迭代。几乎没有哪个复杂的创客项目能一次成功。我的第一个BB-8版本因为驱动轮打滑根本动不了第二个版本因为电源干扰无线信号时断时续。每一个问题的解决都建立在对原理更深入的理解和不断的尝试上。不要害怕失败把每一次调试都当作学习的机会。当你最终看到自己亲手制作的BB-8流畅地在地板上滚动、转头那种成就感是无与伦比的。这个项目教会我的远不止Arduino编程或3D打印更是一种系统性的工程思维和解决问题的能力。