经过驱动L298N和寻迹模块的学习,相信大家有能力做出一个最简单的循迹小车,也是最经典的。现在让我们动手开始搭建!

硬件准备

  • Arduino UNO 开发板
  • 两路红外循迹模块(TCRT5000或其他型号)
  • L298N 电机驱动模块
  • 直流减速电机 ×2
  • 小车底盘及轮子(如下图)
  • 7.4V 锂电池(或其他合适电源)
  • 杜邦线若干

电路连接

  1. 红外循迹模块

    • 左传感器 OUT 接 Arduino A0
    • 右传感器 OUT 接 Arduino A1
    • VCC 接 5V,GND 接 GND
  2. L298N 电机驱动

    • IN1 接 Arduino D5(控制左侧电机方向)
    • IN2 接 Arduino D6(控制左侧电机方向)
    • IN3 接 Arduino D9  (控制右侧电机方向)
    • IN4 接 Arduino D10(控制右侧电机方向)
    • ENA 接 Arduino D3(左侧电机 PWM 调速)也可直接跳帽
    • ENB 接 Arduino D11(右侧电机 PWM 调速)也可直接跳帽
    • 驱动模块电源输入接 7.4V 锂电池
  3. 电机接线

    • 左侧电机接 L298N 的 OUT1 和 OUT2
    • 右侧电机接 L298N 的 OUT3 和 OUT4

代码实现

// 定义引脚
const int leftSensor = A0;   // 左循迹传感器
const int rightSensor = A1;  // 右循迹传感器
const int IN1 = 5;           // 左电机方向1
const int IN2 = 6;           // 左电机方向2
const int IN3 = 9;           // 右电机方向1
const int IN4 = 10;          // 右电机方向2
const int ENA = 3;           // 左电机PWM
const int ENB = 11;          // 右电机PWM

// 电机速度(0-255)
const int baseSpeed = 150;    // 基础速度
const int turnSpeed = 200;    // 转向速度

void setup() {
  pinMode(leftSensor, INPUT);
  pinMode(rightSensor, INPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  pinMode(ENA, OUTPUT);
  pinMode(ENB, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int leftValue = digitalRead(leftSensor);   // 读取左传感器
  int rightValue = digitalRead(rightSensor); // 读取右传感器

  // 打印传感器值(调试用)
  Serial.print("Left: ");
  Serial.print(leftValue);
  Serial.print(" | Right: ");
  Serial.println(rightValue);

  // 循迹逻辑
  if (leftValue == LOW && rightValue == LOW) {
    moveForward();  // 两侧均检测到黑线,直行
  } else if (leftValue == HIGH && rightValue == LOW) {
    turnLeft();     // 左侧偏离黑线,左转
  } else if (leftValue == LOW && rightValue == HIGH) {
    turnRight();    // 右侧偏离黑线,右转
  } else {
    stopCar();      // 其他情况停车
  }
}

// 前进函数
void moveForward() {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENA, baseSpeed);
  analogWrite(ENB, baseSpeed);
}

// 后退函数
void moveBackward() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  analogWrite(ENA, baseSpeed);
  analogWrite(ENB, baseSpeed);
}

// 左转函数
void turnLeft() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, HIGH);
  digitalWrite(IN3, HIGH);
  digitalWrite(IN4, LOW);
  analogWrite(ENA, turnSpeed);
  analogWrite(ENB, turnSpeed);
}

// 右转函数
void turnRight() {
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, HIGH);
  analogWrite(ENA, turnSpeed);
  analogWrite(ENB, turnSpeed);
}

// 停车函数
void stopCar() {
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  analogWrite(ENA, 0);
  analogWrite(ENB, 0);
}

调试与优化

  1. 传感器校准:将小车放在黑线上,调整传感器高度,确保能稳定检测黑线(输出 LOW)和背景(输出 HIGH)
  2. 逻辑扩展:如需更复杂路径(如十字路口),可增加延时或状态判断逻辑。

注意事项

  • 确保电机电源与 Arduino 电源共地。
  • 若电机反转,调换 IN1/IN2 或 IN3/IN4 的接线。
  • 红外传感器易受环境光干扰,尽量在稳定光照条件下测试。
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐