制作一款使用三个超声波传感器和四个机械臂轮的机器人,通过在不同方向上移动来避开障碍物
我制作这个机器人是为了参加“2026塞浦路斯机器人展”(Robotex Cyprus 2026)的民间赛挑战。在这一挑战中,机器人必须尽可能多地完成赛道圈数,同时避免撞到墙壁、障碍物或其他遇到的机器人。我认为这是一个绝佳的项目,可以利用我身边闲置的机械臂轮。
结果发现它能很好地避开障碍物,因此我们在这项挑战中获得了第一名。于是,我决定分享这个设计,供他人进一步改进。
该机器人被命名为“喀耳刻”,因为它的三个头部——也就是三个超声波传感器,看起来有点像神话中的同名犬类。
基本上,赛道是一个约1米宽的封闭环形轨道,通常还带有隧道或桥梁结构。沿着墙边有突出的障碍物,容易让紧贴墙壁行驶的机器人被困住;而赛道中央有时也会有立柱,会减缓机器人的速度。在规定时间内完成最多圈数的机器人将获胜。
在我们这次比赛中,我们的机器人速度比其他机器人稍慢,主要是因为我为了安全起见,将速度设置得略高于一半。然而,其算法结合了梅卡努姆轮的特性,使它能够轻松避开其他机器人难以处理的障碍物,同时保持在正确路径上(不偏离赛道轨迹),从而取得成功。
机器人的逻辑:
Mecanum wheels使用滚轮代替轮胎,使机器人能够向任意方向移动。
•当机器人前方检测到一定距离的障碍物时:机器人会以空间最大的方向斜向移动,从而避开障碍物。
•当机器人接近障碍物危险或正面撞到障碍物时:机器人会稍微后退,然后以后轮为轴心,仅使用前轮,在空间最大的方向旋转。
•当机器人靠近墙壁过近时:侧面传感器检测到墙壁,机器人会停止其中一个后轮,以便转向远离墙壁。
第一步:底盘
对于底盘,你可以使用任何能容纳4个TT电机、3个传感器和电子元件的部件。
在我的情况下,我3D打印了一个由earldaniph为Mechamaven平台设计的底盘版本,并根据比赛的尺寸限制进行了修改。当然,任何其他能适配4个TT电机的3D打印底盘都可以使用。
为了给面包板、控制器和传感器留出更多空间,我在3D打印的车架顶部加装了一些Coroplast(一种塑料材料)。
随后,将带有Mecanum轮的电机固定在3D打印的底盘上。
第二步:传感器接线
在完成底盘制作后,我们需要连接三个传感器。两侧传感器主要用于检测墙壁的存在,而前部传感器则用于避免路径上的障碍物。
如上图所示,每个传感器的引脚连接方式如下:
传感器\引脚 | 触发信号 | 回波信号
---|---|---
前部 | D12 | D13
右侧 | D10 | D11
左侧 | D6 | D9
由于Feather的引脚会被羽毛翼遮盖,因此我使用了较长的接线头,其中“公头”一侧连接到面包板,“母头”一侧连接到羽毛翼。传感器通过跳线连接到羽毛翼,并接入面包板。
为了将传感器固定在机箱上,我使用了3D打印的RCWL支架来安装侧边传感器,用双面胶粘贴固定;而前部传感器则安装在一根木棍上,插入Coroplast材料的切口中。前部传感器采用垂直安装而非水平安装,以便更有效地检测细小障碍物,例如立柱。
第三步:电机
电机通过羽毛翼的螺丝端子进行连接。关于编号,各端子与电机的连接方式如下:
M1:左前方
M2:右前方
M3:左后方
M4:右后方
第四步:为电机和旋翼供电
机器人使用两个独立的电池组,一个用于羽毛翼,另一个用于电机及其控制器。
旋翼通过JST连接器与锂离子电池组相连,由电池组提供动力。旋翼自带充电电路,因此Type C接口可用于为连接到JST接口的电池充电。在我的搭建中,我将锂离子电池安装在传感器和面包板之间,并确保JST接口可被访问,以便于快速拆卸电池。
至于电机,它们通过一个4AA电池组供电,该电池组通过旋翼的螺丝端子连接。为了将电池组固定到机器人上,我在机器人顶部使用长金属垫片加装了一层额外的Coroplast材料。电池通过“命令条”固定在第二层的顶部,也可以使用双面胶带进行固定。
电池组内置的开关在比赛期间充当机器人的开关按钮。基本上,锂离子电池始终处于连接状态,使羽毛板能够运行程序;当裁判发出信号时,用户只需将开关切换至“开启”状态,电机即可启动并开始响应循环。
第五步:编程避障算法
机器人的算法使用 CircuitPython 编写,CircuitPython 是一种专为微控制器设计的 Python 嵌入式语言。
为了使程序能够正常运行,它还依赖于 Adafruit 提供的 CircuitPython 库包中的若干库和依赖项。复制到控制器“lib”文件夹中的库包括:
- adafruit_motor
- adafruit_register
- adafruit_hcsr04.mpy
- adafruit_motorkit.mpy
- adafruit_pca9685.mpy
以下是机器人编程的工作原理说明:
首先,我们导入所需的库。对于传感器,可以使用 hcsr04 库,因为这些传感器的引脚与 HCSR04 兼容。motorkit 库则是用于大多数 Adafruit 制作的电机控制器扩展的库。
接着,我们设置电机和传感器的名称,并在此步骤中指定每个传感器的引脚。我还创建了一个变量来表示电机速度,该变量可取值范围为 -1 到 1,以便日后更方便地调整。
上述代码定义了机器人可以执行的所有可能动作。我甚至包含了在主循环中未使用的运动选项,以备将来使用。
具体来说,机器人可以:
•向前和向后移动
•向左或向右移动(stleft/right)
•向左或向右斜向前方移动(dgleft/right)
•在移动过程中转向左侧或右侧,以避开墙壁(turnleft/right)
•以机器人的后部为旋转轴,绕其身体旋转(rotleft/right)
现在我们来分解主循环:
如果前方传感器检测到距离内有障碍物,机器人会根据侧面传感器检测到的空间情况,选择空间最大的方向进行斜向移动,从而避开障碍物。
如果机器人前部过于接近障碍物或墙壁,则会稍微向后退一步以增加安全距离,然后根据哪一侧有更多可用空间再次决定转向方向。
上述方法有助于机器人保持在轨道中央,避免与墙壁过近。当侧面传感器检测到指定距离内的墙壁时,机器人仍继续前进的同时,会通过停止其中一个后轮电机,轻微转向。
如果机器人靠近其一侧的任何墙壁,它会通过向相反方向斜向移动,并由于轨道呈圆形而轻微旋转来避开。
我还附带了一个程序,用于测试传感器并打印其数值,以及Fritzing电路图。
第六步:完成!
完成搭建并上传代码后,机器人已准备好开始比赛并避开障碍物。
本文编译自hackster.io





