Académique Documents
Professionnel Documents
Culture Documents
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.
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
*/
13
PWM USANDO POTENCIOMETRO EXTERNO
MONTAJE
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
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
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) .
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
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.
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.
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:
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.
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.
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:
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:
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:
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.
26
Estructura del robot
27
EL PUENTE H
28
29
SENSOR
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.
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.
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
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.
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.
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.
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.
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
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);
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);
}
46
47
48
49
50
51
52
53
54
55
56
57
58
TEORÍA BRAZO ROBOTICO:
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.
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
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:
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
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.
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.
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);
}
73
#include <Servo.h>
Servo servo_2;
Servo servo_n;
Despues de void setup() definimos las salidas de cada servo, tendrá que ser una salida PWM.
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);
Tutorial paso a paso para construir un sencillo «Brazo Robótico» con servos y controlado con
Arduino.
Componentes y materiales
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.
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_superior;
int estado_pulsador_derecha = 0;
int estado_pulsador_arriba = 0;
int estado_pulsador_abajo = 0;
servo_superior.attach(10);
76
pinMode(pulsador_arriba, INPUT);
pinMode(pulsador_abajo, INPUT);
}....
....................
void loop() {
estado_pulsador_arriba = digitalRead(pulsador_arriba) ;
estado_pulsador_abajo = digitalRead(pulsador_abajo) ;
if (estado_pulsador_izquierda == HIGH)
{...........................
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 */
int estado_pulsador_derecha = 0;
int estado_pulsador_arriba = 0;
int estado_pulsador_abajo = 0;
servo_superior.attach(10);
pinMode(pulsador_arriba, INPUT);
pinMode(pulsador_abajo, INPUT);
78
void loop() {
estado_pulsador_arriba = digitalRead(pulsador_arriba) ;
estado_pulsador_abajo = digitalRead(pulsador_abajo) ;
if (estado_pulsador_izquierda == HIGH)
servo_inferior.write(posicion_servo_inferior);
delay(100);
79
{
servo_inferior.write(posicion_servo_inferior);
delay(100);
servo_superior.write(posicion_servo_superior);
delay(100);
80
posicion_servo_superior = posicion_servo_superior - incremento_de_angulo;
servo_superior.write(posicion_servo_superior);
delay(100);
else {
delay(100);
81
Código Arduino para nuestro amigo Milo Gopar
#include servo
Servo nombre_2;
Servo nombre_3;
int posicion_nombre_3
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;
Esta es la primera parte de código donde definimos los servos y el pin para cada pulsador.
nombre_2.attach(10);
nombre_3.attach(11);
pinMode(pulsador_3, INPUT);
pinMode(pulsador_4, INPUT);
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.
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
Para la medida analógica en ambos ejes, conectamos las salidas VRx y VRy a dos entradas
analógicas de Arduino.
84
El esquema de montaje del joystick quedaría de la siguiente forma
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.
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 }
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.
void setup() {
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
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.
Código:
#include <Servo.h>
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
panServo.write(servoPanPosition);
tiltServo.write(servoTiltPosition);
delay(50);
// adjustable for overall speed
}
90
Brazo Robotico 4 servos en mdf
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
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.
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.
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
97
Diseño de robot cartesiano XYZ
98
99
100
101
102
103
104
105
Maquina cnc y Arduino
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
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
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.
Incluye unos jumpers amarillos sencillos de quitar, que además son muy chulos.
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.
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.
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.
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 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?
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?
117
8. ¿Cual es la clasificación de los robots según su morfología?
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