ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用Arduino和红外测温打造全自动烤棉花糖机器人

用Arduino和红外测温打造全自动烤棉花糖机器人 这项目其实特别有意思一句话描述就是“把一根戳着棉花糖的签子放到火上去烤”。但一旦你打算让机器人来做这件事麻烦就来了怎么夹住签子、怎么把棉花糖送到火上方、怎么控制离火距离、怎么判断“烤好了”、怎么防止把机器人自己烧了。我花了一个周末把它们一个个解决掉最终做出来的这版 Robotic Smore Maker核心思路是“用固定机械臂 非接触测温 有限状态机”来模拟一个烧烤师傅的完整流程。这篇文章把从设计、选型、组装到代码调试的全部过程记录下来不光是晒成品更想让你少踩几个我已经踩过的坑。想复刻的话大概花几天时间、几百块材料费就能搞定哪怕你不想动手做看完这篇也能理解这类轻量级自动化设备的设计思路。1. 项目拆解一台烤棉花糖机器人到底在解决什么问题1.1 从烧烤师傅的流程倒推机器人职责先别急着碰硬件把自己当成一个正在烤棉花糖的人观察你的一整套动作。你取出一个棉花糖把它插到竹签或者金属签上走到火堆旁把签子伸出去让棉花糖悬在火焰上方。这时候你得控制高度离火太近十秒就烧成黑炭离火太远烤五分钟还是硬的。接着你会慢慢转动签子让棉花糖受热均匀表面从白色变成焦黄色甚至微微鼓起来这时候才算“好了”。你把手收回来把签子递给身边的人让他们自己做 Smore夹上饼干和巧克力。如果把这套流程拆给机器人实际上就是几个顺序任务抓取签子把签子水平举起来。把签子从“等待位置”移动到“火源上方”。在火源上方持续旋转签子同时监控棉花糖表面的温度。当温度达到某个范围时停止加热把签子收回到安全位置。等待人类取走成品然后循环执行。这个流程看起来简单但它其实覆盖了机械结构、运动控制、传感器数据读取、安全保护这四块核心内容。很多新手上来就想着用摄像头、神经网络识别棉花糖颜色那是把项目想复杂了。最稳的方案恰恰是回归烧烤师傅的本能“温度 时间 距离”。这三样东西不需要视觉也能控制得很好。所以我最终把机器人定位成“一个能完成规则运动的小型桌面设备”而不是“拥有通用智能的厨艺机器人”。这个定位非常重要它决定了所有后续技术选型的简洁程度。1.2 功能边界与技术选型总览明确了要做的事情接下来就得划定边界。我做这个项目的原始场景是室内桌面用一个小型酒精灯或者蜡烛作为热源。这意味着不存在大风环境机械结构不需要特别厚重的抗风设计。热源功率有限棉花糖表面温度上升不是瞬间完成传感器有足够的响应时间。桌面空间有限机械臂的工作半径控制在 40 厘米以内最合适。场景是半自动人来放棉花糖、取成品所以机器人可以不设计复杂的识别系统。基于这些边界我的选型思路是这样的模块选型理由控制器Arduino Nano便宜、生态成熟、GPIO 够用不需要跑操作系统舵机MG996R 金属齿轮舵机 × 3 SG90 小舵机 × 1成本低力矩足够能完成三维空间里的三个旋转轴动作温度传感器GY-906 红外测温模块非接触不用碰棉花糖不会污染食物热源便利店蜡烛铝壳类型安全可控火焰固定无明火外溢机械结构3D 打印零件 长竹签 金属夹爪轻量化打印成本低修改快输入按钮2 个触摸开关一个启动/停止一个强制回退这个组合整套材料成本大概在 300 元以内不含 3D 打印机的话而且每个模块都是单独可替换的。这对调试来说特别重要——哪个环节坏了直接换哪个不用重新焊一整块板子。2. 硬件方案机械结构、传感器与驱动的几个关键决定2.1 机械结构三轴旋转辅助而不是直角坐标最开始我考虑过做一个“龙门架式”结构就是 X、Y、Z 三个方向互相垂直用丝杆或者滑轨传动像普通 3D 打印机一样。这种结构的好处是控制简单每一步都是一个直线运动逻辑清晰。但缺点也很明显体积大、零件多、加工精度要求高对于一支烤棉花糖的签子来说严重杀鸡用牛刀。后来我换成了三轴旋转结构底座一个水平旋转轴相当于人的肩膀中间一个俯仰轴相当于上臂抬放签子上再叠加一个沿签子轴线的自转相当于手腕和手指搓动签子。这三个旋转轴不需要绝对精准的坐标换算只要保证末端能覆盖“火源上方”和“等待区”这两个关键位置其余路径怎么走都行。这是第一点经验做这类自动化改造能用旋转轴解决的就别用直线轴。旋转轴结构更紧凑、更便宜而且因为我们不需要精密插补运动所以舵机的角度控制完全够用。实际安装的时候我把底座舵机固定在一个直径 12 厘米的圆形底座上中间立一根 25 厘米长的铝合金立柱。俯仰舵机安装在立柱顶端负责控制整个前臂一根 30 厘米长的竹签套筒的抬升和下降。前臂末端装了一个夹爪夹爪里卡住金属签子。金属签子穿过夹爪处的轴承尾部接一个小的 SG90 舵机直接带动签子自转。3D 打印的零件包括底座、立柱连接件、舵机支架、夹爪外壳、传感器支架。所有 STL 文件我都是自己在建模软件里现画的没有用现成模型因为尺寸和舵机型号、签子粗细强相关。你要复刻的话建议先确定签子直径再反向设计夹爪内径否则夹不紧或插不进去都很折磨人。2.2 温度传感为什么坚决不用接触式探头棉花糖表面很软直接插一根热电偶进去不但破坏外观而且棉花糖黏在探头上旋转时会带动探头导致读数剧烈抖动。所以我选了 GY-906 红外测温模块它其实是一个小型非接触式温度传感器通过读取目标物体的红外辐射来推算表面温度。需要注意一个坑GY-906 默认的视场角是 90 度这个角度对于近距离测量来说太大了。如果你把传感器放在距离棉花糖 5 厘米的位置它测出来的不是棉花糖一个点的温度而是棉花糖加上后面背景比如墙壁、手指的平均温度。解决方法是让它离得更近距离压到 2~3 厘米左右或者给传感器加一个聚光罩。我实际处理的方式是在传感器前方套了一个小纸卷相当于把视场角物理缩小到大约 30 度。纸卷用黑色卡纸卷的外部包了一圈铝箔反射热辐射。这样测试下来在 3 厘米距离上读到的棉花糖温度和在接触式温度计上的读数误差控制在了正负 3 度以内对烤棉花糖来说已经完全够用。这里还有一个关键判断棉花糖最佳口感表面温度大约在 150 到 170 摄氏度之间。超过 180 度会开始冒烟甚至变黑低于 140 度表皮还是硬的。所以我的控制目标就是让表面温度进入 150~170 这个区间然后维持 10 秒钟让内部受热软化再自动回收。2.3 控制器与供电全部围绕稳定运行设计控制器上选了 Arduino Nano因为我只需要读取红外传感器、三个姿态舵机、一个小旋转舵机、两个按钮完全不需要联网也几乎不涉及多线程。Arduino 的 16MHz 主频在这个项目里性能绰绰有余。ESP32 有人也喜欢用但它的烧录和引脚布局对新手稍复杂不必要。供电问题是这类小项目翻车的高发区。舵机启动瞬间电流会冲得很高MG996R 在堵转状态下能跑到接近 1A。如果你直接用 Arduino 的 5V 引脚给舵机供电瞬间电压跌落会让 Arduino 复位表现就是机器人一动就重启。我的方案是单独用一个 5V 3A 的 DC-DC 降压模块从 12V 电源取电。这个降压模块的输出直接给四个舵机供电Arduino 用另外一路要么从 USB 口供电要么从降压模块的 5V 输出再串了一个二极管之后接入 VIN。这样即使舵机瞬间压降也不会影响控制器的逻辑部分。传感器和按钮直接由 Arduino 的 5V 供电因为它们电流消耗只有几毫安和舵机共电源反而容易受到干扰。3. 控制逻辑与大火候算法状态机是救星3.1 状态机划分从开始到成品一共七个状态如果你在代码里直接用循环叠加延时来控制整个流程很快会发现一个问题传感器数据读取、舵机动作、异常处理全部混在一起逻辑乱成一团改一个参数就影响全局。所以我用了状态机把整个烤制过程拆成七个状态IDLE待机机械臂停留在等待位置等待启动按钮。LOWER下探前臂从水平位置下压让棉花糖移动到火焰上方 3~5 厘米处。ROTATE_WAIT加热等待保持位置签子开始自转等待表面温度达到目标下限。HOLD_TEMP保持熟度一旦温度达到目标区间开始计时继续旋转 10 秒。RAISE回抽棉花糖离开热源前臂抬起到安全高度。RETURN归位机械臂旋转到等待位置停在人类方便拿取的高度。FAULT异常如果温度超过危险值、火焰消失、按钮强制停止进入此状态。每个状态只做自己那一件事状态之间通过条件触发跳转。比如LOWER状态的结束条件是前臂舵机到达指定角度然后跳转到ROTATE_WAITROTATE_WAIT的结束条件是温度超过 150 度跳转到HOLD_TEMP。这个设计的最大好处是当你发现“棉花糖烤糊了”你不需要重新梳理整个流程只需要单独检查HOLD_TEMP里的温度阈值和持续时间。想调焦一点改一个数字就行。想换成烤面包只要改目标温度区间和加热时间。3.2 温度曲线与“挡位式”决策很多人一听到“基于温度控制”就想到 PID 控制但在这种场景里PID 其实有点杀鸡用牛刀。棉花糖表面温度变化相对缓慢从室温到 160 度大概需要 30 到 60 秒火焰功率基本恒定系统惯性也不大。这种情况下一个简单阈值判断加上保持计时效果完全够用而且代码更容易维护。我实际用的是一个类似“挡位”的决策逻辑温度低于 100 度认为刚进入加热区继续等待。温度在 100~140 度说明表面开始升温签子保持旋转可以稍微将前臂降低 1 厘米靠近火焰。温度在 150~170 度进入理想区间计时开始一旦持续 10 秒就回抽。温度超过 185 度视为危险状态立即停止加热并抬臂同时蜂鸣器响。为什么不用 PID因为 PID 输出的是“控制量”比如加热功率或者离火距离。但我们的执行器是舵机改变前臂角度会让棉花糖位置发生跳变位置跳变又会改变热辐射强度反而引入系统性抖动。真正被人掌握的“火候”本身就是分档的近一点、远一点、转慢一点、转快一点、差不多了收回。所以挡位式调节更贴合物理系统。在温度采样上我做了滑动平均滤波。GY-906 的原始读数在火焰附近会有明显噪声单次读数抖动可以到正负 5 度。我每次取 20 次采样去掉最高和最低各 3 个然后求平均采样周期压到 200 毫秒一轮。这样温度曲线平滑很多也不会有“明明没烤好却瞬间跳转到 180 度”的误判。3.3 安全保护一个桌面机器人也要有三层保险做食物相关的东西安全问题再怎么强调都不为过。我的安全保护分成三层第一层是温度阈值保护。前面说的超过 185 度立即回抽这是最关键的一道防线。对应棉花糖可能因为火焰跳动、传感器遮挡而异常升温的场景。第二层是火焰监测。我用了一个非常便宜的火焰传感器模块装在火焰侧边。它本质上是一个光电二极管专门检测火焰发出的红外波段。如果在加热过程中火焰传感器连续 3 秒没有检测到火焰信号说明蜡烛熄灭了或者被风吹灭了这时候机器人应该停止旋转并抬臂避免持续对着已灭的火焰空烤。第三层是机械限位。我在底座旋转轴和俯仰轴上都装了微动开关对应机械限位。舵机在堵转或者代码角度写错时有可能会把机械结构推过头微动开关作为最后的物理保护一旦触发就立即断开舵机电源通过一个继电器实现防止齿轮和打印件损坏。三层保护不算复杂但让我在调试时能放手测试不用担心把家里点着。4. 从图纸到实物装配流程、接线细节和代码落地4.1 机械装配顺序与关键间隙如果你打算复刻装配顺序我建议按“底座 → 立柱 → 前臂 → 夹爪 → 传感器支架 → 配线”的顺序。为什么是这样一个顺序因为每一层都是下一层的承重基础先把基础固定牢后面装传感器和走线才不会到处晃。底座部分先安装底座舵机。注意 MG996R 的安装孔位和舵盘舵机自带的那套螺丝很容易滑丝装的时候涂一点螺丝胶或者用尼龙垫片。舵机输出轴和立柱之间我用了一个 L 形金属支架这样立柱可以垂直固定在舵盘上而且不会因为重力自然下垂。立柱顶端安装俯仰舵机。这里有一个很关键的参数前臂的重力中心应该尽量靠近俯仰舵机输出轴否则前臂伸出去的时候舵机会因为端部重量过大而抬不起来甚至堵转。解决办法是让前臂的竹签套筒尽量短并且把夹爪签子组件的总重量控制在 150 克以内。这个重量对 MG996R 来说毫无压力。夹爪我设计成了两瓣式通过一颗螺丝锁紧。两瓣的内壁贴了 3M 泡棉胶这样既能增加摩擦力又能在签子转动时轻微缓冲。签子用的是不锈钢烤肉签直径 3 毫米前端是尖的后端穿过一个滚珠轴承接到小舵机。小舵机负责让签子自转实测转速不需要快大约每 2 秒转一圈棉花糖表面就能烤得非常均匀。如果你想做焦糖脆壳转速可以降到每 3 秒一圈让表面停留时间更长。4.2 接线一个不让你糊板的电路规划接线之前先画一张简单的接线表写在纸上比插完再找问题快得多。信号/电源接 Arduino 引脚备注底座舵机 PWND9橙线接信号红黑接外部 5V俯仰舵机 PWND10橙线接信号红黑接外部 5V旋转舵机 PWND11SG90信号脚夹爪开合舵机 PWND12SG90信号脚GY-906 SCLA5I2C 时钟GY-906 SDAA4I2C 数据GY-906 VIN5V注意稳压为 3.3V逻辑电平兼容火焰传感器 DOD2数字输出低电平代表有火焰启动按钮D3输入内部上拉低电平触发强制停止按钮D4输入内部上拉低电平触发蜂鸣器D5通过三极管驱动或者直接接有源蜂鸣器我在这里说一个非常容易踩的坑GY-906 模块虽然名字里带 5V但它内部稳压芯片有点脆弱直接用 Arduino 的 5V 供电没问题但如果这时候舵机动起来导致 5V 被拉低模块可能会重启I2C 通信就会卡死。所以我把 GY-906 的供电单独从降压模块的 5V 输出端引出来经过一个 100 微法电容滤波后接入模块。这个小改动让温度数据稳定了不少。所有舵机的信号线必须共地也就是舵机电源负极和 Arduino 的 GND 要连在一起否则 PWM 信号没有参考地舵机要么不动要么乱抖。常见问题里我还会详细说。4.3 核心代码结构状态机框架和烤制参数代码我用的是 CArduino 环境整体结构很简单核心就是一个updateStateMachine()函数加上温度读取和舵机控制。我不打算粘贴几百行完整代码因为每个人的引脚和舵机角度都可能不一样但我会把关键逻辑框架写出来你拿回去根据自己的机械结构改角度和参数就能用。#include Wire.h #include Adafruit_MLX90614.h #include Servo.h Adafruit_MLX90614 mlx Adafruit_MLX90614(); Servo baseServo; // 底座旋转 Servo armServo; // 前臂俯仰 Servo rotateServo; // 签子自转 Servo gripperServo; // 定义状态 enum State { IDLE, LOWER, ROTATE_WAIT, HOLD_TEMP, RAISE, RETURN, FAULT }; State currentState IDLE; // 关键参数 const float TARGET_LOW 150.0; const float TARGET_HIGH 170.0; const float OVERHEAT 185.0; const int HOLD_MS 10000; // 在目标区间保持 10 秒 unsigned long holdStartTime 0; // 前臂角度这些角度需要你根据机械结构实测标定 const int ARM_LOWER_ANGLE 100; // 棉花糖到达火焰上方 const int ARM_RAISE_ANGLE 60; // 安全高度 const int BASE_FIRE_ANGLE 90; // 底座对准火焰 const int BASE_WAIT_ANGLE 140; // 等待取签位置 // 滑动平均滤波器 #define FILTER_SIZE 20 float tempBuffer[FILTER_SIZE]; int tempIndex 0; float readSmoothedTemp() { float current mlx.readObjectTempC(); tempBuffer[tempIndex] current; tempIndex (tempIndex 1) % FILTER_SIZE; float sum 0; float minVal tempBuffer[0], maxVal tempBuffer[0]; for (int i 0; i FILTER_SIZE; i) { sum tempBuffer[i]; if (tempBuffer[i] minVal) minVal tempBuffer[i]; if (tempBuffer[i] maxVal) maxVal tempBuffer[i]; } // 去极值平均 return (sum - minVal - maxVal) / (FILTER_SIZE - 2); } void updateStateMachine() { float tempC readSmoothedTemp(); bool flameDetected (digitalRead(2) LOW); switch (currentState) { case IDLE: // 等待启动按钮按下 if (digitalRead(3) LOW) { baseServo.write(BASE_FIRE_ANGLE); currentState LOWER; } break; case LOWER: armServo.write(ARM_LOWER_ANGLE); delay(300); // 简单延时, 让舵机到达位置 rotateServo.write(90); // 开始转动签子 currentState ROTATE_WAIT; break; case ROTATE_WAIT: if (tempC TARGET_LOW) { holdStartTime millis(); currentState HOLD_TEMP; } else if (tempC OVERHEAT || !flameDetected) { currentState FAULT; } break; case HOLD_TEMP: if (millis() - holdStartTime HOLD_MS) { currentState RAISE; } else if (tempC OVERHEAT || !flameDetected) { currentState FAULT; } break; case RAISE: armServo.write(ARM_RAISE_ANGLE); rotateServo.write(90); // 停转 delay(300); currentState RETURN; break; case RETURN: baseServo.write(BASE_WAIT_ANGLE); delay(500); currentState IDLE; break; case FAULT: baseServo.write(BASE_WAIT_ANGLE); armServo.write(ARM_RAISE_ANGLE); rotateServo.write(90); digitalWrite(5, HIGH); // 蜂鸣器报警 // 只有按停止按钮才会退出 if (digitalRead(4) LOW) { digitalWrite(5, LOW); currentState IDLE; } break; } } void setup() { Serial.begin(9600); Wire.begin(); mlx.begin(); baseServo.attach(9); armServo.attach(10); rotateServo.attach(11); gripperServo.attach(12); pinMode(2, INPUT_PULLUP); pinMode(3, INPUT_PULLUP); pinMode(4, INPUT_PULLUP); pinMode(5, OUTPUT); gripperServo.write(0); // 先夹紧 baseServo.write(BASE_WAIT_ANGLE); armServo.write(ARM_RAISE_ANGLE); rotateServo.write(90); } void loop() { updateStateMachine(); delay(200); // 控制在 5Hz 状态刷新够用且稳定 }你注意到我在LOWER和RAISE状态里用了delay(300)这不影响整体逻辑是因为这些状态本身就不需要快速响应。但如果你追求更顺滑的运动可以改成“舵机角度缓慢逼近目标”的方式比如每 20 毫秒增加 1 度这样机械臂动作会更优雅。我最初用直接跳变角度机械臂会“咔哒”一下弹过去后来加了缓动函数整体观感就好了很多。4.4 标定舵机角度唯一不能靠猜的步骤舵机角度是整个项目里最需要耐心的一步。不同舵机的初始位置可能不同不同夹爪的重心也会导致前臂自然下垂的角度差异。我的建议是单独写一个标定小程序让它依次输出几个关键角度然后你手动记录对应棉花糖的实际位置底座旋转到BASE_FIRE_ANGLE时棉花糖应该正好在火焰正上方。底座旋转到BASE_WAIT_ANGLE时棉花糖应该在桌面侧边人能轻松拿到。前臂下压到ARM_LOWER_ANGLE时棉花糖距离火焰表面大约 3 到 4 厘米。前臂抬起到ARM_RAISE_ANGLE时棉花糖距离火焰至少 15 厘米避免余温继续加热。这个过程我花了两个小时反复调。因为前臂安装时可能有轻微角度偏移差 5 度在 30 厘米的臂长上就会造成 2.5 厘米的位置误差对于烤棉花糖来说可能就从“刚好”变成了“糊底”。所以标定这一步宁可慢一点也不要靠眼睛大概估一个角度就完事。5. 实测翻车记录与排查思路希望你别再经历5.1 棉花糖被热浪吹歪导致温度读取失效第一次正式测试的时候棉花糖刚开始烤还算正常但 30 秒后我发现温度读数开始剧烈跳动从 120 度突然跳到 190 度又掉回 80 度。检查后发现棉花糖表面受热开始融化下垂整个位置发生了偏移原本正对传感器的棉花糖表面变成了一个斜角红外传感器读到的区域里混入了火焰本身的热辐射。这个问题我用一个看似笨的办法解决了把传感器支架设计成可旋转调节的每次装棉花糖的时候先把传感器对准棉花糖中心再拧紧固定螺丝。同时在代码里把过高温读数的判断延迟了 500 毫秒防止瞬时峰值触发误报警。这里也印证了一个经验传感器视角一定要对着目标物体的中心并且和目标物体保持固定距离任何相对位移都会极大影响红外测量的准确性。5.2 舵机抖动和“还没到位就开始执行下一个动作”用便宜舵机的一个典型问题就是你发出一个角度指令后舵机会先超调再慢慢回正。如果代码在指令发出后立刻判断“已经到位”实际上机械臂还在晃就可能导致棉花糖和热源发生不期望的接触。我排查这个问题的办法是在每次发出舵机角度指令后加一个 300 到 500 毫秒的稳定延时然后再读温度和位置。这个方案对最终功能没有任何负面影响因为烤棉花糖本来就不是一个高动态响应过程稳定几秒钟不会有问题。如果你采用更高级的舵机比如带角度反馈的串行总线舵机可以把延时缩短到 50 毫秒还能做闭环控制。但就这个项目而言固定延时足够没有必要升级。5.3 火焰传感器被误触发火焰传感器检测火焰的原理是感知红外光但阳光、白炽灯也可能触发它。我把机器人放在房间中靠近窗户的位置测试时有一次大晴天火焰已经被棉花糖滴落的糖浆浇灭了一部分但传感器依然显示有火焰。排查后我发现是阳光直射导致传感器产生误导。解决办法很粗暴把火焰传感器换到一个半封闭的小黑盒里只在朝向火焰的方向开一个小孔。这样阳光只有在一个非常狭窄的角度下才能照射进去但火焰的红外辐射可以正常进入。同时我把检测阈值调高一点只有当传感器读数连续 3 秒都是“低电平”有火焰才认为正常中途有任何抖动都算异常。5.4 火势不稳导致表面烤焦如果你用蜡烛火焰高度会受到空气流动影响。虽然室内没有大风但开门、开空调都会让蜡烛火焰左右摆动。火焰一旦偏离棉花糖正下方棉花糖一侧可能已经焦了另一侧还是白的。我的处理方式是给热源加了一个小风罩用铝箔纸折成半包围的形状留出朝向棉花糖一侧的开口。这样火焰会被聚拢不会大面积摆动。同时签子自转的速度也会影响均匀性——如果火焰本身不稳自转再快也救不了一侧焦糊因为高温停留时间取决于火焰扫过表面的频率。加大自转速度能让整体加热更均匀代价是表面脆壳不太容易形成。我最终把转速稳定在 2 秒一圈兼顾均匀度和外壳效果。5.5 常见问题速查表现象可能原因解决方式温度读数一直显示室温GY-906 接线错误或 I2C 地址不对检查 SDA/SCL 是否接对用 I2C 扫描程序确认设备地址舵机不动或乱抖信号线未共地供电不足检查舵机负极与 Arduino GND 是否连通用独立 5V 3A 电源棉花糖还没靠近火就黑了前臂下压角度过深棉花糖贴到火焰重新标定ARM_LOWER_ANGLE先把距离调远再往下微调温度达到目标后机械臂不回抽状态机卡在HOLD_TEMP但HOLD_MS被重复初始化确保holdStartTime只在状态进入HOLD_TEMP时赋值一次底座旋转角度和设定值偏差很大舵盘和舵机输出轴之间打滑拧紧舵盘螺丝或换塑料舵盘为金属舵盘蜂鸣器一直响处于 FAULT 状态火焰传感器被阳光/灯光误触发加装遮光罩并检查传感器朝向棉花糖滴落的糖浆把传感器弄脏传感器离棉花糖太近且位置在正下方把传感器装到侧上方 45 度位置并定期用酒精擦拭6. 一些真实体验和后续扩展方向做完这台机器人的第一个晚上我连续烤了五根棉花糖每一根的成色都比我手工烤的稳定多了。手工烤的时候要么离火太近赶紧吹灭要么翻面不及时背面焦了。机器人用恒定转速和温度区间控制反而能烤出那种外层微微金黄、内里软到拉丝的完美状态。有一个小细节我后来才想到签子从夹爪里抽出来的时候因为棉花糖有黏性偶尔会连签子一起带出来。后来我在等待位置放了一个小托盘上面垫了烘焙纸回抽到等待位置后人只需要轻捏棉花糖尾部签子向后一抽就能脱落。这个小改动非常提升体验。如果后续想升级方向其实很多把 GY-906 替换成带热成像阵列的传感器这样可以识别整块棉花糖的温度分布而不只是一个点。在代码里加入“多签模式”串联多个机械臂一次烤三根适合聚会场景。换用更长的金属签和更高功率的热源支持真实篝火大会当然需要额外防风设计和安全防护。接入语音模块用“帮我烤一根”来触发整个流程效果会更炫。把旋转舵机换成无刷电机签子转速可以更平滑地调节碳化均匀度还能再上一个台阶。最后说一个我做这类小项目最深的体会好的自动化设备不求复杂但求每个环节都可解释、可预测、可恢复。这台 Smore Maker 的全部核心逻辑只有温度阈值、旋转时间和一段状态机代码但因为它把烧烤师傅的“感觉”变成了可量化的参数所以在可靠性和一致性上远超手动操作。如果你也想做一个类似的东西建议不管多简单先把状态图画出来再动手这比任何硬件设计都重要。
返回列表