Está en la página 1de 12

Algoritmos Autónomos de Vehículos

¿COMO FUNCIONAN ESTOS ALGORITMOS?

Henrry Cordovillo | Algoritmos | 4 de febrero de 2019

PÁGINA
Introducción

Vehículo autónomo o no tripulado

Entendemos por vehículo autónomo o no tripulado todo aquel capaz de moverse sin la acción directa del ser
humano. En la carrera espacial encontramos diferentes vehículos de este tipo. Uno de los más conocidos es el
Curiosity Rover. Pero también hay otros como el Pathfinder. En el sector agrícola podemos ver los avances en el
proyecto RHEA (Robot Fleets for Highly Effective Agriculture and Forestry Management) impulsado por la
Unión Europea. Incluso en el sector doméstico encontramos robots como el iRobot o el Neato. Pero quizás, los
que más destacan son los coches autónomos o no tripulados. Empresas como Google, Tesla, Apple y todas las
compañías automovilísticas, están invirtiendo mucho dinero para sacar sus prototipos adelante.

Cajero automático

Un cajero automático es una máquina expendedora usada para extraer dinero utilizando una tarjeta de plástico
con banda magnética o un chip (por ejemplo, tarjeta de débito o tarjeta de crédito), sin necesidad de presencia
del personal del banco.

Suelen tener una pequeña impresora matricial o impresora térmica para imprimir los resguardos de la operación
y actualizar las libretas de ahorros.

Los cajeros suelen realizar las siguientes operaciones:

 Extracción de dinero en efectivo de la cuenta bancaria o débito.


 Actualización de la libreta de ahorros.
 Obtención y cambio de contraseñas olvidadas de banca electrónica o telefónica.
 Compra y recogida de entradas.
 Recarga de tarjeta telefónica o bono de transporte.
 Recarga de tarjeta monedero.
 Ingreso de dinero en la cuenta mediante un sobre, normalmente proporcionado por el propio cajero, en el
que introduce el dinero en billetes o un cheque.
 Recarga de crédito para teléfono móvil prepago.
 Obtención del listado del uso del bono transporte.
 Obtención de los movimientos de una cuenta o débito.
 Enviar dinero al extranjero.
 Pago de servicios públicos.

El cajero automático supone un ahorro para el banco, porque el personal no tiene que atender a los clientes para
ofrecer servicios básicos.

1. Como funciona un algoritmo autónomo de un vehículo a control


remoto
Descripción del Sistema

PÁGINA
El sistema consta de dos unidades, el vehículo robótico y el panel de control (Fig.1), conectadas por
medio de un enlace bidireccional de radiofrecuencia, que permite la transferencia de información para la
operación y evaluación del recorrido

Vehículo Robótico

La implementación del VR se realiza con base en la plataforma móvil de un carro eléctrico a escala 1:10
de la marca TAMIYA®, modelo TXT-1. Se trata de un carro todo terreno con tracción en las cuatro
ruedas, impulsado por dos motores de corriente directa en paralelo para el avance y retroceso. Esta
plataforma cuenta con un mecanismo de dirección tipo Ackermann para el eje anterior y otro en el eje
posterior, controlados cada uno por un servomotor (Campion et al, 1996 y Large et al., 2000).

Para la comunicación con el panel de control se usa un radio módem conectado a un microcomputador
maestro, que a su vez gobierna a tres microcomputadores esclavos, que se encargan del control y el
procesamiento de información (Fig. 2).

PÁGINA
Para controlar la velocidad de giro de los motores se utilizan los pines ENA y ENB, que hemos
conectado a las salidas analógicas 6 y 5 de Arduino respectivamente.

 Podemos darles un valor de 0 a 255, aunque os recomendamos que no le pongáis un valor


demasiado alto ni demasiado bajo.

 Si le damos un valor demasiado bajo, no será suficiente para mover los motores.

 Si por el contrario le damos uno demasiado alto no vamos a tener suficiente potencia para mover
las ruedas y hacer funcionar el Bluetooth que pondremos en la siguiente sesión.

 Los componentes que sirven para comunicarse a distancia, como el Bluetooth, consumen mucha
energía.

Para controlar el sentido de giro de los motores se utilizan los pines IN1 e IN2, para el motor A y los
pines IN3 e IN4 para el motor B, y funcionan de la siguiente forma.

Si IN1 está a HIGH e IN2 a LOW, el motor A gira en un sentido

Si IN1 está a LOW e IN2 a HIGH lo hace en el otro.


PÁGINA
Lo mismo con los pines IN3 e IN4 y el motor B.

COMPROBANDO EL SENTIDO DE GIRO

Sabemos que con los pines IN1 a IN4 controlamos el sentido de giro de los motores, pero el problema
que se nos presenta es que no tenemos forma de saber hacia qué dirección va a girar, así que lo haremos
mediante ensayo y error.

Haremos un pequeño programa en el que iremos mandando instrucciones por el puerto serie para
controlar el movimiento de los motores.

Lo primero que vamos a necesitar es declarar las variables que utilizaremos para definir los pines que
vamos a utilizar y fijar la velocidad fácilmente. Y en el definimos todos como salidas.
// Motor A

int ENA = 6;

int IN1 = 13;

int IN2 = 12;

// Motor B

PÁGINA
int ENB = 5;

int IN3 = 11;

int IN4 = 10;

int vel = 200;

void setup()

Serial.begin(9600) ;

// Declaramos todos los pines como salidas

pinMode (ENA, OUTPUT);

pinMode (ENB, OUTPUT);

pinMode (IN1, OUTPUT);

pinMode (IN2, OUTPUT);

pinMode (IN3, OUTPUT);

pinMode (IN4, OUTPUT);

Ahora vamos a suponer que el coche se va a mover hacia delante cuando tengamos IN1 (pin 13 de
Arduino) a LOW, IN2 (pin 12) a HIGH, IN3 (pin 11) a LOW e IN4 (pin 10) a HIGH. Además le
indicaremos la velocidad a lo que lo tiene que hacer con los pines ENA y ENB.

En el loop vamos a crear una estructura case que utilizaremos para controlar el movimiento, y en función
de lo que recibamos por el puerto serie se moverán los motores en una u otra dirección. Utilizaremos ‘F’
para ir hacia delante, ‘B’ para ir hacia atrás, ‘R’ y ‘L’ para girar y ‘S’ para parar.

 Escogemos esos caracteres porque son los que luego utilizará la aplicación que utilizaremos con
nuestro Smartphone para controlar al coche.

 Por si alguno no cae, son las inciales de Forward, Backward, Right, Left y Stop.

void loop()

PÁGINA
{

// Motor gira en un sentido

if (Serial.available())

switch (Serial.read())

case 'F':

Adelante();

break;

case 'B':

Atras();

break;

case 'R':

Derecha();

break;

case 'L':

Izquierda();

break;

case 'S':

Parar();

break;

Y haremos que lo haga cuando reciba una ‘F’ de forward por el puerto serie.

Para comprobarlo encendemos el interruptor del coche y pulsamos la tecla hacia delante. Pueden pasar 4
cosas:
void Adelante ()

//Direccion motor A
PÁGINA
digitalWrite (IN1, LOW);

digitalWrite (IN2, HIGH);

analogWrite (ENA, vel); //Velocidad motor A

//Direccion motor B

digitalWrite (IN3, LOW);

digitalWrite (IN4, HIGH);

analogWrite (ENB, vel); //Velocidad motor B

 Que el coche se mueva hacia delante. ¡Perfecto! Hemos tenido suerte y no vamos a tener que cambiar
nada.

 Que el coche se mueva hacia detrás. Los dos se mueven al revés de lo que hemos supuesto.

 Que el coche gire hacia la derecha. El motor B gira al revés de lo que hemos supuesto.

 Que el coche gire a la izquierda. El motor A gira al revés de lo que hemos supuesto.

Bueno, pues si sois de la primera opción, felicidades, y sino no pasa nada porque esto tiene fácil arreglo, y
de hecho, podemos arreglarlo de varias formas.

Podemos intercambiar las dos conexiones del motor que esté girando al revés de lo que buscamos, o de
los dos motores si los dos lo hacen al revés. OUT1 y OUT2 para el motor A, y OUT3 y OUT4 para el
motor B.

Si os resulta complicado acceder a esos cables, también podéis intercambiar los pines que controlan el
sentido de giro de los motores. Es decir, IN1 e IN2 para el motor A, e IN3 e IN4 para el motor B.

Y si no queréis andar cambiando los cables podemos cambiar el programa. Sólo tendríamos que cambiar
el estado de los pines que dan el sentido de giro del motor que queramos invertir. Si, por ejemplo,
quisiéramos cambiar el sentido de giro del motor A, haríamos lo siguiente:
void Adelante ()

//Direccion motor A

PÁGINA
digitalWrite (IN1, LOW);

digitalWrite (IN2, HIGH);

analogWrite (ENA, vel); //Velocidad motor A

//Direccion motor B

digitalWrite (IN3, HIGH);

digitalWrite (IN4, LOW);

analogWrite (ENB, vel); //Velocidad motor B

Si lo corregís de cualquiera de las dos primeras formas, el resto del programa podéis seguirlo igual que
el que vayamos haciendo nosotros. Si lo hacéis de la última forma, tendréis que tenerlo en cuenta
también para el resto del programa y cambiarlo también para los demás movimientos.

PROGRAMACIÓN DEL COCHE

Una vez que tenemos programado el movimiento hacia delante y tenemos claro cómo giran nuestros
motores, el resto lo tenemos fácil. Ahora vamos a hacer que se mueva hacia atrás al recibir ‘B’ (de
Backward), para lo que sólo necesitaremos invertir los pines 10 al 13 que controlan el sentido de giro.
void Atras ()

//Direccion motor A

digitalWrite (IN1, HIGH);

digitalWrite (IN2, LOW);

analogWrite (ENA, vel); //Velocidad motor A

//Direccion motor B

digitalWrite (IN3, HIGH);

digitalWrite (IN4, LOW);

PÁGINA
analogWrite (ENB, vel); //Velocidad motor B

Si lo que queremos es girar a la derecha, el motor A debería ir hacia delante y el B hacia atrás, y lo
contrario para girar a la izquierda. Como podréis imaginar utilizaremos ‘R’ y ‘L’ (Right y Left)
void Derecha ()

//Direccion motor A

digitalWrite (IN1, LOW);

digitalWrite (IN2, HIGH);

analogWrite (ENA, vel); //Velocidad motor A

//Direccion motor B

digitalWrite (IN3, HIGH);

digitalWrite (IN4, LOW);

analogWrite (ENB, vel); //Velocidad motor A

void Izquierda ()

//Direccion motor A

digitalWrite (IN1, HIGH);

digitalWrite (IN2, LOW);

analogWrite (ENA, vel); //Velocidad motor A

//Direccion motor B

digitalWrite (IN3, LOW);

digitalWrite (IN4, HIGH);

analogWrite (ENB, vel); //Velocidad motor A

}
PÁGINA
Y por último haremos que los motores se paren al recibir ‘S’ (de Stop).
void Parar ()

//Direccion motor A

digitalWrite (IN1, LOW);

digitalWrite (IN2, LOW);

analogWrite (ENA, 0); //Velocidad motor A

//Direccion motor B

digitalWrite (IN3, LOW);

digitalWrite (IN4, LOW);

analogWrite (ENB, 0); //Velocidad motor A

Bibliografía

[1] R. J. Hapka, «GooglePatents,» 19 Octubre 1994. [En línea]. [Último acceso: 02 Febrero 2019].

[2] Licencia del Departamento de Ingeniería de Control y Robótica, División de Ingeniería Eléctrica,
Facultad de Ingeniería UNAM, México., «ScienceDirect,» Marzo 2012. [En línea]. Available:
https://www.sciencedirect.com/science/article/pii/S0016003211002821. [Último acceso: 2 Febrero
2019].

[3] P. Seiler ; A. Pantalón ; K. Hedrick, «IEE Xplore,» 8 Octubre 2004. [En línea]. Available:
https://ieeexplore.ieee.org/abstract/document/1341587. [Último acceso: 2 Febrero 2019].

[4] Scott M. Ettinger , Michael C. Nechyba , Peter G. Ifju y Martin Waszak, «Taylor&Francis Online,» 2
Abril 2012. [En línea]. Available: https://www.tandfonline.com/doi/abs/10.1163/156855303769156983?
casa_token=RsSOTVG5m2UAAAAA%3AEj-
RSc1aDOpG8Jy50iwyThaETGVvaVQcKs2hDwxXmYqq_vSM8BCQqeYFaaZQV25eohCeZPCifsxmAW
o&. [Último acceso: 2 Febrero 2019].

[5] E. Altug ; JP Ostrowski ; CJ Taylor, «IEEE Xplore,» 10 Noviembre 2003. [En línea]. Available:

PÁGINA
https://ieeexplore.ieee.org/abstract/document/1242264. [Último acceso: 2 Febrero 2019].

PÁGINA

También podría gustarte