🛠️ 八路循迹模块DO端基础原理
八路循迹模块的核心是8路TCRT5000红外对管,每一路都独立引出DO数字输出引脚:
检测到白色高反射面时,红外信号反射回接收管,DO输出低电平,对应模块上的绿色指示灯亮起。
检测到黑色低反射面时,红外信号被黑线吸收,DO输出高电平,对应绿色指示灯熄灭。
模块上的蓝色电位器可调节检测灵敏度:顺时针旋转灵敏度升高,逆时针旋转灵敏度降低,检测距离适配1~25mm区间。
⚡ 硬件接线(以STM32/Arduino为例)
供电:模块VCC接3.3V~5V,GND接开发板共地,避免电平不匹配导致DO信号乱跳。
DO引脚连接:将8路DO依次接到开发板的8个普通GPIO输入引脚,推荐连续排布(如PA0~PA7),方便一次性读取8位状态值。
电机驱动:搭配L298N/L293D驱动板,左右两组电机的IN引脚接开发板GPIO,ENA/ENB接PWM引脚用于调速。
🚗 极简入门代码(Arduino版)
这段代码直接读取8路DO的数字状态,用最基础的分级控制逻辑,让小车立刻沿着黑线跑起来:
cpp
// 8路DO引脚定义(连续排布)
const int sensorPins[8] = {A0, A1, A2, A3, A4, A5, A6, A7};
// 电机控制引脚
const int in1 = 2, in2 = 3, in3 = 4, in4 = 5;
const int enA = 9, enB = 10;
// 基础速度值
int baseSpeed = 150;
void setup() {
// 初始化传感器引脚为输入
for(int i=0; i<8; i++) pinMode(sensorPins[i], INPUT);
// 初始化电机引脚为输出
pinMode(in1, OUTPUT); pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT); pinMode(in4, OUTPUT);
// 启动PWM调速
analogWrite(enA, baseSpeed);
analogWrite(enB, baseSpeed);
}
// 基础前进函数
void forward() {
digitalWrite(in1, HIGH); digitalWrite(in2, LOW);
digitalWrite(in3, HIGH); digitalWrite(in4, LOW);
}
// 原地左转
void turnLeft() {
digitalWrite(in1, LOW); digitalWrite(in2, HIGH);
digitalWrite(in3, HIGH); digitalWrite(in4, LOW);
}
// 原地右转
void turnRight() {
digitalWrite(in1, HIGH); digitalWrite(in2, LOW);
digitalWrite(in3, LOW); digitalWrite(in4, HIGH);
}
void loop() {
// 读取8路DO状态,1=检测到黑线,0=检测到白底
byte sensorStatus = 0;
for(int i=0; i<8; i++) {
sensorStatus |= digitalRead(sensorPins[i]) << i;
}
// 核心循迹逻辑:根据DO状态分级调整
if(sensorStatus == 0b00011000) {
// 中间2个传感器检测到黑线,直行
forward();
}
else if(sensorStatus < 0b00011000) {
// 黑线偏左,快速右转修正
turnRight();
}
else {
// 黑线偏右,快速左转修正
turnLeft();
}
}
✅ 首次跑通调试步骤
静态校准:上电后把小车放在黑线上,调节电位器,让黑线刚好落在中间2个传感器上时,对应DO引脚电平稳定,指示灯状态清晰。
低速试跑:先把baseSpeed调到100以下,让小车在简单直线路径上跑,确认DO读取逻辑和电机转向没有接反。
逐步提速:确认基础循迹稳定后,逐步调高PWM占空比,同时根据实际路径的弯道复杂度,调整左右修正的速度差,避免小车冲出赛道。
这套方案完全基于DO数字信号实现,不需要复杂的AD采样,新手零门槛就能快速让小车沿着线跑起来。
需要我为你补充适配51单片机的八路循迹DO端口完整代码吗?直接兼容L298N驱动板,拿来就能烧录运行。
发布评论