Robot esquiva obstáculos

 

Una de las formas más divertidas de aprender a usar microcontroladores es diseñar y montar tu propio robot. Lo bueno es que te permite jugar con el control de motores, la gestión de sensores, la entrada y salida desde el controlador, etc. Gracias a la plataforma Arduino podemos crear un robot .

Primero la lista de componentes:

  • Chasis para el robot fabricado en el aula de tecnología. Instrucciones para fabricar y montar el chasis leer más..

  • Protoboard pequeña (la he usado para distribuir más cómodamente el cableado). Leer más...
  • Driver de motores L293D.  Leer más..
  • Un servo (por ejemplo un TowerPro SG90 9G). Leer más...
  • Sensor de ultrasonidos (por ejemplo HC-SR04). Leer más...
  • Batería power bank de 2500 mah. Leer más...

En mi caso, el chasis tiene dos motores y  una rueda giratoria, así que he optado por usar una batería power bank.


En general, el movimiento del robot lo lleva a cabo el L293DN, que se encarga de alimentar los motores según se lo ordenemos desde el microcontrolador. 

El sensor de ultrasonidos se monta sobre el servo, de forma que cuando el robot encuentra un obstáculo, el servo realiza un barrido a izquierda y derecha para ver qué camino está más despejado y decidir si gira hacia un lado u otro. (ver vídeo al final del artículo).


Este sería el esquema general del robot:



 

Este código de ejemplo puede servir para probar el robot.

#include <Servo.h>
 
Servo myservo;  
int pos = 180/2;     
int disparo=5, eco=4;
int d, dir;
int I1 = 12;
int I2 = 11;
int I3 = 9;
int I4 = 8;

void setup()
{
  pinMode(disparo, OUTPUT);
  pinMode(eco, INPUT);
  pinMode (I1, OUTPUT);     
  pinMode (I2, OUTPUT);
  pinMode (I4, OUTPUT);     
  pinMode (I3, OUTPUT);
  myservo.attach(3);   
  myservo.write(180/2);
  delay(500);
  adelante();
}
 
 
void loop()
{
  d=distancia();
  if (d<20) {
    parar();
    delay(100);
    dir=direccion();
    if (dir==1) {
        izquierda();
        delay(600);
        adelante();
    } else {
        derecha();
        delay(600);
        adelante();
    }
  }
}

int direccion() {
  int d1,d2;
  myservo.write(60);
  delay(300);
  d1=distancia();
  myservo.write(120);
  delay(300);
  d2=distancia();
  myservo.write(180/2);
  delay(300);
  if (d1>d2) {
    return 0; //derecha
  } else {
    return 1; //izquierda
  }
 
}

int distancia() {  
 int cm, duracion;
 digitalWrite(disparo, HIGH);
 delayMicroseconds(2);
 digitalWrite(disparo, LOW);
 duracion=pulseIn(eco, HIGH);
 cm=int((duracion/2)/29.1);
 return cm;
}

void adelante() {
  digitalWrite (I1, HIGH);
  digitalWrite (I2, LOW);
  digitalWrite (I4, HIGH);
  digitalWrite (I3, LOW);
}

void parar() {
  digitalWrite (I1, LOW);
  digitalWrite (I2, LOW);
  digitalWrite (I3, LOW);
  digitalWrite (I4, LOW);
}

void atras() {
  digitalWrite (I1, LOW);
  digitalWrite (I2, HIGH);
  digitalWrite (I4, LOW);
  digitalWrite (I3, HIGH);   
}

void izquierda() {
  digitalWrite (I1, LOW);
  digitalWrite (I2, HIGH);
  digitalWrite (I4, HIGH);
  digitalWrite (I3, LOW);  
}

void derecha() {
  digitalWrite (I1, HIGH);
  digitalWrite (I2, LOW);
  digitalWrite (I4, LOW);
  digitalWrite (I3, HIGH);  
}



Fuente: Robot controlado por Arduino

No hay comentarios: