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. 锂电+升压
电源是机器人项目的“心脏”,选错了会带来一系列头疼的问题。项目给出了两种主流方案:
方案A:3xAA电池盒(碱性/镍氢电池)这是最直接、成本最低的方案。三节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个,腿部(Leg)2个,电机驱动臂(Motor_Arm)2个,普通从动臂(Plain_Arm)4个,关节帽(Joint_Cap)10个,CRICKIT托盘(Crickit_Tray)1个,电池托盘(Battery_Tray)1个。
打印参数建议:
- 材料: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的电机端口A(MOTOR A1, A2)和电机端口B(MOTOR B1, B2)。切记,先不要完全固定另一边侧板!此时应该上传一个简单的测试代码(例如,让两个电机正转、反转各一秒),检查电机转向是否正确。如果某个电机转向反了,只需将其两根线在端子上对调即可。这个步骤能避免全部装好后才发现问题,导致返工拆卸。
3.4 腿部机构与最终总装
- 安装驱动臂:将电机驱动臂(Motor_Arm)用力按到电机输出轴上。这里可能需要用锉刀稍微修整一下方孔,目标是达到“紧配合”——需要用一些力气才能按到底,但不需要用锤子猛砸。确保驱动臂与电机轴之间没有松动。
- 安装从动臂:将四个普通从动臂(Plain_Arm)末端的圆轴,分别插入两侧机身板剩下的四个孔中。它们应该能自由转动。每个从动臂的外侧,用一个关节帽(Joint_Cap)和一颗M3x6mm的沉头螺丝固定。沉头螺丝的锥形头可以埋入关节帽,外观平整。
- 闭合机身:确认电机接线无误后,将另一片机身侧板对准CRICKIT托盘,用另外两颗M3x20mm螺丝固定。现在,机器人的主体框架就形成了一个坚固的“H”形结构。
- 安装电池托盘:根据你的电池和升压模块的尺寸,规划好走线路径,然后将电池托盘用M3x20mm螺丝固定在机身底部。如果使用升压模块,可以用双面胶或扎带将其固定在托盘下方。
- 安装腿部:这是最需要耐心的一步。将打印好的腿部零件,同时套到同一侧的三个臂(一个驱动臂,两个从动臂)末端的轴上。可以轻微摆动驱动臂来对齐三个轴孔。套上后,在三个轴端分别盖上关节帽,用M3x6mm沉头螺丝固定。另一侧重复此操作。
- 最终接线与整理:将电池/电源输出线连接到CRICKIT的“Motor Power”端子。用扎带或胶带整理好内部所有线缆,避免其缠绕到运动部件中。
4. 软件配置与代码深度解析
4.1 开发环境搭建与库安装
代码使用Arduino框架编写。首先确保你已安装Arduino IDE(1.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)函数是核心。它接受两个参数:leg(RIGHT或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打印部件,或者为机器人设计一个有趣的“外壳”或“装饰”,让它更具个性。
- 探索其他主控:如果你熟悉CircuitPython,Adafruit的CRICKIT库同样支持。你可以用CircuitPython重写代码,或许能实现更灵活的交互逻辑。
这个Flippy机器人项目最让我着迷的地方,在于它用相对简单的硬件,实现了一种复杂且有趣的运动表现。它不像轮式机器人那样“直白”,也不像多足机器人那样“精密”,它的魅力就在于那种笨拙又努力的滑稽感。从机械组装、电路连接到代码调试,整个过程充满了动手的乐趣和解决问题的成就感。当你第一次用手机遥控它在地板上划动起来时,那种感觉绝对值得所有的投入。希望这份详细的指南能帮你顺利打造出自己的“滑稽行者”,并开启更多机器人创作的灵感。