循线小车怎么做:准备四个部分 — 带两个 TT 电机的 2WD 底盘、两个朝下安装、负责读黑线的红外传感器、负责做决定的 Arduino Uno,以及负责转动电机的 L298N。两个传感器都看到白色就直走;哪边的传感器看到黑色,小车就往哪边转。
循线小车是怎么工作的?
循线小车(也叫巡线机器人)沿着白色表面上的黑线行走,逻辑非常简单。两个红外传感器装在车头,一个在线的左边,一个在右边。只要两个都看到白色,小车就一直直走 — 黑线正好在正中间。
当小车偏离时,其中一个传感器会”踩到”黑线。Arduino 停掉同一边的电机,小车就转回线上。这种方法叫 bang-bang control(开关式控制)— 没有复杂的数学,非常适合 RBT(中学设计与工艺课)和 FYP(毕业设计)项目。
| 左传感器 | 右传感器 | 小车动作 |
|---|---|---|
| 白色 | 白色 | 直走 |
| 黑色 | 白色 | 向左转 |
| 白色 | 黑色 | 向右转 |
| 黑色 | 黑色 | 停止(终点线或十字路口) |

需要哪些零件?
2WD 底盘套件已经包含两个 TT 电机、车轮、万向轮和螺丝 — 你只需要加上大脑(Arduino Uno)、电机驱动(L298N)、两个红外传感器和电源。全部都在这份清单里。
零件清单
一个重要提醒:2WD 底盘套件里 TT 电机的焊片需要先焊上电线,才能接到 L298N。两分钟的活 — 如果没焊过,跟着我们的如何焊接排针教程做,技巧是一样的。
L298N 在循线小车里做什么?
L298N 是双 H桥电机驱动模块 — 它能同时驱动两个直流电机,还能分别改变每个电机的转向。Arduino 的引脚扛不动电机电流,所以 L298N 充当中间人:Arduino 发逻辑指令,L298N 从电池供大电流。
每个电机的方向由一对 IN 引脚按下表控制(IN1/IN2 管电机 A,IN3/IN4 管电机 B):
| IN1 | IN2 | 电机 A |
|---|---|---|
| LOW | LOW | 停止 |
| HIGH | LOW | 正转(前进) |
| LOW | HIGH | 反转(后退) |
| HIGH | HIGH | 停止 |
速度则通过 ENA 和 ENB 引脚控制。模块出厂时这两个引脚都插着跳线帽 — 跳线帽插着,电机就只会全速转。拔掉 ENA 和 ENB 的跳线帽,接到 Arduino 的 PWM 引脚,analogWrite() 才能通过改变 PWM 占空比来调速。循线小车必须能调速 — 全速几乎肯定会冲出线外。
关于电压:L298N 用的是双极型晶体管,根据 ST L298 数据手册,电池到电机之间会有大约 1.8–2.5V 的压降。用两节 18650 电池(标称 7.4V),电机实际拿到大约 5–5.6V — 刚好匹配额定 3–6V 的 TT 电机。这就是为什么 2×18650 + L298N 是学校机器人的经典配方。
加分项:保留 5V-EN 跳线帽(板载稳压器),因为我们的供电低于 12V — L298N 的 5V 端子会输出 5V,可以直接通过 5V 引脚给 Arduino Uno 供电,Arduino 不需要另外配电池。只有供电超过 12V 时,才需要拔掉这个跳线帽。注意:用 USB 线上传代码时,先拔掉 L298N 接到 Arduino 的 5V 电线(或拔掉电池)— 不要让 USB 和 L298N 同时给 5V 引脚供电。
红外传感器怎么读黑线?
这种 FC-51 红外传感器其实是反射式传感器:黑色 LED 发射红外光,旁边透明的 LED 等待反射回来的光。做循线小车时,传感器要朝下安装,离地大约 1–2cm。白色表面反射红外线的效果很好;黑色胶带会把它吸收掉。
| 传感器下方的表面 | 红外反射 | 输出(OUT) |
|---|---|---|
| 白色 | 有反射 | LOW(低电平)(检测到反射时输出低电平,active LOW) |
| 黑色胶带 | 被吸收,无反射 | HIGH(高电平) |
注意这个逻辑跟多数人的直觉是反的:白色反光 → OUT 低电平(LOW),黑线吸收 → 高电平(HIGH),也就是低电平代表白色、高电平代表黑色。这是小车”自作主张乱跑”的头号原因 — 下面的代码已经用了正确的逻辑。
传感器上蓝色方形的微调电位器用来调灵敏度,这也是整个项目最关键的一步。流程是这样:把传感器放在白色表面上方的实际安装高度,慢慢转动电位器,直到指示 LED 稳定亮起。然后把小车推到黑色胶带上 — LED 必须熄灭。反复调整,直到两种状态都稳定一致,两个传感器都要做一遍。

所有零件怎么接线?
这台小车的接线看着多,其实很有条理 — L298N 就是中间的枢纽。左电机接 OUT1/OUT2 端子,右电机接 OUT3/OUT4,电池接 12V 和 GND 端子,所有控制信号都来自 Arduino。
| 从 | 引脚 / 电线 | 接到 |
|---|---|---|
| 18650 电池盒(2 节) | 红线(+) | L298N 12V 端子 |
| 黑线(−) | L298N GND 端子 + Arduino GND(必须共地) | |
| L298N | 5V 端子 | Arduino 5V 引脚(5V-EN 跳线帽保留) |
| L298N 控制引脚 | ENA(拔掉跳线帽) | Pin 5(PWM) |
| IN1 | Pin 7 | |
| IN2 | Pin 8 | |
| IN3 | Pin 9 | |
| IN4 | Pin 10 | |
| ENB(拔掉跳线帽) | Pin 6(PWM) | |
| 左红外传感器 | VCC | Arduino 5V |
| GND | Arduino GND | |
| OUT | Pin 2 | |
| 右红外传感器 | VCC | Arduino 5V |
| GND | Arduino GND | |
| OUT | Pin 3 |
底盘套件附带的 4xAA 电池盒可以用来做简单测试,但 18650 双节电池盒配两节锂电池在负载下电压稳得多 — 小车不会跑到一半就”犯困”。

双传感器小车的完整 Arduino 代码是什么?
这段 Arduino 代码实现的就是 bang-bang 逻辑。注意 LAJU(马来语”速度”)设在 PWM 150 而不是 255 — 全速时,传感器还来不及反应,小车就已经冲过线了。先从 150 开始,赛道直线多的话再逐步往上加。
// 双传感器循线小车 - Arduino Uno + L298N
// 记住:这种红外传感器是 active LOW - LOW = 白色(有反射),HIGH = 黑色
const int SENSOR_KIRI = 2; // 左传感器 OUT
const int SENSOR_KANAN = 3; // 右传感器 OUT
const int ENA = 5; // 左电机 PWM 调速(跳线帽已拔掉)
const int IN1 = 7;
const int IN2 = 8;
const int IN3 = 9;
const int IN4 = 10;
const int ENB = 6; // 右电机 PWM 调速(跳线帽已拔掉)
const int LAJU = 150; // PWM 0-255;全速容易冲出线外
void setup() {
pinMode(SENSOR_KIRI, INPUT);
pinMode(SENSOR_KANAN, INPUT);
pinMode(ENA, OUTPUT); pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT);
pinMode(ENB, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
Serial.begin(9600); // 打开 Serial Monitor 检查传感器读数
}
void jalanTerus() {
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); // 左电机前进
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); // 右电机前进
analogWrite(ENA, LAJU);
analogWrite(ENB, LAJU);
}
void belokKiri() {
analogWrite(ENA, 0); // 左电机停止
digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW);
analogWrite(ENB, LAJU); // 右电机推进 - 小车向左转
}
void belokKanan() {
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW);
analogWrite(ENA, LAJU); // 左电机推进 - 小车向右转
analogWrite(ENB, 0); // 右电机停止
}
void berhenti() {
analogWrite(ENA, 0);
analogWrite(ENB, 0);
}
void loop() {
// HIGH = 传感器看到黑色(无反射)
bool kiriHitam = (digitalRead(SENSOR_KIRI) == HIGH);
bool kananHitam = (digitalRead(SENSOR_KANAN) == HIGH);
if (!kiriHitam && !kananHitam) {
jalanTerus(); // 两边都白:黑线在中间
}
else if (kiriHitam && !kananHitam) {
belokKiri(); // 左边压到线:向左转
}
else if (!kiriHitam && kananHitam) {
belokKanan(); // 右边压到线:向右转
}
else {
berhenti(); // 两边都黑:终点线 / 十字路口
}
}
放上赛道之前,先把小车拿起来测试:白纸只放一边传感器下 — 比如只放在右传感器下面,悬空的左传感器会读到黑色,这时右轮应该转动。如果动作相反,多半是左右电机的电线在 L298N 端子上接反了。
赛道怎么做、传感器怎么调?
最便宜的经典学校赛道:黑色电工胶带(宽 18–19mm)贴在白色麻将纸或白板上。先做一个椭圆形赛道 — 在小车跑稳之前避免急弯。两个传感器之间的间距应该比胶带稍宽,大约 3–4cm,这样小车在线中间时,两个传感器都落在白色上。
接着在真正的赛道上重做一遍电位器调校流程,别在桌面上调 — 房间灯光和地板材质都会影响红外反射。打开 Serial Monitor,把两个传感器的读数打印出来,在实际安装高度确认白色 = LOW、黑色 = HIGH,再放车上路。
想看同样的组合装好后在赛道上跑?这个视频把 Arduino、L298N 和红外传感器的搭配从头演示到跑起来:

我们从真实顾客身上看到的常见错误
传感器装得太高
这是最常见的错误。在 4–5cm 的高度,传感器开始”看到”一大片区域的反射 — 连胶带旁边的地板也算进去 — 读数就变得毫无规律。保持离地 1–2cm,并确保两个传感器一样高。
ENA/ENB 跳线帽没拔
跳线帽还插着的话,analogWrite() 完全不起作用 — 电机全速转,小车每个弯都冲出去。如果你的小车快得离谱、完全无视代码里的 LAJU 值,先检查这两个跳线帽。
代码里传感器逻辑写反
很多人以为 HIGH = 检测到东西。对这种反射式传感器来说,LOW 才是”看到白色”。如果小车该停的时候在跑、或者一通电就往反方向转,把传感器读数打印到 Serial Monitor,对照上面的表格逐一核对。
Arduino 和 L298N 没有共地
PWM 和 IN 信号只有在 Arduino 和 L298N 共用同一个参考电位时才有意义。忘了把 Arduino 的 GND 接到 L298N 的 GND,电机就会行为诡异或者干脆不动 — 哪怕其他电线全都接对了。
常见问题
为什么我的小车在弯道冲出线外?
三个嫌疑对象:PWM 太高(降到 130–150 左右)、赛道弯太急超出双传感器逻辑的能力,或者电位器灵敏度还没在真正的赛道上调好。一个一个排查,先从速度开始。
可以用底盘套件附带的 4xAA 电池盒吗?
简单测试可以,但碱性电池的电压在负载下掉得很快 — L298N 再”吃掉”大约 2V 之后,电机只剩大约 3–4V。两节 18650 电池给的扭矩和速度要稳定得多。
为什么用 Arduino Uno 而不是 ESP32?
对不需要 WiFi 的双传感器逻辑来说,Uno 更省事:全 5V 系统(和传感器、L298N 电压一致)、引脚更耐折腾,而且学校示例代码几乎全是为 Uno 写的。完整对比请看 ESP32、ESP8266 和 Arduino Uno 对比。
为什么两个传感器都看到黑色时小车会停?
这是代码故意设计的 — 两个都是 HIGH 通常意味着横向的终点线或十字路口。如果想让小车直接穿过路口,把最后一个分支里的 berhenti() 改成 jalanTerus(),再观察它的表现。
除了比赛,这个项目还适合做什么?
它是 RBT 作品集和 FYP 的好底子,因为一台车就涵盖了传感器、电机驱动和控制逻辑。想做用到同样技能的第二个学校项目,可以试试雨感应自动晾衣架。
最后更新:2026年8月。有问题?WhatsApp 联系我们。



2WD 4WD Smart Car Chassis Single Layer Acrylic Arduino Smart Car Chassis Kit With Motor - 2WD CAR KIT
Arduino Uno Compatible SMD UNO R3 with Type B Cable - ATMEGA328P with CH340G-Microcontroller Project
L298N Motor Driver Module Arduino Compatible Dual H Bridge Dual DC Motor Control Arduino Robotic Car
IR sensor Infrared Range Finder Adjustable Distance Sensor Obstacle Avoidance Arduino Robotic
3.7V 18650 Battery Rechargeable Li-Ion Battery 1200mAh 2200mAh 3200mAh Flat Top - 18650 Li-Ion Battery (2200mAh)
18650 Battery Holder 1/2/3/4 Slot 3.7V Battery Cell Housing Battery Case Battery Casing - 18650 BATTERY HOLDER(2)