Robot Evita Obstaculos
Robot Evita Obstaculos
Robot Evita Obstaculos
Corrección 10/04/20
1 de 17
ÍNDICE
1. Materiales empleados
2. Control de motores L298N Puente H
3. Sensor ultrasonidos HC-SR04
4. Sistemas de alimentación de Arduino
5. Programación para su funcionamiento
2 de 17
3 de 17
1. Materiales empleados
- Cables protoboard
- Protoboard pequeña
- 4 Ruedas
- Chasis
- 4 Motores
- Batería
2.1 Introducción
El módulo controlador de motores L298N H-bridge nos permite controlar la velocidad
y la dirección de dos motores de corriente continua o un motor paso a paso de una
forma muy sencilla, gracias a los 2 los dos H-bridge que monta.
Ya hemos hablado de ellos antes, pero básicamente un puente-H o H-bridge es un
componente formado por 4 transistores que nos permite invertir el sentido de la
corriente, y de esta forma podemos invertir el sentido de giro del motor.
El rango de tensiones en el que trabaja este módulo va desde 3V hasta 35V, y una
intensidad de hasta 2A. A la hora de alimentarlo hay que tener en cuenta que la
4 de 17
electrónica del módulo consume unos 3V, así que los motores reciben 3V menos que
la tensión con la que alimentemos el módulo.
Además el L298N incluye un regulador de tensión que nos permite obtener del
módulo una tensión de 5V, perfecta para alimentar nuestro Arduino. Eso sí, este
regulador sólo funciona si alimentamos el módulo con una tensión máxima de 12V
Es un módulo que se utiliza mucho en proyectos de robótica, por su facilidad de uso
y su reducido precio.
Los pines IN1 e IN2 nos sirven para controlar el sentido de giro del motor A, y los
pines IN3 e IN4 el del motor B. Funcionan de forma que si IN1 está a HIGH e IN2 a LOW,
el motor A gira en un sentido, y si está IN1 a LOW e IN2 a HIGH lo hace en el otro. Y lo
mismo con los pines IN3 e IN4 y el motor B.
Para controlar la velocidad de giro de los motores tenemos que quitar los jumpers y usar los
pines ENA y ENB. Los conectaremos a dos salidas PWM de Arduino de forma que le
enviemos un valor entre 0 y 255 que controle la velocidad de giro. Si tenemos los jumpers
colocados, los motores girarán a la siempre a la misma velocidad.
El esquema de montaje que vamos a utilizar va a ser el siguiente, aunque podemos usar los
pines que queráis siempre que respetemos que los que conectemos
a ENA y ENB sean PWM
5 de 17
2.4 Programación del IDE de Arduino para que funcionen los motores en
todos los casos.
Comenzamos asignando los pines que vamos a usar y declarándolos como salida:
// Motor A
int ENA = 10;
int IN1 = 9;
int IN2 = 8;
// Motor B
int ENB = 5;
int IN3 = 7;
int IN4 = 6;
void setup ()
{
// Declaramos todos los pines como salidas
pinMode (ENA, OUTPUT);
pinMode (ENB, OUTPUT);
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
}
Y ahora vamos a crear las funciones para mover los motores. Primero para moverlos hacia
delante a plena potencia:
void Adelante ()
{
//Direccion motor A
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
analogWrite (ENA, 255); //Velocidad motor A
//Direccion motor B
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite (ENB, 255); //Velocidad motor B
}
Y ahora para moverse en el sentido contrario a la mitad de potencia:
void Atras ()
{
//Direccion motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
analogWrite (ENA, 128); //Velocidad motor A
//Direccion motor B
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
analogWrite (ENB, 128); //Velocidad motor B
}
Y ahora vamos a girar cada motor en un sentido, cada uno con una velocidad además:
6 de 17
void Derecha ()
{
//Direccion motor A
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
analogWrite (ENA, 200); //Velocidad motor A
//Direccion motor B
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
analogWrite (ENB, 100); //Velocidad motor A
}
void Izquierda ()
{
//Direccion motor A
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
analogWrite (ENA, 50); //Velocidad motor A
//Direccion motor B
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
analogWrite (ENB, 150); //Velocidad motor A
}
Y una función más para pararlos:
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
}
Vamos a combinar estas funciones en el loop, haciendo que cada una se ejecute durante un
periodo de tiempo:
void loop ()
{
Adelante ();
delay (5000);
Atras ();
delay (3000);
Derecha ();
delay (2000);
Izquierda ();
delay (2000);
Parar ();
delay (4000);
}
7 de 17
3. Sensor ultrasónico HC-SR04
3.1 Introducción
Un sensor de ultra sonidos es un dispositivo para medir distancias. Su
funcionamiento se base en el envío de un pulso de alta frecuencia, no audible por el
ser humano. Este pulso rebota en los objetos cercanos y es reflejado hacia el sensor,
que dispone de un micrófono adecuado para esa frecuencia.
8 de 17
3.2 Funcionamiento
Es decir, el sonido tarda 29,2 microsegundos en recorrer un centímetro. Por tanto, podemos
obtener la distancia a partir del tiempo entre la emisión y recepción del pulso mediante la
siguiente ecuación.
El motivo de dividir por dos el tiempo (además de la velocidad del sonido en las unidades
apropiadas, que hemos calculado antes) es porque hemos medido el tiempo que tarda el
pulso en ir y volver, por lo que la distancia recorrida por el pulso es el doble de la que d
queremos medir.
3.3 Esquemas
-Esquema eléctrico:
9 de 17
-Esquema montaje:
void setup() {
Serial.begin(9600);
pinMode(TriggerPin, OUTPUT);
pinMode(EchoPin, INPUT);
}
void loop() {
int cm = ping(TriggerPin, EchoPin);
Serial.print("Distancia: ");
Serial.println(cm);
delay(1000);
}
10 de 17
digitalWrite(TriggerPin, LOW); //para generar un pulso limpio ponemos a LOW 4us
delayMicroseconds(4);
digitalWrite(TriggerPin, HIGH); //generamos Trigger (disparo) de 10us
delayMicroseconds(10);
digitalWrite(TriggerPin, LOW);
La potencia eléctrica es la proporción por unidad de tiempo, o ritmo, con la cual la energía
eléctrica es transferida por un circuito eléctrico. Es decir, la cantidad de energía
eléctrica entregada o absorbida por un elemento en un momento determinado
11 de 17
motores
4000 mAh 2000 mAh 15 mAh 46 mAh
x4=16000mAh
Pila 9V
Tienen la ventaja de ser fáciles de encontrar y usar. Además hay disponibles cables y
portapilas, que incluso incorporan un conector jack tipo Arduino, lo que hace que sean
fáciles de usar.
Como desventajas, las pilas de 9V disponen de baja densidad energética. Una pila
tiene una capacidad típica de 500-600mAh. Además, son proporcionan una intensidad de
corriente máxima muy baja, en torno a 300mA, útil solo para proyectos pequeños.
Por otro lado, 9V es una tensión inadecuada para la mayoría de actuadores. Resulta
excesiva para la mayoría de motores DC y servos, mientras que no es suficiente para
grandes motores brushless y paso a paso, que funcionan con 12V y, además, requieren
mucho más intensidad.
En resumen, una opción para pequeños montajes o pruebas sencillas, pero que en
seguida queda corto en características, por lo que requeriremos opciones superiores.
12 de 17
PILAS AA DE 1.5V
Podemos encontrar con facilidad porta pilas, cables y otras soluciones para incorporar
cuatro pilas AA como forma de alimentación en nuestros proyectos.
La intensidad máxima que podemos obtener supera 1A, pudiendo llegar a extraer
hasta 2A. Pero debemos tener en cuenta que, debido a las curvas de descarga, la
cantidad de carga que podemos extraer de la pila se reduce cuanto más rápido la
drenamos.
El precio de las pilas es barato, pero al no ser recargables a largo plazo no resulta
económico.
Banco de Baterías de 5V
Tienen como ventaja que proporcionan 5V regulados, por lo que podemos alimentar
Arduino a través del USB, sin preocuparnos de la necesidad de regular el voltaje.
Muchos de estos bancos, de hecho, incorporan una única batería de litio 18650, más un
pequeño circuito que eleva y regula el voltaje a 5V. En estos casos podemos incluso sustituir
una batería por otra, empleando la misma caja, mientras cargamos la batería descargada.
13 de 17
Estos bancos son, por supuesto, recargables. La capacidad de energía es alta,
pudiendo encontrar bancos de hasta 17.000 mAh (aunque nuevamente no os creáis por
completo las capacidades que ponen en los anuncios)
Como desventaja, es una opción algo cara frente a otras opciones disponibles.
Además, la intensidad máxima es reducida, típicamente inferior a 2A, lo que le hace inviable
para proyectos grandes.
Las baterías de Polimero Litio (Lipo) son la opción más avanzada para alimentar
nuestros proyectos.
Las baterías LiPo se presentan en varios voltajes, en función del número de celdas. Así las
LiPo de 2 celdas (2S) proporcionan 7.4V-8.4, y las de 3 celdas (3S) proporcionan 11.1-12.6V.
Ambos voltajes son adecuados para alimentar un Arduino.
Las baterías LiPo presentan la densidad de energía más alta de las opciones planteadas.
Podemos encontrar baterías con capacidades desde 500 a 5000mAh.
Las baterías LiPo también son la opción más cara, aunque al ser recargables resultan
económicas a largo plazo, más aún si tenemos en cuenta sus características eléctricas
14 de 17
La mayor desventaja de estas baterías es la dificultad y cuidado que hay que tener en su
uso. Manipular de forma indebida una batería LiPo puede ser extremadamente
peligroso, por las gran cantidad de energía que almacenan.
La carga de este tipo de baterías tiene que realizarse mediante cargadores especiales, y no
deberían dejarse sin supervisión durante el proceso. Hasta el almacenamiento de estas
baterías debe realizarse en condiciones controladas.
En resumen, las baterías LiPo son la solución más potente para alimentar nuestros
proyectos, pero los requisitos de manipulación y carga la hacen adecuada sólo para
usuarios avanzados y los proyectos complejos, como grandes robots, quadricópteros, y
otro tipo de grandes vehículos
int TRIG = 3;
int ECHO = 4; //definimos las entradas para el sensor
int in1 = 6;
int in2 = 7; //definimos motores 1 y 2 que estarán colocados en paralelos y colocados en el lado
izquierdo.
int EnA = 10; //definimos la salida para controlar la velocidad del motor 1
int in3 = 8;
int in4 = 9; //definimos motores 3 y 4 que estarán colocados en paralelos y colocados en el lado
derecho.
int EnB = 11;
long tiempo;
long distancia;
void setup() {
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
void loop() {
15 de 17
digitalWrite (TRIG, LOW);
delayMicroseconds (10);
if(distancia>=45)
{
analogWrite(EnA,80);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(EnA,80);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
delay(100);
else
{
analogWrite(EnA,0);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
analogWrite(EnB,0);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
analogWrite(EnA,80);
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(EnB,80);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
delay(500);
}
}
16 de 17
17 de 17