news 2026/5/16 1:49:24

基于CRICKIT与Feather M0的双足机器人:从PWM控制到蓝牙遥控的完整实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于CRICKIT与Feather M0的双足机器人:从PWM控制到蓝牙遥控的完整实现

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的电机驱动电源输入端。优点是即装即用,无需担心充电电路。但缺点也很明显:

  1. 电压波动:直流电机在启动和堵转(卡住)时,瞬时电流很大,会导致电池电压瞬间跌落。这种电压波动可能会“干扰”到同一电源供电的Feather主控板,导致其复位或程序跑飞。虽然我们这个项目只有两个电机,比原文提到的五电机WobblyBot情况要好,但风险依然存在。
  2. 续航与成本:碱性电池不可充电,在电机频繁启停的工况下耗电很快,长期使用成本高。镍氢电池(NiMH)可充电,但需要额外的充电器,且能量密度相对较低。
  3. 缺乏开关:简单的电池盒没有电源开关,每次用完需要拔掉插头,不方便。

方案B:大容量锂电+升压模块(推荐)这是我个人强烈推荐的方案。使用一块3.7V的大容量锂聚合物电池(比如4400mAh或6600mAh),搭配一个PowerBoost 1000C这样的升压充电模块。

  1. 功率充足:锂电放电能力强,能提供电机所需的大电流,电压相对稳定。
  2. 集成充电与开关:PowerBoost模块集成了充电管理、升压(至5V)和负载切换功能。你只需要一根USB线就能给电池充电,模块上自带的开关可以方便地控制整个系统电源。
  3. 续航持久:单块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 核心电子部件组装

  1. CRICKIT托盘处理:如果你使用M3黄铜热熔螺母(Threaded Insert),现在就用烙铁将它们压入CRICKIT托盘背面的预留孔中。这能提供坚固的金属螺纹,避免螺丝反复拧入塑料导致滑丝。注意:只需在CRICKIT托盘上安装螺母,电池托盘用自攻螺丝直接拧入塑料即可。
  2. 主板叠层:将Feather M0 Bluefruit插入CRICKIT FeatherWing的对应插座,确保方向正确(USB口朝向一致)。然后将这个叠层组合体用M3x6mm的螺丝固定在CRICKIT托盘上。
  3. 初步框架搭建:取一个已经装好电机的机身侧板,用两颗M3x20mm的螺丝,将CRICKIT托盘暂时固定在这一侧板上。此时框架还处于开放状态,方便后续布线。
  4. 电机接线与测试:将左右电机的线分别连接到CRICKIT的电机端口A(MOTOR A1, A2)和电机端口B(MOTOR B1, B2)。切记,先不要完全固定另一边侧板!此时应该上传一个简单的测试代码(例如,让两个电机正转、反转各一秒),检查电机转向是否正确。如果某个电机转向反了,只需将其两根线在端子上对调即可。这个步骤能避免全部装好后才发现问题,导致返工拆卸。

3.4 腿部机构与最终总装

  1. 安装驱动臂:将电机驱动臂(Motor_Arm)用力按到电机输出轴上。这里可能需要用锉刀稍微修整一下方孔,目标是达到“紧配合”——需要用一些力气才能按到底,但不需要用锤子猛砸。确保驱动臂与电机轴之间没有松动。
  2. 安装从动臂:将四个普通从动臂(Plain_Arm)末端的圆轴,分别插入两侧机身板剩下的四个孔中。它们应该能自由转动。每个从动臂的外侧,用一个关节帽(Joint_Cap)和一颗M3x6mm的沉头螺丝固定。沉头螺丝的锥形头可以埋入关节帽,外观平整。
  3. 闭合机身:确认电机接线无误后,将另一片机身侧板对准CRICKIT托盘,用另外两颗M3x20mm螺丝固定。现在,机器人的主体框架就形成了一个坚固的“H”形结构。
  4. 安装电池托盘:根据你的电池和升压模块的尺寸,规划好走线路径,然后将电池托盘用M3x20mm螺丝固定在机身底部。如果使用升压模块,可以用双面胶或扎带将其固定在托盘下方。
  5. 安装腿部:这是最需要耐心的一步。将打印好的腿部零件,同时套到同一侧的三个臂(一个驱动臂,两个从动臂)末端的轴上。可以轻微摆动驱动臂来对齐三个轴孔。套上后,在三个轴端分别盖上关节帽,用M3x6mm沉头螺丝固定。另一侧重复此操作。
  6. 最终接线与整理:将电池/电源输出线连接到CRICKIT的“Motor Power”端子。用扎带或胶带整理好内部所有线缆,避免其缠绕到运动部件中。

4. 软件配置与代码深度解析

4.1 开发环境搭建与库安装

代码使用Arduino框架编写。首先确保你已安装Arduino IDE(1.8.x或2.0版本均可)。

  1. 添加板支持:打开“首选项”,在“附加开发板管理器网址”中填入:https://adafruit.github.io/arduino-board-index/package_adafruit_index.json。然后打开“工具”->“开发板”->“开发板管理器”,搜索“Adafruit SAMD”,安装“Adafruit SAMD Boards”。
  2. 安装必要的库:打开“工具”->“管理库”。搜索并安装以下库:
    • Adafruit BluefruitLE nRF51
    • Adafruit Crickit
    • Adafruit seesaw Library(CRICKIT依赖此库)

安装完成后,在“工具”菜单下选择开发板为“Adafruit Feather M0 Bluefruit LE”,并选择正确的端口。

4.2 核心代码逻辑剖析

项目的代码结构清晰,主要分为蓝牙通信初始化、电机控制封装和主循环命令解析三大部分。

电机控制抽象层: 代码没有直接操作复杂的PWM寄存器,而是通过seesaw_Motor对象来管理。set_leg(int leg, float velocity)函数是核心。它接受两个参数:legRIGHTLEFT)和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”。

  1. 给机器人上电。
  2. 打开手机蓝牙和App。
  3. 在App的设备列表里,你应该能看到一个名为“Adafruit Bluefruit LE”的设备,点击连接。
  4. 连接成功后,进入“Controller”模式,选择“Control Pad”。
  5. 现在,你就可以使用屏幕上的方向键来控制机器人移动了!数字键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.attachleft_leg.attach指定的引脚是否与物理连接一致。
运动时Feather主板偶尔重启电机工作时引起的电源电压跌落干扰了主控板。1.首选:为电机供电使用大容量锂电+升压模块,确保电源功率充足。
2.进阶:如问题依旧,尝试为Feather主板单独供电(小锂电接JST接口)。
3. 在CRICKIT的电机电源输入端并联一个较大容量的电解电容(如470uF-1000uF,注意耐压值),作为储能缓冲。
只有一个电机转,或转向错误1. 单个电机接线故障。
2. 代码中左右腿控制逻辑写反。
3. 电机本身损坏。
1. 交换两个电机的接线,如果问题跟随电机走,则是电机或接线问题;如果问题依旧在原侧,则是代码或端口问题。
2. 在setup()函数中添加测试代码,分别单独测试每个电机的正反转。
3. 直接给电机施加外部电源(如3V电池),测试电机本身是否完好。

5.3 扩展与进阶玩法

这个项目是一个优秀的起点,你可以在此基础上进行多种扩展:

  1. 增加传感器:在Feather M0的空闲IO口上连接超声波传感器(HC-SR04)或红外距离传感器,实现简单的自动避障功能。当检测到前方有障碍时,自动执行转向序列。
  2. 丰富动作库:完善demo2()demo4()函数,编写更复杂的舞蹈或步态序列。例如,可以尝试让机器人走正方形、画圆,或者模拟某种动物的步伐。
  3. 改变控制方式:利用Bluefruit App的其他模式,比如“加速度计控制”,通过倾斜手机来控制机器人速度;或者使用“颜色选择器”,让不同的颜色对应不同的预设动作。
  4. 结构个性化:使用不同颜色的PLA打印部件,或者为机器人设计一个有趣的“外壳”或“装饰”,让它更具个性。
  5. 探索其他主控:如果你熟悉CircuitPython,Adafruit的CRICKIT库同样支持。你可以用CircuitPython重写代码,或许能实现更灵活的交互逻辑。

这个Flippy机器人项目最让我着迷的地方,在于它用相对简单的硬件,实现了一种复杂且有趣的运动表现。它不像轮式机器人那样“直白”,也不像多足机器人那样“精密”,它的魅力就在于那种笨拙又努力的滑稽感。从机械组装、电路连接到代码调试,整个过程充满了动手的乐趣和解决问题的成就感。当你第一次用手机遥控它在地板上划动起来时,那种感觉绝对值得所有的投入。希望这份详细的指南能帮你顺利打造出自己的“滑稽行者”,并开启更多机器人创作的灵感。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 1:49:24

LeetCode 线段树优化题解

LeetCode 线段树优化题解 题目描述 介绍线段树的优化技巧。 线段树优化技巧 1. 懒惰传播 延迟更新操作,减少不必要的更新。将更新操作记录在懒标记中,后续需要时再向下传递。 2. 离散化 将大范围数据映射到小范围索引。减少线段树的空间复杂度。 3. 动态…

作者头像 李华
网站建设 2026/5/16 1:47:08

告别抢票焦虑:3步配置Python自动化脚本轻松抢到演唱会门票

告别抢票焦虑:3步配置Python自动化脚本轻松抢到演唱会门票 【免费下载链接】DamaiHelper 大麦网演唱会演出抢票脚本。 项目地址: https://gitcode.com/gh_mirrors/dama/DamaiHelper 还记得那些让人心跳加速的抢票时刻吗?热门演唱会门票开售瞬间&a…

作者头像 李华
网站建设 2026/5/16 1:39:09

OpenShart:开源AI智能体开发框架,简化LLM应用构建

1. 项目概述:一个开源的AI智能体开发框架最近在AI应用开发领域,一个名为OpenShart的项目开始引起不少开发者的注意。这个由 bcharleson 开源的框架,核心目标直指一个痛点:如何让开发者,尤其是那些对大型语言模型&#…

作者头像 李华
网站建设 2026/5/16 1:37:19

AWD Watchbird:PHP Web应用防火墙深度解析与实战部署指南

AWD Watchbird:PHP Web应用防火墙深度解析与实战部署指南 【免费下载链接】awd-watchbird A powerful PHP WAF for AWD 项目地址: https://gitcode.com/gh_mirrors/aw/awd-watchbird AWD Watchbird 是一款专为PHP Web应用设计的高性能防火墙,特别…

作者头像 李华
网站建设 2026/5/16 1:36:47

U盘接口断裂,资料全没?别慌!专业数据恢复案例详解

老师的U盘被学生撞断接口,本以为几年心血付之东流,没想到……前言前几天接到一个紧急的数据恢复需求——一位学校老师的U盘被学生不小心撞断了接口,直接从根部断裂,电脑完全无法识别。老师焦急地告诉我,里面存着几年的…

作者头像 李华
网站建设 2026/5/16 1:35:24

2026年AI招聘系统厂商榜单:TOP10完整排名与深度评析

2026年,AI招聘系统已经从“可选”变成“必选”。但市面上的系统五花八门,到底哪家真正能打?我们综合产品力、市场占有率、客户口碑和AI技术深度,发布了这份年度榜单。行业开篇:AI招聘,从锦上添花到不可或缺…

作者头像 李华