5. Jugar con el Módulo de Evitación de Obstáculos

Dos módulos de evitación de obstáculos infrarrojos están montados en la parte delantera del coche, que se pueden usar para detectar algunos obstáculos cercanos.

En este proyecto, se permite que el coche se mueva libremente hacia adelante, y cuando encuentra un obstáculo, es capaz de evitarlo y continuar moviéndose en otras direcciones.

Componentes Necesarios

En este proyecto, necesitaremos los siguientes componentes.

Es definitivamente conveniente comprar un kit completo, aquí está el enlace:

Nombre

ELEMENTOS EN ESTE KIT

ENLACE

3 in 1 Starter Kit

380+

3 in 1 Starter Kit

También puedes comprarlos por separado en los enlaces a continuación.

INTRODUCCIÓN DEL COMPONENTE

ENLACE DE COMPRA

Placa SunFounder R3

BUY

Módulo Controlador de Motor L9110

-

Motor TT

-

Módulo de Evitación de Obstáculos

BUY

Cableado

El módulo de evitación de obstáculos es un sensor de proximidad infrarrojo ajustable en distancia cuya salida es normalmente alta y baja cuando se detecta un obstáculo.

Ahora construye el circuito según el siguiente diagrama.

Módulo IR Izquierdo

Placa R3

OUT

8

GND

GND

VCC

5V

Módulo IR Derecho

Placa R3

OUT

7

GND

GND

VCC

5V

../_images/car_5.png

Ajustar el Módulo

Antes de comenzar el proyecto, necesitas ajustar la distancia de detección del módulo.

Conecta el cableado según el diagrama anterior, enciende la placa R3 (ya sea conectando directamente el cable USB o enchufando el cable de la batería de 9V), sin subir el código.

Coloca un cuaderno u otro objeto plano a unos 5cm frente al módulo IR de evitación de obstáculos.

Luego usa un destornillador para girar el potenciómetro en el módulo hasta que el indicador de señal en el módulo apenas se ilumine, de esta manera ajustarás su máxima distancia de detección a 5cm.

Sigue el mismo método para ajustar otro módulo infrarrojo.

../_images/ir_obs_cali.jpg

Código

Nota

  • Abre el archivo 5.obstacle_avoidance_module.ino en la ruta 3in1-kit\car_project\5.obstacle_avoidance_module.

  • O copia este código en el Arduino IDE.

  • O sube el código a través del Editor Web de Arduino.

El coche se moverá hacia adelante una vez que el código haya sido cargado con éxito. Cuando el módulo infrarrojo izquierdo detecta un obstáculo, retrocederá hacia la izquierda; cuando el módulo infrarrojo derecho detecta un obstáculo, retrocederá hacia la derecha; si ambos lados detectan un obstáculo, retrocederá rectamente.

¿Cómo funciona?

Este proyecto se basa en el valor de los módulos infrarrojos de evitación de obstáculos izquierdo y derecho para hacer que el coche realice la acción adecuada.

  1. Añade la definición de pin para los 2 módulos de evitación de obstáculos, aquí están configurados como INPUT.

    ...
    const int rightIR = 7;
    const int leftIR = 8;
    
    void setup() {
    ...
    
    //IR obstacle
        pinMode(leftIR, INPUT);
        pinMode(rightIR, INPUT);
    }
    
  2. Lee los valores de los módulos infrarrojos izquierdo y derecho y haz que el coche realice la acción correspondiente.

    void loop() {
    
        int left = digitalRead(leftIR);   // 0: Obstructed  1: Empty
        int right = digitalRead(rightIR);
        int speed = 150;
    
        if (!left && right) {
            backLeft(speed);
        } else if (left && !right) {
            backRight(speed);
        } else if (!left && !right) {
            moveBackward(speed);
        } else {
            moveForward(speed);
        }
    }
    
    • Si el módulo IR izquierdo es 0 (obstáculo detectado) y el módulo IR derecho es 1, haz que el coche retroceda hacia la izquierda.

    • Si el módulo IR derecho es 0 (obstáculo detectado), haz que el coche retroceda hacia la derecha.

    • Si los 2 módulos IR detectan el obstáculo al mismo tiempo, el coche retrocederá.

    • De lo contrario, el coche seguirá avanzando.

  3. Acerca de la función backLeft().

    Cuando el motor derecho gira en sentido antihorario y el motor izquierdo no gira, el coche retrocederá hacia la izquierda.

    void backLeft(int speed) {
        analogWrite(A_1B, speed);
        analogWrite(A_1A, 0);
        analogWrite(B_1B, 0);
        analogWrite(B_1A, 0);
    }
    
  4. Acerca de la función backLeft().

    Cuando el motor izquierdo gira en sentido horario y el motor derecho no gira, el coche retrocederá hacia la derecha.

    void backRight(int speed) {
        analogWrite(A_1B, 0);
        analogWrite(A_1A, 0);
        analogWrite(B_1B, 0);
        analogWrite(B_1A, speed);
    }
    
  • &&: El AND lógico resulta en verdadero solo si ambos operandos son verdaderos.

  • !: El NOT lógico resulta en verdadero si el operando es falso y viceversa.