战斗机器人 —— 机器人锦标赛


瓦MAMA
转载
发布时间: 2025-11-29 18:13:54 | 阅读数 0收藏数 0评论数 0
封面
本文将为你提供组装和编程迷你相扑机器人的分步指南。你能在这里找到所有必需内容:从电机和电源的准备,到电子元件的安装、基础代码的上传,再到最终在相扑场地(dohyō)的测试。 发挥你的创造力,在过程中享受乐趣,为在赛场上全力以赴做好准备吧!🤖🔥 ⚠️注意:本文记录的是我们机构组织的内部锦标赛,并非公开招募,仅作为教育资源分享,旨在启发其他创作者社区。

准备工作:

材料:

结构与耗材

  1. MDF 结构底座(由你的创客空间提供)* 若发生损坏或丢失,“步骤 3:组装基础结构” 中包含 DXF 格式图纸,可通过激光切割重新制作零件
  2. 纸张、硬纸板、MDF 板、亚克力板或其他轻质材料(用于制作外部外壳)
  3. 木工胶、热熔胶或双面胶
  4. 不同尺寸的塑料扎带
  5. 16 个 M3×10~12 毫米六角螺丝(可选)
  6. 16 个 M3 六角螺母(可选)

电子元件

  1. 1 块 Arduino UNO 或类似开发板(教程基于此型号,兼容 Arduino Nano 等同类产品)
  2. 1 根 USB A 转 USB B 数据线(或与开发板兼容的数据线)
  3. 1 个 H 桥或 L298N 电机驱动板
  4. 2 个 I 型双轴减速电机(减速比 1:120,黄色)(替代方案:2 个 I 型双轴减速电机,减速比 1:48)
  5. 1 套与减速电机兼容的塑料车轮
  6. 2 个 ST1140 线跟踪传感器
  7. 1 个等效于 SRF04 的超声波传感器
  8. 1 个 9V 电池扣
  9. 1 个单刀双掷(SPDT)跷板开关
  10. 1 节 9V 电池(建议备用或使用可充电电池)
  11. 1 套 15~20 厘米长的杜邦线(公对公、公对母)



工具:

  1. 微型斜口钳
  2. 剥线钳
  3. 内六角扳手组
  4. 电烙铁
  5. 焊锡丝
  6. 助焊剂
  7. 绝缘胶带或热缩管(可选)
  8. 电动螺丝刀(可选)
  9. 3 毫米钻头(可选)
1

准备电源

  1. 取两根 15~20 厘米长的公头杜邦线,切断一端并剥去 5~7 毫米绝缘层。
  2. 剥去 9V 电池扣的红色正极线绝缘层。
  3. 将电池扣的红色正极线焊接到跷板开关的一个接线端子上。
  4. 取一根准备好的杜邦线(一端带公头),焊接到开关的另一个端子上。
  5. 用热缩管或绝缘胶带包裹两个焊点进行绝缘处理。
  6. 剥去电池扣的黑色负极线绝缘层。
  7. 将另一根准备好的杜邦线(一端带公头)直接焊接到黑色负极线上。
  8. 用热缩管或绝缘胶带包裹负极焊点。

✅ 预期结果:最终两端各有一个公头,可轻松连接到电路;开关需串联在红色正极线中间,黑色负极线直接延伸。

2

安装电机

  1. 找出两个 MDF 电机支架(每个支架背面均有两个对齐的孔洞)。
  2. 取 4 根 15~20 厘米长的公头杜邦线,2 根一种颜色,2 根另一种颜色;每根杜邦线切断一端,剥去 5~7 毫米绝缘层,保留另一端的公头。
  3. 给每个电机焊接一对杜邦线(每个接线端子一根):左侧电机用颜色 A,右侧电机用颜色 B。
  4. 用热缩管或绝缘胶带包裹焊点,避免接触不良。
  5. 将第一个减速电机放在对应支架上,紧贴平面一侧(不要靠在黄色小圆柱一侧)。
  6. 穿过支架的两个孔洞套上扎带,环绕电机并收紧,确保电机固定牢固。
  7. 在另一个支架上安装第二个减速电机,注意呈镜像对称:当两个支架分别作为 “左侧” 和 “右侧” 组合时,黄色圆柱需朝向外侧。

✅ 预期结果:两个 “支架 + 电机” 模块呈镜像安装,每个电机均焊接有颜色统一的两根杜邦线,焊点绝缘处理完成,公头可直接连接电机驱动器。

💡 小贴士:可使用美纹纸标记电机的正负极,方便后续参考。


3

组装基础结构

📸 组装主结构时,可参考上方图片。

💡 小贴士:你会发现套件中的部分零件带有 “T” 形孔洞,可使用 M3 螺丝和螺母增强连接处的牢固性;若偏好更简便的方式,也可使用木工胶或热熔胶固定。

✅ 组装合格标准:

  1. 电机通过支架夹紧在底盘和第二层结构之间,金属部分朝后,黄色圆柱朝外,固定牢固。
  2. 底盘前部装有一个带两个大圆洞的零件,孔洞朝前。
  3. 底盘前部下方组装有一个半球形零件,作为支撑,防止前部触地。
  4. 第二层结构上可见激光标记的矩形区域,后续将用于安装 H 桥(L298N)和 Arduino UNO。

⚠️ 固定方式:可使用热熔胶、双面胶、塑料扎带;若希望安装更牢固,可先用 3 毫米钻头钻孔,再用 M3 螺丝和螺母固定。

👇🏻 下载激光切割文件(可选)


DXF
FWDSC9KMG169P1C.dxf
189.86KB
4

固定电子元件

  1. 首先将线跟踪传感器安装在底盘下方,可用扎带或 M3 螺丝固定,确保传感器探头朝前。传感器位置可自定义:可沿滑槽调整或旋转,具体根据团队策略确定。
  2. 将超声波接近传感器安装在底盘前部上方的带孔零件上,传感器的发射器和接收器需紧密嵌入孔洞,探头朝前,接线端朝上。
  3. 第二层结构上有专门设计的开关安装位,将开关固定在此处;确保电线从安装位穿向底盘后方,保持规整以便后续连接;将电池扣放置在结构内部,便于插入或更换电池。


5

连接整个系统

所有模块均固定在结构上后,即可进行电路连接。以下按元件分类列出连接方式,方便遵循:

🔋 电池扣

  1. 红色正极线 → H 桥模块的 VMS(+)接线柱
  2. 黑色负极线 → H 桥模块的 GND(-)接线柱

⚙️ H 桥模块

  1. VMS(+)接线柱(与电池红色正极线共用同一接线端子) → Arduino UNO 的 VIN 引脚(或桶形电源接口)
  2. GND(-)接线柱(与电池黑色负极线共用同一接线端子) → Arduino UNO 的 GND 引脚
  3. 5V 接线柱 → 左右线跟踪传感器的 V + 引脚
  4. 5V 排针 → 超声波传感器的 Vcc 引脚
  5. GND 排针 → 超声波传感器的 GND 引脚
  6. ENA 引脚 → Arduino UNO 的 D5 引脚(PWM 输出)
  7. IN1 引脚 → Arduino UNO 的 D8 引脚
  8. IN2 引脚 → Arduino UNO 的 D9 引脚
  9. ENB 引脚 → Arduino UNO 的 D6 引脚(PWM 输出)
  10. IN3 引脚 → Arduino UNO 的 D10 引脚
  11. IN4 引脚 → Arduino UNO 的 D11 引脚

📟 Arduino UNO

  1. D3 引脚 → 超声波传感器的 TRIG 引脚
  2. D2 引脚 → 超声波传感器的 ECHO 引脚
  3. D7 引脚 → 左侧线跟踪传感器的 S 引脚
  4. D4 引脚 → 右侧线跟踪传感器的 S 引脚
  5. GND 引脚 → 左侧线跟踪传感器的 G 引脚
  6. 另一个 GND 引脚 → 右侧线跟踪传感器的 G 引脚

⚡ 电机

  1. 左侧电机 → H 桥模块的 OUT1 和 OUT2 输出端(每个输出端接一根线)
  2. 右侧电机 → H 桥模块的 OUT3 和 OUT4 输出端(每个输出端接一根线)

✅ 重要提示:每个连接仅标注一次,传感器和电机的连接不再重复 H 桥模块或 Arduino UNO 中已说明的内容。


6

安装车轮

将每个车轮安装到对应减速电机的轴上,确保安装到位、无松动。需保证两个车轮对齐,且能自由旋转,不与底盘或电机支架摩擦。

⚠️ 重要规则:车轮需为普通摩擦力类型,不得添加任何辅助物质。机器人禁止使用粘性材料、吸附表面、吸盘或任何旨在固定或粘附在相扑场地(dohyō)上的机构。


7

上传基础代码

⚠️ 当 Arduino 通过 USB 连接电脑时,切勿将 9V 电池接入电池扣。

💻 安装 Arduino IDE 并上传基础代码,使机器人具备基本运行配置:

  1. 安装 Arduino IDE(2.3.6 版本)并首次打开。
  2. 安装 NewPing 库:点击 “项目(Sketch)→ 导入库(Include Library)→ 管理库(Manage Libraries…)”,搜索 “NewPing” 并安装。
  3. 在 Arduino IDE 中新建空白文档。
  4. 复制下方完整代码,粘贴到空白文档中。
  5. 用 USB 线连接 Arduino UNO 和电脑。
  6. 选择开发板:点击 “工具(Tools)→ 开发板(Board)→ Arduino AVR Boards → Arduino Uno”。
  7. 选择端口:点击 “工具(Tools)→ 端口(Port)→ 选择电脑的活跃 USB 端口”。
  8. 点击 “验证(✓)”,再点击 “上传(→)”,直至看到 “上传完成(Upload done)” 提示。
  9. 若要在桌面上测试,先断开 USB 连接,再接入电池,通过开关启动机器人。

👇🏻 复制完整代码

#include <NewPing.h>
/* ===================== 原型映射 ===================== */
// H桥(L298N / "H模块")
const int ENA = 5; // 左侧电机PWM引脚
const int IN1 = 8; // 控制引脚1
const int IN2 = 9; // 控制引脚2
const int ENB = 6; // 右侧电机PWM引脚
const int IN3 = 10; // 控制引脚3
const int IN4 = 11; // 控制引脚4
// 线跟踪传感器(S = 信号引脚)
const int LINE_LEFT = 7; // 左侧线跟踪传感器(S引脚)
const int LINE_RIGHT = 4; // 右侧线跟踪传感器(S引脚)
// 超声波传感器(HC-SR04/SRF04等效型号)
#define TRIG_PIN 3
#define ECHO_PIN 2
#define MAX_DISTANCE 200
NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
/* ===================== 参数设置 ===================== */
// 线跟踪传感器:LOW=检测到黑色,HIGH=检测到白色
const bool LINE_HIGH_IS_WHITE = false;
// >>> 各侧软件反向设置 <<<
// 若机器人“向后前进”,则均设为true
// 若后续调整线路后方向正确,则设为false
const bool LEFT_INVERT = true;
const bool RIGHT_INVERT = true;
// 速度(0-255)
const int SPEED_FWD = 200; // 前进速度
const int SPEED_TURN = 200; // 转向速度
const int SPEED_REV = 200; // 后退速度
// 基础时间参数
const unsigned long TURN_EDGE_MS = 180; // 检测到边缘时的转向时间
const unsigned long RANDOM_TURN_MS = 200; // 无目标时的随机转向时间
const unsigned long ADV_AFTER_TURN = 200; // 随机转向后的前进时间
/* ===================== 电机控制辅助函数 ===================== */
// 方向:+1 = 前进,-1 = 后退,0 = 停止
static inline void motorLeft(int dir, int pwm){
pwm = constrain(pwm, 0, 255);
int d = LEFT_INVERT ? -dir : dir;
if (d > 0) { digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); }
else if (d < 0) { digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); }
else { digitalWrite(IN1, HIGH); digitalWrite(IN2, HIGH); } // 停止(制动)
analogWrite(ENA, pwm);
}
static inline void motorRight(int dir, int pwm){
pwm = constrain(pwm, 0, 255);
int d = RIGHT_INVERT ? -dir : dir;
if (d > 0) { digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); }
else if (d < 0) { digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); }
else { digitalWrite(IN3, HIGH); digitalWrite(IN4, HIGH); } // 停止(制动)
analogWrite(ENB, pwm);
}
void avanzar() { motorLeft(+1, SPEED_FWD); motorRight(+1, SPEED_FWD); } // 前进
void retroceder() { motorLeft(-1, SPEED_REV); motorRight(-1, SPEED_REV); } // 后退
void girarIzquierda(){ motorLeft(-1, SPEED_TURN); motorRight(+1, SPEED_TURN); } // 左转
void girarDerecha() { motorLeft(+1, SPEED_TURN); motorRight(-1, SPEED_TURN); } // 右转
void detener() { motorLeft(0, 0); motorRight(0, 0); } // 停止
/* ===================== 线跟踪传感器读取 ===================== */
bool readLeftWhite(){
int v = digitalRead(LINE_LEFT);
return LINE_HIGH_IS_WHITE ? (v == HIGH) : (v == LOW);
}
bool readRightWhite(){
int v = digitalRead(LINE_RIGHT);
return LINE_HIGH_IS_WHITE ? (v == HIGH) : (v == LOW);
}
/* ===================== 初始化/循环函数 ===================== */
void setup() {
pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
pinMode(LINE_LEFT, INPUT);
pinMode(LINE_RIGHT, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
detener(); // 电机初始状态为停止(安全模式)
Serial.begin(9600);
randomSeed(analogRead(A0));
}
void loop() {
// 读取线跟踪传感器数据(根据LINE_HIGH_IS_WHITE定义解析)
bool leftWhite = readLeftWhite(); // true = 左侧检测到白色
bool rightWhite = readRightWhite(); // true = 右侧检测到白色
// 🚩 优先级:不越出赛道
if (leftWhite) { // 左侧检测到边缘 → 右转
girarDerecha();
delay(TURN_EDGE_MS);
return;
}
if (rightWhite) { // 右侧检测到边缘 → 左转
girarIzquierda();
delay(TURN_EDGE_MS);
return;
}
// 超声波检测
delay(15);
unsigned int distancia = sonar.ping_cm();
if (distancia > 0 && distancia < 30) {
// ✅ 检测到近距离目标 → 前进
avanzar();
} else {
// ❌ 无目标 → 随机转向后前进一段距离
if (random(2) == 0) girarIzquierda();
else girarDerecha();
delay(RANDOM_TURN_MS);
avanzar();
delay(ADV_AFTER_TURN);
}
}

🤖 注意:基础代码仅为起点,你可修改参数或编写自定义代码,优化机器人策略。

8

自定义策略

上一步提供的代码仅为参考,你可从此处修改机器人逻辑,赋予其独特 “个性”,提升获胜概率:

🔛 示例 1:线性巡逻策略 —— 机器人稳定前进,检测到白色边界线时随机转向,以新角度继续前进。循环往复,途中检测到对手时,调整速度将其推出场地。

🔀 示例 2:随机探索策略 —— 机器人通过短距离移动和不规则转向,覆盖场地大部分区域寻找对手。检测到对手后切换模式,直线强力前进,试图将其推出相扑场地(基础代码采用此逻辑)。

💡 最终,团队的创造力、策略设计和编程能力,将决定你的机器人在赛场上的竞争力。


9

连接电池

⚠️ 连接电池前,确保开关处于关闭(OFF)状态。

用双面胶或一滴热熔胶将电池固定在底盘上,但需使用易拆卸的粘合剂 —— 锦标赛期间可能需要更换电池。

🔋 额外提示:携带备用电池或使用可充电电池,避免比赛中出现意外状况。


10

在相扑场地测试

战斗场地为直径 90 厘米的黑色圆形相扑场地(dohyō),边缘有 4 厘米宽的白色条纹,明确标示战斗区域边界。

💥 比赛规则:

  1. 采用三局两胜制,每局最长时长 3 分钟。
  2. 每局机器人初始位置不同:
  3. 第一局:中心位置,背对背,间距 15 厘米;
  4. 第二局:中心位置,侧对侧,间距 15 厘米;
  5. 第三局:相对两端,朝向前方。

🏆 获胜条件:

  1. 成功将对手推出圆形区域;
  2. 对手自行越界;
  3. 对手静止超过 15 秒。

总结:你的机器人需始终保持在黑色区域内,通过白色边界线触发反应避免越界,并利用每次与对手的接触机会将其推出场地。

相扑场地测试是验证策略有效性的关键环节!🚀


11

设计外部外壳

最后一步是赋予机器人独特标识。你可自由设计和制作外部外壳,既保护电子元件,又为作品增添专属风格。可使用硬纸板、MDF 板、亚克力板、3D 打印塑料或创客空间 / 家中可获取的其他材料。

🔍 关键注意事项:⚠️ 外壳不得遮挡传感器 —— 需在前方为超声波传感器预留开口,确保底盘下方无遮挡,线跟踪传感器可正常工作。⚠️ 预留开关操作口;若偏好,可将开关外置,因比赛期间不允许拆卸外壳启动机器人。🛑 创作需遵循以下通用规则:

  1. 机器人最大尺寸不得超过 15×15 厘米(长 × 宽);
  2. 总重量不得超过 350 克;
  3. 禁止使用释放气体或液体的元件;
  4. 禁止使用可能弄脏、划伤或损坏战斗场地的材料或结构;
  5. 严格禁止使用金属刀片或类似结构。
阅读记录0
点赞0
收藏0
禁止 本文未经作者允许授权,禁止转载
猜你喜欢
评论/提问(已发布 0 条)
评论 评论
收藏 收藏
分享 分享
pdf下载 下载
pdf下载 举报