第10课 画地为牢智能车#

项目介绍:#

前面我们详细的介绍了智能车上各个传感器、模块、扩展板的使用方法。在这里我们可以结合前面课程中知识制作一个画地为牢智能车。实验中,我们通过循迹传感器检测智能车底部是否存在黑线,然后根据检测结果控制两个电机的转动,从而把智能车关在黑线圈中即画地为牢。

流程图:#

画地为牢智能车具体逻辑如下表格。

检测

中循迹传感器

检测到黑线:高电平

检测到黑线:高电平

检测

中循迹传感器

检测到白线:低电平

检测到白线:低电平

检测

左循迹传感器

检测到黑线:高电平

检测到黑线:高电平

检测

左循迹传感器

检测到白线:低电平

检测到白线:低电平

检测

右循迹传感器

检测到黑线:高电平

检测到黑线:高电平

检测

右循迹传感器

检测到白线:低电平

检测到白线:低电平

条件

条件

条件

状态

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

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

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

前进(PWM设为200)

左循迹传感器检测到黑线 或者中循迹传感器检测到黑线 或者右循迹传感器检测到黑线

左循迹传感器检测到黑线 或者中循迹传感器检测到黑线 或者右循迹传感器检测到黑线

左循迹传感器检测到黑线 或者中循迹传感器检测到黑线 或者右循迹传感器检测到黑线

后退(PWM设为200) 然后左旋转(PWM设为200)

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

接线图:循迹模块+电机#

测试代码:#

示例代码 1(KE0165_10.ino):

/*
  keyes 4WD 多功能智能车
  课程 10
  线路跟踪机器人
  http://www.keyes-robot.com
*/
#define L_PIN 11      // 左边传感器引脚
#define M_PIN 7       // 中间传感器引脚
#define R_PIN 8       // 右边传感器引脚
#define MA 2          // 电机M3,M4方向控制引脚
#define PWMA 6        // 电机M3,M4速度控制引脚
#define MB 4          // 电机M1,M2方向控制引脚
#define PWMB 5        // 电机M1,M2速度控制引脚

int lVal, mVal, rVal;

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

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

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

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

/* 功能:小车停止 */
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);             // 电机方向控制引脚配置为输出模式
  pinMode(PWMA, OUTPUT);           // 电机速度控制引脚配置为输出模式
  pinMode(MB, OUTPUT);             // 电机方向控制引脚配置为输出模式
  pinMode(PWMB, OUTPUT);           // 电机速度控制引脚配置为输出模式
}

/* 功能:主循环,读取传感器并控制小车动作 */
void loop() {
  lVal = digitalRead(L_PIN);       // 读取左边传感器的值
  mVal = digitalRead(M_PIN);       // 读取中间传感器的值
  rVal = digitalRead(R_PIN);       // 读取右边传感器的值

  if (lVal == 0 && mVal == 0 && rVal == 0) {  // 当都没有检测到黑线时前进
    advance();
  } else {                                    // 任一传感器检测到黑线则后退再左转
    back();
    delay(500);                               // 后退延时
    turnLeft();
    delay(800);                               // 左转延时
  }
}

测试结果:#

当小车行驶过程中检测到黑线立即撤退,然后左转继续行驶。