第11课 循线智能车#

(1)项目介绍:#

前面我们详细的介绍了画地为牢智能车的实现方法。在这里我们可以结合前面课程中知识制作一个循迹智能车。实验中,我们还是通过循迹传感器检测智能车底部是否存在黑线,然后根据检测结果控制两个电机的转动,从而控制智能车沿着黑线行走。

(2)流程图:#

循迹智能车具体逻辑如下表格。

检测

中循迹传感器

中循迹传感器

检测到黑线:高电平

检测到黑线:高电平

检测

中循迹传感器

中循迹传感器

检测到白线:低电平

检测到白线:低电平

检测

左循迹传感器

左循迹传感器

检测到黑线:高电平

检测到黑线:高电平

检测

左循迹传感器

左循迹传感器

检测到白线:低电平

检测到白线:低电平

检测

右循迹传感器

右循迹传感器

检测到黑线:高电平

检测到黑线:高电平

检测

右循迹传感器

右循迹传感器

检测到白线:低电平

检测到白线:低电平

条件

条件

条件

条件

状态

中循迹传感器检测到黑线

中循迹传感器检测到黑线

左循迹传感器检测到黑线并且 右循迹传感器检测到白线

左循迹传感器检测到黑线并且 右循迹传感器检测到白线

左旋转(PWM设为200)

中循迹传感器检测到黑线

中循迹传感器检测到黑线

左循迹传感器检测到白线并且 右循迹传感器检测到黑线

左循迹传感器检测到白线并且 右循迹传感器检测到黑线

右旋转(PWM设为200)

中循迹传感器检测到黑线

中循迹传感器检测到黑线

左循迹传感器检测到白线并且 右循迹传感器检测到白线

左循迹传感器检测到白线并且 右循迹传感器检测到白线

前进

中循迹传感器检测到黑线

中循迹传感器检测到黑线

左循迹传感器检测到黑线并且右循迹传感器检测到黑线

左循迹传感器检测到黑线并且右循迹传感器检测到黑线

前进

中循迹传感器检测到白线

中循迹传感器检测到白线

左循迹传感器检测到黑线并且 右循迹传感器检测到白线

左循迹传感器检测到黑线并且 右循迹传感器检测到白线

左旋转(PWM设为200)

中循迹传感器检测到白线

中循迹传感器检测到白线

左循迹传感器检测到白线并且 右循迹传感器检测到黑线

左循迹传感器检测到白线并且 右循迹传感器检测到黑线

右旋转(PWM设为200)

中循迹传感器检测到白线

中循迹传感器检测到白线

左循迹传感器检测到白线并且 右循迹传感器检测到白线

左循迹传感器检测到白线并且 右循迹传感器检测到白线

停止

中循迹传感器检测到白线

中循迹传感器检测到白线

左循迹传感器检测到黑线并且右循迹传感器检测到黑线

左循迹传感器检测到黑线并且右循迹传感器检测到黑线

停止

按照前面思路设计好智能车后,我们就需要按照设计思路开始制作智能车。我们需要设计对应的接线,测试代码,然后接线上传代码,运行,确保智能车能够实现理想中的功能。

(3)接线图:#

巡线模块+电机

接线注意:用导线把循迹模块连接到电机驱动扩展板上P1接口的G、V、D11、D7、D8;(M1、M2)和(M3、M4)两对时电机分别对应的连接到电机驱动扩展板上的接口B和接口A,电源接到BAT接口。

(4)测试代码:#

示例代码 1(KE0165_11.ino):

/*
  keyes 4WD 多功能智能车
  课程 11
  线路跟踪机器人
  http://www.keyes-robot.com
*/

const int L_PIN = 11;     // 左边传感器引脚
const int M_PIN = 7;      // 中间传感器引脚
const int R_PIN = 8;      // 右边传感器引脚
const int MA = 2;         // 电机A方向控制引脚
const int PWMA = 6;       // 电机A速度控制引脚
const int MB = 4;         // 电机B方向控制引脚
const int PWMB = 5;       // 电机B速度控制引脚

int lVal, mVal, rVal;

/* 功能:小车前进 */
void advance() {
  digitalWrite(MA, HIGH);          // 电机A正转
  analogWrite(PWMA, 150);          // 电机A速度为150
  digitalWrite(MB, HIGH);          // 电机B正转
  analogWrite(PWMB, 150);          // 电机B速度为150
}

/* 功能:小车后退 */
void back() {
  digitalWrite(MA, LOW);           // 电机A反转
  analogWrite(PWMA, 150);          // 电机A速度为150
  digitalWrite(MB, LOW);           // 电机B反转
  analogWrite(PWMB, 150);          // 电机B速度为150
}

/* 功能:小车左转 */
void turnLeft() {
  digitalWrite(MA, HIGH);          // 电机A正转
  analogWrite(PWMA, 150);          // 电机A速度为150
  digitalWrite(MB, LOW);           // 电机B反转
  analogWrite(PWMB, 150);          // 电机B速度为150
}

/* 功能:小车右转 */
void turnRight() {
  digitalWrite(MA, LOW);           // 电机A反转
  analogWrite(PWMA, 150);          // 电机A速度为150
  digitalWrite(MB, HIGH);          // 电机B正转
  analogWrite(PWMB, 150);          // 电机B速度为150
}

/* 功能:小车停止 */
void stopCar() {
  analogWrite(PWMA, 0);            // 电机A速度为0
  analogWrite(PWMB, 0);            // 电机B速度为0
}

void setup() {
  Serial.begin(9600);              // 设置波特率为9600
  pinMode(L_PIN, INPUT);           // 左边传感器引脚配置为输入模式
  pinMode(M_PIN, INPUT);           // 中间传感器引脚配置为输入模式
  pinMode(R_PIN, INPUT);           // 右边传感器引脚配置为输入模式
  pinMode(MA, OUTPUT);             // 电机A方向引脚配置为输出模式
  pinMode(PWMA, OUTPUT);           // 电机A速度引脚配置为输出模式
  pinMode(MB, OUTPUT);             // 电机B方向引脚配置为输出模式
  pinMode(PWMB, OUTPUT);           // 电机B速度引脚配置为输出模式
}

void loop() {
  lVal = digitalRead(L_PIN);       // 读取左边传感器的值
  mVal = digitalRead(M_PIN);       // 读取中间传感器的值
  rVal = digitalRead(R_PIN);       // 读取右边传感器的值

  if (mVal == 1) {                 // 中间检测到黑线
    if (lVal == 1 && rVal == 0) { // 左边检测到黑线,右边没有,左转
      turnLeft();
    } 
    else if (lVal == 0 && rVal == 1) { // 右边检测到黑线,左边没有,右转
      turnRight();
    } 
    else {                        // 其他情况前进
      advance();
    }
  } 
  else {                          // 中间未检测到黑线
    if (lVal == 1 && rVal == 0) { // 左边检测到黑线,右边没有,左转
      turnLeft();
    } 
    else if (lVal == 0 && rVal == 1) { // 右边检测到黑线,左边没有,右转
      turnRight();
    } 
    else {                        // 其他情况停止
      stopCar();
    }
  }
}

(5)测试结果:#

将驱动扩展板堆叠在UNO R3板上,上传好代码,按照接线图接线,将拨码开关拨至ON端后,智能车能够沿着黑线行走。