跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++AI算法

智能竞赛小车零基础制作指南:全地形机器人硬件与软件实现

综述由AI生成一款基于 Arduino Uno R3 和 L298N 驱动模块的全地形智能竞赛小车的制作过程。硬件部分采用五路激光寻迹模块感知地形,结合 3D 打印零件与洞洞板焊接完成电路搭建。软件部分使用状态机控制逻辑,针对不同障碍编写速度子函数。项目最终获得省赛一等奖,提供了详细的材料选型、接线规划及代码示例,适合嵌入式初学者参考。

魔法巫师发布于 2026/4/5更新于 2026/6/1432 浏览
智能竞赛小车零基础制作指南:全地形机器人硬件与软件实现

前言

本文总结了一次参加吉林省人工智能创新大赛全地形赛道的经历,旨在分享制作经验,帮助初学者少走弯路。

封面

介绍

本项目小车的核心是 Arduino Uno R3 控制板,使用 L298N 作为驱动模块。它主要依靠激光寻迹模块来感知地形。激光寻迹模块会传回不同的信号,小车根据这些信号判断出不同的地形,然后做出相应的决策。

赛道主要包括如下部分:

全地形地图

在比赛时,大部分人都用的是履带小车,本方案采用的是四轮小车。虽然未上中间的高台,但最终获得了省一等奖。

一、硬件结构

1.整体结构展示

小车整体结构图

小车正面展示

小车侧视图

小车背面展示

小车底部

2.材料选型

  • 分线端子:两个
  • 激光寻迹模块:五个

激光寻迹模块

  • 主控:Arduino UNO R3:一个

arduino uno r3 开发板

分线端子

  • 减速直流电机:四个

电机

  • 2P 接线端子:一个(多买点)

接线端子

  • 洞洞板:一个(多买点)

洞洞板

  • 降压模块:一个(多买点)

降压模块

  • L298N 驱动模块:一个(多买点)

电机驱动板模块

  • 导向轮:两个

导向轮

  • 12V 锂电池:一个

电源

  • 小车底板:一个
  • 排母若干

排母

  • 排针若干

排针

  • 铜线若干

黑红线

  • 轮胎和联轴器

越野轮胎

  • 开关

开关

除了主要部件,还用了铜柱、热缩管、标签贴纸、杜邦线、尼龙扎带、螺丝螺母等辅助材料。

3.洞洞板拖锡

为什么要用洞洞板拖锡? 因为时间紧张,无法等待定制电路板,所以选择手工焊接。提前准备好下载好程序的备用主控板,以便在赛场上快速替换故障模块。引脚之间采用排针排母连接,保证稳定性。

  1. 在纸上把主控板和各个功能模块的引脚分配规划好
L298N 引脚Arduino Uno R3 引脚
ENA11
IN112
IN213
IN38
IN49
ENB10

Arduino Uno R3 中带波浪线标注的引脚才具有 PWM 输出功能

激光寻迹模块 引脚Arduino Uno R3 引脚
L12
L23
ME4
R25
R16
  1. 把每个模块的电源供电安排好
模块种类电压
Arduino Uno R35V(Vin)
L298N12V
激光寻迹模块5V

锂电池的 12V 直接接给 L298N。尽量别用 L298N 输出的 5V 给主控芯片供电,因为那个电压不太稳。可以把锂电池的 12V 接到降压模块上,让降压模块输出 5V,专门给单片机和 5 个激光寻迹模块供电。激光寻迹模块单独供电的同时,要和 Arduino Uno R3 的信号口连接,并且所有模块要共地。L298N 也得和 Arduino Uno R3 共地。

电路拖锡图

上板面

小车内部

4.3D打印零件

五路激光寻迹模块支架

因为激光寻迹模块得倾斜摆放,才能发挥出最好的效果。不过,激光的具体倾斜角度要根据不同的小车模型来调整。

激光寻迹模块支架

导向轮支架

轻松过弯道,就算有时候激光寻迹模块识别不到亚克力板下面的黑线,它也能通过物理接触通过。

导向轮支架

导向轮安装

二、软件思路

1.控制思路

根据寻迹模块检测到黑线的次数,调用对应的障碍子函数,每种障碍都有自己的处理逻辑。

首先确定小车的行走路线,然后根据路线里障碍的顺序来写代码。 思路是先写好小车前进、后退、左转、右转这些基本动作的子函数。在速度控制方面,设计了低速、中速、高速三种前进模式,还有小速度和大速度下的左右转。此外,还写了后退、停止的子函数,以及针对特定地形的速度函数,比如上台阶和通过 U 型管道的速度肯定是不一样的。

流程图

速度子函数代码示例:

void W() //正常速度模式
{
    digitalWrite(IN1, 1);
    digitalWrite(IN2, 0);
    analogWrite(ENA, 140); //PWM 值根据不同转速而定
    digitalWrite(IN3, 1);
    digitalWrite(IN4, 0);
    analogWrite(ENB, 140);
}

设置变量 n 来进行不同状态之间的转换。 像是通过小台阶,将方法写成两个部分分别是小台阶上和小台阶下两个子函数,之后再小台阶上下的子函数里面,进行速度的配置,其他障碍依次类推,越复杂的障碍对应的子函数越多配置速度更加详细。 使用多个变量(如 n、j、t、Q 等)作为计时器或状态转换的条件,用于控制模式的切换和特定动作的执行。

Serial.println("在调试过程中,最好加上输出语句或者设置断点,这样能清楚地了解代码的执行情况")

U 型管模块代码示例:

void U()
{
    int L1_V = digitalRead(L1);
    int L2_V = digitalRead(L2);
    int ME_V = digitalRead(ME);
    int R2_V = digitalRead(R2);
    int R1_V = digitalRead(R1);
    if (L1_V == 1 && L2_V == 1 && ME_V == 1 && R2_V == 1 && R1_V == 1) //1 1 1 1 1
    {
        LW();
        n = 6;
    }
    else if (L1_V == 0 && L2_V == 0 && ME_V == 1 && R2_V == 0 && R1_V == 0) //0 0 1 0 0
    {
        LW();
    }
    else if (L1_V == 0 && L2_V == 1 && ME_V == 0 && R2_V == 0 && R1_V == 0) //0 1 0 0 0
    {
        XZ();
    }
    else if (L1_V == 0 && L2_V == 0 && ME_V == 0 && R2_V == 1 && R1_V == 0) //0 0 0 1 0
    {
        XY();
    }
    else if (L1_V == 0 && L2_V == 0 && ME_V == 0 && R2_V == 0 && R1_V == 0) //0 0 0 0 0
    {
        LW();
    }
}

状态机代码示例:

switch(n)
{
    case 0:
    {
        while(1)
        {
            jiansudai();
            Serial.println("减速带");
            if (n >= 4)
            {
                n = 3;
                Serial.println("改变的 n");
                Serial.println(n);
                break;
            }
        }
        break;
    }
    case 3:
    {
        while(1)
        {
            caodi();
            Serial.println("草地");
            Serial.println(n);
            if (n >= 7)
            {
                Serial.println(">=8");
                Serial.println(n);
                n = 4;
                break;
            }
        }
        break;
    }
    default:
        Serial.println("未知状态");
        break;
}

2.代码烧录

下载 Arduino IDE,安装后连接开发板,选择对应的开发板和端口,编写代码并上传。

Arduino IDE 下载图片

3.资源下载

资料包内容如下:

材料清单

三、经验教训

小车的结构一定要稳定,速度再快也得稳!轮子最好换成窄一点的,这样通过 U 型管道和方形隧道会更方便。比赛情况千变万化,可能会有大灯干扰,地形也可能和在学校模拟的时候不一样,所以一定要做好十足的准备!

总结

祝大家比赛顺利,小车一路畅通无阻!

目录

  1. 前言
  2. 介绍
  3. 一、硬件结构
  4. 1.整体结构展示
  5. 2.材料选型
  6. 3.洞洞板拖锡
  7. 4.3D打印零件
  8. 二、软件思路
  9. 1.控制思路
  10. 2.代码烧录
  11. 3.资源下载
  12. 三、经验教训
  13. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • HTML5 Web Workers 详解:提升网页性能的关键技术
  • Claude Code 工程化实践:Hooks、Commands 与 Agents 协同激活技能
  • 时序数据库 Apache IoTDB 基于 Kubernetes 的部署运维指南
  • MAC M1 本地部署 Llama.cpp 与通义千问 Qwen 1.5-7B 实践指南
  • 多无人机协同吊载高速穿越 0.8 米窄缝技术解析
  • 文心一言与通义千问大模型能力对比评测
  • 大模型应用的 5 种核心架构模式
  • 力扣 1749 题:任意子数组和的绝对值的最大值(DP 与前缀和)
  • 二叉树基础:概念、存储结构与遍历算法详解
  • 县域低空一体化 AI 巡检平台架构与核心功能解析
  • 使用 Document Picture-in-Picture API 实现视频小窗同步控制
  • Llama-Factory 快速迭代 NLP 模型微调指南
  • 通义万相 2.1:多模态生成模型的技术架构与应用场景解析
  • OpenWrt opkg update 报错 Failed to download 且换源无效的解决方案
  • 无人机智能 AI 巡检平台:全域感知与自动化作业方案
  • 算法实战:前缀和与后缀和解决中心下标及数组乘积问题
  • OpenClaw 本地部署及飞书集成教程
  • 基于 Python 的阿布量化交易框架
  • 数据结构入门:链表分类详解与带头双向循环链表初始化
  • MySQL 库核心操作详解:创建、修改与备份实战

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online