Proyecto 13: Tanque en Movimiento en Espacio Confinado

(1)Descripción:

Las funciones de seguimiento de sonido ultrasónico y evasión de obstáculos del carro inteligente han sido presentadas en proyectos anteriores. Aquí pretendemos combinar los conocimientos de los cursos anteriores para confinar el carro inteligente a moverse en un espacio determinado.

En el experimento, utilizamos el sensor de seguimiento de línea para detectar si hay una línea negra alrededor del carro inteligente, y luego controlamos la rotación de los dos motores según los resultados de la detección, para así mantener el carro inteligente dentro de un círculo trazado con línea negra.

La lógica específica del carro inteligente seguidor de línea se muestra en la tabla a continuación:

Condición

Movimiento

Si alguno de los tres sensores de seguimiento de línea detecta líneas negras

Retroceder (establecer PWM en 150) Luego girar a la izquierda (establecer PWM en 150)

Ninguno detecta líneas negras

Avanzar (establecer PWM en 100)

(2)Diagrama de flujo:

(3)Diagrama de conexión:

(4)Código de prueba:

(Nota: No conecte el módulo Bluetooth antes de cargar el código, porque la carga del código también utiliza comunicación serial, y puede haber conflictos con la comunicación serial Bluetooth, lo que puede causar que la carga falle.)

/*
  Keyestudio Mini Tank Robot V3 (Popular Edition)
  lesson 13
  draw a circle for tank
  http://www.keyestudio.com
*/

//El cableado del sensor de seguimiento de línea
#define L_pin  11  //izquierda
#define M_pin  7  //centro
#define R_pin  8  //derecha

#define ML_Ctrl 4  //Define el pin de control de dirección del motor izquierdo
#define ML_PWM 6   //Define el pin de control PWM del motor izquierdo
#define MR_Ctrl 2  //Define el pin de control de dirección del motor derecho
#define MR_PWM 5   //Define el pin de control PWM del motor derecho
int L_val, M_val, R_val;

void setup()
{
  Serial.begin(9600); //Establece la velocidad de baudios en 9600
  pinMode(L_pin, INPUT); //Establece todos los pines del sensor de seguimiento de línea en modo entrada
  pinMode(M_pin, INPUT);
  pinMode(R_pin, INPUT);
  pinMode(ML_Ctrl, OUTPUT);
  pinMode(ML_PWM, OUTPUT);
  pinMode(MR_Ctrl, OUTPUT);
  pinMode(MR_PWM, OUTPUT);
}

void loop () 
{
  L_val = digitalRead(L_pin); //Lee el valor del sensor izquierdo
  M_val = digitalRead(M_pin); //Lee el valor del sensor central
  R_val = digitalRead(R_pin); //Lee el valor del sensor derecho
  if ( L_val == 0 && M_val == 0 && R_val == 0 )  //cuando no se detectan líneas negras, avanzar
  {
    Car_front();
  }
  else  //se detectan líneas negras, retroceder y luego girar a la izquierda
  {
    Car_back();
    delay(700);
    Car_left();
    delay(800);
  }
}

void Car_front()
{
  digitalWrite(MR_Ctrl, HIGH);
  analogWrite(MR_PWM, 100);
  digitalWrite(ML_Ctrl, HIGH);
  analogWrite(ML_PWM, 100);
}

void Car_back()
{
  digitalWrite(MR_Ctrl, LOW);
  analogWrite(MR_PWM, 150);
  digitalWrite(ML_Ctrl, LOW);
  analogWrite(ML_PWM, 150);
}

void Car_left()
{
  digitalWrite(MR_Ctrl, HIGH);
  analogWrite(MR_PWM, 100);
  digitalWrite(ML_Ctrl, LOW);
  analogWrite(ML_PWM, 150);
}

void Car_right()
{
  digitalWrite(MR_Ctrl, LOW);
  analogWrite(MR_PWM, 150);
  digitalWrite(ML_Ctrl, HIGH);
  analogWrite(ML_PWM, 100);
}

void Car_Stop()
{
  digitalWrite(MR_Ctrl, LOW);
  analogWrite(MR_PWM, 0);
  digitalWrite(ML_Ctrl, LOW);
  analogWrite(ML_PWM, 0);
}

(5)Resultados de la prueba:

Después de cargar el código de prueba exitosamente y encenderlo, el carro inteligente se mueve en un espacio confinado, el círculo trazado con línea negra.