Blog

IMG 3153

Montaje y programación del Robot de AVAST

0

Secuencia de montaje y programación del Robot utilizado en los talleres de AVAST

robotica1robotica2

Redactado y explicado completamente por el profe Alex.

Robot Esquiva Objetos

  • Introducción Programación Arduino.

Todos los códigos de Arduino se pueden separar en 4 partes:

La primera es la parte donde se declaran las variables globales, es decir, variables que se pueden utilizar en el resto de partes del código.

La segunda es el void setup(), esta parte solo se ejecuta una vez, y es aquí donde declaramos que pines(Ej : D4, D5, A3…) vamos a utilizar y si van a ser de entrada(para leer datos) o de salida(para enviar información). También se puede ejecutar en esta parte cualquier función.

02

La tercera parte es el void loop(), que como la propia palabra dice en ingles, es un bucle. Este bucle es cuerpo principal del programa, y se va ejecutar de forma infinita desde que se enciende hasta que se apaga Arduino. En él es donde vamos a programar lo que va a hacer el robot. Arduino, va a pasar por todas las instrucciones de el bucle, y cuando acabe va a volver a la primera instrucción del void loop() y lo va a volver a ejecutar, esto indefinidamente.

03La cuarta y última parte, son funciones auxiliares que pueden existir o no. Estas funciones se crean para no sobrecargar el void loop(). Para ello definimos funciones por ejemplo void avanzar(){}. Dentro de los corchetes, escribimos la función y desde el void loop() con escribir avanzar() se ejecuta la función.

Las sentencias más utilizadas del lenguaje Arduino son:

pinMode(PIN,1); à Declaramos el pin como salida. Al enviar información sacará 5v por el pin.

pinMode(PIN,HIGH); à Declaramos el pin como salida. Al enviar información sacará 5v por el pin.

pinMode(PIN,0); àDeclaramos el pin como entrada. Podemos leer si recibe 5v ó 0v.

pinMode(PIN,LOW); àDeclaramos el pin como entrada. Podemos leer si recibe 5v ó 0v.

digitalWrite(PIN, 1); àEnviamos por el pin 5v

digitalWrite(PIN, HIGH); àEnviamos por el pin 5v

digitalWrite(PIN, 0); àEnviamos por el pin 0v

digitalWrite(PIN, LOW); àEnviamos por el pin 0v

delay(x); àHacemos una espera de x milisegundos

Los bucles y las sentencias condicionales son iguales que en el resto de lenguajes de programación, como el if(){} para evaluar una condición o el while(){} para entrar en un bucle y mantenerse si se cumple cierta condición.

  • Componentes del robot.

Arduino: En este caso utilizaremos el Arduino NANO. Arduino es un microcontrolador, es decir un cerebro programable capaz de ejecutar ordenes que tiene almacenada en su memoria.

Driver para motores: Se usan estos drivers para tener un control lógico sobre los motores. Pero no usar Arduino como fuente de alimentación, se usa una fuente de alimentación externa.

PinOut

04

+12v Power: Conexión a fuente de alimentación externa a arduino.

Power GND: Debemos conectar esto a GND de arduino y de la fuente externa.

+5vPower: Conexión a arduino que sirve como referencia de un 1 lógico.

Logic Input: 4 entradas digitales con las que controlaremos el sentido de los motores.

A/B Enable: Dos entradas PWD para controlar la velocidad de los motores.

Output A/B: Salidas positivo y negativo de cada uno de los motores.

*No todas las conexiones son necesarias, en nuestro caso solo utilizaremos +12v, GND y los Logic Input

Para programar el driver solo es necesario declarar en el void setup() los pines de Logic Input y en el void loop() para cada motor tenemos 3 opciones:

digitalWrite(pin_1,0); // El motor se mantiene parado

digitalWrite(pin_2,0);

digitalWrite(pin_1,1); // El motor gira en un sentido

digitalWrite(pin_2,0);

digitalWrite(pin_1,0); // El motor gira en el sentido contrario

digitalWrite(pin_2,1);

Sensor de ultrasonidos: Es un detector de proximidad utilizado usualmente en robots para detectar obstáculos y evitarlos.

05

Programación del sensor:

#define Pecho 6

#define Ptrig 7

long duracion, distancia;

void setup() {

Serial.begin (9600);       // inicializa el puerto seria a 9600 baudios

pinMode(Pecho, INPUT);     // define el pin 6 como entrada (echo)

pinMode(Ptrig, OUTPUT);   // define el pin 7 como salida (triger)

pinMode(13, 1);           // Define el pin 13 como salida

}

void loop() {

digitalWrite(Ptrig, LOW);

delayMicroseconds(2);

digitalWrite(Ptrig, HIGH);   // genera el pulso de triger por                                                                                  //10ms

delayMicroseconds(10);

digitalWrite(Ptrig, LOW);

duracion = pulseIn(Pecho, HIGH);

distancia = (duracion/2) / 2 // calcula la distancia en                                                                                            //centímetros

}

El cableado completo del robot es el siguiente:

06

  • Programación del robot.

Para programar el robot utilizaremos el siguiente código:

//Pines

int echo = 10, trig = 9;

long int distancia=0;

long duracion;//Variable para almacenar la distancia medida.

int aleatorio=0;//Variable para guardar un valor aleatorio.

int sentido = 1; // La utilizamos para girar cada vez en un sentido

void setup()

{

pinMode(echo, 1);     // define el pin como entrada (echo)

pinMode(trig, 0);   // define el pin como salida (triger)

pinMode(3,1);

pinMode(4,1);

pinMode(5,1);

pinMode(6,1);

reset();

}

void loop()

{

int cont = 0;

// Control para avanzar

avanzar();

delay(200);

// Medimos distancia

digitalWrite(trig, LOW);

delayMicroseconds(2);

digitalWrite(trig, HIGH);   // genera el pulso de triger por 10ms

delayMicroseconds(10);

digitalWrite(trig, LOW);

duracion = pulseIn(echo, HIGH); //Leemos cuanto tiempo tarda en ir y volver la onda

distancia = (duracion/2) / 29; //Utilizamos esta fórmula por que la velocidad del sonido

// es 1/29 cm/microsegundo . Dividimos entre dos para solo

// quedarnos con la ida.

while(distancia<30){//Mientras la distancia sea menor que 30 se mantiene en este bucle

if(cont>2){ //Cuando intenta girar para ambos lados y no consigue salir

reset();        //tiramos para atrás

atras();

delay(500);

cont = 0;

}

if(sentido == 1) ){//Si sentido es 1 giramos hacia este lado y cambiamos sentido = -1

// Resetemos Control direccion

reset();

// Control para girar lado UNO

giroUno();

delay(200);

cont++;

sentido = -1;

}

if (sentido == -1){//Si sentido es -1 giramos hacia este lado y cambiamos sentido = 1

// Resetemos Control direccion

reset();

// Control para girar lado UNO

giroDos();

delay(200);

cont++;

sentido = 1;

}

// Resetemos Control direccion

reset();

// Medimos distancia

digitalWrite(trig, LOW);

delayMicroseconds(2);

digitalWrite(trig, HIGH);   // genera el pulso de triger por 10ms

delayMicroseconds(10);

digitalWrite(trig, LOW);

duracion = pulseIn(echo, HIGH);

distancia = (duracion/2) / 29;

delay(5);

}

}

// estas funciones las escribimos para no sobrecargar el void loop(), para utilizarlas tan solo

// las llamamos (Ej: avanzar();)

void avanzar(){

digitalWrite(3,1); //Con estas dos sentencias giramos el motor conectado a los pines 3 y 4

digitalWrite(4,0); // hacia delante

digitalWrite(5,1); //Con estas dos sentencias giramos el motor conectado a los pines 5 y 6

digitalWrite(6,0); // hacia delante

}

void reset(){ //Utilizamos esta función para resetear los valores de los pines antes de hacer

// mover el robot hacia cualquier dirección

digitalWrite(3,0);

digitalWrite(4,0);

digitalWrite(5,0);

digitalWrite(6,0);

}

void atras(){ // Podemos ver que los valores son los contrarios que en la función avanzar

digitalWrite(3,0);

digitalWrite(4,1);

digitalWrite(5,0);

digitalWrite(6,1);

}

void giroUno(){ // Un motor avanza y el otro se queda parado, conseguimos girar

digitalWrite(3,1);

digitalWrite(4,0);

digitalWrite(5,0);

digitalWrite(6,0);

}

void giroDos(){// Un motor avanza y el otro se queda parado, conseguimos girar

digitalWrite(3,0);

digitalWrite(4,0);

digitalWrite(5,1);

digitalWrite(6,0); }

 

Para hacer comprobar que los motores giran en el sentido correcto, podéis programar Arduino con el siguiente código:

void setup() {

pinMode(3,1);

pinMode(4,1);

pinMode(5,1);

pinMode(6,1);

pinMode(13,1);

}

void loop() {

//Delante

digitalWrite(3,1);

digitalWrite(4,0);

digitalWrite(5,1);

digitalWrite(6,0);

delay(2000);

digitalWrite(3,0);

digitalWrite(4,0);

digitalWrite(5,0);

digitalWrite(6,0);

delay(200);

//Detrás

digitalWrite(3,0);

digitalWrite(4,1);

digitalWrite(5,0);

digitalWrite(6,1);

delay(2000);

}

 

Con este programa los motores deberían girar durante dos segundo hacia delante, y durante dos segundos hacia atrás y repetirse. Si el primer sentido es hacia atrás podéis cambiar la polaridad de los dos motores. Si es uno de los motores el que no gira en el sentido correcto, podéis cambiar la polaridad solo a ese motor.

PARA SUBIR EL PROGRAMA A LA PLACA DE ARDUINO DEBÉIS SEGUIR LOS SIGUIENTES PASOS:

  1. CONECTAR ARDUINO AL ORDENADOR
  2. SELECCIONAR EL TIPO ARDUINO NANO

07

  1. SELECCONAR EL PUERTO(Normalmente es el único que sale COM x)

08

  1. DARLE A LA FLECHA

09Para descargar el entorno de programación entrar en www.arduino.cc y elegir la opción adecuada para vuestro Sistema Operativo.

Los drivers para que el ordenador pueda leer la placa de Arduino, se instalan solos cuando esta el ordenador conectado a internet. Si no fuera así (no os detectaría el puerto), podéis buscar drivers arduino nano, y dependiendo del sistema operativo, descargar.

Si tienes dudas, puedes preguntarnos en la entrada de Facebook por si tus compañeros tienen la misma duda.

Para informarte y/o contratar nuestro servicio de Talleres Educativos solo tienes que contactar con nosotros y te contestaremos lo antes posible.

2016-logo-TDA-1

Leave a Reply