1. 项目概述一个“滑稽行走”的双足机器人如果你玩腻了循线、避障或者用舵机做关节的机器人想搞点不一样的运动方式那么这个基于Adafruit CRICKIT和Feather M0 Bluefruit的Flippy机器人绝对能让你眼前一亮。它的核心魅力在于其独特的行走机制——不是靠轮子滚动也不是靠多关节的仿生腿迈步而是利用两个独立的直流电机驱动一组呈三角形布局的“腿”进行一种类似钟摆的、略带滑稽感的划动从而实现前进、后退和转向。这种非传统的移动方式在硬质地板上会发出有节奏的“咔哒”声运动姿态相当魔性我儿子养的狗第一次见到它时愣是盯着看了半天然后疑惑地走开了。这个项目的精髓在于将简单的机械结构与精确的电子控制相结合。原始的Flippy设计来自Thingiverse社区只用了一个双轴TT电机同时驱动两侧结构极简。而我们这个版本则是一次全面的“豪华升级”。我们用两个高扭矩的全金属齿轮TT电机分别驱动左右腿通过CRICKIT电机驱动板进行独立且精细的PWM控制再搭配具备蓝牙功能的Feather M0 Bluefruit作为大脑最终实现用手机App进行遥控。这不仅仅是零件数量的增加更是将机器人的可控性、灵活性和可玩性提升了一个维度。整个项目涵盖了3D打印结构设计、电机驱动、无线通信和Arduino编程非常适合有一定基础的创客、机器人爱好者或者想深入学习机电一体化整合的工程师作为练手项目。下面我就把从设计思路到最终调试的完整过程以及我踩过的几个坑毫无保留地分享给你。2. 核心硬件选型与设计思路拆解2.1 为什么是CRICKIT Feather M0 Bluefruit这个组合的选择背后有非常明确的工程考量。首先我们需要驱动两个直流电机。虽然用普通的L298N或TB6612电机驱动模块也能实现但CRICKIT作为Adafruit生态系统中的“创客瑞士军刀”其优势在于高度集成和易用性。它原生提供了4路直流电机或2路步进电机的驱动能力每路都自带独立的H桥和PWM控制这意味着我们无需额外搭建复杂的电机驱动电路也省去了计算限流电阻、设计逻辑隔离的麻烦。更重要的是CRICKIT通过I2C与主控板通信仅需4根线VCC, GND, SDA, SCL就能控制所有电机和伺服舵机极大简化了布线让机器人体内更加整洁也减少了信号干扰的风险。主控板选择Feather M0 Bluefruit LE核心诉求是无线控制。Feather M0基于ARM Cortex-M0内核性能足以应对简单的运动控制逻辑。其集成的nRF51822蓝牙低能耗BLE模块是关键它让我们可以通过Adafruit官方开发的Bluefruit LE Connect App以极低的开发成本实现手机遥控。你不需要去研究复杂的BLE协议栈App已经提供了现成的控制器界面我们只需要在代码中解析对应的按键指令即可。这种“硬件软件生态”的打包解决方案能让你把精力集中在机器人行为逻辑本身而不是通信协议的泥潭里。此外Featherwing的设计让CRICKIT可以直接插在Feather主控板上形成一个坚固的叠层结构这对于在移动机器人上节省空间和增强可靠性至关重要。整个控制核心的体积和复杂度都得到了有效控制。2.2 机械结构设计从单电机到双电机的进化原始的单电机Flippy其巧妙之处在于用一个电机通过连杆同时带动左右两侧的腿结构简单但运动是锁死的无法转向。我们的双电机版本则进行了彻底的重新设计。首先尺寸放大了一倍多。这不仅是为了容纳CRICKIT和更大的电池更是力学上的需要。两个TT电机并排安装加上控制板和电池整体的重量和力矩都增加了。如果保持原尺寸机器人的重心会太高在那种滑稽的摆动中极易侧翻。我们将宽度显著增加使机器人的底盘更稳像一只矮壮的螃蟹虽然走路姿势怪异但不容易摔倒。其次左右腿完全独立。每个电机只驱动同侧的三条“腿”一条主动臂两条从动臂。这种设计带来了真正的差速转向能力让两个电机同向同速转动机器人直线前进或后退让两个电机反向转动机器人就能实现原地旋转。这比单电机版本只能直来直去要有趣得多。最后结构件全部采用3D打印。我尝试过用瓦楞纸板来制作成本低且加工方便但实际测试下来强度完全不够。机器人在运动时电机轴和腿部连接处承受的扭力很大纸板很快会变形、撕裂。使用PLA材料进行3D打印并设置合理的填充率我推荐10%-15%的稀疏填充能在保证足够强度的前提下尽可能减轻重量。记住在移动机器人上每一克多余的重量都会消耗更多的电池电量并增加电机的负载。2.3 电源方案抉择碱性电池 vs. 锂电升压电源是机器人项目的“心脏”选错了会带来一系列头疼的问题。项目给出了两种主流方案方案A3xAA电池盒碱性/镍氢电池这是最直接、成本最低的方案。三节AA电池提供约4.5V电压直接接入CRICKIT的电机驱动电源输入端。优点是即装即用无需担心充电电路。但缺点也很明显电压波动直流电机在启动和堵转卡住时瞬时电流很大会导致电池电压瞬间跌落。这种电压波动可能会“干扰”到同一电源供电的Feather主控板导致其复位或程序跑飞。虽然我们这个项目只有两个电机比原文提到的五电机WobblyBot情况要好但风险依然存在。续航与成本碱性电池不可充电在电机频繁启停的工况下耗电很快长期使用成本高。镍氢电池NiMH可充电但需要额外的充电器且能量密度相对较低。缺乏开关简单的电池盒没有电源开关每次用完需要拔掉插头不方便。方案B大容量锂电升压模块推荐这是我个人强烈推荐的方案。使用一块3.7V的大容量锂聚合物电池比如4400mAh或6600mAh搭配一个PowerBoost 1000C这样的升压充电模块。功率充足锂电放电能力强能提供电机所需的大电流电压相对稳定。集成充电与开关PowerBoost模块集成了充电管理、升压至5V和负载切换功能。你只需要一根USB线就能给电池充电模块上自带的开关可以方便地控制整个系统电源。续航持久单块6600mAh的锂电其能量远超三节AA电池能支持机器人玩上很久。实操心得如果你在调试时发现Feather主控板会莫名其妙重启尤其是在电机堵转时这很可能是电源问题。一个高级的解决方案是采用双电源供电用大锂电升压模块方案B单独给CRICKIT的电机电源端供电同时用一块小容量的锂电如1200mAh直接接在Feather的电池接口上。这样电机工作时剧烈的电流变化就不会影响到核心控制器。当然这增加了布线和重量的复杂度对于初版验证先用一个优质电源试试看。3. 详细制作步骤与装配要点3.1 3D打印文件处理与准备你需要打印的零件包括机身左/右侧板Body_1, Body_2各1个腿部Leg2个电机驱动臂Motor_Arm2个普通从动臂Plain_Arm4个关节帽Joint_Cap10个CRICKIT托盘Crickit_Tray1个电池托盘Battery_Tray1个。打印参数建议材料PLA即可它强度足够易于打印。层高0.2mm在强度和打印时间间取得平衡。填充率10%-15%。记住我们的目标是在保证结构件不碎裂的前提下减重过高的填充率只会增加重量和打印时间对强度提升却不明显。支撑对于关节帽这类有悬空结构的小零件需要开启支撑。对于机身侧板、托盘等大零件根据你的打印机性能决定如果底面悬空面积大最好加支撑。公差处理设计文件中的孔洞特别是电机轴孔和螺丝孔可能会因为打印机精度或材料收缩而略小。准备好一套小尺寸的钻头或锉刀用于在组装前对孔位进行轻微的扩孔或清理确保轴和螺丝能顺畅装入但又不至于太松。如果没有3D打印机可以使用像Craftcloud、JLCPCB等在线打印服务或者在本地的创客空间Maker Space寻找帮助。3.2 电机安装与布线TT电机通常不带线或者预焊的线很短。我们需要为每个电机焊接两根长约15厘米的导线。建议使用多股硅胶线它更柔软耐弯折。焊接后用热缩管保护好焊点。安装电机是第一个关键机械步骤。将电机嵌入机身侧板的预留凹槽内这个设计非常巧妙——凹槽承受了电机工作时的主要扭力而M3螺丝主要起固定作用而非受力。从外侧将4颗M3x25mm的螺丝穿过侧板孔和电机安装孔内侧加上垫片和六角防松螺母。这里有个重要技巧拧紧螺母时务必使用两个扳手一个固定螺丝头部另一个拧螺母。切忌过度拧紧否则可能导致PLA材料开裂。感觉螺母压紧垫片电机没有晃动即可。电机线可以先从侧板内部的走线空间预穿过去暂时不连接CRICKIT。3.3 核心电子部件组装CRICKIT托盘处理如果你使用M3黄铜热熔螺母Threaded Insert现在就用烙铁将它们压入CRICKIT托盘背面的预留孔中。这能提供坚固的金属螺纹避免螺丝反复拧入塑料导致滑丝。注意只需在CRICKIT托盘上安装螺母电池托盘用自攻螺丝直接拧入塑料即可。主板叠层将Feather M0 Bluefruit插入CRICKIT FeatherWing的对应插座确保方向正确USB口朝向一致。然后将这个叠层组合体用M3x6mm的螺丝固定在CRICKIT托盘上。初步框架搭建取一个已经装好电机的机身侧板用两颗M3x20mm的螺丝将CRICKIT托盘暂时固定在这一侧板上。此时框架还处于开放状态方便后续布线。电机接线与测试将左右电机的线分别连接到CRICKIT的电机端口AMOTOR A1, A2和电机端口BMOTOR B1, B2。切记先不要完全固定另一边侧板此时应该上传一个简单的测试代码例如让两个电机正转、反转各一秒检查电机转向是否正确。如果某个电机转向反了只需将其两根线在端子上对调即可。这个步骤能避免全部装好后才发现问题导致返工拆卸。3.4 腿部机构与最终总装安装驱动臂将电机驱动臂Motor_Arm用力按到电机输出轴上。这里可能需要用锉刀稍微修整一下方孔目标是达到“紧配合”——需要用一些力气才能按到底但不需要用锤子猛砸。确保驱动臂与电机轴之间没有松动。安装从动臂将四个普通从动臂Plain_Arm末端的圆轴分别插入两侧机身板剩下的四个孔中。它们应该能自由转动。每个从动臂的外侧用一个关节帽Joint_Cap和一颗M3x6mm的沉头螺丝固定。沉头螺丝的锥形头可以埋入关节帽外观平整。闭合机身确认电机接线无误后将另一片机身侧板对准CRICKIT托盘用另外两颗M3x20mm螺丝固定。现在机器人的主体框架就形成了一个坚固的“H”形结构。安装电池托盘根据你的电池和升压模块的尺寸规划好走线路径然后将电池托盘用M3x20mm螺丝固定在机身底部。如果使用升压模块可以用双面胶或扎带将其固定在托盘下方。安装腿部这是最需要耐心的一步。将打印好的腿部零件同时套到同一侧的三个臂一个驱动臂两个从动臂末端的轴上。可以轻微摆动驱动臂来对齐三个轴孔。套上后在三个轴端分别盖上关节帽用M3x6mm沉头螺丝固定。另一侧重复此操作。最终接线与整理将电池/电源输出线连接到CRICKIT的“Motor Power”端子。用扎带或胶带整理好内部所有线缆避免其缠绕到运动部件中。4. 软件配置与代码深度解析4.1 开发环境搭建与库安装代码使用Arduino框架编写。首先确保你已安装Arduino IDE1.8.x或2.0版本均可。添加板支持打开“首选项”在“附加开发板管理器网址”中填入https://adafruit.github.io/arduino-board-index/package_adafruit_index.json。然后打开“工具”-“开发板”-“开发板管理器”搜索“Adafruit SAMD”安装“Adafruit SAMD Boards”。安装必要的库打开“工具”-“管理库”。搜索并安装以下库Adafruit BluefruitLE nRF51Adafruit CrickitAdafruit seesaw Library(CRICKIT依赖此库)安装完成后在“工具”菜单下选择开发板为“Adafruit Feather M0 Bluefruit LE”并选择正确的端口。4.2 核心代码逻辑剖析项目的代码结构清晰主要分为蓝牙通信初始化、电机控制封装和主循环命令解析三大部分。电机控制抽象层 代码没有直接操作复杂的PWM寄存器而是通过seesaw_Motor对象来管理。set_leg(int leg, float velocity)函数是核心。它接受两个参数legRIGHT或LEFT和velocity速度范围-1.0到1.0。这里velocity的正负代表方向。函数内部调用了legs[leg]-throttle(velocity)这个throttle方法由Adafruit_Crickit库提供它帮我们处理了所有底层细节将-1.0到1.0的速度值映射成相应的PWM占空比和H桥方向控制信号。基于set_leg我们封装了四个基础运动函数forward(float speed): 两腿同向正转。reverse(float speed): 两腿同向反转。rotate_clockwise(float speed): 右腿反转左腿正转实现顺时针原地旋转。rotate_counterclockwise(float speed): 右腿正转左腿反转实现逆时针原地旋转。这种封装让主逻辑非常简洁易懂也便于后期扩展更复杂的步态。蓝牙命令解析 主循环loop()函数的核心是readPacket(ble, BLE_READPACKET_TIMEOUT)它等待手机App通过蓝牙发送过来的数据包。数据包的格式由Bluefruit LE App定义。当收到一个按钮‘B’类型的数据包时代码解析出按钮编号buttnum和按下状态pressed。if (packetbuffer[1] B) { uint8_t buttnum packetbuffer[2] - 0; // 字符数字转整数 boolean pressed packetbuffer[3] - 0; ... }接下来的switch语句根据按钮编号执行相应动作。按钮5-8对应方向控制前进、后退、左转、右转采用的是“按下即运动释放即停止”的模式。按钮1-4则预留给了可编程的演示序列demo1()到demo4()。demo1()已经写了一个例子前进5秒 - 顺时针转2秒 - 以0.75速度前进4秒 - 逆时针转3秒 - 停止。你可以在这里编写任何你想要的复杂动作序列。调试技巧 代码开头附近有一行被注释的//#define DEBUG 1。在开发阶段取消这行的注释然后编译上传。这样打开Arduino IDE的串口监视器波特率115200你就能看到详细的蓝牙连接状态、电机速度设置等日志信息对于排查问题比如蓝牙连不上、电机不转至关重要。在最终部署前记得重新注释掉这行以关闭调试输出节省资源。4.3 手机App连接与操控在手机应用商店搜索并安装“Adafruit Bluefruit LE Connect”。给机器人上电。打开手机蓝牙和App。在App的设备列表里你应该能看到一个名为“Adafruit Bluefruit LE”的设备点击连接。连接成功后进入“Controller”模式选择“Control Pad”。现在你就可以使用屏幕上的方向键来控制机器人移动了数字键1-4则用于触发你预设的demo函数。5. 调试心得、常见问题与优化建议5.1 运动调试与性能优化起步同步问题由于左右腿独立上电初始位置可能一前一后。直接让机器人全速前进可能会因为起步力矩不平衡而“扭一下”。技巧是在开始遥控前先轻微地左右点按转向键让两条腿摆动到大致相同的位置比如都摆到最后方然后再前进运动会更顺畅。后退无力这是由机械结构决定的。前进时腿部的运动趋势是“推开”地面带动身体向前比较省力。而后退时则需要“拉动”身体对电机力矩要求更高。如果发现后退困难可以尝试先让机器人向前摆动一点获得一点惯性再命令后退。或者在代码中将后退的速度speed参数设置得比前进速度稍高一点例如前进用0.8后退用1.0。地面适应性这个机器人在光滑的硬质地板上木地板、瓷砖运动效果和声音最“滑稽”。在地毯上阻力增大可能会行动迟缓甚至卡住。可以考虑在腿部底部粘贴一小块橡胶片或砂纸来增加抓地力。5.2 电气问题排查问题现象可能原因排查步骤与解决方案上电后毫无反应LED不亮1. 电源未接通或开关未开。2. 电池电量耗尽。3. 电源线连接松动或反接。1. 检查所有开关用万用表测量CRICKIT电源输入端电压应为4.5-5.5V。2. 更换电池或为锂电充电。3. 重新插拔电源插头确认极性中心正极。Feather主板LED闪烁但蓝牙搜不到/连不上1. 蓝牙模块未正确初始化。2. 代码未上传成功或板卡选择错误。3. 手机蓝牙或App权限问题。1. 打开串口调试查看启动日志是否报错。2. 重新检查Arduino IDE中的板卡和端口选择完整编译并上传。3. 重启手机蓝牙确保App有定位权限用于蓝牙扫描。蓝牙已连接但按键控制无反应1. 电机接线错误或松动。2. CRICKIT电机电源未接或电压不足。3. 代码中电机端口映射错误。1. 检查电机线是否牢固接在CRICKIT的MOTOR A和B端子上。2. 确认电机驱动电源Motor Power已接入电压正常。3. 检查代码中right_leg.attach和left_leg.attach指定的引脚是否与物理连接一致。运动时Feather主板偶尔重启电机工作时引起的电源电压跌落干扰了主控板。1.首选为电机供电使用大容量锂电升压模块确保电源功率充足。2.进阶如问题依旧尝试为Feather主板单独供电小锂电接JST接口。3. 在CRICKIT的电机电源输入端并联一个较大容量的电解电容如470uF-1000uF注意耐压值作为储能缓冲。只有一个电机转或转向错误1. 单个电机接线故障。2. 代码中左右腿控制逻辑写反。3. 电机本身损坏。1. 交换两个电机的接线如果问题跟随电机走则是电机或接线问题如果问题依旧在原侧则是代码或端口问题。2. 在setup()函数中添加测试代码分别单独测试每个电机的正反转。3. 直接给电机施加外部电源如3V电池测试电机本身是否完好。5.3 扩展与进阶玩法这个项目是一个优秀的起点你可以在此基础上进行多种扩展增加传感器在Feather M0的空闲IO口上连接超声波传感器HC-SR04或红外距离传感器实现简单的自动避障功能。当检测到前方有障碍时自动执行转向序列。丰富动作库完善demo2()到demo4()函数编写更复杂的舞蹈或步态序列。例如可以尝试让机器人走正方形、画圆或者模拟某种动物的步伐。改变控制方式利用Bluefruit App的其他模式比如“加速度计控制”通过倾斜手机来控制机器人速度或者使用“颜色选择器”让不同的颜色对应不同的预设动作。结构个性化使用不同颜色的PLA打印部件或者为机器人设计一个有趣的“外壳”或“装饰”让它更具个性。探索其他主控如果你熟悉CircuitPythonAdafruit的CRICKIT库同样支持。你可以用CircuitPython重写代码或许能实现更灵活的交互逻辑。这个Flippy机器人项目最让我着迷的地方在于它用相对简单的硬件实现了一种复杂且有趣的运动表现。它不像轮式机器人那样“直白”也不像多足机器人那样“精密”它的魅力就在于那种笨拙又努力的滑稽感。从机械组装、电路连接到代码调试整个过程充满了动手的乐趣和解决问题的成就感。当你第一次用手机遥控它在地板上划动起来时那种感觉绝对值得所有的投入。希望这份详细的指南能帮你顺利打造出自己的“滑稽行者”并开启更多机器人创作的灵感。