公司动态

从零搭建Arduino智能小车:硬件选型、电路连接与避障编程全攻略

📅 2026/8/16 2:51:04
从零搭建Arduino智能小车:硬件选型、电路连接与避障编程全攻略
这次我们来看一个 Arduino 智能小车项目。对于很多电子爱好者、学生和创客来说自己动手组装一台能跑、能避障、甚至能遥控的小车是入门嵌入式开发和机器人控制最直观、也最有成就感的实践。这个项目不追求复杂的算法重点在于硬件选型、电路搭建、代码烧录和功能验证的完整流程。无论你是参加工创赛、课程设计还是个人兴趣学习这篇文章都能提供一个清晰的路线图。Arduino 智能小车的核心在于其模块化和易用性。你不需要从零设计 PCB也不需要编写复杂的底层驱动Arduino 生态提供了丰富的库和成熟的硬件模块。本文将从零开始带你完成一台基础智能小车的组装与编程。我们会重点关注硬件清单的选购、电路连接的正确性、Arduino IDE 的环境配置、核心控制代码的编写以及避障、巡线等基础功能的实现与调试。整个过程门槛不高但能让你系统掌握从硬件到软件的全链路开发技能。如果你关心的是需要准备哪些零件总成本大概多少代码怎么写遇到电机不转、传感器没反应怎么办这篇文章可以直接参考。我们将以最通用的 Arduino Uno R3 作为主控板搭配 L298N 电机驱动模块、超声波传感器等常见模块进行讲解。这些组件价格低廉、资料丰富非常适合初学者。1. 核心能力速览在开始动手之前我们先快速了解这个项目能实现什么以及你需要准备什么。能力项说明项目类型嵌入式硬件开发 / 机器人入门实践核心功能电机驱动前进、后退、转向、超声波避障、红外巡线、蓝牙/Wi-Fi 遥控可选主控平台Arduino Uno R3 (兼容 CH340 芯片版本)推荐硬件Arduino 主板、电机驱动模块、直流减速电机、超声波模块、红外传感器、小车底盘套件、电池开发环境Arduino IDE (或 PlatformIO, Arduino Web Editor)编程语言C/C (Arduino 框架)关键技能基础电路连接、Arduino 引脚控制、PWM 调速、串口通信、传感器数据读取适合场景创客教育、电子竞赛、课程设计、个人兴趣项目、机器人算法验证平台这个项目的“显存占用”在这里就是你的物料成本和时间投入。整体花费通常在 100 至 300 元人民币之间具体取决于所选传感器的多少和底盘质量。它的“一键启动”则是上电后烧录好的程序自动运行。2. 适用场景与使用边界适合谁电子/自动化/计算机相关专业的学生用于完成课程设计、毕业设计或备战“工创赛”等赛事。创客与硬件爱好者希望亲手打造一个可交互的智能硬件学习传感器和执行器的控制。中小学科技教师或家长作为 STEM 教育的实践项目培养孩子的动手能力和逻辑思维。软件开发者想了解硬件如何与软件交互拓展物联网IoT开发技能。能解决什么问题理论与实践结合将编程逻辑转化为真实的物理运动。传感器应用入门学习如何使用超声波测距、红外反射等传感器感知环境。控制系统搭建理解开环与闭环控制的基本概念如简单的巡线就是闭环。为复杂项目奠基此小车平台可扩展为自动驾驶模型、物流搬运小车、环境监测机器人等。不适合什么场景需要高精度定位或高速运算的场景Arduino Uno 处理能力有限内存小不适合运行 SLAM 或复杂视觉算法可考虑升级为 ESP32 或 Raspberry Pi。商业产品或需要长期稳定运行的工业环境Arduino 开发板设计用于原型验证在可靠性、防护等级上不如工业控制器。完全零基础的纯软件人员需要具备最基础的电路知识如正负极、短路和动手焊接/接线的意愿。安全与合规边界电气安全使用合适的电池如 18650 锂电池组避免短路。电机驱动模块可能发热注意散热。运动安全小车在测试时可能突然启动请确保在空旷、平整的桌面或地面进行远离边缘。版权与开源Arduino 生态本身是开源的项目中使用的库通常遵循开源协议。在分享或参赛时注明所使用的库和参考来源是良好的实践。3. 环境准备与前置条件在购买零件前我们先确保软件开发环境就绪。1. 操作系统Windows 10/11, macOS, 或 Linux 发行版均可。本文以 Windows 环境为例进行说明。2. 安装 Arduino IDE这是最官方的开发环境集成了代码编辑、编译、上传和串口监视功能。下载访问 Arduino 官网下载对应操作系统的安装包。安装运行安装程序建议勾选“安装 USB 驱动”这对于识别 CH340 等 USB 转串口芯片至关重要。验证安装打开 Arduino IDE在文件-示例-01.Basics中打开Blink示例程序。如果能正常打开说明 IDE 安装成功。3. 准备 USB 数据线你需要一根USB-A 转 USB-B 方口线来连接电脑和 Arduino Uno 板。这是最常见的连接线。4. 硬件清单采购建议以下是组装一台具备基础避障功能的小车所需的核心物料清单。你可以在各大电子元器件电商平台如淘宝、京东、得捷电子等搜索购买。序号组件名称数量关键说明参考单价元1Arduino Uno R3 开发板1建议选 CH340 芯片版本性价比高驱动易安装。20-302智能小车底盘套件1包含底盘、2个或4个直流减速电机、轮子、万向轮/球、螺丝包。40-803L298N 电机驱动模块1最常用的双路 H 桥驱动可同时驱动两个直流电机。10-154HC-SR04 超声波模块1用于测距避障。5-8518650 锂电池及电池盒1套建议使用 2节 18650 串联的电池盒输出 7.4V为电机驱动供电。15-2569V 电池或电池扣1为 Arduino 板单独供电可选也可从 L298N 取 5V。5-107杜邦线若干公对公、公对母、母对母都需要用于连接各模块。10-208面包板1用于扩展连接和测试非必须但强烈推荐。5-10总计约 110-200注若想增加巡线功能还需购买TCRT5000 红外反射传感器模块通常 3-5 元一个一般需要 3-5 个。若想增加蓝牙遥控需购买HC-05 或 HC-06 蓝牙模块约 15-25 元。4. 硬件组装与电路连接这是最关键的一步正确的连接是代码能正常控制硬件的前提。我们分步进行。4.1 机械结构组装根据你购买的小车底盘套件说明书将直流减速电机安装到底盘上并固定好轮子。将万向轮或球轮安装到底盘前部或后部确保小车能平稳保持三点或四点支撑。使用螺丝或扎带将 Arduino 板、L298N 模块、电池盒等初步固定到底盘上。注意布局为后续连接杜邦线留出空间。4.2 电源系统连接电源连接错误是导致模块烧毁的最常见原因请仔细核对。L298N 供电将 2节 18650 电池盒的输出线红正黑负连接到 L298N 模块的12V和GND端子。注意即使电池是 7.4V也接在12V口这个端子实际是电机电源输入口。L298N 输出将 L298N 模块的5V输出端子与 Arduino 的5V引脚用杜邦线连接同时将两者的GND用杜邦线连接起来。这样L298N 在给电机供电的同时也能通过其稳压芯片给 Arduino 供电无需额外的 9V 电池。这是最简洁的供电方案。使能跳线帽确保 L298N 模块上控制电机 A 和电机 B 的使能端ENA和ENB插上了跳线帽默认使能全速。后续调速时会拔掉通过 Arduino 的 PWM 引脚控制。4.3 电机与驱动连接假设我们使用两个电机驱动后轮差速转向。将左侧电机的两根线连接到 L298N 的OUT1和OUT2。将右侧电机的两根线连接到 L298N 的OUT3和OUT4。如果电机转向与预期相反只需将这两根线对调即可。4.4 控制信号连接将 L298N 的控制引脚连接到 Arduino 的数字引脚。L298N 引脚Arduino 引脚功能说明ENA5(PWM)左侧电机使能/调速IN14控制左侧电机方向IN27控制左侧电机方向ENB6(PWM)右侧电机使能/调速IN38控制右侧电机方向IN49控制右侧电机方向连接方式使用公对母杜邦线一端插在 L298N 的排针上另一端插在 Arduino 的对应插孔。4.5 超声波传感器连接将 HC-SR04 模块连接到 Arduino。HC-SR04 引脚Arduino 引脚功能说明VCC5V电源正极Trig2触发测距信号Echo3接收回波信号GNDGND电源地至此硬件连接基本完成。上电前请务必再次检查所有电源线红正黑负是否正确特别是 Arduino 和 L298N 的5V和GND是否已连通。5. 软件环境配置与驱动安装硬件连接好后我们需要让电脑识别 Arduino 板。连接 USB 线用 USB 线将 Arduino Uno 与电脑连接。安装 CH340 驱动如果需要如果你的 Arduino 是 CH340 芯片版本Windows 系统可能需要手动安装驱动。可以在 Arduino IDE 安装目录下的drivers文件夹里找到或者从网络搜索“CH340 驱动”下载安装。安装后在 Windows 设备管理器的“端口 (COM 和 LPT)”下应该能看到类似“USB-SERIAL CH340 (COM3)”的设备记住后面的 COM 端口号如 COM3。配置 Arduino IDE打开 Arduino IDE。点击工具-开发板选择Arduino Uno。点击工具-端口选择刚才在设备管理器中看到的 COM 端口如 COM3。6. 基础功能代码编写与测试不要急于编写完整的避障程序。我们先分模块测试确保每个部分都工作正常。6.1 测试电机驱动上传以下代码测试小车是否能基本前进、后退、左转、右转。// 引脚定义 const int ENA 5; const int IN1 4; const int IN2 7; const int ENB 6; const int IN3 8; const int IN4 9; void setup() { // 设置所有控制引脚为输出模式 pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); // 初始化串口用于调试 Serial.begin(9600); Serial.println(Motor Test Start!); } // 电机控制函数 void setMotor(int motor, int speed, int direction) { // motor: 0 左电机1 右电机 // speed: 0-255, PWM调速值 // direction: 0 停止1 前进-1 后退 int in1, in2, en; if (motor 0) { // 左电机 in1 IN1; in2 IN2; en ENA; } else { // 右电机 in1 IN3; in2 IN4; en ENB; } if (direction 0) { // 停止 digitalWrite(in1, LOW); digitalWrite(in2, LOW); analogWrite(en, 0); } else if (direction 1) { // 前进 digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(en, speed); } else if (direction -1) { // 后退 digitalWrite(in1, LOW); digitalWrite(in2, HIGH); analogWrite(en, speed); } } void loop() { Serial.println(Forward 2s); setMotor(0, 200, 1); // 左电机前进速度200 setMotor(1, 200, 1); // 右电机前进速度200 delay(2000); Serial.println(Backward 2s); setMotor(0, 200, -1); setMotor(1, 200, -1); delay(2000); Serial.println(Turn Left 1s); setMotor(0, 150, -1); // 左电机后退 setMotor(1, 150, 1); // 右电机前进 delay(1000); Serial.println(Turn Right 1s); setMotor(0, 150, 1); // 左电机前进 setMotor(1, 150, -1); // 右电机后退 delay(1000); Serial.println(Stop 1s); setMotor(0, 0, 0); setMotor(1, 0, 0); delay(1000); }操作与验证将代码复制到 Arduino IDE 中。点击上传按钮向右的箭头。上传成功后小车应该会按照“前进2秒 - 后退2秒 - 左转1秒 - 右转1秒 - 停止1秒”的循环动作。如果电机不转检查电源是否接通L298N 和 Arduino 的电源指示灯是否亮。检查杜邦线是否插紧特别是控制引脚。检查代码中的引脚定义是否与实际连接一致。尝试调换电机的两根线可能电机极性接反。用万用表测量 L298N 的电机输出端是否有电压变化。6.2 测试超声波传感器单独测试超声波测距是否准确。const int trigPin 2; const int echoPin 3; void setup() { Serial.begin(9600); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); } void loop() { // 发送一个10us的高电平脉冲触发测距 digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // 读取回波高电平持续时间单位微秒 long duration pulseIn(echoPin, HIGH); // 计算距离声速340m/s除以2因为是往返距离 // 距离 (持续时间 * 0.034) / 2 持续时间 * 0.017 (厘米) int distance duration * 0.017; Serial.print(Distance: ); Serial.print(distance); Serial.println( cm); delay(500); // 每500ms测一次 }操作与验证上传此代码。打开 Arduino IDE 的工具-串口监视器设置波特率为 9600。在超声波传感器前方放置障碍物如书本移动障碍物观察串口监视器输出的距离值是否随之变化。有效测距范围通常在 2cm 到 400cm 左右。如果一直输出0或超大值检查 VCC 和 GND 是否接反或接错。检查 Trig 和 Echo 引脚是否与代码定义一致。尝试给VCC和GND之间并联一个 10uF 的电容以稳定电源。7. 核心功能集成自动避障小车将电机控制和超声波测距结合起来实现一个简单的自动避障逻辑前进遇到障碍物距离小于设定阈值则后退并随机转向。// 引脚定义 (与之前相同) const int ENA 5; const int IN1 4; const int IN2 7; const int ENB 6; const int IN3 8; const int IN4 9; const int trigPin 2; const int echoPin 3; // 避障阈值厘米 const int OBSTACLE_DISTANCE 20; // 电机速度 const int MOTOR_SPEED 180; const int TURN_SPEED 150; void setup() { pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); randomSeed(analogRead(0)); // 初始化随机数种子 } // 测距函数 int getDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration pulseIn(echoPin, HIGH); return duration * 0.017; } // 电机控制函数 (与之前相同略作简化) void motorControl(int leftSpeed, int leftDir, int rightSpeed, int rightDir) { // 左电机 digitalWrite(IN1, leftDir 1 ? HIGH : LOW); digitalWrite(IN2, leftDir -1 ? HIGH : LOW); analogWrite(ENA, leftSpeed); // 右电机 digitalWrite(IN3, rightDir 1 ? HIGH : LOW); digitalWrite(IN4, rightDir -1 ? HIGH : LOW); analogWrite(ENB, rightSpeed); } void loop() { int distance getDistance(); Serial.print(Distance: ); Serial.println(distance); if (distance OBSTACLE_DISTANCE distance 100) { // 前方无障碍且在有效范围内 // 前进 motorControl(MOTOR_SPEED, 1, MOTOR_SPEED, 1); Serial.println(Moving Forward); } else { // 遇到障碍先停止 motorControl(0, 0, 0, 0); delay(200); // 后退一小段 motorControl(MOTOR_SPEED, -1, MOTOR_SPEED, -1); Serial.println(Moving Backward); delay(500); // 随机左转或右转 motorControl(0, 0, 0, 0); delay(200); if (random(2) 0) { // 随机数0或1 // 左转 motorControl(TURN_SPEED, -1, TURN_SPEED, 1); Serial.println(Turning Left); } else { // 右转 motorControl(TURN_SPEED, 1, TURN_SPEED, -1); Serial.println(Turning Right); } delay(random(300, 700)); // 随机转向时间 } delay(100); // 主循环延迟 }功能验证上传此代码。将小车放在空旷地面上电。观察小车行为正常情况下应向前直行。用手或书本在小车前方约 20cm 内模拟障碍物。小车应能检测到障碍物先后退再随机转向然后继续前进。通过串口监视器可以实时查看距离数据和当前状态。8. 功能扩展与进阶思路基础避障实现后你可以在此基础上增加更多功能。8.1 增加红外巡线功能巡线是智能小车比赛的经典项目。你需要购买 3-5 个 TCRT5000 红外传感器并排安装在小车底部。连接每个传感器的VCC接5VGND接GNDDO数字输出接 Arduino 的数字引脚如10,11,12。原理传感器发射红外光接收反射光。黑线吸收红外光反射弱输出高电平白底反射红外光反射强输出低电平。逻辑读取所有传感器的状态判断黑线相对于小车中心的位置从而调整左右电机速度实现 PID 或简单比例控制使小车沿黑线行驶。8.2 增加蓝牙遥控功能通过手机 APP 控制小车。硬件添加 HC-05 或 HC-06 蓝牙模块。连接蓝牙模块的VCC接5VGND接GNDTXD接 Arduino 的RX引脚 0RXD接 Arduino 的TX引脚 1。注意烧录程序时需断开RX/TX连接否则可能冲突。代码编写程序通过Serial读取手机 APP 发送的指令如 ‘F’, ‘B’, ‘L’, ‘R’, ‘S’ 分别代表前、后、左、右、停并控制电机动作。8.3 升级主控平台如果觉得 Arduino Uno 性能或接口不够用可以考虑ESP32自带 Wi-Fi 和蓝牙性能更强引脚更多适合做物联网小车或需要无线图传的项目。在 Arduino IDE 中通过开发板管理器安装 ESP32 支持即可开发。STM32性能强大资源丰富但开发环境如 Keil, STM32CubeIDE和库生态相对复杂适合有一定基础后进阶学习。9. 常见问题与排查方法在组装和调试过程中你可能会遇到以下问题问题现象可能原因排查方式解决方案Arduino IDE 无法上传程序1. 端口选择错误2. CH340 驱动未安装3. 开发板类型选错4. 其他程序占用了串口1. 检查设备管理器端口号2. 检查驱动安装3. 关闭串口监视器或其他串口工具1. 重新选择正确的 COM 端口2. 安装 CH340 驱动3. 选择Arduino Uno4. 关闭所有可能占用端口的软件电机完全不转1. 电源未接通或电压不足2. L298N 使能跳线帽未插或使能引脚未置高3. 电机线未接牢或接错4. 程序未上传成功1. 检查电池电量测量 L298N 输入电压2. 检查ENA/ENB跳线帽或代码中 PWM 输出3. 重新插拔电机线调换极性测试4. 上传一个简单的Blink程序测试 Arduino1. 充电或更换电池2. 插上跳线帽或检查analogWrite函数3. 确保连接牢固尝试对调电机线4. 确保上传时无错误板载 LED (13号引脚) 应闪烁电机只朝一个方向转1. 控制电机方向的两个引脚IN1/IN2, IN3/IN4逻辑设置错误2. 其中一个方向控制引脚接触不良1. 检查代码中digitalWrite设置高低电平的逻辑2. 检查杜邦线连接1. 修正代码逻辑前进时 (HIGH, LOW)后退时 (LOW, HIGH)2. 重新插拔或更换杜邦线超声波传感器读数始终为 0 或异常大1. 电源接反或接触不良2. Trig 和 Echo 引脚接错或接触不良3. 测量对象不适合如透明、吸音材料4. 传感器本身故障1. 检查 VCC 和 GND2. 检查 Trig 和 Echo 连接3. 换用书本等物体测试4. 更换传感器测试1. 确保电源正确2. 确保引脚连接正确且牢固3. 使用合适的障碍物4. 更换传感器小车行为不稳定抽搐、跑偏1. 电池电量不足导致供电不稳2. 机械结构松动轮子打滑3. 地面不平或有坡度4. 两个电机性能有差异转速不同1. 测量电池电压2. 检查所有螺丝和轮子紧固情况3. 在平整地面测试4. 分别测试两个电机空载转速1. 给电池充电2. 紧固所有机械部件3. 选择平整地面4. 在代码中为两个电机设置略微不同的 PWM 值进行校准增加模块后系统不稳定1. 总功耗超过电源负载能力2. 杜邦线接触电阻过大或线序混乱3. 引脚冲突或代码逻辑错误1. 测量总电流检查电池和 L298N 是否发烫2. 逐一排查新模块的连接3. 检查引脚定义是否重复1. 使用容量更大的电池或分开供电2. 使用质量好的杜邦线理清线序3. 重新规划引脚避免冲突10. 最佳实践与项目建议分步测试循序渐进不要一次性连接所有模块并编写复杂代码。务必遵循“电源 - 电机 - 单个传感器 - 集成逻辑”的顺序进行测试每步成功后再进行下一步。善用串口调试Serial.print()是你的好朋友。将关键变量如传感器读数、电机状态打印到串口监视器是定位问题最有效的方法。代码模块化将电机控制、传感器读数等功能封装成函数如本文中的setMotor()和getDistance()。这使主循环逻辑清晰易于维护和调试。电源管理电机启动瞬间电流很大可能引起 Arduino 复位。确保电机电源接 L298N和控制电源给 Arduino之间共地。如果问题严重可以考虑使用大电容并联在电机电源两端缓冲或使用独立的电源为 Arduino 供电。扩展时注意引脚资源Arduino Uno 的模拟引脚A0-A5也可以作为数字引脚使用。提前规划好各模块所需引脚制作一个引脚分配表。版本管理与备份使用 GitHub 或本地文件夹管理你的代码版本。每次重大修改前备份旧代码。参与社区遇到棘手问题可以在 Arduino 中文社区、CSDN、知乎等平台搜索或提问。很多坑别人已经踩过善于利用现有资源能极大提高效率。从零组装一台 Arduino 智能小车最大的收获不是小车本身而是解决问题的完整流程定义需求、选型采购、硬件连接、环境配置、分步调试、集成测试、功能扩展。这个过程中遇到的每一个“为什么不动”的疑问和最终解决后看到的“动起来了”的喜悦正是硬件开发的魅力所在。建议你先基于本文完成基础避障小车确保所有环节都跑通。之后无论是增加巡线、蓝牙遥控还是尝试用 ESP32 做 Web 控制都有了坚实的起点。项目的所有代码和连接图都已在文中给出你可以直接复制使用并根据自己的硬件情况进行微调。