Publicado el Deja un comentario

SmartCar v1.0

En esta entrada os proponemos crear un robot tipo coche muy sencillo. Recorrerá nuestra casa sin chocar con las paredes. Lo hará con ayuda de 3 sensores de distancia por infrarrojos, los más sencillos que existen.

Y… ¿para qué sirve esto? ¡Para mil cosas! Nosotros queremos instalarle unos LED ultravioleta y que vaya desinfectando espacios domésticos de forma automática. Pero eso, amigos, es otra historia. ¿Y a ti? ¿Qué idea se te ocurre?

  1. Chasis: SmartCar 2WD

Escogemos como plataforma del robot nuestro chasis básico, el SmartCar, por ser de bajo coste y fácil de ensamblar, conectar y reparar si fuera necesario. Cuenta con 2 ruedas motrices y una rueda loca que hace de apoyo. El chasis está lleno de agujeros útiles para atornillar nuestros sensores e incluye el portapilas.

Debes siempre estudiar dónde colocarás cada elemento según lo que quieras hacer con tu robot.

Nosotros hemos colocado el portapilas abajo para dejar espacio libre arriba en previsión de futuras aplicaciones. Llevar las cuatro pilas delante sobrecarga un poco esta parte y provoca en ocasiones cabeceo en la marcha atrás del robot, lo cual hemos compensado con un contrapeso en su parte posterior (en nuestro caso, con un simpático dinosaurio de goma).

2. Resto de componentes

Como procesador sirve cualquier Arduino. Nosotros hemos empleado el Arduino MEGA con un sensor shield. También puedes emplear: Arduino UNO + sensor shield, o incluso Arduino Nano + expansion shield.

Para salvar los obstáculos, utilizamos 3 sensores de distancia infrarrojos. Éstos tienen lógica invertida habitualmente (0 detecta obstáculo), recuerda comprobar los tuyos en la fase programación.

El kit SmartCar incluye interruptor, pero nosotros hemos preferido incorporarle nuestro módulo pulsador de 12 mm, que nos encanta por su comodidad.

El control de los motores se lleva a cabo con un clásico L298, de corriente y par suficientes, y fácil de programar.

Cables empleados en el proyecto: cable USB impresora para la programación del Arduino (en el caso de emplear un MEGA o un UNO, cable miniUSB si te decides por el Nano); cables Dupont macho-macho, macho-hembra y hembra-hembra.

Sujeciones empleadas en el proyecto: tornillos y tuercas M3, pistola de pegamento caliente (de la empleada en manualidades infantiles) y soldadura para la conexión de los cables a los motores.

Pilas: 4xAA (alimentación 6V). También sirven AA recargables.

Ya estamos listos 😉 . ¡Vamos a ello!

3. Conexiones

Visto el robot desde arriba y según la imagen, atrás está el dinosaurio y a la derecha, el pulsador.

Portapilas rojo-negro a SensorShield Vcc-GND.

L298 IN1-IN2-IN3-IN4 a SensorShield DIGITAL S11-S10-S9-S8.

L298 (+12V)-GND-(+5V) a SensorShield DIGITAL V9-G9-V8.

L298 OUT1-OUT2 a Motor_Izquierdo (si ves luego que giran al revés, inviertes la conexión al L298)

L298 OUT3-OUT4 a Motor_Derecho (si ves luego que giran al revés, inviertes la conexión al L298)

SensorDistancia_Izquierdo VCC-GND-OUT a SensorShield DIGITAL V7-G7-S7.

SensorDistancia_Centro VCC-GND-OUT a SensorShield DIGITAL V6-G6-S6.

SensorDistancia_Derecho VCC-GND-OUT a SensorShield DIGITAL V5-G5-S5.

Pulsador VCC-OUT-GND a SensorShield V3-S3-G3.

4. Programación

// -----------------------------------------------------
// Robot Smart Car v1.0
// Robot autónomo que evita el impacto con las paredes
// Usa 3 sensores: frente y laterales a 45º
//
// Si necesitas ayuda, pues escribir a: contacto@electronperdido.com
// -----------------------------------------------------

// Pines de conexión de los sensores de distancia
#define izq 7
#define cen 6
#define dch 5

// Pines de conexión del L298
#define motA1 11
#define motA2 10
#define motB1 8
#define motB2 9

// Velocidad de los motores (0-255)
#define velA 175
#define velB 210

// Pin del pulsador de inicio
#define inicio 3

// Código que se ejecuta una única vez (configuración)
void setup() {
// Entradas de los sensores de distancia infrarrojos
  pinMode(izq,INPUT);
  pinMode(cen,INPUT);
  pinMode(dch,INPUT);

// Salidas para el manejo del L298
  pinMode(motA1, OUTPUT);
  pinMode(motA2, OUTPUT);
  pinMode(motB1, OUTPUT);
  pinMode(motB2, OUTPUT);

// Entrada del pulsador de marcha/paro
  pinMode(inicio, INPUT);

}

//Variables globales
int direccion = 0;  // Indicará al robot qué acción debe tomar, de las siguientes:
                    // 0:  Parado
                    // 2:  Adelante
                    // -2: Atrás
                    // 1:  Derecha
                    // -1: Izquierda
int on = 0;         // Memoriza el estado Encendido/Apagado

// Bucle que se ejecuta de manera infinita
void loop() {

// Lectura del pulsador de encendido/apagado
  if (digitalRead(inicio)){
    on = !on;    // Invierte el estado
    delay(1000); // Para que dé tiempo a apartar el dedo del botón
  }

  if(on){
    //Acciones cuando está encendido (ON = 1)
    // Lee la señal de los ssensores y actúa. En caso de detección simultánea se da prioridad al sensor frontal
  if (!digitalRead(cen)){ direccion = -2; }
  else if (!digitalRead(izq)){ direccion = 1; }
  else if (!digitalRead(dch)){ direccion = -1; }
  else { direccion = 2; }  

 
  }
    // Acciones cuando está apagado (ON = 0)
  if(!on){
    direccion = 0;
  }

    // Acciones que se ejecutan siempre (en función de la dirección activa los motores en una dirección u otra
  if ( direccion == 0){
    // Parado
    digitalWrite(motA1,HIGH);  digitalWrite(motA2,HIGH);
    digitalWrite(motB1,HIGH);  digitalWrite(motB2,HIGH);
  }

  if ( direccion == 2){
    // Adelante
    // La velocidad de cada motor se ajusta con velA y velB (0-255)
    // El ajuste cuidadoso de estos valores permite hacerlo andar en línea recta
    analogWrite(motA1,velA);  digitalWrite(motA2,LOW);
    analogWrite(motB1,velB);  digitalWrite(motB2,LOW);
  }

    if ( direccion == -2){
    // Atrás
    digitalWrite(motA1,LOW);  analogWrite(motA2,velA-60); // forzamos que al ir hacia atrás lo haga girando
    digitalWrite(motB1,LOW);  analogWrite(motB2,velB-40); // queremos que retroceda más despacio que cuando va hacia delante
    delay(1500); //Retard adicional, para que la marcha atrás se ejecute durante más tiempo
  }

      if ( direccion == -1){
    // Izquierda
    digitalWrite(motA1,LOW);  analogWrite(motA2,velA);
    analogWrite(motB1,velB);  digitalWrite(motB2,LOW);
  }

      if ( direccion == 1){
    // Derecha
    analogWrite(motA1,velA);  digitalWrite(motA2,LOW);
    digitalWrite(motB1,LOW);  analogWrite(motB2,velB);
  }
  
delay(100); // El bucle se repite cada 100ms
}

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *