本周分享一个基于行空板M10制作的开源“宠物”机器人——Tillu,其灵感来源于Otto机器人。Tillu具备行走、跳舞等动态功能,配备了显示屏用于展示表情,还集成了麦克风、陀螺仪等传感器,支持语音识别和触摸交互。项目完整开源了3D打印文件和Python代码,小伙伴们可以通过Fusion 360修改设计,使用Mind+进行可视化编程。整个项目的成本控制合理,制作难度适中,非常适合想要入门机器人开发的创客们进行学习和实践。
特色功能
趣味表情:通过行空板显示屏,来帮助Tillu显示各种灵活可爱的面部表情;
行走、舞蹈:Tillu通过两条腿上的四个舵机来实现行走,或向前后左右的移动,甚至完成一系列连续的舞蹈动作,共计含有约10种行动模式;
触摸传感和语音指令:
内置触摸传感器,每当有人触摸Tillu的头部,它就会开始一些随机的动作;由于行空板M10内置的麦克风,它可以识别语音指令,每当你对它说“Tillu,dance”(Tillu,跳舞),它就会开启一段随机舞蹈。它还可以根据你的指令来向前、退后或左右转动或舞蹈。
外观方面,使用深灰色和橙色丝线为Tillu打造酷炫的双色外观;
其它方面,头部背壳的开孔设计方便充电和连接电脑扩展编程。
材料清单
硬件
行空板M10
DF15MG舵机
2路18650电池座
Type-C L型公对母转接线 (行空板M10专用)
触觉按钮
触摸传感器
螺丝套件
软件
Mind+
Autodesk Fusion
其他
3D 打印机
项目过程
第一步:CAD和3D打印
组件导入:我导入了所有标准组件,如行空板M10、舵机,并手动测量了尺寸以创建电池管理板。
机器人主体设计:
头部外壳:设计用于稳固地承载重型电池和行空板。
主体(中心框架):作为结构支柱,连接头部和腿部,同时确保稳定性。
盖板:提升机器人的美观性。
腿脚:灵感来自Otto DIY机器人,确保流畅运动和平衡。
耳机设计:为增添趣味和酷炫外观而设计,赋予Tillu更多个性,
整个机器人的部件使用螺丝组装固定,项目作者在外壳背面设计了电源按钮和两个USB Type-C接口的插槽,一个用于电池充电,另一个用于行空板编程。
你可以在 Fusion 360 中打开模型,以根据您的要求对其进行修改。或者可以直接下载用于 3D 打印的 STL 文件。
以下是要打印的部件:
Main.stl
Cover.stl
Servo Housing Right.stl
Servo Cover Right.stl
Servo Cover Left.stl
Right Leg.stl
Left Leg.stl
Head Phone P1.stl
Head Phone P2.stl
Head Phone P3.stl
第二步:3D打印部件组装
1.组装外壳和面罩:
所需打印部件:Housing.stl(灰色)+ Visor.stl(橙色)
步骤:
- 取机器人的头部外壳(Housing),找到用于安装显示屏(Visor)的插槽。
- 将显示屏(Visor)插入头部外壳的对应插槽中。
- 取少量快干胶将面罩固定到位,为了保持外观整洁,注意不要使用过量。
2.组装耳机:
所需打印部件:Head Phone P1.stl、 Head Phone P2.stl 、Head Phone P3.stl
步骤:
- 双色打印: 如果你希望耳机部分呈现双色效果,可以选择更换丝线。在打印过程中暂停,更换耗材,以达到理想的效果。
- 打印完成后,将四个耳机部件对齐组装:
- 将耳机部件P2安装到耳机部件P1上。
- 将两个耳机部件P3安装到位,完成耳机的设计。
- 虽然这些部件设计为紧密贴合,但如果你需要额外的牢固性,可以适量使用胶水进行固定。
第三步:为舵机添加接线
舵机自带接线,但这些接线与行空板M10的接口不兼容。因此,需要对接线进行改造,以确保兼容性和正常连接。
行空板M10带有三个含PWM 信号的 GPIO 接口(P21、P22 和 P23),而在我们的项目中,需要连接四个舵机,为解决此问题,我们可以:
- 给前三个舵机使用可用的 GPIO 引脚
- 把第四个舵机的信号引脚直接焊接到行空板上的 P16 上
1.改造和添加接口:准备接线:取出行空板附带的两个双面三pin接线,将它们从中间剪开,得到四个独立的接线。保留三条接线用于连接舵机,另一个用于触摸传感器(在后续步骤中使用)。
2.连接舵机:
使用两组接线分别连接两个舵机。按照下图所示的极性和接线图进行连接:
- 信号线(橙色)
- 5V电源线(红色)
- 地线(棕色)
确保接线的方向与接线图一致。
3.将两个舵机连接到一组接线上:
对于第三组接线:
- 将两个伺服电机的地线和5V电源线连接到同一组接线上。
- 将其中一个伺服电机的信号线连接到接线上。
- 保持第二个舵机的信号线畅通;稍后将焊接到 P16 上。
检查所有连接,确保极性和接线图一致。
第四步:扩展按钮以控制电源开关
项目设计中的电池座包含一个小按钮,用于控制Tillu机器人的电源开关。然而,由于外壳设计的原因,无法触摸到按钮,并且由于尺寸过小,实际使用时不够方便。为了解决这个问题,我们将通过添加一个外部触摸按键来扩展其功能。
所需材料:
触觉按钮、焊接器材、用于扩展连接的绝缘线
步骤:
- 识别电池座上的微型内置按钮
- 注意连接点(两个端子)
- 将两根绝缘线连接到按钮端子,确保它们长度足够
- 将外部按键的一端焊接到与连接图一致的相同端子上。
第五步:连接电池
在此步骤中,我们将使用电池座为行空板准备电源,并用同一个 USB Type-C 接口实现无缝编程。通过创建一个定制的扩展接线,我们将使电池组能同时为电路供电,并且可以访问行空板的Type-C 接口进行编程。
所需材料:
USB Type-C 延长线、电池座、焊接器材、电线(处理电力负责)
步骤:
- 取一根USB Type-C延长线,在母头一端剥开绝缘层。
- 找到G(GND,地线)和V(Vcc,电源)端子。
- 将两根高质量的导线分别焊接到母头的GND和VCC端子上。
- 将焊接好的导线另一端连接到电池座的GND和5V输出端子上。
- 参考连接图以确保接线正确。
- 使用热缩管或绝缘胶带包裹Type-C延长线上裸露的焊接部分,确保绝缘和安全。
第六步:触摸传感器接线
所需材料:
触摸传感器模块、兼容接线(来自步骤三)、焊接器材、跳线(按需使用)
步骤:
取步骤三中准备好的接线,根据上面的电路图,将接线焊接到触摸传感器的引脚上。
第七步:编程测试
- 将行空板从电脑上断开连接。
- 打开电池模块的电源。
- 行空板应该会开机启动。
- 使用行空板上的导航按钮,在根目录中找到forward.py文件。
- 在行空板上直接选择并运行该程序。
- 舵机应该会响应,触摸传感器也应该能够正常接收输入。
第八步:安装行空板支架
行空板M10、3D打印的行空板支架、3颗M3螺丝、电池座
步骤:
- 将电池组的Type-C线通过支架上的预留槽连接到行空板上。
- 将3D打印的行空板支架与行空板上的安装孔对齐。
- 使用3颗M3螺丝将支架固定到行空板上。
第九步:安装触摸传感器
将触摸传感器安装到外壳主体上,用手按压几秒钟,直到胶水变干。
电池座、Type-C延长线、M2螺丝、螺丝刀
步骤:
- 取第二根Type-C延长线,将其牢固地插入电池管理板。
- 将电池组与外壳上预设的螺丝孔对齐。
- 使用M2螺丝将电池组固定到外壳上。
2个舵机(髋部舵机)、M2螺丝、小型螺丝刀
说明:
由于舵机侧面的接线会与主体槽位的壳壁发生碰撞,导致舵机无法直接安装到主体槽位中。为了解决这个问题,我们需要暂时拆卸舵机外壳的一部分。
步骤:
- 用螺丝刀拆下每个舵机底部盖板的螺丝。
- 小心地将舵机的底部部分分离。
- 先将舵机外壳的底部部分放入主体槽位中。
- 将舵机与槽位对齐,并轻轻放置到位。
- 当舵机位置正确后,重新将底部部分安装到舵机上。
- 拧紧之前拆下的螺丝,确保舵机外壳牢固闭合。
- 使用舵机配件包中的M2螺丝将舵机固定到主体上。
2个舵机(连接到一个共用接线)、2个舵机外壳、2个舵机盖板、M2螺丝、速干胶
步骤:
- 取出之前连接到一个共用接线的两个舵机,以及3D打印的脚部舵机部件。
- 将每个舵机插入其对应的外壳中,确保舵机的方向与外壳结构对齐。
- 使用舵机配件包中的M2螺丝将每个舵机固定到其外壳上。
- 取出盖板,对齐轴心,轻轻按压将盖板扣合到外壳上。
- 在盖板与外壳接触的边缘处涂抹少量速干胶,确保粘合牢固。
3D打印的腿部部件、4个舵机摆臂、M2螺丝
步骤:
- 取出舵机附带的4个舵机摆臂,按照提供的图片所示,将其中两个摆臂从中间剪开。
- 将舵机摆臂与3D打印腿部部件上的设计槽位对齐,参考图片中的方向,确保摆臂位置正确。
- 使用M2螺丝将每个舵机摆臂固定到腿部部件上。
将选项切换为“启用”。
3.设置程序自动运行:
导航到“运行程序” -> “root/” -> “main.py”,选择“main.py”并运行一次。
手动运行程序后,该程序将被设置为开机时的默认运行程序。
关闭并重新启动行空板,确认main.py是否自动运行。
注意事项:
如果行空板已经安装到外壳中,导航按钮可能无法直接操作。在这种情况下,可以通过行空板的USB接口连接鼠标来完成这些步骤。
- 取出已经预先安装到定制3D打印支架上的行空板。
- 接入所有接线,包括:通过Type-C接口连接的电池组、3个舵机、触摸传感器。
- 将第四个舵机的信号线焊接到行空板的P16引脚上。
- 将行空板组件放置到位,对准外壳(头部)上的安装孔。
- 使用M2螺丝将行空板组件牢固地固定到外壳上。
第十六步:主体组装
1.定位Type-C数据接口(用于编程和充电):
- 找到外壳上的Type-C数据接口槽位。
- 将Type-C接口小心地放入其指定槽位,并使用速干胶固定。
- 用同样方式,定位充电接口并使用速干胶固定。
- 取主体部件,小心地将其放置到外壳上。
- 对齐螺丝孔位,将所有线缆整齐地收纳在外壳内,确保没有线缆被挤压。
- 确保两条舵机腿部线缆从设计好的槽位中引出。
- 使用5颗M2螺丝将主体固定到外壳上。
第十七步:封闭部件
取下外壳并将其与主体组件对齐,使用 3 个 M2 螺丝将外壳固定到主体组件上。
1.运行初始化脚本:
将行空板连接到电脑,运行initialize.py脚本。该脚本会将所有舵机调整到90°中立位,确保组装时正确对齐。
2.安装腿部:
取两条腿部部件,将它们安装到处于90°位置的舵机上,使用螺丝固定腿部。
3.安装脚部:
取出之前组装好的脚部舵机,将它们以90°位置安装到腿部上,用螺丝将脚部舵机固定牢固。
4.安装头部(耳机部分):
取出耳机部分(头部组件),小心地将其安装在机器人的头部。
现在所有部件都已组装完成,设备已通电并准备就绪,Tillu机器人可以开机了!
代码注释
- 导入模块:程序导入了多个模块:random、threading 和 time 用于随机化、多任务处理和计时。
- 自定义模块:
- 触摸传感器:初始化一个数字引脚(Pin.P24)作为输入触摸传感器。
- 动作控制锁:使用线程锁(action_lock)确保同一时间只能运行一个动作(触摸或语音触发)。
2. 关键功能
- 随机化:从13个预定义的舞蹈动作(如dance1、dance2)中选择一个,选择一个表情(如angry、heart)。
- 并行执行:使用线程同时执行动作和表情。
- 时长管理:两个线程运行5秒后重置到中立状态(reset_positions 和 blink)。
- 确保没有其他动作正在运行(通过action_lock)。
- 执行random_movement_and_expression。
- 命令映射:
3. 主程序
-
以中立状态的眨眼表情开始。
-
在单独的线程中启动touch_listener和voice_listener。
-
持续运行,直到被中断(如按下Ctrl+C),此时调用cleanup函数。
- 基本运动(如前进、后退)。
- 转向(左转、右转)。
- 舞蹈(13个独特的动作,使用同步舵机运动)。
-
播放预录制的视频循环(如blink.mp4、angry.mp4)。
-
确保资源正确清理。
故障排除与自定义:
servo_hip_right.write_angle(95)
servo_hip_left.write_angle(85)
servo_foot_right.write_angle(85)
servo_foot_left.write_angle(100)
复制代码
-
增加或减少servo_hip_*的值以调整腿部角度。
-
调整servo_foot_*的值以更精确地定位脚部。
测试时使用小幅度调整(例如±5度),并观察变化,以避免舵机过载或错位。