想让小车自动沿着地上的黑线跑,TCRT5000 红外循迹模块是最常用的选择。它靠红外对管判断脚下是黑是白,把信号给 Arduino 去控制电机方向,就能做成经典的黑白线循迹小车。这篇把工作原理、接线、校准以及单路到多路的控制代码一次写清楚。
TCRT5000 为什么能分辨黑白
模块上一个红外 LED 一直在往下发红外,旁边一个光敏三极管接收地面的反射。地面是白色,反射回来 90% 的红外光,三极管导通多、输出低电平;地面是黑色胶带,吸收掉大部分红外,反射回来很少,三极管截止、输出高电平。就这么一个「反射多少」的区别,让模块能判断脚下是不是黑线。它能分辨的距离很短,最佳工作高度约 2~5mm,所以模块要装得离地面很近。

单个模块怎么接 Arduino
常见单个 TCRT5000 模块有 4 个引脚:VCC 接 5V、GND 接 GND、AO 是模拟输出、DO 是数字输出。用 DO 只要知道「脚下是不是线」,把 AO 接模拟口 A0 能看到连续的反射强度 = 0~1023,数值越大说明反射越少(越黑/越远)。想看平滑曲线或做阈值微调就用 AO,只判断有无线用 DO 更省事。板上还有个电位器,用来调节数字输出的翻转阈值。

最基础的读值代码
先跑一下面这段代码,把 AO 和 DO 的值打印到串口,用手在传感器底下晃,观察白纸和黑线上数值的变化。这样你就知道你自己地面环境下阈值大概是多少,校准好电位器,后面循迹逻辑才有依据。
const int aoPin=A0;
const int doPin=2;
void setup(){ Serial.begin(9600); pinMode(doPin,INPUT);}
void loop(){
int raw=analogRead(aoPin);
int line=digitalRead(doPin);
Serial.print("Raw="); Serial.print(raw);
Serial.print(" DO="); Serial.println(line);
delay(100);
}三路循迹小车的控制逻辑
循迹小车一般左右中放 3 个传感器。中间那个压到黑线说明在直行,往左偏就说明车头往右偏出线了,要有轮减速、右轮加速把它拉回来;往右偏则反过来。下面给出 3 路控制的骨架代码,电机引脚接你自己的电机驱动板(L298N 或 L9110S 都行)。核心就是根据路况给左右轮不同的 PWM 速度做差速纠偏。
// Left=D2, Center=D3, Right=D4 ; motorL=9, motorR=10(PWM)
const int sLeft=2,sC=3,sR=4,mL=9,mR=10;
void setup(){ pinMode(sLeft,INPUT);pinMode(sC,INPUT);pinMode(sR,INPUT);pinMode(mL,OUTPUT);pinMode(mR,OUTPUT);}
void loop(){
bool L=digitalRead(sLeft)==LOW; // LOW=压到黑线
bool C=digitalRead(sC)==LOW;
bool R=digitalRead(sR)==LOW;
if(C&&!L&&!R){ analogWrite(mL,180); analogWrite(mR,180);} // 直行
else if(L&&!R){ analogWrite(mL,80); analogWrite(mR,200);} // 左轮慢右轮快
else if(R&&!L){ analogWrite(mL,200); analogWrite(mR,80);} // 左轮快右轮慢
else { analogWrite(mL,0); analogWrite(mR,0);} // 暂定停车
}几个实操提醒
一是电源:TCRT5000 用 5V,电池供电要给 Arduino 降压稳压(比如 7805 或 DC-DC),别把 7.4V 直接怼上去;二是阈值:务必用螺丝刀调电位器,让传感器在黑白交界处 LED 状态翻转;三是过十字路口容易误判,量少好处理,可适当调低速度或加大阈值差。
本篇为实操改写整理,接线与阈值以实物和你的小车底盘为准。







78转5V那段提醒很实用,电池供电直接怼很容易烧板子。
问下十字路口怎么区分直行和转弯啊?
电位器阈值没校准之前一直乱跑,校准后一贴膜就跑直线,感谢。
我用的 3 路做巡线,车身会左右晃,按文章把速度差调小一点就稳多了。
循迹小车最经典的就是黑白胶带地面了,这个模块灵敏度高,调好电位器很关键。