Comenzando un Robot con Arduino

En este post comenzamos a trabajar con un robot muy simple. El objetivo es usar un chasis de robot genérico y luego ir agregando funcionalidades, si el tiempo lo permite.

wpid-20140216_221045.jpg

 

En esta oportunidad mostramos el chasis, el módulo de control de motores, las conexiones y el código necesario para mover los motores.

 

 

 

Todos los detalles después del salto.

Materiales

  • Arduino Uno R3
  • Batería 9V
  • Pilas recargables AA x 4
  • Soporte 4 pilas
  • Jumper
  • Chasis de robot 4 ruedas
  • Modulo de control de motor basado en L298

Sobre el Hardware

El chasis de robot viene armado, y consta de cuatro motores.  Lo único que tuve que hacer fue soldar los pines de los motores en cada lado (rojo con rojo y negro con negro) para así tener que controlar sólo dos motores.
Sobre el módulo de control de motor esta es una excelente presentación  y en este link tambien hay información importante. El módulo viene con unos jumpers, los cuales no se deben sacar.

Conectando el Hardware

Entre el módulo y el Arduino se conectan los cables de la siguiente manera
IN1 pin2
IN2 pin3
IN3 pin4
IN4 pin5
ENA pin9
ENB pin10
GND GND
Se puede ver la conexión por el lado de Arduino
Se puede ver la conexión por el lado de Arduino

Alimentación

La energía para el módulo se conecta desde el pack de 4 baterías a los pines VMS (+) y GND (-) del módulo, además la puerta GND  se debe conectar con GND de Arduino Uno.
El arduino, por su parte, se alimenta con la bateria de 9V a traves de un clip.
Se muestran las conexiones de energía, noter que un cable de GND va a GND de Arduino
Se muestran las conexiones de energía, notar que un cable va de GND del módulo de control a GND de Arduino

Software

Este es el primer sketch que probamos
// motor A
int dir1PinA = 2;
int dir2PinA = 3;
int speedPinA = 9;
// motor B
int dir1PinB = 4;
int dir2PinB = 5;
int speedPinB = 10;

unsigned long time;
int speed;
int dir;
void setup(){
  pinMode(dir1PinA,OUTPUT);
  pinMode(dir2PinA,OUTPUT);
  pinMode(speedPinA,OUTPUT);
  pinMode(dir1PinB,OUTPUT);
  pinMode(dir2PinB,OUTPUT);
  pinMode(speedPinB,OUTPUT);
  time = millis();
  dir = 1;
  digitalWrite(speedPinA, HIGH);
  digitalWrite(speedPinB, HIGH);
}

void loop(){
  if(1==dir){
    digitalWrite(dir1PinA, LOW);
    digitalWrite(dir2PinA, HIGH);
    digitalWrite(dir1PinB, LOW);
    digitalWrite(dir2PinB, HIGH);
  }
  else{
    digitalWrite(dir1PinA, HIGH);
    digitalWrite(dir2PinA, LOW);
    digitalWrite(dir1PinB, HIGH);
    digitalWrite(dir2PinB, LOW);
  }
if (millis() - time > 3000){
  time= millis();
  if( 1==dir){
  dir=0;
  }
  else {
   dir =1;
  } 
}
}
El funcionamiento es el siguiente, las variables en el programa se indican en paréntesis :
ENA y ENB (speedPinA y speedPinB) siempre deben estar estado high, pero mas adelante las usamos PWM para cambiar la velocidad.
los valores de IN1, IN2 (dir1PinA, dir2PinA) dependen de la siguiente logica
  • IN1 HIGH, IN2 LOW motor va en un sentido
  • IN1 LOW, IN2 HIGH motor va en sentido contrario
  • IN1 = IN2 motor se detiene
  • Lo mismo es válido para IN3, IN4 (dir1PinB, dir2PinB).
El uso de la función millis() esta documentada aqui , es una forma de medir tiempo transcurrido. En este caso se incorpora dentro de un if  para evaluar si ha pasado cierto tiempo predeterminado (3000 ms o 3segundos)
Por ultimo, la variable dir se usa para cambiar la dirección del motor.
Entonces este sketch mueve los motores en un sentido a full velocidad durante 3s y luego en el sentido inverso.
A continuación veremos un caso similar pero usando PWM sobre las puertas, es decir cambiando la velocidad. Esto se ocupa para tener mayor control sobre el motor.
// motor A
int dir1PinA = 2;
int dir2PinA = 3;
int speedPinA = 9;
// motor B
int dir1PinB = 4;
int dir2PinB = 5;
int speedPinB = 10;unsigned long time;
int speed;
int dir;
void setup(){
pinMode(dir1PinA,OUTPUT);
pinMode(dir2PinA,OUTPUT);
pinMode(speedPinA,OUTPUT);
pinMode(dir1PinB,OUTPUT);
pinMode(dir2PinB,OUTPUT);
pinMode(speedPinB,OUTPUT);
time = millis();
speed = 0;
dir = 1;
}void loop(){
analogWrite(speedPinA, speed);
analogWrite(speedPinB, speed);
//set direction
if(1==dir){
digitalWrite(dir1PinA, LOW);
digitalWrite(dir2PinA, HIGH);
digitalWrite(dir1PinB, LOW);
digitalWrite(dir2PinB, HIGH);
}
else{
digitalWrite(dir1PinA, HIGH);
digitalWrite(dir2PinA, LOW);
digitalWrite(dir1PinB, HIGH);
digitalWrite(dir2PinB, LOW);
}
if (millis() - time > 3000){
time= millis();
speed += 40;
if (speed > 255){
speed = 0;
}
if( 1==dir){
dir=0;
}
else {
dir =1;
}
}
}

Ambos sketchs fueron probados con Arduino Uno y con Teensy 3.0. La unica salvedad que en el caso de Teensy las puertas ENA yENB (speedPinA y speedPinB) son la 20 y 21, pues estas tienen la funcionalidad de PWM.

El chasis de robot con arduino y módulo de control. La batería de 9V es para el arduino , al fondo hay un pack de 4 baterias para alimentar los motores,
El chasis de robot con arduino y módulo de control. La batería de 9V es para el arduino , al fondo hay un pack de 4 baterias para alimentar los motores,

 

Un ejemplo de programación

El usuario de Youtube iainportalupi  creó una rutina para controlar los motores de tal manera que sea muy fácil de utilizar

El video con su explicación se puede ver a continuación y es un ejemplo de como usar subrutinas en Arduino

Y el código creado por iainportalupi esta en el siguiente link

 

Author: manuel

Ingeniero Eléctrico, Institutano, instructor certificado Cisco, en twitter @mcarrasco con comentarios y opiniones personales.

4 thoughts

  1. LA pila de 9v es para alimentar el motorshield(l298), pero solo dura como 5 minutos, luego se muere…. considero necesario hacer un elevador de corriente… para que dure mas la pila o usar otra … Hice uno con sensor de ultrasonido.. y eso paso…

  2. Hola, gracias por tus posts,
    te comento que hice un proyecto similar, nada mas que le agregue sensores de luz y proximidad, y funciona de acuerdo a su entorno, buscando de la luz u ocultandose de ella sin que alla una pared cerca.

    1. Edgardo, nos parece super interesante el proyecto que realizaste, pero la idea de internetdelascosas.cl es compartir conocimientos, no videos de youtube, si el video hiciera un enlace al codigo fuente o a mayor informacion de como realizar el proyecto no tenemos problemas en difundirlo, por ahora nos reservamos el derecho a editarlo. Saludos.

Deja un comentario

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