news 2026/4/15 3:55:16

Arduino小车入门必看:零基础搭建第一个智能小车

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Arduino小车入门必看:零基础搭建第一个智能小车

从零开始造一辆会“躲障碍”的小车:Arduino新手实战全记录

你有没有想过,自己动手做一个能自动避开墙角、不会撞翻花瓶的小车?听起来像科幻电影里的场景,其实用一块十几块钱的开发板就能搞定。

今天我们就来干一件“硬核小事”——从零搭建一台基础智能小车。不需要任何电子基础,只要你会插线、会复制代码,就能让它跑起来。整个过程就像搭乐高+写小程序,但背后藏着机器人控制的核心逻辑。

这不仅是炫技玩具,更是理解“感知-决策-执行”闭环系统的最佳入口。电机怎么转?传感器怎么测距?程序如何让机器“动脑筋”?我们一步步拆解,把每个模块讲透。


主控大脑:为什么选 Arduino Uno?

所有智能设备都有个“指挥中心”,对小车来说就是Arduino Uno。它不是什么神秘芯片,而是一块开源的微控制器板子,有点像迷你版计算机主板,专为快速原型设计打造。

它到底强在哪?

  • 上手极快:插上USB线,装个免费IDE(集成开发环境),点一下“上传”,代码就进去了,不用烧录器、也不用焊电路。
  • 接口够用:14个数字口、6个模拟口,其中D3/D5/D6/D9/D10/D11支持PWM输出——这意味着你可以轻松实现调光、调速。
  • 生态成熟:全球几百万开发者在用,遇到问题搜一句“Arduino XXX 不工作”,几乎都能找到答案。
  • 语言友好:虽然底层是C/C++,但封装得特别简单,连小学生都能写出第一个“点亮LED”程序。

别看它小,功能完整:ATmega328P 芯片、16MHz晶振、稳压电路、串口通信一应俱全。最关键的是——它不挑电源,7–12V直流电随便接,还能通过USB供电调试。

✅ 实战提示:初学者建议用9V电池盒(6节AA)或7.4V锂电池给整车供电,既能驱动电机又不会烧板子。

先练基本功:让板载LED闪起来

每个 Arduino 都自带一个连接到D13的LED灯。我们先写段最简单的代码验证系统是否正常:

void setup() { pinMode(13, OUTPUT); // 设置D13为输出模式 } void loop() { digitalWrite(13, HIGH); // 点亮 delay(1000); digitalWrite(13, LOW); // 熄灭 delay(1000); }

这段代码叫“Blink”,堪称嵌入式界的“Hello World”。运行后你会看到小灯一秒一闪,说明你的开发环境和硬件都没问题——恭喜,第一步成功了!


动力心脏:L298N 驱动两个轮子一起跑

有了大脑,还得有手脚。小车靠轮子前进,轮子靠电机转动,但 Arduino 输出电流太弱,直接带不动电机。这时候就需要一个“放大器”——L298N 电机驱动模块

它是怎么让电机听话的?

L298N 的核心是双H桥电路,你可以把它想象成一个“电流方向开关”。通过控制四个开关的不同组合,能让电流正向流过电机(正转)、反向流过(反转),或者切断(停止)。

更厉害的是,它支持PWM调速。所谓PWM,就是快速通断电源来调节平均电压。比如占空比50%,相当于一半时间通电一半时间断电,电机就以半速运行。

关键引脚说明:
引脚名用途
IN1/IN2控制电机A转向(高低电平决定方向)
ENA使能端,接PWM引脚实现调速
IN3/IN4控制电机B
ENB电机B调速
VCC/GND接5V逻辑电源(通常来自Arduino)
+12V/GND接电机电源(7–12V)

⚠️ 注意:如果使用外部电源供电机,必须将 L298N 和 Arduino 的 GND 连在一起,否则信号不通!

写段代码试试看

下面这段程序控制一个电机完成“前进→暂停→后退”循环:

int enA = 9; // PWM调速 int in1 = 8; int in2 = 7; void setup() { pinMode(enA, OUTPUT); pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); } void loop() { // 正转(前进) digitalWrite(in1, HIGH); digitalWrite(in2, LOW); analogWrite(enA, 200); // 速度约80% delay(2000); // 停止 digitalWrite(in1, LOW); digitalWrite(in2, LOW); delay(1000); // 反转(倒车) digitalWrite(in1, LOW); digitalWrite(in2, HIGH); analogWrite(enA, 150); delay(2000); }

你会发现电机真的按指令动起来了!这就是自动化控制的雏形:程序发令 → 模块执行 → 机械响应


行走之腿:直流减速电机,力气大还稳当

普通电机转得快但扭力小,根本推不动小车。所以我们用的是直流减速电机——在电机后面加了个齿轮箱,牺牲一点转速,换来好几倍的扭矩。

常见参数如 120rpm@6V,意思是每分钟转120圈,在6伏电压下可输出几百克·厘米的扭矩,足够带动1公斤左右的小车爬坡。

这类电机只有两根线,不分正负极,但接反了会反转。实际应用中通常左右各装一个,形成差速驱动结构:左轮停右轮转,小车就原地右拐;两边同速前进,直线行驶。

🔧 小贴士:初次测试时用手托住小车底盘,避免突然启动冲出去摔坏齿轮。


眼睛上线:HC-SR04 超声波避障,让小车学会“看路”

到现在为止,小车只会傻乎乎往前冲。要想智能化,必须加上感知能力。最实用也最便宜的方案就是HC-SR04 超声波传感器

它的工作原理很简单:发出一串40kHz声波,碰到物体反弹回来,模块根据发射和接收的时间差算出距离。

公式如下:
$$
\text{距离(cm)} = \frac{\text{高电平持续时间(μs)} \times 0.034}{2}
$$

为什么除以2?因为声音走了“去程+回程”两段路。

接线与读数

  • Trig 引脚:给一个10微秒的高电平触发测量
  • Echo 引脚:返回一个高电平脉冲,长度对应距离
  • 使用pulseIn(echoPin, HIGH)函数读取这个时间

示例代码:

const int trigPin = 2; const int echoPin = 3; void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); Serial.begin(9600); } void loop() { long duration, distance; // 发送触发信号 digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // 读取回响时间 duration = pulseIn(echoPin, HIGH); distance = (duration * 0.034) / 2; Serial.print("Distance: "); Serial.print(distance); Serial.println(" cm"); delay(100); }

打开串口监视器(Ctrl+Shift+M),你会看到实时更新的距离值。当前方放一本书,数值立刻变小——小车“看见”了障碍物。


把所有零件串起来:构建完整的智能小车系统

现在我们把前面四个模块组装成一个真正的闭环控制系统:

硬件连接清单

模块连接到 Arduino
L298N IN1D8
L298N IN2D7
L298N IN3D5
L298N IN4D4
L298N ENAD9(PWM)
L298N ENBD3(PWM)
HC-SR04 TrigD2
HC-SR04 EchoD3
所有GND共地连接

💡 提醒:电机电源最好独立供电(如锂电池),避免大电流拉低电压导致Arduino重启。

底盘结构推荐

  • 材料:亚克力或塑料底盘(淘宝几十元可购套件)
  • 轮子:两个驱动轮(接电机)+ 一个万向轮(支撑尾部)
  • 布局:超声波居中前置,视野无遮挡

让它真正“智能”起来:加入避障逻辑

最后一步,融合所有功能,写一个自动避障程序:

// 电机控制引脚 int enA = 9, in1 = 8, in2 = 7; // 左电机 int enB = 3, in3 = 5, in4 = 4; // 右电机 // 超声波引脚 int trigPin = 2, echoPin = 6; 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); } void loop() { long duration, distance = measureDistance(); if (distance > 20) { forward(); // 前进 } else { stopMotors(); delay(500); turnRight(); // 距离太近,右转1秒 delay(1000); } delay(100); } long measureDistance() { digitalWrite(trigPin, LOW); delayMicroseconds(2); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); long duration = pulseIn(echoPin, HIGH); return (duration * 0.034) / 2; } void forward() { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, HIGH); digitalWrite(in4, LOW); analogWrite(enA, 200); analogWrite(enB, 200); } void turnRight() { digitalWrite(in1, HIGH); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, HIGH); analogWrite(enA, 200); analogWrite(enB, 150); // 右轮慢一点,转弯更稳 } void stopMotors() { digitalWrite(in1, LOW); digitalWrite(in2, LOW); digitalWrite(in3, LOW); digitalWrite(in4, LOW); }

烧录进去后,小车就会边走边测距。一旦前方障碍小于20厘米,立即停下并右转,绕开障碍继续前行——一个初级自动驾驶系统诞生了!


新手常踩的坑 & 解决方案

❌ 电机不转?

  • 检查 L298N 上的使能跳帽是否插上(ENA/ENB)
  • 确认电机电源已接入且电压足够
  • 查看 INx 引脚是否接错顺序

🌀 小车跑偏?

  • 两侧电机PWM值不同,手动微调使速度一致
  • 检查轮胎是否有打滑、轴是否弯曲
  • 尝试降低整体速度,提高稳定性

📏 超声波数据跳动大?

  • 避免对着吸音材料(如窗帘、毛绒玩具)
  • 多次采样取平均值:
long avg = 0; for(int i=0; i<5; i++) { avg += measureDistance(); delay(10); } distance = avg / 5;

🔌 Arduino 总是重启?

  • 电机启动瞬间耗电过大,造成电压跌落
  • 解决方案:电机和主控使用独立电源,仅共地

后续还能怎么玩?

这台基础小车只是起点。接下来你可以轻松升级:

  • 加红外传感器 → 实现自动循迹
  • 接蓝牙模块(HC-05)→ 手机遥控
  • 换编码电机 + PID算法 → 更精准的速度控制
  • 加陀螺仪(MPU6050)→ 平衡车项目
  • 换ESP32主控 → 支持WiFi联网、远程监控

每一次扩展,都是对新知识的实践。而这一切,都始于你亲手点亮的第一行代码和第一声电机嗡鸣。


现在,拿起你的 Arduino,把线插上,打开 IDE,按下上传按钮。
当那两个轮子第一次按照你的意志转动时,你会明白:
原来创造智能,并没有那么遥远。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 18:53:41

Unreal Engine像素级画质搭配IndexTTS2震撼配音

Unreal Engine像素级画质搭配IndexTTS2震撼配音 在数字内容创作的前沿战场上&#xff0c;我们正见证一场“感官革命”&#xff1a;画面不再只是被看见&#xff0c;声音也不再只是被听见。当虚拟角色的一颦一笑由Unreal Engine以电影级精度渲染而出&#xff0c;而它的每一句低语…

作者头像 李华
网站建设 2026/4/8 10:24:02

JavaScript——时间处理工具函数

时间处理在前端应用中非常普遍&#xff0c;尤其是在社交、新闻等应用中经常需要显示相对时间。 // 计算距离当前时间的描述 function getTimeAgo(time) {if (!time) return ;const seconds Math.floor((Date.now() - new Date(time).getTime()) / 1000);const intervals {年:…

作者头像 李华
网站建设 2026/4/15 8:38:26

利用 screen 命令搭建稳定远程开发环境的完整指南

如何用screen打造坚如磐石的远程开发环境你有没有过这样的经历&#xff1a;在云服务器上跑一个深度学习训练任务&#xff0c;本地电脑一合盖&#xff0c;再打开时发现 SSH 断了&#xff0c;训练进程也莫名其妙终止了&#xff1f;或者正在编译大型项目&#xff0c;网络稍微抖一下…

作者头像 李华
网站建设 2026/4/13 3:18:03

ESP32对接OneNet:固件编译与烧录操作指南

ESP32连接OneNet实战&#xff1a;从编译到烧录&#xff0c;打通设备上云“最后一公里” 你有没有遇到过这样的场景&#xff1f; 手里的ESP32开发板已经焊好&#xff0c;传感器也接上了&#xff0c;代码写得差不多了——可一到烧录就卡住&#xff1a;串口找不到设备、固件跑不…

作者头像 李华
网站建设 2026/4/13 5:29:49

Open3D三维重建实战:5步教你完成碎片配准

Open3D三维重建实战&#xff1a;5步教你完成碎片配准 【免费下载链接】Open3D 项目地址: https://gitcode.com/gh_mirrors/open/Open3D 想要将多个零散的三维碎片拼接成一个完整的场景吗&#xff1f;Open3D的三维重建系统正是解决这个问题的利器&#xff01;想象一下&a…

作者头像 李华