Vous êtes sur la page 1sur 119

CLASE DE ROBOTICA

1
2
3
4
5
6
7
8
9
CONTROL DEL ROBOT MOVIL
Arduino

Arduino es una plataforma de prototipos electrónica de código abierto (open-source) basada en una
sencilla placa con entradas y salidas, en un entorno de desarrollo que está basado en el lenguaje
de programación Processing. Es un dispositivo que conecta el mundo físico con el mundo virtual, o
el mundo analógico con el digital.

Partes de un arduino
El arduino como todo componente esta conformado distintas partes como son entradas, salidas,
alimentación, comunicación y shields.

Entradas
Son los pines de nuestra placa que podemos utilizar para hacer lecturas. En la placa Uno son los
pines digitales (del 0 al 13) y los analógicos (del A0 al A5).

Salidas
Los pines de salidas se utilizan para el envío de señales. En este caso los pines de salida son sólo
los digitales (0 a 13).

10
Otros pines
También tenemos otros pines como los GND (tierra), 5V que proporciona 5 Voltios, 3.3V que
proporciona 3.3 Voltios, los pines REF de referencia de voltaje, TX (transmisión) y RX (lectura)
también usados para comunicación serial, RESET para resetear, Vin para alimentar la placa y los
pines ICSP para comunicación SPI.

Alimentación
Como hemos visto el pin Vin sirve para alimentar la placa pero lo más normal es alimentarlo por el
jack de alimentación usando una tensión de 7 a 12 Voltios. También podemos alimentarlo por el
puerto USB pero en la mayoría de aplicaciones no lo tendremos conectado a un ordenador.

Arduino está constituido en el hardware por un micro controlador principal llamado Atmel AVR de 8
bits (que es programable con un lenguaje de alto nivel), presente en la mayoría de los modelos de
Arduino

Tutorial: Uso de Driver L298N para motores DC y paso a paso con Arduino
El siguiente tutorial está basado en el Driver dual para motores (Full-Bridge) – L298N

Este módulo basado en el chip L298N te permite controlar dos motores de corriente continua o un
motor paso a paso bipolar de hasta 2 amperios.

El módulo cuenta con todos los componentes necesarios para funcionar sin necesidad de elementos
adicionales, entre ellos diodos de protección y un regulador LM7805 que suministra 5V a la parte
lógica del integrado L298N. Cuenta con jumpers de selección para habilitar cada una de las salidas
del módulo (A y B). La salida A esta conformada por OUT1 y OUT2 y la salida B por OUT3 y OUT4.
Los pines de habilitación son ENA y ENB respectivamente.

11
En la parte inferior se encuentran los pines de control del módulo, marcados como IN1, IN2, IN3 e IN4.

Conexión de alimentación
Este módulo se puede alimentar de 2 maneras gracias al regulador integrado LM7805.

Cuando el jumper de selección de 5V se encuentra activo, el módulo permite una alimentación de


entre 6V a 12V DC. Como el regulador se encuentra activo, el pin marcado como +5V tendrá un voltaje
de 5V DC. Este voltaje se puede usar para alimentar la parte de control del módulo ya sea un
microcontrolador o un Arduino, pero recomendamos que el consumo no sea mayor a 500 mA.

Cuando el jumper de selección de 5V se encuentra inactivo, el módulo permite una alimentación de


entre 12V a 35V DC. Como el regulador no esta funcionando, tendremos que conectar el pin de +5V
a una tensión de 5V para alimentar la parte lógica del L298N. Usualmente esta tensión es la misma
de la parte de control, ya sea un microcontrolador o Arduino.

Control de un motor DC variando su velocidad


Si queremos controlar la velocidad del motor, tenemos que hacer uso de PWM. Este PWM será
aplicado a los pines de activación de cada salida o pines ENA y ENB respectivamente, por tanto los
jumper de selección no serán usados.

Esquema de conexión

12
Código en Arduino
El programa controla la velocidad de un motor DC aplicando PWM al pin ENB del módulo L298N.

/*
Ejemplo de control de motor DC usando modulo L298
http://electronilab.co/tienda/driver-dual-para-motores-full-bridge-l298n/

Creado 16/05/14
por Andres Cruz
ELECTRONILAB.CO
*/

int IN3 = 5; // Input3 conectada al pin 5


int IN4 = 4; // Input4 conectada al pin 4
int ENB = 3; // ENB conectada al pin 3 de Arduino
void setup()
{
pinMode (ENB, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);
}
void loop()
{
//Preparamos la salida para que el motor gire en un sentido
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
// Aplicamos PWM al pin ENB, haciendo girar el motor, cada 2 seg aumenta la velocidad
analogWrite(ENB,55);
delay(2000);
analogWrite(ENB,105);
delay(2000);
analogWrite(ENB,255);
delay(2000);
// Apagamos el motor y esperamos 5 seg
analogWrite(ENB,0);
delay(5000);
}

13
PWM USANDO POTENCIOMETRO EXTERNO

MONTAJE

-Pins 4,5,12,13 del L293D a masa.


-Juntar las masas del Arduino y de la fuente de alimentación externa.
-Pin 8 del L293D a 9V de la fuente de alimentación externa. Es el voltaje que proporciona al motor.
-Pin 16 del L293D a 5V. Es la alimentación del L293D, pude alimentarse directamente desde la
alimentación que proporciona el Arduino.

14
-El potenciómetro pude ser de cualquier valor.

PROGRAMA
1 /*
2 www.diymakers.es
3 by A.García
4 Control velocidad y sentido motor DC
5 Tutorial en: http://diymakers.es/control-velocidad-y-sentido-de-motor-dc/
6 */
7 int pin2=9; //Entrada 2 del L293D
8 int pin7=10; //Entrada 7 del L293D
9 int pote=A0; //Potenciómetro
10
11 int valorpote; //Variable que recoge el valor del potenciómetro
12 int pwm1; //Variable del PWM 1
13 int pwm2; //Variable del PWM 2
14
15 void setup()
16 {
17 //Inicializamos los pins de salida
18 pinMode(pin2,OUTPUT);
19 pinMode(pin7, OUTPUT);
20 }
21
22 void loop()
23 {
24 //Almacenamos el valor del potenciómetro en la variable
25 valorpote=analogRead(pote);
26 //Como la entrada analógica del Arduino es de 10 bits, el rango va de 0 a 1023.
27 //En cambio, la salidas del Arduio son de 8 bits, quiere decir, rango entre 0 a 255.
28 //Por esta razón tenemos que mapear el número de un rango a otro usando este código.
29 pwm1 = map(valorpote, 0, 1023, 0, 255);
30 pwm2 = map(valorpote, 0, 1023, 255, 0); //El PWM 2 esta invertido respecto al PWM 1
31
32 //Sacamos el PWM de las dos salidas usando analogWrite(pin,valor)

15
33 analogWrite(pin2,pwm1);
34 analogWrite(pin7,pwm2);
35
}
LABORATORIO 1 DE ROBÓTICA
PROCEDIMIENTO EXPERIMENTAL
PRUEBA1: REALIZAR EL MOVIMIENTO DEL ROBOT MOVIL EN LINEA RECTA

PROCEDIMIENTO:
1. REALIZAR UNA PROGRAMACION DEL ROBOT MOVIL PARA QUE SE MUEVA EN 1
METRO Y ANOTAR EL GRADO DE DESVIACION EN UNA TABLA, REALIZAR MINIMO 10
PRUEBAS Y GRAFICAR LA RELACION DE DESVIO , EL ANGULO PROMEDIO
ANOTAR LA TENDENCIA DE DESVIO DEL ROBOT MOVIL

NRO PRUEBA DISTANCIA CM ANGULO DESVIACION


1
2
3
4
5
6
7
8
9
10
PROMEDIO

PRUEBA 2: GIRO EN ANGULO RECTO DEL ROBOT


2- REALICE LA PROGRAMACION DEL ROBOT QUE SE DESPLACE SEGÚN LA FORMA DE UN
CUADRADO DIBUJADO EN EL PISO Y MEDIR EL ANGULO DE DESVIACION Y EL ANGULO DE
GIRO DEL ROBOT. LOS LADOS DEL CUADRO TIENE 80 CM DE LONGITUD

16
ANOTAR LOS RESULTADOS EN LA TABLA

ANGULO DE
NRO PRUEBA DISTANCIA CM ANGULO DESVIACION GIRO
1
2
3
4
5
6
7
8
9
10
PROMEDIO

PRUEBA 3: MOVIMIENTO LINEAL DEL ROBOT

17
CALCULAR LA ECUACION DEL A RECTA QUE REALIZA EL DESPLAZAMIENTO DEL ROBOT
MOVIL ENTRE DOS PUNTOS DIFERENTES A Y B
OBTENER LA ECUACION Y GRAFICAR LOS PUNTO EN EL PLANO CARTESIANO
2.– Ecuación principal de la recta
Esta es otra de las formas de representar la ecuación de la recta.
Pero antes de entrar en la ecuación principal de la recta conviene recordar lo siguiente:
Cada punto (x, y) que pertenece a una recta se puede representar en un sistema de coordenadas,
siendo x el valor de la abscisa (horizontal) e y el valor de la ordenada (vertical).
(x, y) = (Abscisa , Ordenada)
Ejemplo: El punto (–3, 5) tiene por abscisa –3 y por ordenada 5.
Si un par de valores (x, y) pertenece a la recta, se dice que ese punto satisface la ecuación.
Ejemplo: El punto ( 7, 2 ) (el 7 en la abscisa x y el 2 en la ordenada y ) satisface la ecuación y = x
– 5 , ya que al reemplazar queda
2 = 7 – 5 lo que resulta verdadero.
Recordado lo anterior, veamos ahora la ecuación de la recta que pasa solo por un punto
conocido y cuya pendiente (de la recta) también se conoce , que se obtiene con la fórmula
y = mx + n
que considera las siguientes variables: un punto ( x, y ), la pendiente ( m ) y el punto de intercepción
en la ordenada ( n ), y es conocida como ecuación principal de la recta (conocida también como
forma simplificada, como veremos luego).
Al representar la ecuación de la recta en su forma principal vemos que aparecieron dos nuevas
variables: la m y la n , esto agrega a nuestra ecuación de la recta dos nuevos elementos que deben
considerase al analizar o representar una recta: la pendiente (m) y el punto de intercepción
(n) (también llamado intercepto ) en el eje de las ordenadas (y) .

Respecto a esto, en el gráfico de arriba, m representa la pendiente de la recta y permite obtener


su grado de inclinación (en relación a la horizontal o abscisa), y n es el coeficiente de
posición, el número que señala el punto donde la recta interceptará al eje de las ordenadas (y).
Forma simplificada de la ecuación de la recta

18
Si se conoce la pendiente m , y el punto donde la recta corta al eje de ordenadas es ( 0, b )
(corresponde a n en la fórmula principal ya vista), podemos deducir, partiendo de la ecuación de la
recta de la forma
y − y 1 = m(x − x 1 )
y – b = m(x – 0)
y – b = mx
y = mx + b

Ahora, observemos el gráfico de arriba: Cuando se tienen dos puntos de una recta P 1 (x 1 ,
y 1 ) y P 2 (x 2 , y 2 ) , la pendiente, que es siempre constante , queda determinada por el cuociente
entre la diferencia de las ordenadas de esos dos puntos y la diferencia de las abscisas de los
mismos puntos, o sea, con la fórmula

Entonces, a partir de esta fórmula de la pendiente se puede también obtener la ecuación de la


recta, con la fórmula:
y – y 1 = m(x – x 1 )

Robot móvil

En los últimos años la investigación sobre robots móviles está adquiriendo gran desarrollo. Ello se
debe, en parte, al abaratamiento del hardware necesario para su construcción, y en parte a la nueva
concepción industrial de planta de fabricación flexible, que requiere la reconfiguración de la
secuencia de acciones necesarias para una producción variada, lo que a su vez exige facilidad de
desplazamiento de los materiales entre cualesquiera puntos de la factoría.

19
Las soluciones a este problema de transporte de material en entornos "flexibles" son varias. La
primera situar las máquinas cerca unas de otras, y organizadas de modo que uno o más brazos
robot puedan llevar las piezas entre ellas; esta configuración, un caso particular de las
llamadas células de fabricación flexible, es sólo apropiada para un número limitado de máquinas.
Otra solución válida es el uso de vehículos autoguiados (denotados usualmente
como AGV, Autonomous Guided Vehicles), los cuales recurren para el guiado a sistemas externos
preprogramados, tales como un raíl, cables eléctricos enterrados que crean un campo magnético,
etc. Finalmente, la mejor solución sería disponer de vehículos autónomos (denotados
como ALV, Autonomous Land Vehicles) que se mueven de un punto a otro sin necesidad de ayudas
externas (al menos, no en todo momento), lo que los hace capaces de navegación genérica en un
entorno dado a partir de órdenes de alto nivel; a la secuencia de tales órdenes se la suele llamar
el plan de la misión.

Sistema autónomo robot móvil + brazo robótico

Por otra parte, la construcción experimental de (normalmente) pequeños robots móviles en


laboratorios universitarios y a nivel de aficionado (microbots) está haciendo surgir un tipo de
investigación que aborda los aspectos de conexión senso-motora (el aspecto más fundamental
de la Robótica) desde un punto de vista diferente a aproximaciones anteriores, y que conlleva
también un cambio de visión en la concepción clásica de la Inteligencia Artificial, la cual se aborda
intentando construir vida artificial.

Existen diferencias bastante importantes entre los robots manipuladores industriales y los
móviles. Para que un robot manipulador sea útil y capaz de evolucionar en el espacio 3D, debe
poseer varios grados de movilidad (grados de libertad), sin embargo, un robot móvil con solamente
dos grados de libertad puede realizar cosas bastante interesantes sobre una superficie de trabajo.
Por otro lado, dado que los robots manipuladores generalmente trabajan en espacios altamente
estructurados (fijos y adecuados a las tareas a desarrollar), requieren de un sistema de percepción
mucho menos sofisticado.

1. Navegación

Se llama navegación al conjunto de métodos y técnicas usados para dirigir el curso de un robot
móvil a medida que éste atraviesa su entorno. Se supone que se debe llegar a algún destino pedido,
sin perderse y sin chocar ni con obstáculos fijos, ni con otros móviles que eventualmente puedan
aparecer en el camino.

Para efectuar navegación lo más común es disponer de un mapa, aunque no necesariamente.


Mapa es cualquier tipo de representación del entorno en la memoria del robot. A partir de un mapa,
se puede determinar un camino apropiado entre dos puntos deseados, lo cual será más o menos
complejo según haya sido la representación escogida. Por último, habrá que seguir ese camino.

20
Veamos en primer lugar los tipos de mapas que se usan normalmente. Primeramente están los
basados en información sensorial, con dos tipos:

 Mapas de marcas en el terreno (landmarks): son localizaciones particulares fácilmente


identificables por el sistema sensorial del robot (cierta esquina, un grupo de objetos bien
visibles o tubos de neón, etc.) que actúan como marcas relevantes (landmarks). Se
representan como nodos de un grafo (que pueden tener características asociadas, para
garantizar su identificación unívoca), los cuales se unen por los arcos que normalmente
representan la accesibilidad (si existe arco entre dos nodos, el robot puede desplazarse
directamente de uno a otro de los landmarks a los que los nodos representan). Estos arcos
pueden también estar etiquetados con características del recorrido como distancia,
dirección, tiempo de tránsito, etc.
 Mapas de ocupación: se basan en representar el terreno como una retícula, regular o no,
cada una de cuyas casillas contiene un valor útil para el robot, que suele ser la certitud de
ocupación, es decir, qué grado de creencia tiene el robot sobre el estado de una determinada
casilla, desde -1 (es seguro que está libre) hasta +1 (es seguro que está ocupada) pasando
por 0 (no hay evidencia en ningún sentido). Estos mapas se pueden construir por métodos
visuales, mediante la toma de imágenes por un par estéreo de cámaras (o una sola que va
a bordo del robot y se sitúa en varias posiciones), a partir de las proyecciones de puntos
límite de un objeto, como se ve en la siguiente figura:

Construcción visual de un mapa de ocupación


Imagen tomada de http://ingenieroseninformatica.org (recursos/tutoriales/aprob)

Los mapas también se pueden clasificar de acuerdo a lo que almacenan:

 Mapas de espacio libre: al igual que en los mapas de marcas, la estructura de


almacenamiento elegida es también el grafo, pero esta vez cada nodo representa un punto
de parada donde el robot pueda detenerse para explorar el entorno mediante sus sensores.
Los arcos son líneas rectas que el robot pueda recorrer entre estos puntos sin encontrar
obstáculos; evidentemente, limitarán a los posibles obstáculos. Observa la figura:

21
Imagen tomada de http://ingenieroseninformatica.org (recursos/tutoriales/aprob)

 Mapas de objetos: Como su nombre indica, lo que se almacena en ellos son los objetos
(obstáculos) que el robot puede encontrar en su trayectoria, de varios modos; los más
normales son considerar al objeto como un polígono, y almacenar su punto central y la
extensión máxima en una serie de direcciones desde él; otro modo es caracterizarlo como
una de entre un conjunto de figuras geométricas dadas, y dar su posición y la orientación de
un eje propio de esa figura
 Mapas compuestos: almacenan tanto información de objetos como de espacio libre. Una
posibilidad es dividir el espacio en regiones arbitrarias, pero conocidas, e indicar en cada
una de ellas si está totalmente libre, totalmente ocupada, o parcialmente ocupada. Otra
alternativa es una retícula de puntos con un indicador de estado en cada punto, y una lista
de a cuáles de los puntos adyacentes se puede acceder directamente; la retícula puede
hacerse más o menos densa, en función del tamaño del robot.
 Quadtrees: Dividen el espacio mediante una retícula, y proceden por subdivisión recursiva
de la misma, mientras la celda resultante sea subdividible, siendo el criterio el que no tenga
toda ella el mismo carácter de ocupación.

Una vez se tienen los mapas, el siguiente paso consiste en definir cómo un robot móvil es capaz de
saber en qué punto del mapa se encuentra. Para ello, se puede recurrir a la información aportada
por los dos tipos posibles de sensores: internos y externos. Los principales procedimientos para
la autolocalización (dead reckroning) son:

 Odometría: a partir del conocimiento de la velocidad de las ruedas resulta posible conocer
la velocidad instantánea del robot respecto a un sistema externo. Para ello se pueden
instalar sensores de posición angular (normalmente, codificadores ópticos) en cada rueda.
Conocido el vector velocidad, la posición en un instante puede obtenerse mediante
integración.
 Balizas: son marcas de fácil localización instaladas en lugares conocidos, que el robot es
capaz de detectar con sus sensores, y respecto a las cuáles se sitúa. Pueden ser marcas
visuales (tubos de neón, o bandas de colores), o emisores de infrarrojos, cada uno emitiendo
una señal modulada con un código conocido. Estas señales pueden ser recogidas por una
óptica apropiada y proyectadas sobre una cámara CCD o un array de fotodiodos, que sirve
para determinar la dirección de la que proceden. Conociendo al menos dos de éstas
direcciones (aunque pueden ser más) y las posiciones absolutas de las balizas es posible
determinar por triangulación la posición del robot:

22
Imagen tomada de http://ingenieroseninformatica.org (recursos/tutoriales/aprob)

El problema ahora es, dados un punto inicial y un punto final (meta) especificados sobre el modelo
de mapa propuesto, encontrar en dicho mapa un camino libre de colisión que el robot pueda seguir.
Para hacerlo físicamente, comprobará continua o intermitentemente que se encuentra sobre los
puntos del camino, usando alguna de las técnicas de autolocalización. A este proceso se le
denomina planificación y seguimiento de caminos.

Los requerimientos que deberá cumplir un planificador de caminos son:

 Encontrar un camino que el robot pueda atravesar sin colisión.


 Manejar la incertidumbre en la información sobre el entorno derivada de la imprecisión de
los sensores.
 Mantener el robot lo más lejos posible de los objetos, para que los sensores envíen menos
datos y así se requiera menos proceso.
 Encontrar el camino óptimo (el mejor entre los posibles) y seguirlo de un modo suave.

Veamos ahora los modos de planificar un camino:

 Por guiado: consiste en llevar al robot físicamente a una serie de lugares preestablecidos y
almacenar las impresiones sensoriales que se reciben en cada uno de ellos, así como la
dirección o direcciones de desplazamiento posterior hacia el/los siguiente(s) punto(s)
importantes(s). Para alcanzar el punto deseado se pueden implantar lazos de realimentación
que operen tomando directamente como entrada las señales sensoriales, y que generen
señales de control para los actuadores, evitando el cálculo de la posición absoluta, no útil
en este caso.
 Automáticamente: Aquí entran en juego algoritmos que dependen fuertemente de la
representación usada para el mapa. En mapas de tipo grafo, siendo los nodos posiciones
de referencia a comprobar con los sensores, la planificación consiste en encontrar el camino
de mínima distancia en el grafo. La distancia se define en función de los costes de cada
arco, que pueden ser, bien distancias físicas, bien algún otro tipo de penalización asociada
a ese desplazamiento (por ejemplo, debida a la estrechez de un pasillo que obliga a reducir
la velocidad, etc.). En mapas que contienen los objetos, los planificadores tratan de
encontrar caminos por el espacio libre lo más alejados posible de los objetos. Esto es bueno
en pasillos estrechos, pero puede ser ineficiente en zonas anchas, por elegir caminos más
largos. Observa la parte izquierda de la siguiente figura, en la que se elegiría el camino A
antes que el B, pese a ser más largo.

Imagen tomada de http://ingenieroseninformatica.org (recursos/tutoriales/aprob)


23
2. Tecnologías de construcción y conexión senso-motora

Un robot móvil, como otros tipos de robot, puede considerarse esencialmente como un sistema (una
colección de sensores, actuadores, y elementos computacionales) organizados de tal modo que
exhiban una acción inteligente en respuesta aciertos estímulos. Tal sistema no tiene por qué ser
complejo. De hecho, algunos de los robots móviles más sencillos responden al siguiente esquema.
Están constituidos por dos motores que hacen girar sendas ruedas independientemente. No llevan
procesador, todo su hardware consiste en los drivers de potencia de los motores, y en dos
contadores programables que comienzan a contar al recibir una señal externa, y durante el tiempo
que dure su cuenta, hasta un valor predefinido generan una señal que indica al motor que se mueva
en sentido opuesto (B). El resto del tiempo cada motor se mueve hacia adelante (F). Los contadores
están conectados a los sensores de choque S1 y S2, como muestra la siguiente figura:

Imagen adaptada de http://ingenieroseninformatica.org (recursos/tutoriales/aprob)

Al moverse ambos motores a la misma velocidad y en el mismo sentido (F) el robot avanza. Al
chocar con un obstáculo, ambos motores invierten su sentido, y el robot retrocede. Pero el contador
de uno de ellos está ajustado a un tiempo menor que el del otro, con lo cual al invertirse ambos
giran en distinto sentido durante un instante, lo que hace que el robot gire sobre su propio eje, con
lo que es posible que ya no apunte hacia el obstáculo. A continuación ambos motores vuelven a
girar hacia adelante, y se continúa el avance en línea recta. Si el tiempo (ángulo) de giro no hubiese
sido suficiente, el robot volvería a chocar con el obstáculo, y repetiría la misma maniobra. Observa
el recuadro izquierdo de la siguiente figura:

Imagen tomada de http://ingenieroseninformatica.org (recursos/tutoriales/aprob)

Si, además, a uno de los motores se le hiciera girar un poco más lento en el sentido B, tendríamos
que el robot retrocedería describiendo un arco. Esto haría que siguiese aproximadamente las
paredes, como se observa en el recuadro derecho de la figura anterior. En ese caso, el observador
externo asignaría un propósito al robot, cuando en realidad el "programa" no lo establece
explícitamente. De hecho, ni siquiera se puede decir que haya un programa en sentido tradicional:
todo esto se puede implantar con circuitería analógica, aunque sea mejor hacerlo digitalmente,
siempre que se conserve el espíritu de simplicidad. Este ejemplo sirve para ilustrar una conexión
directa y de bajo nivel entre percepción y acción, pero esta no es la única manera. También se
puede (usando sensores más sofisticados) tratar de localizar aspectos físicos externos conocidos
24
por el mapa prealmacenado, realizar una planificación del camino por los medios antes vistos, y
seguirlo usando landmakrs u odometría.

Respecto a la tecnología usada, debemos referirnos a los sensores y a los actuadores. Entre
los sensores que más habituales se encuentran:

 Fotoresistencias o fototransistores, que se usan para implementar fototaxias


(seguimiento de fuentes de luz). Su salida se conecta a un conversor A/D, o a un simple
comparador, dependiendo del uso que se quiera hacer (si importa el valor de la señal, o sólo
si ésta es superior a un umbral).
 Sensores de proximidad por infrarrojos: Son sensibles a radiación alrededor de los 880
nm. Existen detectores encapsulados que contienen emisor y receptor; modulan la emisión,
y responden sólo a ese patrón de modulación, con lo que evitan interferencias de fuentes
externas de infrarrojos. El hardware que necesitan es un oscilador (de cuarzo, o astable)
para el emisor, y un conversor A/D o comparador para el receptor.
 Sensores piroeléctricos: son resistencias variables con la temperatura. Se usan para
seguir fuentes de calor.
 Sensores de contacto por doblez: constan de un eje metálico con una capa de pintura
conductora que varía su resistencia al doblarse. Se conectan a un conversor A/D.
 Microinterruptores de choque (bumpers): se usan con una palanca que los activa al
chocar el robot con algún obstáculo. Se conectan directamente a entradas digitales del
microcontrolador del robot.
 Sonares: El modelo más usado es el Polaroid TM. El hardware que usan es un contador,
para saber el tiempo transcurrido entre la ida yla vuelta del impulso ultrasónico, y circuitos
especiales para generar el pulso.
 Codificadores ópticos: normalmente de tipo incremental, se instalan en todas o algunas
de las ruedas, tanto en el eje de giro como en el de guiado. Como ya se vio, requieren un
hardware específico para la cuenta de pulsos, aunque ésta se pueda hacer también
por sofwtare, conectado las señales de cada canal a puertos de entrada, y manteniendo un
proceso dedicado a monitorizarlos.
 Giróscopos: son análogos a los usados en los sistemas de navegación inercial de los
aviones, pero algo más simples. Son raramente usados por su precio. Existen versiones
electrónicas baratas basadas en sensores de estado sólido que sólo miden la velocidad de
giro, pero no la orientación absoluta.
 Inclinómetros: se basan en un codificador óptico en posición vertical con un péndulo
colgado de él, o bien en una gota de mercurio sobre un platillo horizontal con contactos
repartidos regularmente alrededor de ella.
 Brújulas: deberían dar la orientación absoluta usando el campo magnético terrestre. No son
muy usadas, porque aunque en exteriores dan medidas aceptables, en interiores y sobre
todo con campos magnéticos provocados por la circuitería o maquinaria circundante no son
fiables.
 Cámaras de TV: se suelen usar modelos en miniatura, de tipo CCD. Tienen los
inconvenientes de requerir un hardware más complicado (una placa digital de imagen) y
generar un volumen de información difícilmente tratable en tiempo real sin hardware
específico.

25
Navegación de robots en convoy utilizando visión artificial
Imagen tomada de http://omega2.inin.mx/publicaciones/documentospdf/ROBOTS.pdf

En cuanto a los actuadores, se suelen usar siempre motores eléctricos de CC, por su facilidad de
control. Se conectan a engranajes reductores para disminuir la velocidad y aumentar la potencia. Si
la corriente que necesitan no es muy alta (robots pequeños no muy pesados con dos motores
pueden consumir de 0.5 a 2 A por motor), existen reguladores encapsulados que pueden
proporcionarla, los cuales se controlan por modulación en anchura de pulso (PWM).

Los lazos de realimentación para el control de las ruedas se suelen realizar por software, que va
leyendo los registros asociados a los codificadores, y envía una señal digital que luego se convierte
en analógica y activa los dispositivos de potencia. El control es, por supuesto, siempre discreto.

Los sistemas de locomoción son variados. El modelo más común consiste en usar dos ruedas
motrices independientes con sus ejes alineados perpendicularmente a la dirección de avance. La
forma del robot suele ser compacta, mejor circular, para ganar maniobrabilidad.

La alimentación es un punto muy problemático. Hasta ahora, las baterías que podían dar suficiente
corriente eran muy pesadas; hoy día existen modelos recargables de Ni-Cd más ligeros.

ROBOT SEGUIDOR DE LINEAS


Materiales

26
Estructura del robot

27
EL PUENTE H

28
29
SENSOR

Necesitamos conocer el estado de nuestro sistema, y además lo compararemos con nuestro


objetivo. En nuestro caso ese objetivo es seguir una línea pintada en el suelo. En las competiciones
típicas de robots siguelíneas tenemos una base blanca con una línea negra de 2 centímetros de
ancho. Hay otras con la pista pintada de un color degradado ¡el algoritmo también vale para estas!

Para detectar la línea utilizamos sensores de reflectancia. Estos sensores emiten luz con un diodo
(normalmente infrarrojo) y leen la luz rebotada con un sensor de luz (típicamente un fotodiodo o un
fototransistor). Cuando la luz rebota sobre una superficie negra da una lectura diferente que cuando
rebota sobre una superficie blanca et voilà. Hay que tener cuidado, a la medida de estos sensores
le afecta la distancia a la superficie de rebote y la luz ambiental.

El Sensor QRD1114 es un sensor que ha venido a revolucionar la robotica estudiantil, este sensor
se ha vuelto el remplazo directo del sensor CNY, esto debido a que esta nueva gama QRD1114
posee una mejor precisión que el sensor ya antes mencionado.
30
El Sensor QRD1114 ha sido adoptado en la actualidad por los estudiantes y los amantes de la
robotica para la construcción de los llamados seguidores de linea. Estos seguidores se
construyen para seguir una linea de color negro o blanco sin salirse del camino marcado y en el
menor tiempo posible, esta característica de tener que seguir una linea de un color en especial es
lo que hizo que este sensor se convirtiera en el favorito de los desarrolladores por su particular
característica que se muestra en la siguiente imagen.

Sensor QRD1114 Seguidor de lineas


Debido a que la luz emitida por el sensor es reflejada o absorbida (dependiendo del color), se
pueden realizar diferentes programas para aprovechar esta interesante característica.
Otra característica de este sensor es que su salida de datos es Analógica y su conexión es muy
fácil. La conexión de este sensor es prácticamente igual para Arduino y para Microcontroladores,
dicha conexión se puede ver a continuación.

Sensor QRD1114 Arduino


Características del Sensor QRD1114

 Voltaje de alimentación: 5 Volts


 Distancia de censado o medición ideal: 6 Milímetros
 Salida del sensor: Analógica
 Cuerpo del tipo encapsulado que alberga al emisor y receptor
 Este sensor es compatible con Microcontroladores que acepten datos analógicos, también
es compatible con cualquier tarjeta Arduino

PROGRAMACION DEL ROBOT SEGUIDOR D ELINEAS


const int sensor1 = 2; //declaracion de constantes para
const int sensor2 = 3;
boolean s1; //declaracion de variables para la
boolean s2; //lectura de las entradas boolean

31
const int motor1 = 9;
const int motor2 = 10;
void setup() {
pinMode(motor1, OUTPUT);
pinMode(motor2, OUTPUT);
pinMode(sensor1, INPUT);
pinMode(sensor2, INPUT);
}void loop() {
//programa principal//lectura de sensores
s1= digitalRead(sensor1);
s2= digitalRead(sensor2);
if (s1 == LOW && s2 == HIGH)
{analogWrite(motor1,255);
analogWrite(motor2,255);}
else
{//regla 2
if (s1 == LOW && s2 == HIGH)
{
analogWrite(motor1,254);
analogWrite(motor2,254);
}}}
SENSOR QTR DIGITAL

PROG Nota: Este producto ahora viene en pares por cada empaque.

La salida está diseñada para ser leída por una E/S digital de un microcontrolador.

El Pololu QTR-1RC sensor de reflectancia lleva un LED infrarrojo y un fototransistor. El fototransistor


utiliza un circuito de descarga capacitiva que permite leer una E/S digital de un microcontrolador,
para hacer una lectura analógica del IR, se refleja mediante la medición del tiempo de descarga del
condensador. Menor tiempo de descarga del condensador es un indicio de una mayor reflexión.

La resistencia de limitación de corriente se ajusta para entregar aproximadamente 20 a 25 mA para


el LED cuando VIN es de 5 V. Debido a su pequeño tamaño, las unidades múltiples se pueden
32
arreglar fácilmente para adaptarse a diversas aplicaciones tales como sensores de detección de
proximidad de línea. Para un sensor de línea con ocho de estas unidades dispuestas en una fila,
por favor consulta el Sensor QTR- Digital arreglo de 8.

Características:
 Dimensiones: 13 x 8mm
 Voltaje de funcionamiento: 5,0 V
 Consumo de corriente: 25 mA
 Formato de salida: E / S digital compatible
 Distancia óptima de detección: 3 mm
 Máxima distancia de detección recomendada: 9,5 mm
 Peso sin terminales: 0,23g

ROBOT EVITA OBSTÁCULOS CON ULTRASONIDOS


Circuito eléctrico (diagrama de conexiones)
Dado que en otras sesiones ya trabajamos con el driver L298n para controlar 2 motores de corriente
contínua y con el sensor de ultrasonidos HC-SR04 para detectar la presencia de osbtáculos,
combinaremos la circuitería de ambos circuitos para crear nuestro proyecto conjunto.
A continuación realizaremos el esquema en el que alimentaremos el driver L298n y los motores con
una fuente de alimentación externa (en nuestro caso 4 pilas AA que nos proporcionan un voltaje de
6V

Código programa Arduino


En este primer ejemplo usaremos un código muy sencillo que no usa librerías externas y que solo
usa las funciones nativas de la IDE de Arduino y dejaremos el uso de programas más complejos
para siguientes ocasiones.
Arduino Code
1. /*
2. Nombre: Robot esquivaobstáculos
3. Autor: Daniel Pascual Gallegos
4. Fecha: Noviembre 2016
5. Funcionalidad: Este subproyecto forma parte de la construcción de nuestro robot autónomo.
6. En este subproyecto usaremos el driver L298n para gobernar 2 motores de CC que
realizarán
33
7. la parte mecánica de nuestro robot móvil.
8. En este subproyecto nuestro robot irá recto y cuando encuentre un obstáculo a menos de
5 cm
9. girará en sentido horario hasta que esquive el obstáculo y siga su camino
10. */
11. // Definición de variables y constantes relacionadas con el motor izquierdo
12. const int IN1 = 13; // Pin digital 13 para controlar sentido giro motor izquierdo
13. const int IN2 = 12; // Pin digital 12 para controlar sentido giro motor izquierdo
14.
15. // Definición de variables y constantes relacionadas con el motor derecho
16. const int IN3 = 11; // Pin digital 11 para controlar sentido giro motor izquierdo
17. const int IN4 = 10; // Pin digital 10 para controlar sentido giro motor izquierdo
18.
19. // Este programa usará el sensor de ultrasonidos HCSR04
20. // para medir la distancia a la que se encuentran
21. // diferentes obstáculos en centímetros y mostrarlo por el puerto serie.
22. const int triggerEmisor = 3;
23. const int echoReceptor = 2;
24. const int valorUmbral = 20;
25. long tiempoEntrada; // Almacena el tiempo de respuesta del sensor de entrada
26. float distanciaEntrada; // Almacena la distancia en cm a la que se encuentra el objeto
27.
28. // Función que se ejecuta una sola vez al cargar el programa
29. void setup()
30. {
31. // Se declaran todos los pines como salidas
32. pinMode (IN1, OUTPUT);
33. pinMode (IN2, OUTPUT);
34. pinMode (IN3, OUTPUT);
35. pinMode (IN4, OUTPUT);
36.
37. pinMode(triggerEmisor,OUTPUT); // El emisor emite por lo que es configurado como salida
38. pinMode(echoReceptor,INPUT); // El receptor recibe por lo que es configurado como
entrada
39. Serial.begin(9600); // Inicia el puerto de comunicaciones en serie
40. }
34
41. // Función que se repite de manera periódica
42. void loop()
43. {
44. sensorUltrasonidos();
45. // Si el valor de la distancia es menor que 5 cm se para y sigue recto en caso contrario
46. if(distanciaEntrada>valorUmbral)
47. {
48.
49. robotAvance();
50. }
51. else
52. {
53. robotDerecha ();
54. }
55. }
56. /*
57. Función sensorUltrasonidos: para medir la longitud del pulso entrante.
58. Mide el tiempo que transcurrido entre el envío del pulso ultrasónico
59. y cuando el sensor recibe el rebote,
60. es decir: desde que el pin echo empieza a recibir el rebote, HIGH,
61. hasta que deja de hacerlo, LOW, la longitud del pulso entrante.
62. */
63. void sensorUltrasonidos()
64. {
65. // Se inicializa el sensor de infrasonidos
66. digitalWrite(triggerEmisor,LOW); // Para estabilizar
67. delayMicroseconds(10);
68.
69. // Comenzamos las mediciones
70. // Se envía una señal activando la salida trigger durante 10 microsegundos
71. digitalWrite(triggerEmisor, HIGH); // envío del pulso ultrasónico
72. delayMicroseconds(10);
73. tiempoEntrada=pulseIn(echoReceptor, HIGH);
74. distanciaEntrada= int(0.017*tiempoEntrada); // Fórmula para calcular la distancia en cm
75. Serial.println("El valor de la distancia es ");
35
76. Serial.println(distanciaEntrada);
77. delay(200);
78. }
79. /*
80. Función robotAvance: esta función hará que ambos motores se activen a máxima potencia
81. por lo que el robot avanzará hacia delante
82. */
83. void robotAvance()
84. {
85. // Motor izquierdo
86. // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
87. digitalWrite (IN1, HIGH);
88. digitalWrite (IN2, LOW);
89. // Motor derecho
90. // Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
91. digitalWrite (IN3, HIGH);
92. digitalWrite (IN4, LOW);
93. }
94. /*
95. Función robotRetroceso: esta función hará que ambos motores se activen a máxima
potencia
96. en sentido contrario al anterior por lo que el robot avanzará hacia atrás
97. */
98. void robotRetroceso()
99. {
100. // Motor izquierdo
101. // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al
anterior
102. digitalWrite (IN1, LOW);
103. digitalWrite (IN2, HIGH);
104. // Motor derecho
105. // Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al
anterior
106. digitalWrite (IN3, LOW);
107. digitalWrite (IN4, HIGH);
108. }

36
109. /*
110. Función robotDerecha: esta función acccionará el motor izquierdo y parará el
derecho
111. por lo que el coche girará hacia la derecha (sentido horario)
112. */
113. void robotDerecha()
114. {
115. // Motor izquierdo
116. // Se activa el motor izquierdo
117. digitalWrite (IN1, HIGH);
118. digitalWrite (IN2, LOW);
119. // Motor derecho
120. // Se para el motor derecho
121. digitalWrite (IN3, LOW);
122. digitalWrite (IN4, LOW);
123. }
124. /*
125. Función robotIzquierda: esta función acccionará el motor derecho y parará el
izquierdo
126. por lo que el coche girará hacia la izquierda (sentido antihorario)
127. */
128. void robotIzquierda ()
129. {
130. // Motor izquierdo
131. // Se para el motor izquierdo
132. digitalWrite (IN1, LOW);
133. digitalWrite (IN2, LOW);
134. // Motor derecho
135. // Se activa el motor derecho
136. digitalWrite (IN3, HIGH);
137. digitalWrite (IN4, LOW);
138. }
139. /*Función robotParar: esta función parará ambos motorespor lo que el robot se
parará.
140. void robotParar()
141. {// Motor izquierdo

37
142. // Se para el motor izquierdo
143. digitalWrite (IN1, LOW);
144. digitalWrite (IN2, LOW);
145. // Motor derecho
146. // Se para el motor derecho
147. digitalWrite (IN3, LOW);
148. digitalWrite (IN4, LOW);
149. }
150.

TAREA:
ELABORAR EN GRUPO LOS DOS ROBOTS (ROBOT SEGUIDOR DE LINEAS Y
ULTRASONIDO) Y PROBARLO EN EL AULA
NOTA FINAL DE UNIDAD 1
ROBOT ULTRASONIDO ARDUINO
El robot que esquiva obstáculos con ultrasonido funciona usando 3 piezas.

1. La primera es el Arduino Uno, una plataforma de prototipos electrónica de código abierto. Esta es
como el cerebro del robot. Funciona con el IDE Software: Integrated Development Environment.
2. La segunda pieza es el Driver L298N, este permite controlar 2 motores de corriente continua. Este
es el motor del robot que está conectado con el arduino uno y el sensor de ultrasonido HC-SR04.
De este motor driver sale la energía para el arduino.
3. La tercer pieza es el sensor de ultrasonido HC-SR04, este usando ondas de sonidos logra medir un
distancia desde 2 cm - 400 cm. Este sensor está conectado al Arduino uno que dirige al driver L298N
y este finalmente comanda al los motores DC haciendo que el robot se mueva de forma correcta.

Add TipAsk QuestionCommentDownload


Step 6: Realizar Las Conexiones

38
 La programación de la tarjeta de Arduino consta de 3 etapas.

1. La primera fase consta de declarar variables que nos ayuden a identificar los puertos que
utilizaremos a lo largo del código. Las variables nos permiten guardar valores numéricos o de
texto con un determinado nombre. En este caso, principalmente nos sirve para ordenar la
programación y poder modificarla con mayor facilidad si es que un problema se presenta.

Sabiendo que para este proyecto utilizaremos 6 puertos (4 para la tarjeta roja y 2 para el sensor de
ultrasonido), le asignaremos un nombre a cada valor para evitar confusiones al momento de
programar. En este caso el nombre que le asignamos a cada variable está relacionado con su
función. Por ejemplo, el puerto 0 que va conectado al puerto IN1, cuando lo tengamos que llamar
en la programación, tendríamos que escribir pinMode(0,OUTPUT); pero ese 0 evidentemente no
nos dice nada y lo más probable es que nos enredemos utilizando muchos números. Para ello,
creamos un casillero que almacene el valor 0 y que tenga un nombre identificable a simple vista.

2. La segunda fase se centra en configurar el robot utilizando la función por defecto “void
setup”. En esta función declaramos lo que utilizaremos a lo largo de código. En otras palabras,
acentuamos una base para que el programa luego corra sin problema. En estos cimientos
activaremos los 6 puertos que vamos a utilizar.
Para activar un puerto es necesario conocer dos valores. El primero, es el número del puerto y el
segundo, es si es INPUT o OUTPUT. Un puerto funciona como INPUT cuando recibe señales y
como OUTPUT cuando emite señales. Por ejemplo, todos puertos destinados a los motores
funcionan como OUTPUT, pues solo dan ordenes de prender y apagar. Mientras que el puerto
“Echo” (el segundo puerto del sensor de ultrasonido), que mide el tiempo de retorno de la onda de
ultrasonido, es INPUT, pues, a diferencia de los motores, esta envía una señal a la tarjeta.

Ejemplo de escritura (que se debe de repetir para los 6 puertos):

pinMode(Trigger,OUTPUT);
pinMode(Echo,INPUT);
3. La tercera y última parte sería programar la función “void loop”. En esta función va todo
lo que el robot va a analizar en todo momento.

Para esto, es necesario entender claramente lo que el robot hará paso por paso.

En este caso, lo primero que hará es esperar a saber su distancia con respecto al objeto que está
enfrente. Pues sin ese dato no puede saber si debe de avanzar o voltear.

Sabiendo que el sensor de ultrasonido mide el tiempo que demora en regresar una onda emitida,
tendremos que transformar este tiempo en distancia utilizando una fórmula matemática. Antes de
hacer esto es imperativo crear dos variables que nos ayuden a almacenar estos datos:

39
long t1;
long d1;
(Utilizamos “long” para declarar variables con bastantes decimales).

Teniendo estas dos variables, programamos el sensor de ultrasonido y guardamos el tiempo en una
variable, para calcular con ello la distancia.

digitalWrite(Trigger, HIGH);
delayMicroseconds(10);
digitalWrite(Trigger, LOW);
t1= pulseIn(Echo, HIGH);
d1= (t1/2)/29;

Una vez teniendo el valor de la distancia, creamos un “if” (condicional) que hará que el robot elija
entre dos caminos dependiendo del valor de la distancia. Una camino (opción) es que siga de frente
porque la distancia todavía es considerable y el otro, es que se dé una vuelta porque está muy cerca
a un objeto.

Hay que tener en cuenta que cada IN"x" es un cable que controla ya sea la función de avanzar o
retroceder de una llanta. Siendo específicos, IN1 se encarga de hacer que la llanta izquierda
retroceda y IN2 que avanze, igualmente IN3 y IN4 para la otra llanta.

if (d1>25) {
digitalWrite(IN1,LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3,HIGH);
digitalWrite(IN4, LOW);
}else {
digitalWrite(IN1,LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3,HIGH);
digitalWrite(IN4, LOW);
}
Como resultado nos debería quedar el siguiente código:

int IN1= 0;
int IN2= 1;
int IN3= 6;
int IN4= 5;
const int Trigger= 12;
const int Echo= 13;
void setup() {

40
pinMode(IN1,OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT);
pinMode(Trigger, OUTPUT);
pinMode(Echo,INPUT);
digitalWrite(Trigger, LOW);
}
void loop() {
long t1;
long d1;
digitalWrite(Trigger,HIGH);
delayMicroseconds(10);
digitalWrite(Trigger,LOW);
t1= pulseIn(Echo, HIGH);
d1= (t1/2)/29;
if (d1>25) {
digitalWrite(IN1,LOW);
digitalWrite(IN2, HIGH);
digitalWrite(IN3,HIGH);
digitalWrite(IN4, LOW);
}
else {
digitalWrite(IN1,LOW);
digitalWrite(IN2, LOW);
digitalWrite(IN3,HIGH);
digitalWrite(IN4, LOW);
}
}
En esta última etapa debemos de subir el código ya listo a nuestro Arduino. Para lograr esto,
necesitamos un “Cable A to B” (muy común en impresoras). Tras conectar el Arduino a la
computadora, vamos al programa de arduino, vamos a la pestaña herramientas y nos aseguramos
de que en “Placa” esté seleccionado “Arduino Uno”. En la misma pestaña, seleccionamos el puerto
en el que nuestro cable está conectado.

Antes de proseguir, es recomendable tener el robot prendido en todo momento. Teniendo esto en
cuenta, presionamos el botón que tiene como ícono un check, verificamos de que no haya ningún
error de escritura y presionamos el boton que tiene como ícono una flecha.

Circuito eléctrico (diagrama de conexiones)

41
Dado que en otras sesiones ya trabajamos con el driver L298n para controlar 2 motores de
corriente contínua y con el sensor de ultrasonidos HC-SR04 para detectar la presencia de
osbtáculos, combinaremos la circuitería de ambos circuitos para crear nuestro proyecto
conjunto.

A continuación realizaremos el esquema en el que alimentaremos el driver L298n y los


motores con una fuente de alimentación externa (en nuestro caso 4 pilas AA que nos
proporcionan un voltaje de 6 V aunque existirían mejores y más caras opciones (leer artículo
sobre alimentación de la placa Arduino)) por lo que. nuestro vehículo se podría mover sin
tener que estar conectado a la red. A continuación se muestran 2 versiones con la diferencia
de que en la segunda se usará la placa de pruebas para poder introducir en el futuro más
sensores o actuadores.

Código programa Arduino


En este primer ejemplo usaremos un código muy sencillo que no usa librerías externas y
que solo usa las funciones nativas de la IDE de Arduino y dejaremos el uso de programas
más complejos para siguientes ocasiones.
Arduino Code
/*
Nombre: Robot esquivaobstáculos
Autor: Daniel Pascual Gallegos
Fecha: Noviembre 2016
Funcionalidad: Este subproyecto forma parte de la construcción de nuestro robot
autónomo.
En este subproyecto usaremos el driver L298n para gobernar 2 motores de CC que
realizarán
la parte mecánica de nuestro robot móvil.
En este subproyecto nuestro robot irá recto y cuando encuentre un obstáculo a menos de
5 cm
girará en sentido horario hasta que esquive el obstáculo y siga su camino
*/
// Definición de variables y constantes relacionadas con el motor izquierdo
const int IN1 = 13; // Pin digital 13 para controlar sentido giro motor izquierdo
const int IN2 = 12; // Pin digital 12 para controlar sentido giro motor izquierdo

// Definición de variables y constantes relacionadas con el motor derecho


const int IN3 = 11; // Pin digital 11 para controlar sentido giro motor izquierdo
const int IN4 = 10; // Pin digital 10 para controlar sentido giro motor izquierdo

// Este programa usará el sensor de ultrasonidos HCSR04

42
// para medir la distancia a la que se encuentran
// diferentes obstáculos en centímetros y mostrarlo por el puerto serie.
const int triggerEmisor = 3;
const int echoReceptor = 2;
const int valorUmbral = 20;
long tiempoEntrada; // Almacena el tiempo de respuesta del sensor de entrada
float distanciaEntrada; // Almacena la distancia en cm a la que se encuentra el objeto

// Función que se ejecuta una sola vez al cargar el programa


void setup()
{
// Se declaran todos los pines como salidas
pinMode (IN1, OUTPUT);
pinMode (IN2, OUTPUT);
pinMode (IN3, OUTPUT);
pinMode (IN4, OUTPUT);

pinMode(triggerEmisor,OUTPUT); // El emisor emite por lo que es configurado como salida


pinMode(echoReceptor,INPUT); // El receptor recibe por lo que es configurado como
entrada
Serial.begin(9600); // Inicia el puerto de comunicaciones en serie
}
// Función que se repite de manera periódica
void loop()
{
sensorUltrasonidos();
// Si el valor de la distancia es menor que 5 cm se para y sigue recto en caso contrario
if(distanciaEntrada>valorUmbral)
{
robotAvance();
}
else
{
robotDerecha ();
}

43
}
/*
Función sensorUltrasonidos: para medir la longitud del pulso entrante.
Mide el tiempo que transcurrido entre el envío del pulso ultrasónico
y cuando el sensor recibe el rebote,
es decir: desde que el pin echo empieza a recibir el rebote, HIGH,
hasta que deja de hacerlo, LOW, la longitud del pulso entrante.
*/
void sensorUltrasonidos()
{
// Se inicializa el sensor de infrasonidos
digitalWrite(triggerEmisor,LOW); // Para estabilizar
delayMicroseconds(10);

// Comenzamos las mediciones


// Se envía una señal activando la salida trigger durante 10 microsegundos
digitalWrite(triggerEmisor, HIGH); // envío del pulso ultrasónico
delayMicroseconds(10);
tiempoEntrada=pulseIn(echoReceptor, HIGH);
distanciaEntrada= int(0.017*tiempoEntrada); // Fórmula para calcular la distancia en cm
Serial.println("El valor de la distancia es ");
Serial.println(distanciaEntrada);
delay(200);
}
/*
Función robotAvance: esta función hará que ambos motores se activen a máxima potencia
por lo que el robot avanzará hacia delante
*/
void robotAvance()
{
// Motor izquierdo
// Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
// Motor derecho
44
// Al mantener un pin HIGH y el otro LOW el motor gira en un sentido
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
}
/*
Función robotRetroceso: esta función hará que ambos motores se activen a máxima
potencia
en sentido contrario al anterior por lo que el robot avanzará hacia atrás
*/
void robotRetroceso()
{
// Motor izquierdo
// Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
digitalWrite (IN1, LOW);
digitalWrite (IN2, HIGH);
// Motor derecho
// Al mantener un pin LOW y el otro HIGH el motor gira en sentido contrario al anterior
digitalWrite (IN3, LOW);
digitalWrite (IN4, HIGH);
}
/*
Función robotDerecha: esta función acccionará el motor izquierdo y parará el derecho
por lo que el coche girará hacia la derecha (sentido horario)
*/
void robotDerecha()
{
// Motor izquierdo
// Se activa el motor izquierdo
digitalWrite (IN1, HIGH);
digitalWrite (IN2, LOW);
// Motor derecho
// Se para el motor derecho
digitalWrite (IN3, LOW);
digitalWrite (IN4, LOW);
}

45
/*
Función robotIzquierda: esta función acccionará el motor derecho y parará el izquierdo
por lo que el coche girará hacia la izquierda (sentido antihorario)
*/
void robotIzquierda ()
{ /////Función robotParar: esta función parará ambos motores
por lo que el robot se parará.
// Motor izquierdo
// Se para el motor izquierdo
digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
// Motor derecho
// Se activa el motor derecho
digitalWrite (IN3, HIGH);
digitalWrite (IN4, LOW);
}
/*
*/
void robotParar()
{ // Motor izquierdo
// Se para el motor izquierdo
digitalWrite (IN1, LOW);
digitalWrite (IN2, LOW);
// Motor derecho
// Se para el motor derecho
digitalWrite (IN3, LOW);
digitalWrite (IN4, LOW);
}

ELABORACIÓN DE ROBOT SOCCER:

46
47
48
49
50
51
52
53
54
55
56
57
58
TEORÍA BRAZO ROBOTICO:

Diseño brazo robótico


Cinematica del brazo robot:

59
60
61
62
63
64
Diseño estructura

65
jostick

El módulo tiene 5 pines: VCC, masa, X, Y, pulsación. La salida X, Y es analógica, además, puede
presionar el joystick hacia abajo para activar la salida digital.

Cuando el joystick se encuentra en la posición de reposo o medio, debe devolver un valor de


aproximadamente 512.

Tenemos que usar pines Arduino analógicos para leer los datos de los pines X / Y, y un pin digital
para leer el botón. Para obtener lecturas estables del pin Key / Select, debe conectarse a VCC a
través de una resistencia pull-up. Las resistencias incorporadas en los pines digitales de Arduino se
pueden utilizar (INPUT_PULLUP).

66
Conexión Arduino:

67
Brazo robotico de 6 grados libertad

Brazo robot de 6 grados libertad

68
brazo robot de 4 grados libertad

El brazo se diseña para tener cuatro grados de libertad, como se muestra en la Figura 6, lo cual le
permite abarcar un amplio espacio de trabajo. Los grados de libertad que dispone el robot son: uno
en la base de rotación, otro en la articulación de rotación tipo hombro, un tercero 32 en la articulación
de rotación tipo codo y finalmente una articulación de rotación tipo muñeca que sirve para darle
orientación al actuador final, que para motivos de prueba es una pinza que permite manipular
objetos.
Brazo robot de 3 grados libertad:

Robot de 6 grados libertad

69
1. Pin 10 muñeca YAW eje 6
2. Pin 9 muñeca PITCH eje 5
3. Pin 8 muñeca ROLL eje 4
4. Pin 7 codo eje 3
5. Pin 6 hombro eje 2
6. Pin 5 hombro eje 2.1
7. Pin 4 Base eje 1

 Para la alimentación sera con una fuente de 5V a 2 o mas ampere y la conexión es en el


Sensor Shield como lo muestra la siguiente imagen:

70
NOTA: SOLO ALIMENTAR EL SHIELD, SI USTEN ALIMENTA EL ARDUINO LO QUEMARA YA
QUE EL ARDUINO SOLO PUEDE DAR A LA SALIDA 500MILIAMPERES Y LOS SERVOS
NECESITAN 300MILIAMPERE POR CADA UNO(SON 7 SERVOS LO QUE ES 2100MILIAMPERE
POR LO QUE SE RECOMIENDA UNA FUENTE MAYOR A 2 AMPERE).
Aplicación
 Para la conexión del Modulo bluetooth HC-05 lo pondremos en el proto de 400 puntos, del
pin RX del modulo al pin 2 del Arduino, del pin TX del modulo al pin 3 del Arduino, del pin
GND del modulo al pin GND del Arduino, del pin VCC del modulo al pin 5v del Arduino.

 Descargue la app, usted tendrá que dar click en Seleccionar tu dispositivo, seleccione el
bluetooth espere a que haga la conexión y ahora podrá mover el brazo servo a servo observe
las siguientes imágenes:

Características de un servomotor

Está conformado por un motor, una caja reductora y un circuito de control. También potencia
proporcional para cargas mecánicas. Un servo, por consiguiente, tiene un consumo de energía
reducido.

La corriente que requiere depende del tamaño del servo. Normalmente el fabricante indica cuál es
la corriente que consume. La corriente depende principalmente del par, y puede exceder un amperio
si el servo está enclavado.

71
En otras palabras, un servomotor es un motor especial al que se ha añadido un sistema de control
(tarjeta electrónica), un potenciómetro y un conjunto de engranajes.

Con anterioridad los servomotores no permitían que el motor girara 360 grados, solo
aproximadamente 180, sin embargo, hoy en día existen servomotores en los que puede ser
controlada su posición y velocidad en los 360 grados. Los servomotores son comúnmente usados
en robots, y en modelismo, en aviones, barcos, helicópteros y trenes para controlar de manera
eficaz los sistemas motores y los de dirección.

Como controlar un servomotor con Arduino

Para obtener mas información pulsa aqui

Los servomotores tienen tres cables: VCC, GND y Señal. El cable de alimentación VCC es
típicamente rojo, y debe ser conectado al pin 5V de la placa Arduino. El cable de tierra, GND, suele
ser negro o marrón y debe estar conectado a un conector de tierra de la placa Arduino. El cable de
señal es normalmente de color amarillo, naranja o blanco y debe ser conectado a un pin digital en
la placa Arduino. Tenga en cuenta que algunos servos pueden tener un consumo de energia
considerable, por lo que si tienes que utilizar más de uno o dos, es recomendable una fuente de
alimentación independiente, es decir, no conectados al pin + 5V en la placa Arduino. Asegúrese de
conectar los GND del Arduino y de la fuente de alimentación externa juntos.

Los servomotores hacen uso de la modulación por ancho de pulsos (PWM) para controlar la
dirección o posición de los motores de corriente continua. La mayoría trabaja en la frecuencia de
los cincuenta hertz, así las señales PWM tendrán un periodo de veinte milisegundos. La electrónica
dentro del servomotor responderá al ancho de la señal modulada. Si los circuitos dentro del
servomotor reciben una señal de entre 0,5 a 1,4 milisegundos, éste se moverá en sentido horario;
entre 1,6 a 2 milisegundos moverá el servomotor en sentido antihorario; 1,5 milisegundos
representa un estado neutro para los servomotores estándares.

Para controlar los servomotores con Arduino disponemos de la Biblioteca «Servo», que
deberemos incluir en nuestros códigos. Esta biblioteca permite a una
placa Arduino controlar servomotores. Los servos están formados por engranajes y un por eje
72
que puede ser controlado con precisión. Los servos estándar permiten que el eje pueda ser
posicionado en varios ángulos, por lo general entre 0 y 180 grados. Los servos de rotación continuas
permiten la rotación del eje para ajustarse a diversas velocidades.

Ejemplo de manejo de motor servo

 Tomamos un micro Servo SG90 este lo alineamos a 90° con el siguiente código utilizando
solo 3 Cables Dupont Macho a Macho.

#include <Servo.h>

Servo myservo;
Servo myservo1;

int pos = 0;

void setup()
{
myservo.attach(9);
myservo1.attach(8);
}

void loop()
{
for (pos = 0; pos <= 180; pos += 1)
{
myservo.write(pos);
delay(15);
}
for (pos = 180; pos >= 0; pos -= 1)
{
myservo.write(pos);
delay(15);
}
myservo1.write(90);
}

La Biblioteca Servo admite hasta 12 motores en la mayoría de las placas Arduino y 48 en


el Arduino Mega. En las placas que no sean los de Mega, el uso de la biblioteca desactiva la
funcionalidad analogWrite en los pines 9 y 10, si existe o no es un servo en ellos. En los Mega,
hasta 12 servos pueden ser utilizados sin interferir con la funcionalidad PWM, el uso de 12 a 23
servos desactivará PWM en los pines 11 y 12.

En nuestros prototipos incluimos la Biblioteca Servo a.

73
#include <Servo.h>

También tenemos que definir los servos que vamos a utilizar

Servo servo_1; // Definimos los servos que vamos a utilizar

Servo servo_2;

Servo servo_n;

Despues de void setup() definimos las salidas de cada servo, tendrá que ser una salida PWM.

void setup() // Comenzamos la configuración de los pines

servo_1.attach(9) ; // Difinimos los pines de salida para cada servo

servo_2.attach(10);

servo_n.attach(11);

Para definir la posición del servomotor utilizaremos la siguiente expresión, donde el valor entre
paréntesis será un valor entre 0 y 180. Este valor se puede ajustar por medio de alguna función

servo_1.write(posicion_servo_1);

servo_1.write(valor entre 0 y 180);

Video del «Brazo robótico»

Tutorial paso a paso para construir un sencillo «Brazo Robótico» con servos y controlado con
Arduino.

Componentes y materiales

 Placa Arduino UNO


 2 Micro-servos
 4 Micro-pulsadores
 4 Resistencias 220Ohms
 Protoboard

74
 Cables

Esquema y montaje

Como podemos ver en el esquema, conectamos los servos a +5V, a GND, y a los pines 9 y 10
respectivamente. Estas salidas están controladas por la señal recibida en los pines de entrada 2, 3,
4 y 5, por medio de los cuatro pulsadores.

Los cuatro pulsadores se conectan a las entradas de la placa Arduino, a VCC, y a GND se
conectan por medio de una resistencia de 220 Ohms cada uno. Un pin del cada pulsador queda
libre.

Cada pulsador permanece conectado a GND en estado normal, y al pulsarlo permite el paso
de +5V.

Con dos servos vamos a conseguir dos movimientos principales, uno sobre el plano horizontal y
otro en un plano vertical. Podremos mover el «Brazo robótico» hacia izquierda y derecha, y arriba
y abajo.

Código Arduino para controlar 2 servos con pulsadores

En la primera parte del código configuramos las salidas que controlarán los servos, las entradas
que reciben la señal de los pulsadores y su estado lógico.

75
#include <Servo.h> // Incluimos la biblioteca Servo

Servo servo_inferior; // Definimos los servos que vamos a utilizar

Servo servo_superior;

int posicion_servo_inferior; // Estas variables definirán

int posicion_servo_superior; // las posiciónes de los servos en cada momento

const int pulsador_izquierda = 2; // Definimos el número de pin

const int pulsador_derecha = 3; // para cada uno de los pulsadores

const int pulsador_arriba = 4;

const int pulsador_abajo = 5;

int estado_pulsador_izquierda = 0; // Variables para leer el estado del pulsador

int estado_pulsador_derecha = 0;

int estado_pulsador_arriba = 0;

int estado_pulsador_abajo = 0;

int incremento_de_angulo = 2; // Incremento que queremos cada vez que pulsamos

void setup() // Comenzamos la configuración de los pines

servo_inferior.attach(9) ; // Difinimos los pines de salida para cada servo

servo_superior.attach(10);

pinMode(pulsador_izquierda, INPUT); // Difinimos los pines para la señal de

pinMode(pulsador_derecha, INPUT); // los pulsadores como entadas

76
pinMode(pulsador_arriba, INPUT);

pinMode(pulsador_abajo, INPUT);

}....

Después configuramos las condiciones de funcionamiento, si se pulsa activa un pulsador reacciona


de una manera, al pulsar otro, realiza otro movimiento, etc.

....................

void loop() {

estado_pulsador_izquierda = digitalRead(pulsador_izquierda); // Leemos el estado

estado_pulsador_derecha = digitalRead(pulsador_derecha) ; // de cada uno de los pulsadores

estado_pulsador_arriba = digitalRead(pulsador_arriba) ;

estado_pulsador_abajo = digitalRead(pulsador_abajo) ;

if (estado_pulsador_izquierda == HIGH)

// Si tenemos pulasdo el "Pulasdor izquierda"

// El servo inferior se mueve a la nueva posición

// La nueva posición será la posicion actual + el incremento angular

// Esperamos 100ms hasta una nueva señal

{...........................

Código completo

Este es codigo completo para nuestro «Brazo robótico«, copia, pega y modifica el código según
tus necesidades.

/* Brazo robótico utilizando dos servos. Como controlar servomotores Creado por www.web-
robotica.com */

#include <Servo.h> // Incluimos la biblioteca Servo

Servo servo_inferior; // Definimos los servos que vamos a utilizar


77
Servo servo_superior;

int posicion_servo_inferior; // Estas variables definirán

int posicion_servo_superior; // las posiciónes de los servos en cada momento

const int pulsador_izquierda = 2; // Definimos el número de pin

const int pulsador_derecha = 3; // para cada uno de los pulsadores

const int pulsador_arriba = 4;

const int pulsador_abajo = 5;

int estado_pulsador_izquierda = 0; // Variables para leer el estado del pulsador

int estado_pulsador_derecha = 0;

int estado_pulsador_arriba = 0;

int estado_pulsador_abajo = 0;

int incremento_de_angulo = 2; // Incremento que queremos cada vez que pulsamos

void setup() // Comenzamos la configuración de los pines

servo_inferior.attach(9) ; // Difinimos los pines de salida para cada servo

servo_superior.attach(10);

pinMode(pulsador_izquierda, INPUT); // Difinimos los pines para la señal de

pinMode(pulsador_derecha, INPUT); // los pulsadores como entadas

pinMode(pulsador_arriba, INPUT);

pinMode(pulsador_abajo, INPUT);

78
void loop() {

estado_pulsador_izquierda = digitalRead(pulsador_izquierda); // Leemos el estado

estado_pulsador_derecha = digitalRead(pulsador_derecha) ; // de cada uno de los pulsadores

estado_pulsador_arriba = digitalRead(pulsador_arriba) ;

estado_pulsador_abajo = digitalRead(pulsador_abajo) ;

if (estado_pulsador_izquierda == HIGH)

// Si tenemos pulasdo el "Pulasdor izquierda"

// El servo inferior se mueve a la nueva posición

// La nueva posición será la posicion actual + el incremento angular

// Esperamos 100ms hasta una nueva señal

posicion_servo_inferior = posicion_servo_inferior + incremento_de_angulo;

servo_inferior.write(posicion_servo_inferior);

delay(100);

else if (estado_pulsador_derecha == HIGH)

// Si tenemos pulasdo el "Pulasdor derecha"

// El servo inferior se mueve a la nueva posición

// La nueva posición será la posicion actual - el incremento angular

// Esperamos 100ms hasta una nueva señal

79
{

posicion_servo_inferior = posicion_servo_inferior - incremento_de_angulo;

servo_inferior.write(posicion_servo_inferior);

delay(100);

else if (estado_pulsador_arriba == HIGH)

// Si tenemos pulasdo el "Pulasdor arriba"

// El servo superior se mueve a la nueva posición

// La nueva posición será la posicion actual + el incremento angular

// Esperamos 100ms hasta una nueva señal

posicion_servo_superior = posicion_servo_superior + incremento_de_angulo;

servo_superior.write(posicion_servo_superior);

delay(100);

else if (estado_pulsador_abajo == HIGH)

// Si tenemos pulasdo el "Pulasdor abajo"

// El servo inferior se mueve a la nueva posición

// La nueva posición será la posicion actual - el incremento angular

// Esperamos 100ms hasta una nueva señal

80
posicion_servo_superior = posicion_servo_superior - incremento_de_angulo;

servo_superior.write(posicion_servo_superior);

delay(100);

else {

// Si no tenemos pulasdo ningún pulasdor

// esperamos 100ms hasta una nueva señal

delay(100);

Esperamos que os guste y que os ayude en vuestros proyectos.

Prototipo para brazo con 3 servos

Este diseño está construido con 3 servomotores y piezas de Lego

81
Código Arduino para nuestro amigo Milo Gopar

#include servo

Servo nombre_1; // Definimos los servos que vamos a utilizar

Servo nombre_2;

Servo nombre_3;

int posicion_nombre_1; // Estas variables definirán

int posicion_nombre_2; // las posiciónes de los servos en cada momento

int posicion_nombre_3

const int pulsador_1 = 1; // Definimos el número de pin

const int pulsador_2 = 2; // para cada uno de los pulsadores

const int pulsador_3 = 3;

const int pulsador_4 = 4;

const int pulsador_5 = 5;

const int pulsador_6 = 6;

int estado_pulsador_1 = 0; // Variables para leer el estado del pulsador

82
int estado_pulsador_2 = 0;

int estado_pulsador_3 = 0;

int estado_pulsador_4 = 0;

int estado_pulsador_5 = 0;

int estado_pulsador_6 = 0;

int incremento_de_angulo = 2; // Incremento que queremos cada vez que pulsamos

// Puede ser 2 u otro valor

Esta es la primera parte de código donde definimos los servos y el pin para cada pulsador.

Después introducimos esta parte

void setup() // Comenzamos la configuración de los pines

nombre_1.attach(9) ; // Difinimos los pines de salida para cada servo

nombre_2.attach(10);

nombre_3.attach(11);

pinMode(pulsador_1, INPUT); // Difinimos los pines para la señal de

pinMode(pulsador_2, INPUT); // los pulsadores como entadas

pinMode(pulsador_3, INPUT);

pinMode(pulsador_4, INPUT);

CONTROL DE BRAZO ROBOTICO CON JOSTICK


¿QUÉ ES UN JOYSTICK ANALÓGICO?
Un joystick analógico es un sencillo controlador que podemos añadir a nuestros proyectos
de electrónica y Arduino, que tiene la ventaja de proporcionar una cantidad de información
superior a la que podríamos obtener simplemente con pulsadores.
Estos joystick son similares a las palancas de analógicas que tienen muchos mandos de
videoconsolas u ordenadores, como el mando de Playstation 2, o Xbox, que se emplean

83
cuando se necesita un control más suave y preciso del que es posible con los mandos
digitales.
Internamente los joystick están formados por un sistema de balancín con dos ejes ortogonales
acoplados a dos potenciómetros. Estos potenciómetros realizan la medición de la posición de la
palanca en ambos ejes.

Por otro lado, uno de los ejes está apoyado en un microrruptor, lo que permite detectar la
pulsación de la palanca.

Por tanto, los joystick facilitan una señal analógica para la posición de cada eje, más una señal
digital para la detección de la pulsación del mando. Al disponer de la entrada en los ejes X e Y en
forma analógica, podemos programar controles mucho más ricas y precisas de las que podríamos
conseguir con un control digital todo/nada.

Por ejemplo, podemos aumentar la velocidad de movimiento de un brazo robótico cuanto


mayor sea el valor de la medición, o hacer que un vehículo gire más o menos rápido. Si hiciéramos
esto simplemente con pulsadores, sería imposible conseguir movimientos suaves, y el robot se
movería "a saltos".

Este tipo de joystick son dispositivos sencillos y cómodos de usar, y nos permiten añadir un
control a nuestros proyectos. Por ejemplo, podemos usarlo para controlar un servo, un brazo
robótico, una torreta con un laser, o incluso vehículos y robots completos.

PRECIO

Este tipo de Joystick analógicos son dispositivos baratos. Podemos encontrarlos por 0,75€ en
vendedores internacionales de Ebay y Aliexpress.

ESQUEMA DE MONTAJE

El montaje de este tipo de dispositivos es sencillo. En primer lugar, alimentamos el módulo


conectando Vcc y GND, respectivamente, a 5V y GND de Arduino.

Para la medida analógica en ambos ejes, conectamos las salidas VRx y VRy a dos entradas
analógicas de Arduino.

Finalmente, si también queremos la señal digital del pulsador, conectamos la salida SW a


una entrada digital de Arduino. Vamos a usas las resistencias de Pull-Up internas de Arduino, por
lo que no es necesario resistencias adicionales.

84
El esquema de montaje del joystick quedaría de la siguiente forma

Mientras que el montaje, visto desde Arduino, sería el siguiente.

EJEMPLOS DE CÓDIGO

El código para hacer funcionar el joystick es igualmente sencillo. Por un lado, leemos la
posición de ambos potenciómetros mediante mediante las entradas analógicas.

Respecto al pulsador, usamos una entrada digital para leer el su estado.

Finalmente, mostramos la lectura por puerto serie. En un ejemplo real, en esta parte ejecutaríamos
las acciones oportunas, como mover un servo, o un robot.

1 GND - GND
2 Vcc - 5v
3 VRx - A0
4 VRy - A1
5 SW - D9
6 */
7
8 const int pinLED = 13;

85
9 const int pinJoyX = A0;
10 const int pinJoyY = A1;
11 const int pinJoyButton = 9;
12
13 void setup() {
14 pinMode(pinJoyButton , INPUT_PULLUP); //activar resistencia pull up
15 Serial.begin(9600);
16 }
17
18 void loop() {
19 int Xvalue = 0;
20 int Yvalue = 0;
21 bool buttonValue = false;
22
23 //leer valores
24 Xvalue = analogRead(pinJoyX);
25 delay(100); //es necesaria una pequeña pausa entre lecturas analógicas
26 Yvalue = analogRead(pinJoyY);
27 buttonValue = digitalRead(pinJoyButton);
28
29 //mostrar valores por serial
30 Serial.print("X:" );
31 Serial.print(Xvalue);
32 Serial.print(" | Y: ");
33 Serial.print(Yvalue);
34 Serial.print(" | Pulsador: ");
35 Serial.println(buttonValue);
36 delay(1000);
37 }

CONTROL DE MOTOR SERVO USANDO JOSTICK


SERVOMOTOR ARDUINO:
El motor del servo tiene circuitos internos y un potenciómetro para realizar control. Este control se
realiza por la retroalimentación del potenciometro que está conectado al eje central del motor. Ten
en cuenta que el potenciómetro le permite al circuito supervisar el ángulo actual del servo. Entonces,
por lo tanto si el eje está en el ángulo correcto, el motor se apagará. Sin embargo, por el contrario
86
si el circuito detecta que el servo no está en la posición que debería de estar, en consecuencia el
motor se encenderá y se pondrá en el lugar adecuado. Los servos normalmente se usan para
controlar movimientos angulares de entre 0° a 180 °.
En este proyecto de servomotor Arduino el servo a utilizar es un mini de la marca TowerPro modelo
SG90, sin embargo, funciona para otros servomotores.

PINES EN LOS SERVOMOTORES


 positiva: Recibe la corriente que alimentará al motor.
 negativa: referencia a la tierra del motor.
 entrada de señal: recibe la señal para controlar al servomotor.
Los colores de los pines en los servomotores, o del cable de cada terminal varía con cada fabricante:
el cable de la terminal positiva siempre es rojo; el de la terminal negativa puede ser marrón o negro;
y el de la terminal de entrada de señal suele ser de color blanco, naranja o amarillo. En este ejemplo
de servomotor, las terminales son marron, rojo y amarillo.
Los servomotores funcionan por control PWM (modulación por ancho de pulso). Entonces este
sistema consiste en generar una onda cuadrada en la que se varía el tiempo que el pulso está en
nivel alto. Esto es para modificar la posición del servo según se desee. Por mucho que se desee es
posible que tu servomotor tenga una desviación en el control PWM por lo que siempre tienes que
calibrar tus servomotores con un programa de prueba.

CONTROL DEL SERVOMOTOR EN ARDUINO


Para controlar al los servomotor en Arduino, se les envían pulsos cada 20 ms es decir cada 50Hz.
La anchura del pulso en nivel alto es lo que codifica el ángulo de giro, está anchura varía según el
servo pero normalmente va entre 1 y 2 ms. De forma que si se quiere que el servo se posicione en
un ángulo de 0° se envía una señal de 1 ms y por los 19 ms restantes no se envía nada para que
se haga el total de los 20 ms. Del mismo modo si se quiere que el servo se ponga en una posición
de 180° entonces se manda una señal de 2 ms y 18 ms no se envía nada, como se ve en la siguiente
imagen.
Es especialmente relevante si vas a usar varios servomotores realizar un programa para identificar
que valor de PWM corresponde físicamente a 0° a 90° y a 180°. Al final te explicamos como calibrar
varios servos en este tutorial de servomotor Arduino.

PWM para el servomotor.


DIAGRAMA DE CONEXIÓN DE SERVOMOTOR EN ARDUINO
Finalmente conecta los componentes para este ejemplo de servomotor en Arduino. Ten en cuenta
que el joystick , te indica en sus pines la conexión con GND. Para la corriente y la señal de salida,
esta señal la puedes conectar en cualquiera de los dos ejes el «Y» o el «X». En consecuencia el
eje que conectes sera el de control para el joystic.

87
CALIBRACIÓN DE SERVOMOTOR EN ARDUINO
Realiza un programa que con un potenciómetro controles el PWM. Toma tu servo y con un
transportador marca 0°, 90° y 180°. Escribe para cada cuaderno el valor de esos 3 grados en el
valor introducido al PWM. Define para cada servomotor un valor de máximo y mínimo. Corrobora
que la mitad corresponda a 90°. Determina un coeficiente de multiplicación basado en la ecuación
de la recta para cada servomotor. y=mx+b.

CÓDIGO DE UN SERVOMOTOR EN ARDUINO:

#include <Servo.h> // Librería para controlar el servomotor

Servo servo; // variable que tomará el valor de la posición del servomotor

void setup() {

servo.attach(2); // Se coloca el servo en el pin 2

void loop() {

int val= analogRead(0); // se agrega variable que tomará el valor que le mandara el joystick a
través de la entrada analógica A0
val=map(val,0,1023,0,180); // Conversión de valores

servo.write(val); // se manda la señal al servo

delay(15); // espera en milisegundos para que detecte la señal

TUTORIAL: CONTROL DE DOS SERVOS MEDIANTE JOYSTICK

En este tutorial veremos el uso del Joystick para manejar dos servos usando un eje para un servo
y otro eje para el otro.
88
Para nuestro tutorial de hoy usaremos:
- Tabla con protoboard y sujeción para Arduino UNO cedida por Electrohobby.
- Arduino UNO cedido por Electrohobby.
- Dos servos.
- Un Joystick de Playstation.
- Cables.

Seguidamente podremos ver el mapa de conexiones:

Como podéis ver, las conexiones son bastante sencillas:


Del Joystick salen 5 terminales. VCC (o 5V), GND, VRx (Horizontal), VRy (Vertical) y SW (Switch).
VCC lo conectaremos con nuestros 5V del arduino. GND del Joystick con el GND del Arduino. Los
pines VRx y VRy los leeremos por los pines analógicos y SW lo trataremos como un pulsador.

Código:

#include <Servo.h>

Servo panServo;//asignamos un eje a un servo y otro eje al otro servo


Servo tiltServo;

int servoPanPosition = 90;//posición de referencia


int servoTiltPosition = 90;
int joystickPanSpeed = 0;
int joystickTiltSpeed = 0;
89
int joystickPanPin = A0; //marcamos entradas analógicas que medirán el ángulo del joystick
int joystickTiltPin = A1;
int servoPanPin = 9;//declaramos los pines digitales por donde le entrará la instrucción del joystick
al servo.
int servoTiltPin = 10;
int boton = 8;

void setup()
{
pinMode(servoPanPin, OUTPUT);//se declara igual que declarariamos un led
pinMode(servoTiltPin, OUTPUT);
panServo.attach(servoPanPin);
tiltServo.attach(servoTiltPin);
}

void loop()
{
joystickPanSpeed = (analogRead(joystickPanPin) - 512) / 50;
// -512 to provide equal +/- numbers
joystickTiltSpeed = (analogRead(joystickTiltPin) - 512) / -50;
// negative 50 to reverse direction

servoPanPosition = constrain((servoPanPosition + joystickPanSpeed), 1, 180);


servoTiltPosition = constrain((servoTiltPosition + joystickTiltSpeed), 1, 180);
// constarin function to not exceed servo limits

panServo.write(servoPanPosition);
tiltServo.write(servoTiltPosition);

delay(50);
// adjustable for overall speed
}

CONTROL ROBOT ARM 4S CON JOYSTICKS


En esta guia creada en formato PDF podras aprender como controlar tu robot Arm 4s con los dos
joysticks incluidos en el Kit Completo Robot arm 4s.
BRAZO ROBOTICO de 4 motores
Podras controlar nuestro Robot Arm 4 servos, aqui te lo mostramos.

90
Brazo Robotico 4 servos en mdf

Planos del brazo

91
Programa para brazo robotico de 4 servos y 2 jostick
Una vez montado el Arm Robot y realizados los ejercicios 1 a 5, realiza este proyecto final
para controlar sus movimientos utilizando los 2 joysticks. Con el J1 moverás el antebrazo
(S3) y las pinzas (S4), y con el J2 moverás el brazo (S2) y la base (S1).
NIVEL DE DIFICULTAD: AVANZADO.
DURACIÓN DE LA ACTIVIDAD: 60 min.
MATERIALES:
 Arm Robot
 Cable USB – USB Type B
 Ordenador
CONEXIONES:
Para realizar este proyecto, el Arm Robot debe estar montado de acuerdo a las instrucciones
indicadas en el manual (link al manual). Sigue paso a paso las indicaciones de montaje y
realiza las conexiones correspondientes.
CÓDIGO DE PROGRAMACIÓN
Puedes realizar esta actividad utilizando el software Arduino y otros software de
programación por bloques compatibles. A continuación encontrarás el código de
programación necesario.
Código Arduino
1. Descarga el software Arduino y realiza en proceso de instalación.
2. Abre el programa Arduino y, una vez en él, copia el siguiente programa:

3. #include <Servo.h>
4.
5. int valorX = 0; // LECTURA DEL EJE X de J2
6. int valorY = 0; // LECTURA DEL EJE Y de J2
7. int valorX2 = 0; // LECTURA DEL EJE X de J1
8. int valorY2 = 0; // LECTURA DEL EJE Y de J1
9. /*-----------------------------------------------------------------------------------------*/
10. int pinJX = A1; // PIN ANALOGICO A1 DEL EJE X de J2
11. int pinJY = A0; // PIN ANALOGICO A0 DEL EJE Y de J2
12. int pinJX2 = A2; // PIN ANALOGICO A2 DEL EJE X de J1
13. int pinJY2 = A3; // PIN ANALOGICO A3 DEL EJE Y de J1
14. /*-----------------------------------------------------------------------------------------*/
92
15. Servo motor1; // DECLARAR S1 // SERVO MOTOR 1
16. Servo motor2; // DECLARAR S2 // SERVO MOTOR 2
17. Servo motor3; // DECLARAR S3 // SERVO MOTOR 3
18. Servo motor4; // DECLARAR S4 // SERVO MOTOR 4
19. /*-----------------------------------------------------------------------------------------*/
20. int grados1 = 0; // GRADOS DEL S1
21. int grados2 = 0; // GRADOS DEL S2
22. int grados3 = 0; // GRADOS DEL S3
23. int grados4 = 0; // GRADOS DEL S4
24. /*-----------------------------------------------------------------------------------------*/
25. float tiempo;
26.
27. void setup() {
28. // put your setup code here, to run once:
29. motor1.attach (6); // PIN DIGITAL PWM 6 DONDE ESTA CONECTADO EL S1
30. motor2.attach (9); // PIN DIGITAL PWM 9 DONDE ESTA CONECTADO EL S2
31. motor3.attach (10); // PIN DIGITAL PWM 10 DONDE ESTA CONECTADO EL S3
32. motor4.attach (11); // PIN DIGITAL PWM 11 DONDE ESTA CONECTADO EL S4
33. /*-----------------------------------------------------------------------------------------*/
34. // POSICION INICIAL DEL ARM ROBOT
35. grados1 = 20; //S1
36. grados2 = 70; //S2
37. grados3 = 80; //S3
38. grados4 = 90; //S4
39. /*-----------------------------------------------------------------------------------------*/
40. }
41.
42. void loop() {
43. // put your main code here, to run repeatedly:
44. Motor1();
45. Motor2();
46. Motor3();
47. Motor4();
48.
49. for (tiempo = 0; tiempo < 2500; tiempo++)
50. {
51. if (tiempo >= 2500)
52. {
53. tiempo == 0;
54. }
55. }
56. }
57.
58. void Motor1 ()
59. {
60. valorX = analogRead ( pinJX); // GUARDA LA LECTURA DEL PUERTO ANALOGICO A1
DEL EJE Y
61. // INCREMENTAR GRADOS MOTOR 1
62. if ( (valorX > 520) && (valorX <= 1023) && (grados1 < 170) ) // INCREMENTAR LOS
GRADOS CUANDO LA LECTURA DEL EJE X ES MÁS GRANDE QUE EL CALIBRAJE Y
MAS PEQUEÑO O IGUAL A 1023
63. {
64. grados1 = grados1 + 5; // +5 GRADOS
65. }
66.
67. // DECREMNTAR GRADOS MOTOR1

93
68. else if ( (valorX >= 0 ) && (valorX < 480)&& (grados1 > 20) ) // DECREMENTAR LOS
GRADOS CUANDO LA LECTURA DEL EJE X ES MÁS PEQUEÑA QUE EL CALIBRAJE Y
MÁS GRANDE O IGUAL A 0
69. {
70. grados1 = grados1 - 5; // -5 GRADOS
71. }
72. motor1.write (grados1); // ENVIAR LOS GRADOS AL SERVO 1
73. }
74.
75. void Motor2 ()
76. {
77. valorY = analogRead ( pinJY); // GUARDA LA LECTURA DEL PUERTO ANALOGICO A0
DEL EJE X
78. // INCREMENTAR GRADOS MOTOR2
79. if ( (valorY > 530 ) && (valorY <= 1023) && (grados2 < 140) )// INCREMENTAR LOS
GRADOS CUANDO LA LECTURA DEL EJE X ES MÁS GRANDE QUE EL CALIBRAJE Y
MAS PEQUEÑO O IGUAL A 1023
80. {
81. grados2 = grados2 + 5; // +5 GRADOS
82. }
83.
84. // DECREMNTAR GRADOS MOTOR2
85. else if ( (valorY >= 0 ) && (valorY < 480) && (grados2 > 70) ) // DECREMENTAR LOS
GRADOS CUANDO LA LECTURA DEL EJE X ES MÁS PEQUEÑA QUE EL CALIBRAJE Y
MÁS GRANDE O IGUAL A 0
86. {
87. grados2 = grados2 - 5; // -5 GRADOS
88. }
89. motor2.write (grados2); // ENVIAR LOS GRADOS AL SERVO 2
90. }
91.
92. void Motor3 ()
93. {
94. valorX2 = analogRead ( pinJX2); // GUARDA LA LECTURA DEL PUERTO ANALOGICO
A2 DEL EJE X
95. // INCREMENTAR GRADOS MOTOR3
96. if ( (valorX2 >= 0 ) && (valorX2 < 480) && (grados3 < 155) ) // INCREMENTAR LOS
GRADOS CUANDO LA LECTURA DEL EJE X ES MÁS GRANDE QUE EL CALIBRAJE Y
MAS PEQUEÑO O IGUAL A 1023
97. {
98. grados3 = grados3 + 5; // +5 GRADOS
99. }
100.
101. // DECREMNTAR GRADOS MOTOR3
102. if ( (valorX2 > 530 ) && (valorX2 <= 1023) && (grados3 > 80) ) // DECREMENTAR LOS
GRADOS CUANDO LA LECTURA DEL EJE X ES MÁS PEQUEÑA QUE EL CALIBRAJE Y
MÁS GRANDE O IGUAL A 0
103. {
104. grados3 = grados3 - 5; // -5 GRADOS
105. }
106. motor3.write (grados3); // ENVIAR LOS GRADOS AL SERVO 3
107. }
108.
109. void Motor4 ()
110. {
111. valorY2 = analogRead ( pinJY2); // GUARDA LA LECTURA DEL PUERTO ANALOGICO
A3 DEL EJE Y
94
112. // INCREMENTAR GRADOS MOTOR4
113. if ( (valorY2 >= 0 ) && (valorY2 < 480) && (grados4 < 125) ) // INCREMENTAR LOS
GRADOS CUANDO LA LECTURA DEL EJE X ES MÁS GRANDE QUE EL CALIBRAJE Y
MAS PEQUEÑO O IGUAL A 1023
114. {
115. grados4 = grados4 + 5; // +5 GRADOS
116. }
117.
118. // DECREMNTAR GRADOS MOTOR4
119. else if ( (valorY2 > 530 ) && (valorY2 <= 1023) && (grados4 > 90) ) // DECREMENTAR
LOS GRADOS CUANDO LA LECTURA DEL EJE X ES MÁS PEQUEÑA QUE EL
CALIBRAJE Y MÁS GRANDE O IGUAL A 0
120. {
121. grados4 = grados4 - 5; // -5 GRADOS
122. }
123. motor4.write (grados4); // ENVIAR LOS GRADOS AL SERVO 4
}

Proyecto final:
1. Implementar el brazo robot de 4 servos ARM 4S
2. Controlar por 2 joystick los 4 servos
3. Controlar los 4 servos con aplicación de celular por bluetooth

95
Robot cartesiano
Robot de coordenadas cartesianas

Esquema cinemático de un robot cartesiano


Un robot de coordenadas cartesianas (también llamado robot cartesiano) es un robot
industrial cuyos tres ejes principales de control son lineales (se mueven en línea recta en
lugar de rotar) y forman ángulos rectos unos respecto de los otros. Además de otras
características, esta configuración mecánica simplifica las ecuaciones en el control de
los brazos robóticos. Los robots de coordenadas cartesianas con el eje horizontal limitado y
apoyado en sus extremos se denominan robots pórtico y normalmente son bastante
grandes.
Una aplicación muy extendida para este tipo de robots es la máquina de control
numérico (CN). Las aplicaciones más sencillas son las usadas en las máquinas de fresado
o dibujo, donde un taladro o pluma se traslada a lo largo de un plano x-y mientras la
herramienta sube y baja sobre la superficie para crear un preciso diseño.

El robot cartesiano

o también el robot de coordenadas cartesianas es un tipo de robot industrial de tres ejes los
cuales operan de forma lineal, es decir su movimiento siempre es recto, no pueden girar por
lo que forman ángulos rectos. Son más simples, pues su programación y configuración
trabaja con menos parámetros, y económicos ya que están más limitados en sus funciones
que otros robots industriales, pero dependiendo del trabajo a realizar son una buena opción
como por ejemplo para realizar dibujos o recoger diversos materiales, en estos casos de
denominan robots pórtico debido a su tamaño y forma similar a la de los pórticos.

Las coordenadas cartesianas


son básicamente las descritas en la coordenada de abscisa X y la coordenada vertical Y del
plano y se utilizan para ubicar un punto en el plano.
La forma en la que trabajan los robots cartesianos es la siguiente, mediante el sistema de
coordenadas propuestas se trazan los puntos donde debe realizar el movimiento. El
ordenador o mejor dicho el programa controla los movimientos optimizándolos. Los
movimientos lineales se realizan en los ejes por servomotores y dependiendo del tipo de
movimiento serán operados por el eje portal o por el eje de extensión o por el eje telescópico.

Diferenciamos tres zonas de trabajo dentro de los robots cartesianos:


Zona de producción, donde operan los movimientos para su posición.
Zona eléctrica, donde se sitúan los aparatos eléctricos y de control.
Zona de supervisión, donde trabaja el operario.

Para terminar una breve descripción de las diferentes partes que conforman un robot
cartesiano:

Guía de movimiento:
Por rodillos, si el movimiento debe ser rápido.
Por bolas, si la carga es pesada.

La trasmisión del robot cartesiano se realiza mediante:


Correa dentada para mayores distancias y rapidez.
Husillo, más lentas que las anteriores.

Motores para el accionamiento del movimiento de los ejes del robot cartesiano:
Servomotores.
Motor paso a paso
96
Aplicaciones típicas

 Packaging
 Manipulación de materiales
 Mecanizado
 Pick & Place
 Sector agroalimentario
 Apilado
 Manipulación, montaje y apilado
 Corte por láser y por chorro de agua
 Mesa XY
 Grabado

Referencias

New Motion - Proporcionamos asesoramiento y asistencia técnica. Hemos contribuido al desarrollo


y construcción del nuevo paletizador. Más información acerca del robot paletizador de coordenadas
desarrollado por New Motion.

Robot paletizador de coordenadas - Proporcionamos todo tipo de productos de automatización para


paletizadores, incluida la lógica, el motion y los controladores híbridos. Consulte nuestros casos
prácticos.

97
Diseño de robot cartesiano XYZ

98
99
100
101
102
103
104
105
Maquina cnc y Arduino

Shield CNC para Arduino Nano


Modelo SHD-CNC-NANO
Olvídate de conexiones complicadas en tu CNC con este shield.

Esta tarjeta te permite construir tu CNC más rápidamente, solo necesitas insertar un Arduino Nano y
los Drivers A4988 o DRV8825. Posee un diseño modular y Open Source.

106
Este shield puede ser usado con los drivers Pololu A4988 (Allegro) o los DRV8825 (Texas Inst.), el
A4988 puede manejar motores Paso a paso de hasta 2A por bobina y microstepping de 1/16, el
driver DRV8825 es más versátil pues ofrece hasta 2.5A por bobina y microstepping de 1/32.

Con este shield podrás desarrollar proyectos como Routers CNC, ploteadoras 2D, Cortadoras Láser
y hasta una Máquina Pick&Place.

NOTA: El firmware más común para usar en el controlador Arduino Nano es el GRBL, a diferencia
del shield CNC para Arduino UNO, este shield tiene los pines de dirección y de pasos revertidos por
lo que se tendrá que cambiar la definición de pines en el archivo cpu_map.h como está indicado
en este enlace. Aunque hayan jumpers al costado de cada driver la configuración de micropasos no
se puede cambiar y siempre estará fija en la configuración máxima.

ESPECIFICACIONES TÉCNICAS
 Voltaje de Potencia: 9-12V DC
 Compatible con GRBL(Firmware OpenSource para Arduino que convierte código-G en comandos
para motores Paso a Paso)
 Soporta 3 Ejes (X, Y, Z)
 2 Fin de carrera por cada eje (6 en Total)
 Habilitador y dirección de Spindle
 Habilitador de refrigerante (coolant)
 Salida serial e I2C
 Diseñador para drivers Pololu A4988 o DRV8825.
 Diseño Compacto
 Los motores se pueden conectar usando header o Molex hembra de 4 pines
 Dimensiones: 59x72mm

Shield CNC v3.0 - GRBL


Modelo SHD-CNC
Construye tu CNC con la ayuda de este magnífico Shield

INFO
El Shield CNC GRBL permite construir una máquina CNC de la manera más rápida y sencilla, solo
necesitas agregar un Arduino Uno, unos cuantos Drivers A4988 o DRV8825 y una fuente de

107
alimentación. Posee un diseño modular y Open Source. Compatible con GRBL, Firmware
OpenSource para Arduino Uno que convierte código-G en comandos para motores Paso a Paso.
Ideal para desarrollar proyectos como Router CNC, Cortadora Láser, Brazo robótico y hasta una
Máquina Pick&Place.
El shield CNC permite manejar 3 motores paso a paso (pap/stepper) de forma independiente (X, Y,
Z) y 1 motor adicional (A) como duplicado de alguno de los anteriores. Es compatible con los drivers
para motores paso a paso Pololu A4988 (Allegro) o los DRV8825 (Texas Inst.), el A4988 puede
manejar motores paso a paso de hasta 2A por bobina y microstepping de 1/16, el driver DRV8825
es más versátil pues ofrece hasta 2.5A por bobina y microstepping de hasta 1/32. Podemos
configurar de forma independiente la resolución de microstepping de cada driver con los 3 jumpers
correspondientes.

Para energizar el shield podemos utilizar fuentes de alimentación entre 12 a 36 voltios. La capacidad
de corriente de la fuente debe ser de aprox. 2 amperios por cada motor, entonces si utilizamos 4
motores necesitaremos una fuente de 8 amperios. Recomendamos utilizar la fuente de
alimentación 12V/8.5A o 24V/5A. El voltaje de potencia no está conectado al Arduino Uno, por lo
que tendremos que utilizar una fuente separada para el Arduino o realizar un puente entre el voltaje
de potencia y el pin de Vin del Arduino (máx. 12V)

ESPECIFICACIONES TÉCNICAS
 Voltaje de Potencia: 12- 36V DC
 Compatible con Arduino Uno R3
 Compatible con firmware GRBL
 Soporta 4 Ejes (X, Y, Z y duplicar uno de los anteriores o crear un eje a medida con los pines D12
y D13)
 2 Fin de carrera por cada eje (6 en total)
 Habilitador y dirección de Spindle
 Habilitador de refrigerante (coolant)
 Diseñado para drivers Pololu A4988 o DRV8825
 Jumpers para configurar el micro-stepping de los drivers
 Los motores se pueden conectar usando header o Molex hembra de 4 pines
 Fusible en placa

Qué puedes hacer con la SB CNC Shield

Arduino CNC Shield Premium con motor paso a paso

108
El diseño es precioso. Está mal que lo diga yo, pero es que el negro me puede. El conector de
alimentación también es negro, y los pines para conectar los cables son blancos.
He dedicado tiempo a pensar qué colores van mejor, hasta encontrar la mejor combinación. Incluso
he buscado un botón de reset en azul, para que sea sencillo de localizar a simple vista.
La placa tiene acabado en oro, de máxima calidad. No sería necesario a nivel tecnico. Pero a nivel
diseño, el color oro y el negro son perfectos.

PCB del Arduino SB CNC Shield

Incluye unos jumpers amarillos sencillos de quitar, que además son muy chulos.

Arduino SB Shield CNC con jumpers amarillos

Una placa 100% compatible con el firmware GRBL. Plug and play. Los pines, los motores, los
finales de carrera, todo ya está en su sitio para que sólo tengas que instalar el firmware y listo.
Conector de Potencia
Seguimos con la filosofía de StaticBoards de usar conectores de calidad. El conector de potencia
es un Molex que soporta 15A de potencia. Más que suficiente para los motores paso a paso
(normalmente consumen unos 5A)
Puedes usar cables potentes, de diámetro AWG22. Te recomiendo, como siempre, usar
unas punteras para que el cable se atornille con firmeza. Si el cable se rompe en alambritos, estos
se van a calentar mucho, y van a estropear el conector.

109
Arduino CNC shield Conector Molex
Condensadores de 35V
La placa incluye unos condensadores de 35V. Asi que podrás usar una fuente de 24V sin
problema. Los drivers DRV8825 soportan más voltaje. Pero la verdad, si vas a usar motores más
grandes, lo ideal es que uses drivers más potentes. Para la mayoría de los mortales, vas a necesitar
una fuente de 12V o de 24V.

Condensadores de 35V SMD


Duplicar uno de los ejes del Arduino SB CNC Shield
No tenemos muchos pines disponibles para el Arduino Uno. No hay posibilidad de tener cuatro
motores y un taladro. Asi que la placa permite dos opciones.

Puedes duplicar un eje (el caso más común). Por ejemplo, usar dos motores para un eje, porque
son los que van a hacer más fuerza.
O puedes sacrificar el taladro, y usar un cuarto eje. Esta es una buena opción si vas a montar un
robot, por ejemplo, o si enciendes y apagas el taladro por tu cuenta.
Para duplicar un eje, tienes que cambiar el par de jumpers que tienes al lado del USB, y seleccionar
el eje que quieres duplicar.

110
Cuarto eje con la Z duplicada
Cada motor incluye unos jumpers para ajustar los micropasos. Por defecto, viene configurado
para usar el máximo número del driver (16 en el a4988 y 32 en el DRV8825)
Sobre los micropasos, tienes toda la información en la comparativa de drivers drv8825 vs a4988.
Drivers de motores paso a paso externos
Puedes sacar la salida de STEP/DIR de cada eje para usar unos drivers externos, como los
conocidos Gecko.
Algunos de estos drivers requieren también del pin ENABLE. En este caso, GRBL usa el mismo pin
para todos los motores.

Conectores para drivers de motores paso a paso externos


Botón de reset externo
Es sencillo de acceder al botón de reset. Está en una esquina y lo puedes pulsar con velocidad
en caso de urgencia.
De todos modos, te recomiendo usar un botón adicional de emergencia, colocado en la máquina.
Pero un botón que corte la electricidad de motores, taladro y todo. No es lo mismo resetear el
Arduino que apagar el taladro

Botón de Reset, y conector para el reset externo


Finales de Carrera
Los pines para conectar el final de carrera del movimiento mínimo y el máximo están unidos en
cada eje (no hay pines para tanto). Asi que es lo mismo conectar uno que otro, a nivel eléctrico y
de configuración.
En la página del producto he incluido una completa guía para conectar los finales de carrera,
paso a paso.

111
Finales de Carrera
Salida para el taladro ó splindle y para líquido refrigerante
Para conectar el taladro tienes que usar el comando M3 , y para apagarlo, es el comando M5.
El pin para activar el taladro (spindle enable) funciona como salida PWM. De esta forma, podemos
regular la velocidad del taladro.
El firmware GRBL te permite controlar la velocidad con el GCODE (Esta opción es algo reciente, y
no la usa mucha gente).

Pero es muy potente. La velocidad de corte es uno de los factores más importantes para que
el acabado sea limpio. Lo ideal es que el corte avance a la misma velocidad que el taladro corta
la viruta.
Necesitas un taladro que permita ajustar esa velocidad. O un controlador de taladro con PWM.
Botones de Pausa/Reanudar
GRBL tiene unos controles adicionales que pueden ser útiles.
Uno es el reset por software (Abort). Lo que hace es parar todo a lo bruto. Se para el taladro, cierra
el liquido refrigerante, y deja de enviar pulsos a los motores paso a paso. Y si la máquina está en
movimiento, vas a perder la posición actual.
En cambio, Hold lo que hace es ejecutar todos los movimientos que tiene en la cola, y hace una
frenada controlada. De esta forma, puedes reanudar el movimiento con Resume, sin perder la
posición.
Esto es útil tenerlo con unos botones adicionales en la máquina. Puedes parar el corte, y por
ejemplo, mover la madera que estás cortando, etc.

Botones para abortar, pausar y reaunudar


Puertos de comunicación adicionales
La placa también tiene acceso a puertos de comunicación.
Tienes el conector UART, que te permite conectar un puerto Bluetooth, y hacer que tu máquina
sea totalmente wireless.
También tiene un conector i2c, para que conectes, por ejemplo, un sensor de temperatura. En este
caso tendrías que modificar el código fuente del GRBL. Esto es ideal si estás montando tu propio
proyecto.

112
Arduino CNC UART i2c
Qué tengo que hacer para conseguir mi SB CNC Shield
Por fín, si has llegado hasta aquí, es que quieres tener tu propia máquina CNC y necesitas una
electrónica fiable.
Si has leido todo esto, no es que te interese sólo el Arduino SB Shield. También te interesa tener
un producto nuevo de StaticBoards.
Podría sacar la placa a un precio estándard, y dejarlo así. Pero ya que te has interesado por la
empresa y por la marca, creo que es justo tener un gesto con los miembros de la comunidad.
Los primeros lectores del blog y todos los que están apoyando este proyecto.
Asi que, por un tiempo limitado, dejaré la placa a un precio rebajado de 9,95€ (más los gastos de
envío).


ARDUINO SB CNC SHIELD PREMIUM
Con las primeras ventas, estaremos un poco desbordados, asi que a lo mejor tardamos unos
días en tener la placa ensamblada. Por eso, cuanto antes la reservas, antes te la pondré enviar.
Si vives fuera de España, puedes comprar la placa a través de Tindie. Lo hago así por el tema de
gestionar los portes y todo eso.
¿Cómo se conecta y cómo se monta una CNC?
Montar la placa es muy sencillo. Para conectar unos drivers y unos motores paso a paso, no hace
falta ser un super ingeniero.

En la página del producto, he escrito toda la información de cómo conectar el arduino sb cnc
shield (que me ha llevado un rato largo).
Esta página es la primera versión. Con los comentarios y las dudas, la propía guía se va ir
actualizando y mejorando.

Viendo la trayectoria que está llevando el blog con la participación de los lectores, estoy seguro
que esta guía se va a posicionar como un referente de Arduino CNCs en español.

113
Es el momento de dar tu opinión
Llega el final del post, y como siempre, es el momento de preguntarte ¿Qué te ha parecido? ¿Tienes
una placa Arduino CNC que ya está instalada? ¿Estás pensando en montar tu propia máquina?
En otros artículos, he creado un formulario para que puedas mandarme tu opinión de forma
privada. Me ayudas a tener información para saber en qué estás trabajando, y qué contenido estás
buscando.

Esta vez he creado un formulario para que puedas decirme el tipo de máquina tienes, o vas a
montar.

 Tipo de CNC*
 Cortadora sencilla de madera/metacrilato

 Cortadora potente de aluminio/metal

 Cortadora Láser

SOFTWARE —
Como explico en el video de abajo (video 2) teneis que copiar el «GBRL»(libreria control para CNC)
dentro del directorio de ejemplos de Arduino, y desde la interfaz de Arduino buscar el ejemplo GBRL
y volcarlo a la placa.

Una vez volcada la librería al Arduino Uno, hay que iniciar GCodeSender, nos conectaremos
seleccionando el puerta que estemos usando y escribiendo $$ en la barra de comandos, la
electrónica de la CNC nos devolverá los parámetros de configuración.

114
Si os sale algún error en la consola como este de abajo, podéis limpiar estos errores escribiendo en
la línea de comando $x y pulsando intro.

Estos son los parámetros que se pueden modificar para controlar la CNC. Vamos a ver solamente
lo más importante, conversión micropasos a mm, y velocidades.
para modificar estos parámetros solamente tenemos que escribir en la línea de comandos $ nº de
parámetro = y el valor y pulsar intro. Ejemplo: $0=400
En los parámetros 0,1 y 2, le tenemos que decir cuantos pasos queremos entregar para recorrer un
mm en cada eje, pero para esto hay que conocer cuál es el avance de nuestros husillos y dividir
ese avance por los micropasos que hayamos configurado. Ejemplo:
Tengo un husillo de 2 mm de avance y la configuración de los micropasos está en 1/4 de paso:
800 pasos por vuelta / 2 mm de avance = 400 pasos o pulsos por 1 mm de avance

115
El parámetro 4 es la velocidad de trabajo de la máquina.
El parámetro 5 es la velocidad de traslación de la máquina cuando levanta la fresa o busca HOME.
El parámetro 8 es la aceleración, que suele ir bien poniendo un 10% de la velocidad de trabajo.
El parámetro 17 es para activar la función de Homing si queremos que siempre busque el punto 0
antes de comenzar a mecanizar.
// Por supuesto ahora toca ir modificando parámetros y probando hasta que quede completamente
calibrada, ya que cada máquina aunque sea igual, puede diferir en muchos aspectos, además, es
la mejor forma de aprender… equivocarse y rectificar, es el mejor progreso

116
Practica 1 de robótica
Nombres y apellidos:…………………………………………………….nota:
1.¿Que es la robotica?

2.¿Que es un robot industrial?

3. Describa con sus palabras las tres leyes de la Robótica según ISAAC ASIMOV:

1.
2.
3.
4.¿De donde proviene y cuál es el significado de la palabra robot?

5. La palabra autómata nació en Grecia, y significa máquina que imita la figura y


movimientos ____________. (2 puntos)
a. del hombre
b. de los animales
c. de un ser animado
d. de los pájaros
5. ¿Cuál fue el primer robot industrial?

6. ¿Cuáles son los elementos de un sistema robótico?

7.¿Cual es la clasificación de los robots móviles?

117
8. ¿Cual es la clasificación de los robots según su morfología?

9. ¿Quien es el padre de la robótica y porque es considerado asi.?

10. Cuál de las siguientes opciones es la mejor alternativa para un robot todo terreno.
a. llantas
b. orugas
c. patas
d. Todas las anteriores
11.¿Qué es un robot?
a) Máquina electrónica capaz de sustituir completamente al ser humano.
b) Aparato que se encuentran en las grandes fabricas europeas y asiáticas.
c) Aparato electrónico y mecánico que realizan tareas de manera autónoma
d) Dispositivo que se utiliza mucho actualmente
12. La palabra robótica fue acuñada por el escritor de ciencia ficción __________.
a) Isaac Newton
b) Karel Čapek
c) Arthur C. Clarke
d) Isaac Asimov

13. REALICE UNA LINEA DE TIEMPO CON LOS HECHOS MÁS IMPORTANTES DE LA
ROBOTICA
14. ¿Cuál es su apreciación de la visita a la feria Nosotros robot de fundación telefónica?

118
Practica 2 de robótica
Nombres y apellidos:…………………………………………………….nota:

119

Vous aimerez peut-être aussi