Robot controlado con Arduino

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 basado en el microcontrolador atmega328 sin necesidad de andar montando osciladores de cuarzo, reguladores de tensión y todo aquello que rodea al microcontrolador. Como ejemplo, os describo a continuación un robot que construí hace ya algún tiempo.

Primero la lista de componentes:
– Chasis para el robot (se localizan fácilmente en Amazon, Ebay, etc.). El que yo he usado ya trae los motores y las ruedas montadas, así que eso que nos ahorramos.
– Protoboard pequeña (la he usado para distribuir más cómodamente el cableado).
– Driver de motores L298N (Es muy versátil. Soporta motores de continua como los usado en este robot, o también motores paso a paso).
– Un servo (por ejemplo un TowerPro SG90 9G).
– Sensor de ultrasonidos (por ejemplo HC-SR04).
– Soporte para poner las pilas AAA.

En mi caso, el chasis tiene cuatro motores, así que he optado por usar un soporte para seis pilas. Si sólo tienes dos motores, con un soporte de cuatro irá bien.
En general, el movimiento del robot lo lleva a cabo el L298N, que se encarga de alimentar los motores según se lo ordenemos desde el microcontrolador. Aunque no es lo más conveniente, por simplificar, he alimentado el L298N desde la salida de 5V del Arduino. Debido a esto, es importante que el Arduino esté alimentado con las pilas, ya que si lo alimentamos por USB no podrá ofrecer la intensidad necesaria para alimentar correctamente al L298N.
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:

esquema

L298N Arduino
IN1 13
IN2 12
IN3 11
IN4 10
Sensor ultrasonidos Arduino
Trig 8
Echo 7
Servo Arduino
1 (naranja) 6

No he puesto las conexiones de alimentación ya que están indicadas en el esquema general.

Este código de ejemplo puede servir para probar el robot. Es muy simple, pero podéis ver al robot funcionando con este código en el vídeo que hay al final del artículo.

#include <Servo.h> 
 
Servo myservo;  
int pos = 180/2;     
int disparo=8, eco=7;
int d, dir;
int IN1 = 10; 
int IN2 = 11;
int IN3 = 12; 
int IN4 = 13;

void setup() 
{ 
  pinMode(disparo, OUTPUT);
  pinMode(eco, INPUT);
  pinMode (IN1, OUTPUT);     
  pinMode (IN2, OUTPUT);
  pinMode (IN4, OUTPUT);     
  pinMode (IN3, OUTPUT);
  myservo.attach(6);   
  myservo.write(180/2);
  delay(500);
  adelante();
} 
 
 
void loop() 
{ 
  d=distancia();
  if (d<6) { 
    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 (IN1, HIGH);
  digitalWrite (IN2, LOW);
  digitalWrite (IN4, HIGH);
  digitalWrite (IN3, LOW); 
}

void parar() {
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, LOW);
  digitalWrite (IN3, LOW);
  digitalWrite (IN4, LOW); 
}

void atras() {
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, HIGH);
  digitalWrite (IN4, LOW);
  digitalWrite (IN3, HIGH);   
}

void izquierda() {
  digitalWrite (IN1, LOW);
  digitalWrite (IN2, HIGH);
  digitalWrite (IN4, HIGH);
  digitalWrite (IN3, LOW);  
}

void derecha() {
  digitalWrite (IN1, HIGH);
  digitalWrite (IN2, LOW);
  digitalWrite (IN4, LOW);
  digitalWrite (IN3, HIGH);  
}

Aquí podéis ver a Ratoncito I en acción (el nombre se lo ha puesto mi hijo).

1 comentario en «Robot controlado con Arduino»

  1. Christian Negri | el a las | Responder

    Bien desarrollado y explicado tu post. Felicitaciones.

Dejar un comentario

Tu dirección de correo electrónico no será publicada.


*