Vous êtes sur la page 1sur 318

TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

MOTORES DE CORRIENTE CONTINUA


Controlando pequeños motores de continua

Home 
 Motores De Corriente Continua

OBJETIVOS

  Presentar los motores de corriente contínua.

 Comprender las bases de funcionamiento.

 Montar un circuito típico de uso y control de los motores CC.

 Montar un variador de velocidad del motor

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


+ 4.50€ +
9.60€

IVA IVA

ARDUINO
UNO REV 3 PROTOBOARD
830 PINES320.
 Añadir al
 Añadir al
carrito
carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


2.00€ + 2.00€ +
IVA IVA

CABLES
DUPONT KIT DE
MACHO- RESISTENCIAS
MACHO VARIADAS
 Añadir al  Añadir al
carrito carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


2.00€ + 0.80€ +
IVA IVA

LEDS DE
COLORES
VARIADOS POTENCIÓMETRO
10K OHM
 Añadir al
 Añadir al
carrito
carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


0.25€ + 6.20€ +
IVA IVA

TRANSISTOR
NPN 2222N RUEDA +
MOTOR
 Añadir al
carrito  Añadir al
carrito

LOS MOTORES DE CORRIENTE CONTINUA, O MOTOR CC

Es difícil moverse por nuestro mundo sin tropezarte con motores eléctricos de todos los tipos y tamaños. Desde los pequeños con los que arrancas el
coche cada mañana a los muy pequeños que mueven tu reproductor de CDs o DVS, al que hace girar el microondas con el que te calientas el café al
levantarte, estamos rodeados de motores eléctricos.

Podemos comprar desde grandes motores trifásicos, de corriente alterna, de gran potencia para labores industriales hasta pequeños motores de

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


corriente continua para mover las ruedas de un pequeño coche de control remoto.

En sesiones previas, ya presentamos una introducción a como gobernar servos o pequeños motores de CC, pero ha llegado el momento de
dedicarles un poco más de tiempo y detalle a ver lo que son y cómo usarlos en nuestro proyectos de Arduino.

Y como siempre es preferible empezar por el principio vamos a comenzar con los motores de corriente continua y viendo cómo podemos controlarlos.

Estoy seguro, de que todos estaréis familiarizados con el hecho de que los imanes tienen un polo positivo y otro negativo y que mientras que los
polos opuestos se atraen, los iguales se repelen.

Hay una relación muy estrecha entre la corriente eléctrica y los campos magnéticos que definen las
ecuaciones de Maxwell (Ya estamos otra vez) y resulta que cuando hacemos circular una corriente
por un conductor que está inmerso en un campo magnético, este se ve sometido a una fuerza
mecánica, que llamamos electromotriz y que podemos usar como principio básico de
funcionamiento de un motor eléctrico

Desde un punto de vista práctico, si hacemos circular una corriente por un hilo que está entre los
polos de un imán, aparecerá una fuerza mecánica que se opondrá a los cambios de esta corriente e
intentara hacer girar el conductor para compensarlos.

La fuerza que aparezca será proporcional a la intensidad del campo magnético, y a el número de conductores que sean recorridos por la corriente,
( por eso lo que hacemos es arrollar espiras de cobre o devanados alrededor de un núcleo, para que la fuerza aumente ).

Todos los motores eléctricos disponen de dos partes básicas:

 El estator o parte inmóvil que por regla general incluye o bien imanes potentes fijos o generan un campo
variable mediante corriente alterna (Lo que nos llevaría a construir un motor de corriente alterna claro)

 El rotor, en el que disponemos espiras o arrollamientos de hilos de cobre alrededor de un núcleo, para que
la fuerza que se ejerce sobre el rotor se multiplique proporcionalmente a este número

La idea final es que podemos diseñar motores de corriente continua sencillos para que esta fuerza sea máxima.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Claro que a medida que la fuerza electromotriz hace girar una fracción de vuelta el rotor, al final nos encontraríamos que, llegaríamos a una posición
de equilibrio, lo que no nos conviene en absoluto porque se pararía el giro del motor.

Por eso tenemos que complicar un poco más el asunto y asegurarnos de que disponemos de múltiples grupos de espiras en distintas posiciones, de
forma que cuando un grupo alcance el equilibrio el otro tome el relevo y el motor siga girando.

Fijaros en los bloques negros marcados como + y – ( Que llamamos escobillas ) que se mantienen estáticos mientras alimentamos con corriente
eléctrica una pareja de espiras con devanados opuestos. Cuando llegan al punto de equilibrio, desconectan ese juego de espiras y las escobillas
alimentan el siguiente juego de espiras durante una fracción de vuelta… y vuelta a empezar.

De ese modo siempre hay un juego de espiras conductoras fuera de la posición de equilibrio que se ve sometido a la fuerza electromotriz y obliga al
motor a girar buscando un equilibrio (Como en el caso de los imanes ) al que nunca le permitimos llegar.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


En esta imagen izquierda podéis apreciar los arrollamientos de hilo conductor, para un pequeño motor de corriente continua. En la animación de la
derecha, podéis apreciar el conjunto girando, y donde Shaft, es el eje de giro. Brushes son las escobillas. Rotor coils son los devanados de hilo
conductor y Magnets son imanes.

CONTROLANDO UN MOTOR DE CC CON ARDUINO

En la sesión transistores, vimos que era muy fácil hacer girar un pequeño motor mediante un transistor que regulase la intensidad de corriente que le
entregamos.

En aquella sesión nos centramos casi en exclusiva en el transistor, para presentar este componente, que vamos a utilizar una y otra vez, y
prácticamente usamos el motor como excusa sin entrar en el tema. Pero en esta ocasión queremos poner el foco en el motorcito y como lo
controlamos y por eso vamos a volver a este ejemplo, pero complicándolo un poco más (Que le vamos a hacer), añadiendo un potenciómetro que
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
nos permita variar la velocidad de giro el motor.

Para ello usaremos un motor de continua, de 5V, con rueda, que podéis encontrar por muy poco dinero y que nos viene de perlas para apreciar el de
giro.

Como cualquier motor, por pequeño que sea consume más de lo que uno de los pines de nuestros Duinos pueden proporcionar, necesitamos usar un
transistor como el 2N2222 para alimentarlo. Y usaremos uno de los pines de Arduino para gobernar este transistor.

Vamos a repetir el montaje que vimos en la sesión transistores con este motorcito. Os incluyo copia del esquema eléctrico que usamos allí y del
diagrama de pines del transistor.

Aquí tenéis el esquema inicial sin potenciómetro para que comprobéis las conexiones del motor y que funciona correctamente, antes de seguir.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Para comprobar que el motor funciona, podéis cargar este pequeño programa, que simplemente varia la tensión que ponemos en el pin 9 para
modificar la velocidad de giro del motor:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


const int control = 9 ;

void setup()
{ pinMode(control, OUTPUT) ; }

void loop()
{
for ( int n = 0 ; n < 255 ; n++)
{
analogWrite (control, n) ;
delay(15) ;
}
}

Que como veréis, simplemente pone un valor analógico en el pin 9. Podemos controlar la velocidad del motor variando la intensidad de tensión que
ponemos en la base del transistor, ya que esta regula la resistencia que el transistor presenta entre emisor y colector.

A 0V el transistor entra en corte (Resistencia infinita) y a 5V está en saturación, con lo que presenta resistencia nula.

 No supongáis que podemos hacer que el motor gire de forma continua para todos los valores de tensión en
la base. Por debajo de un cierto umbral se parará y solo girará cuando este se supere.

 Al hacer crecer el valor de tensión que le damos al motor, la velocidad de giro, irá aumentando
progresivamente.

Aquí os pongo un pequeño video con el resultado:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Vamos a probar ahora a colocar un potenciómetro conectado a la puerta analógica A1, cuya lectura usaremos para variar la señal que ponemos en la
base del transistor. Con ella variaremos la velocidad de giro.

La idea es que a medida que aumentamos o disminuimos la tensión en la base del transistor, la caída de tensión en este varia de forma acorde
haciendo que el motor reciba más o menos tensión y esto se traduce en una cambo de su velocidad de giro.

Y un programa que lee el potenciómetro y varía la velocidad de giro en consonancia puede ser algo como ésto:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


const int control = 9 ;

void setup()
{ pinMode(control, OUTPUT) ;
Serial.begin(9600);
}

void loop()
{
int n = analogRead(A1)/ 4; // Las lecturas analogicas van hasta 1024 y no hasta 255
Serial.println(n);
analogWrite (control, n) ;
delay(200) ;
}

Aquí os pongo un video con el resultado:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Así pues, controlar un pequeño motor de corriente continua es bastante fácil, pero… hasta ahora el motor siempre gira en la misma dirección.
¿Cómo podemos hacer para que invierta su sentido de giro?

Esto queridos amigos será el motivo de la la próxima sesión, porque para eso necesitaremos sofisticar un poco más el circuito

RESUMEN DE LA SESIÓN

  Hemos visto los principios basicos de los motores de corriente continua.

 Revisamos un típico circuito de alimentación y control.

 Vimos que la velocidad de giro es proporcional a la tensión que aplicamos en bornas del motor.

 Vimos como variar la velocidad usando esta idea.

Anterior Siguiente

« COMENTARIOS MÁS VIEJOS

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


(92) Comments

Clarissa 24 Nov 2017


Hola, Si quiero quiero usar diodos infrarrojos emisor y receptor para que detenga el motor cuando se interrumpa la señal
infrarroja pero estoy usando PIC18F4550 para programar, ¿A donde conecto la señal que voy a enviar desde el PIC para
Reply que se detenga el motor si se interrumpe la señal infrarroja?

Ivan 27 Nov 2017


Hola Clarissa, yo no puedo ayudarte en eso, a ver si alguien puede echarte una mano. Un saludo.

Reply

Oscar 29 Nov 2017


Tendría que configurar que si en tu receptor deja de haber una señal, se interrumpa la alimentación a la base del
transistor, ya que esta es la reguladora del voltaje que pasa del microcontrolador al motor.
Reply

JOSUE 15 Oct 2017


Hola, si me pudieses ayudar seria excelente. estoy en un proyecto

Reply y tengo que usar máximo 2 relevadores y tengo que usar 4 motores (2 motores funcionan en un solo relevador, los dos
al mismo tiempo)

necesito saber si hay una forma para invertir el giro de motor con los relevadores?
si alguna manera de invertirlo con transistores pero usando siempre los dos relevadores

de verdad ojala me puedas ayudar, te lo agradecería, haces un buen trabajo

Ivan 17 Oct 2017


Hola Josue, deberías montar un circuito H-bridge o usar un l293D
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Reply

Jesús Sánchez 17 Oct 2017


Hola Josue.

Reply Debes usar reles DPDT. Con ellos puedes invertir el giro de los motores. Si buscas en Internet “control sentido motor
con rele” o similar, verás cómo es el conexionado.

Saludos.

Camila 13 Oct 2017


Hola, como haría para poder controlar el tiempo en que las ruedas giran? Es decir 10 segundos girando y que 10 segundo
paren y así sucesivamente…
Reply

Ivan 17 Oct 2017


la forma más sencilla sería usar un delay. Le pones un delay(10000); después de encenderlos y otro después de
apagarlos. Un saludo.
Reply

Fernando 04 Oct 2017


Hola, no tengo conocimientos de electrónica pero tengo muchas ganas de aprender y a todos los que estamos en esta
situación nos ayudaría mucho el esquela del potenciometro. Excelente trabajo!
Reply

Jesús Sánchez 04 Oct 2017


Hola Fernando. Solo tienes que coger un potenciómetro de 10K, por ejemplo, y de las tres patas que trae, la de la
izquierda la conectas a 5V, la central al pin analógico que usas en el sketch (A1 en este caso), y la tercera pata a GND.
Reply Si el potenciómetro es de 100K tampoco pasa nada.
Saludos.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Mario montaño 14 Sep 2017
hola muy buen tutorial, solo algo me intriga, a mi nunca me ha funcionado como un PPP un 2n2222. como lo lograron?

Reply

admin 20 Sep 2017


Hola Mario, en el tuto tienes la descripcion de todo el montaje ¿No?

Reply

Nicolas 29 Jul 2017


hola a todos, necesito de su ayuda estoi haciendo un proyecto contiene 6 motores en total pero necesito controlar de a
3 motores como si fuera uno solo y queria saber si puedo utilizar el shield que permite hasta 4 motores dc pero en un
Reply puerto en vez de conectar un motor conectar dos???

admin 01 Ago 2017


Hola Nicolas, en principio puedes conctar varios motores a un unico puerto del shiel, pero lo que te limita es la
corriente que puede aceptar y a poc que consume lo superara
Reply
La solucion es que uses mas de un controlador de motores (el https://www.prometec.net/producto/9141/ por ejemplo)
que te permite montar uno encima de otro y aunque enchufes los 3 motores a distintos puertos, los manejas por sof a
unison, vale?

Antonio 01 Jul 2017


Excelentes tutoriales, muy completos y detallados, pero a éste le falta mencionar dentro del MATERIAL REQUERIDO el
transistor 2N2222.
Reply

Ivan 02 Jul 2017


Hola Antonio tienes toda la razón. Lo corregimos en cuanto podamos. Gracias y un saludo.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Reply

Eduardo 12 May 2017


Hola a todos,
Necesito hacer un programa que mueva cuatro motores que se alimento con un voltaje entre 4.5 y 15V y arduino es
Reply capaz de proporcionar. Sabéis como como alimentar el sisitema?? Necesitaría una fuente de alimentación y un
transistor?? Y como se conectaría?? Un saludo
Muchas gracias por adelantado

Ivan 15 May 2017


Hola Eduardo, si quieres manejar 4 motoroes lo mejor es que eches un ojo a algún shield que te facilite el trabajo. Mira
por ejemplo esta sesión https://www.prometec.net/adafruit-motor-shield-v2/
Reply

Ricardo rodriguez rojo 20 Abr 2017


Hola quisiera saber como controlar motor mediante sensor de movimiento pir? Que el motor este trabajando y cuando el
sensor se active el motor se detenga?
Reply

admin 20 Abr 2017


Es tan sencillo como mezclar los dos programas. Cuando el sensor de pir se dispare simplemente cortas la
alimentaciion al motor y listo
Reply

SM 05 Abr 2017
Como se haría para que el motor no pare por completo?

Reply

Ivan 06 Abr 2017


PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Si no quieres que se pare del todo en vez tienes que hacer que la variable n que da velocidad al motor nunca llegue a
0, por ejemplo

Reply for ( int n = 50 ; n < 255 ; n++) { analogWrite (control, n) ; delay(15) ; }

kike 03 Abr 2017


Hola! gracias por atenderme. Quería hacer dos preguntas:
* Por una parte, si queremos saturar el transistor, ¿por qué ponemos la resistencia de 330 ohmios? El pin digital nos da
Reply 0V o 5V (supongamos sólo señal de encendido y apagado). ¿Por qué no conectarlo directamente a la base?
* Por otra parte, cuando utilizamos una fuente externa, por ejemplo de 12V, otra duda que tengo es si en el arduino, sólo
debemos conectar el pin 9, o por el contrario necesitamos conectar además del pin 9, la GND a masa común (la masa de
la fuente de alimentación).

Ivan 04 Abr 2017


Hola Kike, la resistencia se usa para limitar la intensidad que llega al terminal de la base, o se rompería.

Reply Cuando utilices varias dispositivos deberías unir siempre las tierras.

kike 06 Abr 2017


Gracias por lo de unir siempre las tierras, no estaba seguro.

Reply Sobre la otra cuestión todavía no la tengo clara. En la sesión sobre transistores
( https://www.prometec.net/transistores/) se dice “un valor de 5V en la Base permite el paso de la corriente
sin restricciones.”

Si el pin digital de arduino, con un valor HIGH, tiene una tensión de 5V, si le conectamos una resistencia en
serie de 330 ohmnios, se tendrá una caída de tensión, por lo que el transistor no satura ya que en la base
tendremos una tensión inferior a 5. No sé si el razonamiento tiene un error de concepto… Además, 40mA que
da como máximo los pines digitales, ¿puede provocar daño al transistor?

Gracias de nuevo

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Jesús Sánchez 06 Abr 2017
Hola Kike.

Reply Manejar un transistor requiere de una serie de fórmulas que puedes encontrar en Internet como
“Polarización del transistor” o títulos similares, ya que es un tema algo extenso.
Pero con Arduino y microcontroladores lo que se suele usar es el transistor como interruptor, o
dicho de otro modo, en corte y saturación. En corte, cuando no conduce, y en saturación cuando
permite es paso de toda la corriente.
Hay una fómula sencilla para determinar esa resistencia que se coloca en la base del transistor,
pues su valor depende de la carga que vaya a manejar el mismo, el voltaje que entra por la base,
el Vbe sat o voltaje de saturación base/emisor y la ganancia del transistor o hfe. Es así:
Rbase = ((Vbase – Vbe sat) * hfe)/ I carga

Vbase: Son los 5V de Arduino.


Vbe sat: Normalmente son 0.6V (esto viene en la hoja de datos del transistor), pero puede ser
otro voltaje.
hfe: Es la ganancia, que se suele ser 100, pero se debe mirar en la hoja de datos.
I carga: Es la corriente (en amperios) que demanda la carga conectada al transistor.

Con esta sencilla fórmula puedes hallar la resistencia que debe llevar el transistor elegido con
respecto a la carga conectada a él y su corriente.

Saludos.

kike 07 Abr 2017


Gracias Jesús, me ha aclarado mucho. Salu2!

Jesús Sánchez 07 Abr 2017


Por nada…!
Puedes crear un Excell en el que puedas introducir el Vbase, el Vbe, el hfe y la
corriente de la carga, y te calcula automáticamente la resistencia que debes poner.
Recuerda que la corriente es en amperios, así que si la carga demanda 100mA debes

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


poner 0.1
El resultado te aparecerá en Ohmios, y si te resultara 6830, por ejemplo, pues
equivale a una resistencia de 6K8. Siempre puedes colocar una un poco inferior o
superior al valor que te de el resultado, ya que no es crítico.

Saludos.

Raul 30 Mar 2017


Hola, existe alguna manera de hacer este programa de variación de velocidad pero en lugar de un potenciometro, ocupar
2 botones. Al presionar uno, suba su velocidad y al presionar el otro la disminuya? Esto haciéndolo gradualmente con
Reply cada botón.

admin 30 Mar 2017


Buenos dias Raul,

Reply Nada mas facil. Define una variable global llamada velocidad por ejemplo. Haz un programa en que cada vez que pulses
el bont de subir aumente el valor y cuando pulses ol otro boton haz disminui speed y despues haz que el valor de
speed corresponda a la señal PWM con que manejas la velocidad del motor

Lunix 14 Mar 2017


hola cual es el código para cambiar la polaridad del motor?

Reply

Ivan 15 Mar 2017


Hola Lunix, para cambiar la polaridad del motor tendrías que dar la vuelta a los cables del mismo. Un saludo.

Reply

Daniel 19 Feb 2017


Una duda,¿ no habría que alimentar el transistor con una batería externa en lugar de con el Arduino?

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Reply ¿Cuánto es capaz de suministrar el Arduino por la salida de 5V?

Ivan 20 Feb 2017


Hola Daniel, me parece que son 500mA, por supuesto podrías usar una batería o una fuente de alimentación externa
para alimentar el transistor, siempre que este lo aguante. Un saludo.
Reply

Raul 28 Ene 2017


Se podria hacer con cualquier transistor? O solo con este?

Reply

admin 30 Ene 2017


en principio valdria cualquier transistor

Reply

Nano 15 Ene 2017


Hola, sería muy útil si pudieras poner la imágen de como se arma cuando tiene el potenciometro, en el vídeo no se
aprecia bien y para los principiantes es muy difícil ello, vengo horas intentando
Reply

Ivan 16 Ene 2017


Hola Nano, auí tienes el esquema de conexión para controlar la velocidad del motor con un potenciómetro que hicimos
en el curso de Scratch 4 Arduino. Un saludo.
Reply
https://www.prometec.net/s4a-transistores-motor/

admin 16 Ene 2017


a ver si saco un ratito y añado la conexion

Reply
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Anonimo 11 Ene 2017
¿podrías mandarnos los códigos de arduino para realizar lo de regular la potencia del motor? gracias

Reply

admin 12 Ene 2017


Hola anonimo, sera un placer pero los tienes en la sesion y en sus continuacions. No tienes mas que copiarlos o
escargarlos
Reply

Jose 30 Dic 2016


Quisiera iniciarme sin gastar mucho, así que estoy reciclando algunos componentes.

Reply Extraje los motores de vibración de un mando de Playstation, ¿cómo puedo saber el voltaje máximo que le puedo
suministrar? ¿Será suficiente para un proyecto como este? Le puse una pila de 9V directamente y no tiene mucha fuerza
(monte una estructura de coche y apenas la mueve)

admin 30 Dic 2016


Hola Jose,

Reply Para saber el voltaje de esos motores mira la beteria que usa o el numero de pilas que usa. SI por ejempo usa 4 pilas
de 1,5 entonces sabes que como maximo sera 4×1,5 = 6V o sea 5V, pero ten en cuenta que esos motores de vibracion
no son demasiado potentes

Edgardo 05 Nov 2016


Hola como podria controlar un motor mediante un sensor de movimiento de eje x y y

Reply

admin 07 Nov 2016


Hola Edgardo ¿De que sensor nos estas hablando?
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Reply

Henry Silva 18 Oct 2016


Que necesitaria de extra si quiero hacer eso pero con un motor de 12v

Reply

admin 18 Oct 2016


pues usar un transistor por ejemplo que soporte la corriente que pase

Reply

GIVE A REPLY

Message

Name (required) Email (required)

URL

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Post comment
WordPress
WordPress Anti-Spam
Anti-Spam by
by WP-SpamShield
WP-SpamShield

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

MAS SOBRE MOTORES DE CORRIENTE CONTINUA


Variando el sentido y la intensidad de giro

Home 
 Mas Sobre Motores De Corriente Continua

OBJETIVOS

  Seguimos jugando con los motores de corriente continua.

 Presentar los H bridge y porque son necesarios.

 Un integrado, el L293D .

 Montar un variador de velocidad del motor y también de sentido de giro.

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


4.50€ +
9.60€ +
IVA
IVA

ARDUINO PROTOBOARD
UNO REV 3 830 PINES320.
 Añadir al  Añadir al
carrito carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


2.00€ + 6.20€ +
IVA IVA

CABLES
DUPONT
MACHO- RUEDA +
MACHO MOTOR
Añadir al
Añadir al


carrito
carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


1.00€ + 0.80€ +
IVA IVA

H-BRIDGE
L293D POTENCIÓMETRO
10K OHM
 Añadir al
carrito  Añadir al
carrito

Arduino UNO o equivalente.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Una Protoboard .

Algunos cables de protoboard,

Rueda y motor de CC de 5V.

Un H bridge integrado L293D

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Un potenciómetro de 10K

A VUELTAS CON LOS MOTORES DE CORRIENTE CONTINUA, O MOTOR CC

Hemos visto por encima las características básicas de los motores de corriente continua con escobillas (Porque hay varios tipos además de este),
pero vamos a entrar un poco más en detalle de que cosas debes considerar cuando vayas a elegir uno de estos motores.

Cuando compres un motor de corriente continua debes fijarte en tres cosas básicamente:

 Voltaje de funcionamiento: Que especifica los rangos de tensión entre los que el motor funcionará
correctamente. Por ejemplo el que yo estoy usando se mueve entre 3 y 6V, pero no es raro encontrarlos de
9, 12 y 24V

 Revoluciones por minuto: Que indica la velocidad que puede alcanzar a las distintas tensiones y que se
suele consignar como Rpm. Típicamente en motores de Hobby andaremos entre 200 y 2.000 rpm

 Par motor: O potencia que el motor puede desarrollar y que indica la carga útil que puede mover. En inglés
se llama Torque.

En la sesión anterior vimos como como conectar uno de estos motores a nuestro Arduino y como variar la velocidad de giro modificando la tensión
que le entregamos en bornes. La velocidad de giro del motor depende directamente de esta tensión

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 Mucho cuidado de no superar la tensión máxima que el fabricante nos indica como seguras o encontrareis
que el olor de un motor quemado es muy característico y particularmente desagradable.

Pero una cosa que no hicimos en la sesión previa fue invertir el sentido de rotación del motor, porque este es un tema espinoso, ya que para ello
necesitamos invertir la polaridad de la tensión en bornes, y esto, queridos amigos, no podemos hacerlo usando solamente nuestros Arduinos
(Porque Arduino puede proporcionar +5V pero no -5V).

Para resolver este problema tenemos que usar un poco más de ingenio y diseñar un circuito que se llama puente en H ( H-bridge ). Para
comprenderlo, imaginaros el siguiente montaje a base de interruptores:

Cuando usamos los interruptores en la posición de la imagen izquierda el motor gira en un sentido que llamaremos directo. Pero si los colocamos en
la posición de la derecha girará en sentido contrario, porque hemos invertido la polaridad de la tensión en las entradas del motor, y por tanto el
sentido de giro, sin necesidad de invertir la polaridad de la tensión, cosa complicada.

A estos circuitos se les llama H-bridge , porque recuerdan vagamente a una H alrededor del motor.

Claro que invertir el giro mediante interruptores es poco práctico, y como aquí somos expertos electrónicos ( Sin carcajadas, por favor), vamos a ver
cómo podemos hacer la misma función usando electrónica y que no tengamos que conmutar manualmente, sino mediante señales eléctricas. Un
típico H-Bridge seria parecido a este circuito:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Olvídate por ahora de los diodos, que son para protección de la descarga inductiva del motor y proteger los transistores. Jugando con la tensión en
los pines A; B; C; D podemos conseguir que los transistores entren en corte o saturación y disponemos de un medio electrónico para abrir o cerrar el
equivalente a los interruptores mediante transistores.

 Observa que dos transistores son unos PNP y otros dos NPN para jugar con la polaridad de la tensión.

 El campo magnético del rotor almacena energía, que puede ser importante, y que cuando cortamos la
alimentación debe ser liberada en forma de corriente eléctrica, y adecuadamente dirigida por los diodos
para impedir daños en los transistores o en la fuente de alimentación

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Que no se asuste nadie . No voy a pediros que montéis ese circuito (aunque no sería demasiado complicado). Recordad que cuando hay una
necesidad en el mercado, siempre hay alguien dispuesto a fabricar un integrado que hace eso y más.

Y como esta no iba a ser la excepción, nos encontramos que disponemos de varias versiones de circuitos H-bridge dependiendo de la tensión y la
intensidad que se debe conmutar.

Nosotros hoy vamos a utiliza un integrado barato, probado y fácil de encontrar que incluye dos H -bridge y que nos sirve para pequeños motores de
corriente continua. Se llama L293D.

EL H BRIDGE L293D

El L293D, es un pequeño integrado que incluye dos puentes H-Bridge que podemos usar para gobernar simultáneamente dos motores CC.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Si buscáis el manual del L293D, veréis que aunque el funciona a 5V internamente, puede conmutar tensiones de hasta 36V para tus motores.

 Asegurarte de que no sobrepasas la tensión máxima nominal de tus motores, es problema tuyo, así que ojo
que el chip lo aguanta, pero lo de tu motor es otra historia.

El patillaje del chip es así:

Veamos que son los diferentes pines del L293D:

 El pin 16, Vss, son los 5V con los que alimentamos el chip y el pin 8, Vs, es la tensión con la que
alimentamos el motor.

 Los pines del 1 al 7 controlan el primer motor y los pines 9 a 15 controlan el segundo motor.

 El pin 1, Enable1, Activa el uso del motor 1. Con un valor HIGH, el motor puede girar dependiendo del valor
de I1 e I2. Si es LOW se para independientemente de los valores del resto de pines

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 Los pines 2 y 7 son los pines de control para el motor 1, e irán conectados a nuestros Arduino para
controlar el sentido de giro.

 Los pines 3 y 6 son la salida a la que se conecta el motor 1, cuya polaridad se invierte en función los valores
de 2 y 7.

 En el diagrama de arriba veis que hay pines equivalentes para el motor 2 y cuales son.

 Los pines 4, 5,12 y 13 van a GND.

Podemos hacer una tabla para mostrar la lógica que sigue el giro del motor en función de los tres pines:

ENABLE CONTROL PIN 2 CONTROL PIN 7 MOTOR STATUS

LOW – – Motor parado

HIGH HIGH LOW Gira adelante

HIGH LOW HIGH Gira al revés

HIGH HIGH HIGH Motor parado

HIGH LOW LOW Motor parado

Por tanto tenemos que activar el pin enable para que el motor gire y después usamos los pines Input1 e Input2 con valore opuestos para hacer girar
el motor en una dirección o en la contraria. ¿Fácil no? Veamos cómo hacer el montaje con nuestros Arduinos.

Hagamos un resumen de conexiones

PIN L293D PIN ARDUINO DESCRIPCIÓN

1 10 Enable

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


PIN L293D PIN ARDUINO DESCRIPCIÓN

2 9 Input 1

3 – Motor1 +

4,5, 12,13 GND GND

6 – Motor1 –

7 8 Input 2

8 Vin Alimentación del motor

16 5V Alimentación del L293D

Vamos con el esquema de protoboard.

ESQUEMA DE PROTOBOARD

Una vez que tenemos claras las conexiones, el diagrama de protoboard del chip L293D a nuestro Duino será algo así:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Veamos el programa que vamos a usar para controlar este motor. Vamos a usar los 3 pines de la tabla anterior. Arduino Pin 10 es el enable del Motor
1 y usamos los pines 8 y 9 para controlar el sentido de giro. Por tanto

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


#define E1 10 // Enable Pin for motor 1
#define I1 8 // Control pin 1 for motor 1
#define I2 9 // Control pin 2 for motor 1

void setup()
{
for (int i = 8 ; i<11 ; i++) // Inicializamos los pines
pinMode( i, OUTPUT);
}
void loop()
{ digitalWrite(E1, HIGH); // Activamos Motor1
digitalWrite(I1, HIGH); // Arrancamos
digitalWrite(I2, LOW);
delay(3000);

digitalWrite(E1, LOW); // Paramos Motor 1


delay(1000);
digitalWrite(E1, HIGH); // Activamos Motor1

digitalWrite(I1, LOW); // Arrancamos con cambio de direccion


digitalWrite(I2, HIGH);
delay(3000);

digitalWrite(E1, LOW); // Paramos Motor 1


delay(1000);
}

El programa no puede ser más sencillo. Activamos el Enable1 para arrancar Motor1, y luego usamos I1 e I2 con valores invertidos. El motor arranca y
lo paramos a los 3 segundos. A la de 1 segundo levantamos de nuevo el Enable1y al intercambiar los valores de I1 e I2 el giro del motor se inicia y en
la dirección contraria.

Aquí va un mini video con el resultado:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Los lectores más astutos, se habrán dado cuenta de que no hemos variado la velocidad de giro y dado que en el programa anterior todos los valores
son digitales lo vamos a tener mal para variar la velocidad de forma analógica.

Pero el truco está en que hemos conectado el pin Enable1 al pin Arduino 10 que es PWM (Así, como sin querer) y los L293D vienen diseñados para
variar la velocidad de giro de los motores correspondientes con la tensión aplicada a este pin, por lo que resulta trivial variar la velocidad del motor,
sin más darle valores analógicos.

Si por ejemplo añadimos un potenciómetro de nuevo conectado al A1, podemos escribir este valor directamente (dividido por 4, claro) al pin 10 como
analógico, sustituyendo la línea

digitalWrite(E1, HIGH); // Activamos Motor1

Por esta otra que escribe un valor analógico:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


analogWrite(E1, analogRead(A1) /4 ) ;

Fijaremos la velocidad de giro del motor en función del valor del potenciómetro. El programa corregido, quedaría poco más o menos así:

#define E1 10 // Enable Pin for motor 1


#define I1 8 // Control pin 1 for motor 1
#define I2 9 // Control pin 2 for motor 1

void setup()
{
for (int i = 8 ; i<11 ; i++) // Inicializamos los pines
pinMode( i, OUTPUT);
}

void loop()
{ analogWrite(E1, analogRead(A1) / 4); // Activamos Motor1
digitalWrite(I1, HIGH); // Arrancamos
digitalWrite(I2, LOW);
delay(3000);

digitalWrite(E1, LOW); // Paramos Motor 1


delay(1000);
analogWrite(E1, analogRead(A1) / 4); // Activamos Motor1

digitalWrite(I1, LOW); // Arrancamos con cambio de direccion


digitalWrite(I2, HIGH);
delay(3000);

digitalWrite(E1, LOW); // Paramos Motor 1


delay(1000);
}

Y eso es todo.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 Si montáis el circuito de prueba, tened en cuenta que la lectura de A1 solo se hace al salir del delay, por lo
que variación se efectúa al principio de cada ciclo de giro y no en medio de este.

 Sería un buen ejemplo plantear un programita en el que la velocidad se varia inmediatamente, aunque para
ello tendréis que eliminar los delays.

Aquí tenemos un vídeo de muestra del resultado.

RESUMEN DE LA SESIÓN
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
  Hemos presentado los H bridge y porqué son necesarios.

 Vimos un integrado, el L293D, que incluye dos H bridge con la capacidad para regular dos motores tanto
en velocidad como en sentido de giro.

 Montamos un circuito de pruebas para utilizar el H bridge con nuestros Arduinos .

Anterior Siguiente

« COMENTARIOS MÁS VIEJOS

(115) Comments

Josue 05 Nov 2017


Una pregunta, cuanto es el maximo amperaje con el que se le puede alimenta a lo motores CC

Reply

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Ivan 08 Nov 2017
Hola Josué, depende del motor y con qué lo alimentes.

Reply

Jesús Sánchez 08 Nov 2017


Hola Josue.

Reply En realidad, no podemos hablar en este caso de “el máximo amperaje”, sino la “máxima tensión”. Se puede
perfectamente conectar un motor de 12V 100mA a una batería de auto de 40Ah. El motor va a tomar la corriente que
necesite. Otra cosa es que le conectes a esa batería un motor de 3V.

Saludos.

HORACIO OSCAR 17 Sep 2017


Hola…Nececito armar un radio control de 4 canales..(con modulo rf 433 mhz)..y controlar con pulsador..puesta en
marcha y polaridad…es decir pulsar marcha hacia adelante ..pulsar marcha atras…..El chip L293D puedo adaptarlo …o
Reply solo se utiliza para arduino y por ende para ser programado..sI pudieran asesorarme sería de gran ayuda….Gracias

Ivan 19 Sep 2017


Hola Horacio, el L298N se puede usar con cualquier otro microcontrolador, no se programa sino que se controla
mediante dos señales analógicas y 4 digitales. Un saludo.
Reply

Jose Miguel 04 May 2017


Hola Buenas Tardes

Reply Te felicito por el curso ,que es muy explicativo


Si quisiera manejar el motor a control remoto ,con un receptor infrarrojo IR ,donde se conectaria en el circuito?

Saludos

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Ivan 05 May 2017
Tienes que conectar el receptor a un pin de interrupción de Arduino, como el pin 2. De todos modos ech un ojo a esta
sesión que lo explicamos con un receptor de infrarrojos y un mando a distancia. Un saludo.
Reply

Ark 27 Abr 2017


Hola, disculpa, segun tenia entendido, no podiamos conectar motores DC sin una alimentacion externa, dado a que estos
pueden llegar a consumir hasta 70mA, como con arduino solo podemos alimentar dispositivos que consumen un maximo
Reply de 20mA, ¿no seria riesgoso para los pines de la placa alimentar el puente H sin una fuente externa? ¿o el integrado
tiene un amplificador?

Ivan 29 Abr 2017


Hola Ark, creo recordar que los pines de Arduino pueden dar hasta 40mA, y el vcc hasta 200mA. De todas formas lo
máximo que te puede pasar es que no pueda moverlos, o que se muevan muy despacio, pero no le ocurrirá nada a tu
Reply Arduino. Un saludo.

Juan 27 Mar 2017


Hola admin, tengo un par de preguntas/dudas.

Reply La primera es sobre las conexiones. Según la tabla que facilitas, el PIN 2 del chip (Input 1) corresponde al PIN 9 de
Arduino, y el PIN 7 del chip (Input 2) corresponde al PIN 8 de Arduino. Sin embargo en el programa los asignas al revés

#define I1 8 // Control pin 1 for motor 1


#define I2 9 // Control pin 2 for motor 1

¿Da igual como lo asignemos? Entonces, ¿para qué la tabla?

La segunda duda es sobre el funcionamiento. A mi me está ignorando la instrucción de arrancar o parar el motor en todo
momento. Si pongo esto funciona todo igual

void loop()
{

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


digitalWrite(I1, LOW); // Arrancamos
digitalWrite(I2, HIGH);
delay(1000);

digitalWrite(I1, HIGH); // Arrancamos


digitalWrite(I2, LOW);
delay(1000);

No estoy activando el motor en ningún momento y, sin embargo, funciona el programa y gira, durante 1 segundo, en una
dirección y, durante otro segundo, el dirección contraria. Si añado digitalWrite(E1, LOW); en el medio o al final hace caso
omiso y no para el motor.

¿Sabes a qué puede ser debido esto?

Muchas gracias

Carlos-ardu 30 Nov 2017


Hola
¿Has comprobado que tienes fisicamente conectado el enable al nº de pin que as definido en E1?
Reply

Jose 02 Mar 2017


Hola, quería saber si es posible con un solo integrado, suministrar alimentaciones independientes a cada uno de los dos
motores, y así controlar el giro del coche.
Reply
Muchas gracias por el tutorial.

Ivan 03 Mar 2017


Hola Jose, efectivamente puedes controlar dos motores y su sentido de giro con uno de estos chips. Un asludo.

Reply

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


admin 06 Mar 2017
Hola Jose, claro que si, es lo que hacemos en los siguientes tutos , ya veras

Reply

Israel 18 Feb 2017


Hola,
He probado el ejercicio con dos arduinos, dos motores diferentes y dos chips L293D diferentes (comprados a la vez),
Reply pero me encuentro siempre con el mismo problema; cuando aplico un valor por debajo de 255, tal como esto:
analogWrite(E1, 150); el motor produce un zumbido agudo y no se mueve, en teoría debería girar más lento.
Por lo tanto, si aplico 255 o 0, funciona sin problemas, pero cualquier valor fuera de aquí no funciona, por lo que no
puedo hacer que el motor gire a velocidades más pequeñas.
Los motores son los mismos que los usados en este ejercicio.
Aplicando el tester en los bornes del motor, para ver el voltaje que le llega, veo que cuando se produce el zumbido, el
voltaje está alrededor de los 0.8v y cuando gira con un valor de 255, el voltaje está en 2,3v. He probado también de
meterle tensión externa al motor, pero nada.
Cualquier ayuda será bienvenida y gracias por anticipado.

Ivan 18 Feb 2017


Hola Israel, prueba a meterle una fuente de alimentación externa. Puede ser que con la alimentación del USB no tenga
bastante fuerza para moverlo a velocidades bajas. Prueba a ver y me cuentas. Un saludo.
Reply

admin 18 Feb 2017


Hola Israel, Tiene toda la pinta, visto desde fuera que estas usando un pin no PWM para controlar la velocidad del
motor, asegurate de usar un pin que lo permita y veras como enseguida funciona
Reply

Israel 18 Feb 2017


Hola, gracias por las sugerencias.
He probado de nuevo a meterle alimentación externa al motor (6v con 4 pilas) y este lo único que hace es
Reply girar más rápido cuando está a 255, cuando está a 150 pita más fuerte que cuando sólo lo alimento con el
Vin.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
He calcado el ejercicio, uso el PWM 10, para la patilla uno del chip, he probado con todos los PWM.
La verdad es que tiene un comportamiento bastante impredecible, porque a veces, una de cada 10, el motor sí
gira a velocidad lenta y en otras ocasiones, pita durante un rato y se pone en marcha, incluso pita mientras
gira. He probado con 5 motores y con todos pasa lo mismo.
Los duinos también funcionan bien, los he probado con varios servo motores y van bien, de hecho los tengo
conectados con un par de NRF2401 y un joystick para controlar remotamente los motores y el servo responde
perfectamente. Por eliminación sólo me quedan los puentes.

Eddy Ramos 16 Feb 2017


Hola buen día, al puente h L293D es necesario ponerle los diodos o los incluye?
Saludos, muchas gracias por estos tutoriales.
Reply

Ivan 17 Feb 2017


Hola Eddy, el L293D lleva los diodos integrados. Habría que incluirlos si se opta por usar el L293.

Reply

ADRIAN 18 Dic 2016


puedo cambiar la alimentacion de 5v a 12 v tomandolo de una fuente externa pero con las mismas conexiones ???

Reply

admin 20 Dic 2016


Desde luego, el l293d sopoorta hasta 36 V segun su data sheet pero asegurate de no usar 12v con tu arduino o
necesitaras uno nuevo
Reply

JLLC 10 Dic 2016


Hola.
Creo que el L293 tiene para dos motores.
Reply Que pines usariamos para el otro motor?

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Ivan 12 Dic 2016
Los pines para salida a los motores son 3 y 6 para uno y 11 y 14 para el otro. En el esquema del chip de esta sesión
vienen nombradas como Outputs de 1 a 4. Un saludo!
Reply

admin 13 Dic 2016


Hola JLC, Fijate en el patillaje o pinout del chip que incluye la sesion y veras que hay unos pines al otro lado con
nombres iguales a los que usamos para manejar el unico motor que incluye, pero puedes usar estos otros pines
Reply exactamente la misma manera

Pol 20 Oct 2016


hola, queria preguntar si puedes subir la conexión del circuito con el potenciometro y un sensor DHT 22, ya que estoy
haciendo un trabajo y no me aclaro, me lo puedes pasar por mail a polvalles.elluch@gmail.com muchas gracias!!!
Reply

admin 21 Oct 2016


Hola Pol, echa una ojeada a la sesion que habla del dht11. El dht22 es exactamente igual para el circuito y en el
programa solo hay que cmabiar el nombre del sensor
Reply

Juan 08 Oct 2016


hola, queria preguntar por el pin de alimentacion d los motores(pin 8) del l293d esta conectado a Vin; q según entiendo
no provee tension, sino es otra entrada de alimentación del arduino
Reply

admin 09 Oct 2016


Hola Juan, el pin Vin esta directamente conectado a la entrada de alimentacion del arduino en el USB. Eso supone que
dispone de la tension de entrada y por tanto si que puede alimentar hasta un maximo de 0,5 amperios
Reply

Luis Ramírez 28 Ago 2016


Si puede ser porque son 4 pilas de 1,5 V así que ya andará un poco desgastada.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
¿Pero por que el hecho de que la batería ande escasa de potencia implica un conportamienro diferente?

Reply

admin 28 Ago 2016


El problema de que las baterias den tension inferior a la nominal, es que cuando la tension con la que alimentas a la
electronica baja de los 5V se vuelve impredecible y por eso es preferible no dejar margen de duda
Reply

Luis Ramírez 28 Ago 2016


Disculpad que os escriba de nuevo, pero he seguido indagando en el proyecto y me he dado cuenta de una cosa:

Reply Si alimento la placa por USB o mediante la entrada Jack sí que se comporta desde el inicio como debe, sin entrar en el
if. Sin embargo, ocurre todo lo contrario (entra en el if nada más alimentarlo) si lo alimento mediante la entrada Vin que
es la que voy a usar para el proyecto…

Esto me ha dejado aún más desconcertado…

admin 28 Ago 2016


Parece que la bateria que usas anda escasa de potencia ¿Puede ser?

Reply

Luis Ramírez 28 Ago 2016


Muy buenas a todos, estoy haciendo un pequeño coche con dos motores controlados por el L293D. Resulta que su
funcionamiento es totalmente correcto con respecto al código que os muestro más abajo, pero hay una pequeña pega:
Reply nada más alimentar la placa comienza entrando siempre en el if a pesar de que no haya obstáculos delante. Después de
hacer lo propio del if, sí que funciona como debe, pero claro no entiendo porque nada más alimentar la placa lo primero
que hace es el if obviando lo que hay antes al entrar en el loop.

He adjuntado el código por si alguien me podría decir a qué se debe ese error, porque por más vueltas que le doy no sé
por qué hace eso…

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Un saludo y gracias!!

//LED:

#define LED 2

//Definimos parámetros para el motor:

#define E1 10
#define I1 8
#define I2 9
#define E2 5
#define I3 6
#define I4 7

//Definimos parámetros para el sensor:

#define trigPin 13 //boolean trgiPin = 13;


#define echoPin 12 //boolean echoPin = 12;

long duracion;
long distancia;
int limite = 25; //Medida en vacío del sensor. cm.

void setup() {

Serial.begin(9600);

//LED:

pinMode(LED, OUTPUT);

//Sensor:

pinMode(echoPin, INPUT);
pinMode(trigPin, OUTPUT);

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


//Motor 1:

for( int i = 8; i < 11; i++)


pinMode(i, OUTPUT);

//Motor 2:

for( int j = 5; j < 8; j++)


pinMode(j, OUTPUT);

void loop() {

digitalWrite(LED, LOW);

digitalWrite(E1, HIGH); //El motor debe estar moviéndose al poner en marcha el programa hasta que encuentre un
obstáculo.
digitalWrite(I1, HIGH);
digitalWrite(I2, LOW);
digitalWrite(E2, HIGH);
digitalWrite(I3, HIGH);
digitalWrite(I4, LOW);

distancia = medidorDistancia (duracion);

Serial.println(String(distancia) + " cm.");

if (distancia < limite){

digitalWrite(LED, HIGH); //Al encenderse me informa de que ha encontrado un obstáculo.

digitalWrite(E1, LOW); //Paro los motores.


digitalWrite(E2, LOW);
delay(200);

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


digitalWrite(E1, HIGH); //Marcha atrás.
digitalWrite(I1, LOW);
digitalWrite(I2, HIGH);
digitalWrite(E2, HIGH);
digitalWrite(I3, LOW);
digitalWrite(I4, HIGH);
delay(500);

digitalWrite(E1, LOW);
digitalWrite(I3, HIGH); //Giro hacía la izq 180.
digitalWrite(I4, LOW);
delay(800);

else{

digitalWrite(LED, LOW);

digitalWrite(E1, HIGH);
digitalWrite(I1, HIGH);
digitalWrite(I2, LOW);
digitalWrite(E2, HIGH);
digitalWrite(I3, HIGH);
digitalWrite(I4, LOW);

int medidorDistancia (long duracion){

int dist;

digitalWrite(trigPin,LOW); //Nos aseguramos de que el trigger esté desactivado.


delayMicroseconds(2); //Para estar seguros de que el ya está LOW.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


digitalWrite(trigPin, HIGH); //Activamos el pulso de salida.
delayMicroseconds(10); //Esperamos.
digitalWrite(trigPin, LOW); //Cortamos el pulso y a esperar el eco.

duracion = pulseIn(echoPin, HIGH);

dist = duracion / 2 / 29.1 ; //Devidimos por dos porque el eco es tanto ida como vuelta.

return dist;
}

GIVE A REPLY

Message

Name (required) Email (required)

URL

Post comment

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


WordPress
WordPress Anti-Spam
Anti-Spam by
by WP-SpamShield
WP-SpamShield

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

UN PEQUEÑO ROBOT CON TRACCIÓN 4×4


Controlando varios motores simultaneamente

Home 
 Un Pequeño Robot Con Tracción 4×4

OBJETIVOS

  Seguimos jugando con los motores de corriente continua.

 Presentar los Motor Shield V1 de Adafruit.

 Vemos cómo manejarlos con la librería adecuada .

 Montar un pequeño robot con tracción 4×4.

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


+
Out of
13.30€ 9.00€ Stock

+ IVA IVA

ARDUINO
MEGA MOTOR SHIELD
V1
 Añadir al
carrito Leer más

Out of
60.00€ Stock

50.00€

+ IVA

ROBOT
ROVER 4×4
Leer más

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


CONTROLANDO VARIOS MOTORES DE CC

En las sesiones previas hemos visto cómo manejar los motores de corriente continua típicos. Hemos visto cómo hacerlos girar y como modificar
esta velocidad de giro, así como la forma de invertir el sentido de rotación mediante un H bridge integrado como el L293D.

¿Y qué hace un hombre normal, cuando consigue controlar un motor ( y más uno que esté leyendo esto )? Pues naturalmente, probar a manejar varios
motores a la vez, digamos 4, y empezar a pensar en hacer un pequeño cochecito con tracción a las 4 ruedas y control remoto inalámbrico y….
¡Quieto parado!

Vayamos por partes. De momento solo hemos gobernado un motor, aunque sabemos que el L293D dispone de capacidad para manejar un segundo
motor. Podríamos diseñar un circuito con dos L293D para mover 4 motores y quizás hacer un Shield para montar todo en la chepa de nuestro
Arduino.

Pero como siempre os digo, si existe una necesidad en este mundo electrónico, siempre hay alguien presto a vendernos la solución de forma
conveniente. Y como podréis imaginar, ni somos los primeros que hemos tenido esta idea (Ni seremos los últimos) ni es precisamente una novedad
la solución, el mercado nos ofrece toda una variedad de Shields para controlar motores muy interesantes, dependiendo del tamaño de los motores,
su consumo, la tensión y cualquier otra cosa que podáis imaginaros.

Como en esta humilde casa pensamos que para aprender hay que trastear y preferiblemente por poca pasta, vamos a presentar un sencillo Motor
Shield que fue diseñado por nuestros amigos de Adafruit y luego abandonado en favor de un controlador de motores más avanzado (y caro) y cuyo
relevo ha sido tomado por la nube de fabricantes chinos, proporcionándonos un Arduino motor shield V1.0, por muy poco dinero, que nos permite
iniciarnos gastando lo justo.

Veamos sus características.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


ADAFRUIT MOTOR SHIELD V1.0

Aquí tenéis una foto del Motor Shield V1.0, que podéis encontrar fácilmente en cualquier proveedor:

Las características principales son:

 4 H Bridges incluidos con dos L293D chips.

 Hasta 4 motores CC con control bidireccional y selección de velocidad de 8 bits.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 Máxima corriente de 0,6 Amperios (Aunque acepta picos de hasta 1,2) con una protección de sobre
temperatura.

 Acepta motores cuya alimentación va desde 4,5 a 25V.

 Podemos añadir otros dos motores Servos o paso a paso.

 Dispone de alimentación de motores, separada de la del Shield para evitar ruido e interferencias.

 Bajo precio (En serio).

 Compatible con UNOs y Megas por lo menos.

 Dispone de una librería cómoda para manejar los motores .

En resumen, es un Shield barato y práctico para manejar pequeños motores de 5V, pero que se quedará corto si necesitas una cierta potencia en
los motores, ya que la intensidad que estos demandaran superará con facilidad los 0,6A que tiene como límite este Shield.

Es ideal para construir robots autónomos con pequeños motores y sin peso y sobre todo como elemento de aprendizaje antes de invertir una pasta
gansa en otras opciones mas sofisticadas.

CONECTANDO EL MOTOR SHIELD

El shield conecta directamente los H Bridges L293D a los pines PWM de Arduino y además incorpora un viejo conocido nuestro el 74HC595, un
Shift Register, para ahorrar pines en la conexión.

El Shield se reserva los pines 3,4,5,6,7,8,9,10,11,12, los pines 9 y 10 se usan para los servos en caso de que los incluyamos y quedan libres los pines 2
y 13, así como el 0 y 1 que se usan para la comunicación USB con nuestro PC.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Los pines A0 a A5 están disponibles para nuestro uso y recordar que a una mala, podeos usarlos como pines digitales también.

Hay conexiones para los bornes de 4 motores, marcados como M1, M2, M3 y M4 y conviene que al conectar sigas el mismo criterio en los bornes y
en el Shield porque de lo contrario conseguirás que alguno de los motores gire al revés de lo que pretendes. Lo que no es muy grave porque se
arregla con facilidad.

Una cosa interesante de este shield es que nos permite separar la alimentación de los motores de la alimentación de Arduino y es de agradecer
porque los motores generan mucha interferencia electromagnética que puede hacer que nuestro Arduino se comporte de forma errática.

Por eso siempre que sea posible conviene que separéis la alimentación de uno y otro ( Aunque en un robot autónomo va a ser difícil) . Para ello basta

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


con que quites el “power jumper” y la alimentación estará separada. Esto será imprescindible si tus motores son de digamos 9 0 12V porque tu
Arduino solo funciona con 5V (So pena de hacer barbacoa de Arduino ).

Vamos a conectar un primer motor al Shield para probar. Lo primero montad el Shield a vuestro Arduino. Yo os recomiendo un MEGA para que
podamos seguir haciendo cosas en el futuro, pero también vale cualquier otro.

Conectad los bornes del motor a los tornillos A y B del Motor Shield , dejando libre el pin central marcado como GND.

 No es importante que borne a que pin, porque lo único que ocurrirá si lo invertís es que el motor girará al
revés. Lo que sí es recomendable es que mantengáis el mismo criterio para todos los motores, porque os
ahorrará dolores de cabeza.

 Como en este primer ejemplo vamos a alimentar el motor desde Arduino y el USB, no olvidéis conectar el
power jumper, para que alimentemos los motores directamente desde Arduino.

Seria sencillo manejar el motor a través del Shield directamente, recurriendo a los pines de control, y os lo propongo como ejercicio si os parece,
pero aquí vamos a descargar ahora una librería de Adafruit para manejar el Shield directamente, que nos permitirá abstraernos del detalle de pines.

La librería que necesitamos es esta adafruit-Adafruit-Motor-Shield-library-8119eec, y para instalarla seguimos el procedimiento habitual .

Para usarla, lo primero que tenemos que hacer es este par de instrucciones:

#include <AFMotor.h>
AF_DCMotor Motor1(1);

La primera línea, incluye la librería de AdaFruit en nuestro programa, y la segunda crea una instancia de un motor conectado a la puerta M1, y le
iniciamos con el parámetro que le pasamos que puede ir del 1, M1 al 4, M4.

Para establecer la velocidad del motor hacemos:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Motor1.setSpeed(200); // Definimos la velocidad de Motor1
Motor1.run(RELEASE);

La primera línea pone el motor a 200 / 255 del tope de revoluciones, y la segunda línea indica que queremos dejar el motor en punto muerto.

Si queremos que el motor avance usamos:

Motor1.run(FORDWARD);

Y para que retroceda hacemos

Motor1.run(BACKWARD);

Y eso es todo lo necesario para controlar un motor. Si queremos hacer un primer programa sencillo que haga avanzar el motor unos segundos y
después retroceda, podemos escribir un programa similar a este Prog_92_1:

#include <AFMotor1.h>
AF_DCMotor1 Motor1(1);

void setup()
{ Motor1.run(RELEASE); }

void loop()
{ Motor1.run(FORWARD);
delay (2000);

Motor1.setSpeed(180);
Motor1.run(BACKWARD);
delay (2000);
}

Aquí os pongo un mini video con el resultado:


PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
MOVIENDO VARIOS MOTORES SIMULTÁNEAMENTE

Vamos a conectar ahora, 4 motores a nuestro Motor Shield . Yo tengo por aquí rodando un bastidor con 4 ruedas y motores que voy a usar como
base para hace un robot con tracción a las 4 ruedas.

Pero lo mismo da cualquier otro robot que tengáis, o hasta un bastidor con las ruedas, a condición de que podamos subirle nuestro Arduino mas el

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


motor Shield. Una caja de cartón duro a la que sujetéis los motores y ruedas, sirve de maravilla.

En mi caso lo he puesto en un pedestal, para poder probar los diferentes motores sin que se me escape corriendo. Vamos con el programa de
prueba. Lo primero es incluir la librería y definir las instancias de los motores que esta ocasión son 4 en vez de 1:

#include <AFMotor.h>

AF_DCMotor Motor1(1);
AF_DCMotor Motor2(2);
AF_DCMotor Motor3(3);
AF_DCMotor Motor4(4);

Definimos la velociodad de los 4 motores en el setup:

void setup()
{ Serial.begin(9600); // set up Serial library at 9600 bps
Motor1.setSpeed(255);
Motor2.setSpeed(255);
Motor3.setSpeed(255);
Motor4.setSpeed(255);
}

Y por ultimo vamos a mandar moverse adelante y atrás y para los 4 motores simultáneamente:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Motor1.run(RELEASE);
Motor2.run(RELEASE);
Motor3.run(RELEASE);
Motor4.run(RELEASE);
delay (1000) ;

Motor1.run(FORWARD) ;
Motor2.run(FORWARD);
Motor3.run(FORWARD);
Motor4.run(FORWARD);
delay (2000);

Motor1.run(BACKWARD);
Motor2.run(BACKWARD);
Motor3.run(BACKWARD);
Motor4.run(BACKWARD);
delay (2000);

Como veis no es diferente de mover un solo motor, solo mas pesado. Aquí tenéis el programa Prog_92_2.

Es conveniente que comprobéis en vuestro montaje que todas las ruedas giran en la misma dirección y que no hay ninguna rotando al revés, porque
cuando queramos avanzar seria un problema.

Aquí os dejo un pequeño video con el trest de giro

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Con esto, confío en que con esto hayamos dejado listo el hardware de nuestro robot para empezar a programarlo en serio. Pero parece mas
conveniente cortar aqui esta sesión y dejar algo para la próxima sesión, en la que veremos como mover el robot y hacerlo girar además de variar la
velocidad de crucero.

Detalle del uso de pines


Una consulta de un lector suscitó la cuestión de que pines se usaban para que en este Motor Shield V1 y como era una cuestión de lo mas razonable
que no estaba cubierta previamente,hemos optado por añadir este pequeño anexo especificando los pines que usa cada motor y cuales están
disponibles en caso contrario.

ARDUINO FUNCIÓN

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


ARDUINO FUNCIÓN

Pin 1 Disponible

Pin 2 Disponible

Pin D3 DC Motor #2 / Stepper #1

Pin D4 Reservado para gobernar el Shift Register 74HC595

Pin D5 DC Motor #3 / Stepper #2

Pin D6 DC Motor #4 / Stepper #2

Pin D7 Reservado para gobernar el Shift Register 74HC595

Pin D8 Reservado para gobernar el Shift Register 74HC595

Pin D9 Servo #1, Disponible si no se usa el servo

Pin D10 Servo #2, Disponible si no se usa el servo

Pin D11 DC Motor #1 / Stepper #1

Pin D12 Reservado para gobernar el Shift Register 74HC595

Pin D13 Disponible

A0,A1,A2,A3,A4,A5 Disponibles. Recuerda que pueden usarse como digitales

Tened presente que no hay ningun pin de Arduino conectado a los motores directamente. La gestión de los motores se realiza a traves del shift
register para ahorra pines y por eso tenéis necesariamente que usar la libreria para manejarlos.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


RESUMEN DE LA SESIÓN

  Hemos presentado el Motor Shield V1 de Adafruit , que un Shield muy barato además de útil para
mover pequeños motores y como nuestra primera controladora.

 Vimos sus características y limitación pero siempre es mas comodo un Shield que hacerse un invento.

 Instalamos la librería de control de motores y empezamos con las nociones básicas de programación
de los motores.

 Dejamos el Motor Shield conectado a un pequeño robot de 4 ruedas y prbamos que todo funcionaba
como se esperaba, dejando listo el hardware para que podamos empezar a programar el movimiento del
robot.

Anterior Siguiente

« COMENTARIOS MÁS VIEJOS

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


(164) Comments

jeff 12 Sep 2017


y para que gira de un sentido presionando un pulsador y al presionar otro pulsador gira al reves como podria hacer????

Reply

Ivan 19 Sep 2017


Hola Jeff, echa un ojo a esta sesión que te ayudará https://www.prometec.net/condicionales-botones/

Reply

Ave01 08 Ago 2017


Excelentes tutoriales, todo funciona perfectamente, pero en mi caso con la variación de utilizar una par de arañas
unidas: sus motores, en lugar de mover ruedas, mueven patas; es un proyecto muy llamativo, además de barato. Utilizo
Reply un par de baterías de Litio recargables, tipo 18650 (total 7.2v), recicladas de un portátil, junto con su portapilas, y cero
problemas de energía. Cuando la araña está pegada al cable USB apenas si se mueve (con dificultad). Recomiendo
tomar en cuenta la importancia de utilizar una buena alimentación eléctrica.
Gracias de nuevo por los tutoriales.

GIVE A REPLY

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Message

Name (required) Email (required)

URL

Post comment
WordPress
WordPress Anti-Spam
Anti-Spam by
by WP-SpamShield
WP-SpamShield

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

DIRIGIENDO UN ROBOT ROVER 4×4


Girando sin volante

Home 
 Dirigiendo Un Robot Rover 4×4

OBJETIVOS

  Seguimos jugando con los motores de corriente continua y la controladora Motor Shield V1 de Adafruit.

 Veremos la teoría básica de giro sin volante de dirección .

 Programaremos los movimientos básicos de robot.

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


+
Out of
13.30€ 9.00€ Stock

+ IVA IVA

ARDUINO
MEGA MOTOR SHIELD
V1
 Añadir al
carrito Leer más

Out of
60.00€ Stock

50.00€

+ IVA

ROBOT
ROVER 4×4
Leer más

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


CONTROLANDO EL GIRO

En las sesiones previas hemos visto los conceptos básicos de los motores CC y cómo usar una controladora tipo MotorShield , para gobernar varios
motores simultáneamente. Pero de lo que no hemos hablado es de una cuestión básica que a algunas personas les suele parecer difícil de entender:
El giro.

Como los automóviles forman parte de nuestra vida diaria, comprendemos con facilidad el principio de giro que usan medinate el volante, y tenemos
una idea intuitiva de como este desvía la dirección de trazado de las ruedas con respecto a la dirección del movimiento del coche. De ese modo, las
ruedas delanteras trazan siempre la tangente a la curva del movimiento.

 Pero quizás no resulte tan evidente que las dos ruedas delanteras de los modernos coches, no pueden girar
a la misma velocidad en curva, si queremos mantener la estabilidad y gobernabilidad del vehículo.

Pues es bastante fácil, y si lo piensas es el mismo principio que usan los tractores en el campo, que pueden hacer giros impensables para un
automóvil, o los tanques de guerra y excavadoras que se desplazan mediante orugas metálicas (sin dirección móvil).

Como en los automóviles disponemos de un único motor de explosión, tenemos que montar un complicado sistema mecánico, que reparta la
tracción entre las ruedas motoras, pero en los coches eléctricos en general y en nuestro Rover 4×4 en particular, disponemos de un motor por
rueda, por lo que podemos controlar la velocidad de cada una independientemente.

 Esto es así, incluso en los vehículos híbridos comerciales, que usan un motor de combustión para recargar
las baterías centrales, pero disponen de un motor eléctrico por rueda, lo que nos permite además de
tracción 4×4, hacer algunas cosas poco habituales en un coche tradicional,

Controlando la velocidad de cada rueda podemos soslayar la necesidad de una dirección mecánica y podemos hacer movimientos que sorprenderían

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


bastante a un conductor de automóvil, incluyendo girar sin tocar el volante.

El truco esta precisamente en hacer girar cada rueda a diferente velocidad, de modo que fuercen al vehículo a girar en la dirección y radio deseados.

Si las ruedas del lateral derecha giran al doble de velocidad que las del lateral izquierdo, nuestro Rover girara forzosamente a la izquierda y viceversa,
haciendo un giro continuo y tanto más suave cuanto menor sea la diferencia de velocidad entre el giro de los dos laterales.

El radio de giro será más o menos cerrado, dependiendo de la relación entre las velocidades de los laterales. No solo podemos hacer girar el Rover,
sino que además podemos controlar lo cerrado del giro. Si paramos completamente uno de los laterales y mantenemos el otro, el giro será muy
acusado.

Con tracción independiente a las cuatro ruedas podemos incluso hacer girar las ruedas de un lateral en sentido contrario al giro del otro lado, y en
este caso el Rover girará sobre su centro de gravedad sin desplazarse.

Para gobernar nuestro Rover con tracción a las 4 ruedas nos bastara controlar de forma diferencial la velocidad de giro de las ruedas, y esto ya
sabemos hacerlo de las sesiones previas. Así que vamos a pasar al programa.

EL PROGRAMA DE CONTROL DEL ROVER

Vamos a empezar con algunas definiciones, como siempre: Prog_94_1

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


#include <AFMotor.h>

AF_DCMotor Motor1(1);
AF_DCMotor Motor2(2);
AF_DCMotor Motor3(3);
AF_DCMotor Motor4(4);

int Vel = 255 ; // Define la velocidad base del Rover


float P = 0.25 ; // Proporcion de giro

Incluimos la librería e instanciamos las cuatro ocurrencias de los 4 motores. Después creamos una variable que usaremos para contener la velocidad a
la que deseamos mover el Rover. De ese modo variando el contenido de Vel, variaremos la velocidad general del vehículo, y definimos P como una
variable que indicará la proporción de velocidad entre un lado y el otro cuando queramos girar.

Como vamos a girar modificando la relación de velocidades de los motores, nos conviene empezar definiendo una función como esta, que usaremos
para programar la velocidad de cada rueda independientemente:

void SetVel(int v1, int v2, int v3, int v4)


{ Motor1.setSpeed(v1);
Motor2.setSpeed(v2);
Motor3.setSpeed(v3);
Motor4.setSpeed(v4);
}

Recuerda que estas órdenes fijan la velocidad de cada motor pero aún no se ponen en marcha. Para eso vamos a definir algunos movimientos
básicos, como Avance, Retroceso y Paro:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void Avance()
{ SetVel(Vel,Vel,Vel,Vel); // Misma velocidad a las 4 ruedas
Motor1.run(FORWARD) ;
Motor2.run(FORWARD);
Motor3.run(FORWARD);
Motor4.run(FORWARD);
}

void Retroceso()
{ SetVel(Vel,Vel,Vel,Vel); // Misma velocidad a las 4 ruedas
Motor1.run(BACKWARD) ;
Motor2.run(BACKWARD);
Motor3.run(BACKWARD);
Motor4.run(BACKWARD);
}

void Paro()
{ Motor1.run(RELEASE);
Motor2.run(RELEASE);
Motor3.run(RELEASE);
Motor4.run(RELEASE);
}

Para girar ya hemos comentado que bastará con mover a diferente velocidad los laterales del Rover. Podemos montar un sistema de giro abierto
haciendo que uno de los laterales se mueva a digamos 1/3 de la velocidad del otro lado, usando la variable P que definimos al principio.

 En un Rover real, podemos alterar el radio de giro, leyendo un potenciómetro, como una palanca, de modo
que a medida que movemos la palanca hacia la derecha, por ejemplo, va reduciendo proporcionalmente la
velocidad de las ruedas de la derecha.

 Os lo dejo como ejercicio, porque no creo que tengáis dificultad y ya hablaremos de ello cuando veamos
cómo usar un mando a distancia para gobernar el Rover.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void giroIzquierda()
{
int v = Vel * P ;
SetVel( v, Vel, v, Vel) ;

Motor1.run(FORWARD) ;
Motor2.run(FORWARD);
Motor3.run(FORWARD);
Motor4.run(FORWARD);
}

void giroDerecha()
{
int v = Vel * P ;
SetVel( Vel, v, Vel, v) ;

Motor1.run(FORWARD) ;
Motor2.run(FORWARD);
Motor3.run(FORWARD);
Motor4.run(FORWARD);
}

Y ya solo nos falta hacer una prueba en movimiento real. Vamos a programar el movimiento, (Porque aún no tenemos control remoto sobre la
dirección).

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void loop()
{
Avance();
delay(2000);
Retroceso();
delay(2000);
giroIzquierda();
delay(3000);
giroDerecha();
delay(3000);
}

¿Fácil No? Avanza, retrocede y gira a un sentido y al otro. Vamos a probar como se mueve, de este modo tan sencillo.

PROBANDO EL MOVIMIENTO DEL ROVER 4×4

Para mover el Rover la primera intención suele ser usar el cable de USB y dejar el Rover con el conectado para moverlo, pero aunque parece una
buena idea, me temo que no va a funcionar.

 El cable USB puede mover los motores sin ninguna carga, pero escasamente podrá mover el Rover por una
alfombra, ya que los motores tienen la mala costumbre de consumir mucha intensidad y el USB típico no
pasa de medio Amperio máximo.

 Tendréis que usar pilas y os recomiendo que sean 6 pilas, no 4, porque con el alimentador externo,
necesitamos por lo menos 7V para darnos 5V con garantías.(y 4 pilas x 1,5V = 6V, lo que resulta
insuficiente)

 Además y por si fuera poco, los motores baratos suelen ser muy poco eficientes energéticamente y estos,
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
creedme, son muy baratos.

Para probar el movimiento vamos a necesitar un paquete de pilas externo y unas baterías. Algo así como esto:

El conector que veis, en la imagen de arriba, encaja perfectamente en vuestro Arduino (En ese conector que nadie usa, ya ves) y nos ahorrará el
llevar un cable colgando, que siempre acaba liándose con el movimiento.

Montando todo esto junto, tenemos el program Prog_94_2, y este es un mini video con el resultado

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


No puedo resistir la tentación de mostraros lo que ocurre si hacemos girar las ruedas de los laterales en sentidos contrarios, veamos el programa
Prog_94_3:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void giroIzquierda()
{
SetVel( Vel, Vel, Vel, Vel) ;

Motor1.run(BACKWARD) ;
Motor2.run(FORWARD);
Motor3.run(BACKWARD);
Motor4.run(FORWARD);
}

void giroDerecha()
{
SetVel( Vel, Vel, Vel, Vel) ;

Motor1.run(FORWARD) ;
Motor2.run(BACKWARD);
Motor3.run(FORWARD);
Motor4.run(BACKWARD);
}

Este tipo de giro nos resulta un tanto contra intuitivo, porque los coches no pueden hacerlo, pero funciona muy bien y hace que el Rover gire sobre
su propio centro geométrico.

Aquí va el mini video correpsondiente:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Y ya solo nos queda definir una manera de gobernar el Rover 4×4 mediante algún sistema de control remoto. En la próxima sesión veremos que
opciones tenemos y cual elegir.

RESUMEN DE LA SESIÓN

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


  Seguimos usando la controladora de Adafruit MotorShield, y poco queda ya por hacer con ella para
controlar motores de CC.

 Hemos visto la teoría básica de como girar mediante velocidad diferencial con tracción a las 4 ruedas.

 Vimos los programas básicos que gobierna el giro del Robot incluyendo el giro sobre su centro

Anterior Siguiente

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

UN ROBOT 4×4 AUTÓNOMO


Decidiendo la ruta por si mismo

Home 
 Un Robot 4×4 Autónomo

OBJETIVOS

  Seguimos jugando con los motores de corriente continua y la controladora Motor Shield V1 de Adafruit.

 Buscamos que el Rover pueda buscar su ruta de forma autónoma evitando obstáculos .

 Veremos las nociones básicas del movimiento autónomo.

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


+
Out of
13.30€ 9.00€ Stock

+ IVA IVA

ARDUINO
MEGA MOTOR SHIELD
V1
 Añadir al
carrito Leer más

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Out of 3.90€ +
60.00€ Stock
IVA
50.00€

+ IVA

ROBOT SENSOR
ROVER 4×4 DISTANCIA
Leer más
 Añadir al
carrito

ALGUNOS COMENTARIOS PREVIOS

En principio, esta sesión estaba pensada para montar un sistema de control a distancia de nuestro Robot, pero dado que en esta humilde página
aspiramos a poner los medios, para que quien lo desee pueda aprender a programar y dado que nuestro flamante robot con tracción total está en
marcha, no he podido resistirme a intentar una prueba con un sistema autónomo de control.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Me refiero naturalmente a dotar a nuestro Rover con algún sensor de obstáculos y una pequeña toma de decisiones en función de ello para ver qué
pasa. Y qué mejor que uno sensor que ya conocemos por sesiones previas: El sensor ultrasónico de distancia.

En un tutorial anterior vimos cómo manejarlo y sería bastante fácil de incorporar a nuestro pequeño robot 4×4 en el frontal. Naturalmente la cosa
puede hacerse tan complicado como queramos con múltiples sensores de distancia y sensores de luz, o de sonido.

Pero para este primer prototipo, aplicaremos una regla básica de la ingeniería: KISS, por sus iniciales en inglés (Keep It Simple Stupid, que no creo
que necesite traducción) y ya tendremos tiempo de complicarnos la vida (Que en el fondo es lo que nos pone).

 Un algoritmo, por si aún no habíamos hablado antes de ello, es un procedimiento estandarizado para
resolver un problema concreto.

 En nuestro caso el algoritmo será sencillamente girar a la izquierda cuando detecte un obstáculo a menos
de una distancia estipulada, lo que no es un algoritmo muy sofisticado que digamos, pero por algún sitio
hay que empezar.

CONECTANDO EL SENSOR

Ya vimos en una sesión previa como conectar el sensor de distancia por ultrasonidos a un Arduino UNO. En esta ocasión voy a usar un Arduino
MEGA, porque necesitamos disponer de pines libres para conectar el Sensor de distancia (2) y dejar sitio para el mando a distancia (como 6).

 En principio, seguramente podríamos usar un UNO para todo esto, pero un MEGA es mas cómodo,
porque el Motor Shield no nos tapa todos los pines y además vamos a cargar varias librerías, que aunque
no son grandes, no estoy seguro como andaríamos de memoria con el UNO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Solo hay que tener en cuenta que como no tenía a mano el pin de 5V, porque quedaba oculto por el Motor Shield , he usado el pin 52 como
alimentación, (Porque el sensor ultrasónico no consume casi nada y un pin del MEGA tiene capacidad para alimentarlo), y tenemos el GND al lado.

 Este es un truco muy interesante cuando lo que vais a conectar no consume mas de los 20mA que un
Arduino de 5V es capaz de suministrar o recibir, y en ocasiones nos evita andar haciendo cosas raras para
buscar los 5V. Pero asesuraros de que no sobrepasareis este limite.

He elegido estos pines por pura vagancia, para que sea fácil pasar los cables, pero vosotros podéis elegir los que queráis, claro está.

Vamos a incluir aquí un esquema de los pines en los que lo he conectado yo para que podáis usar los mismos y no necesitéis modificar los
programas.

Solo hay que tener en cuenta que como no tenía a mano el pin de 5V, porque quedaba oculto por el Motor Shield, he usado el pin 52 como
alimentación, (Porque el sensor ultrasónico no consume casi nada y un pin del MEGA tiene capacidad para alimentarlo), y tenemos el GND al lado.

He elegido estos pines por pura vagancia, para que sea fácil pasar los cables, pero vosotros podéis elegir los que queráis, claro.

Sensor GND Vcc Echo Trigger

MEGA GND 52 48 50

Color cable Negro Rojo Azul Morado

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 No os fieis del dibujo y fijaros en los nombres de los pines y la tabla de conexión. No es fácil que lo
queméis, pero los cementerios están llenos de optimistas.

En mi caso he sujetado el sensor de ultrasonidos, mediante una pieza de plástico que me hice con la impresora 3D, y celo al frontal del robot.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Vamos con el programa de control.

UN PROGRAMA AUTÓNOMO PARA EL ROVER 4×4

Como solo hemos montado un sencillo sensor de distancia, esta es toda la información que podemos usar y por eso la idea de movimiento autónomo
se tiene que basar en la distancia al obstáculo más cercano.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
No es la situación ideal pero nos servirá como primera aproximación. Por eso la idea que podemos aplicar, es algo así como lo siguiente.

Mientras no haya un obstáculo a menos de digamos 30 centímetros, avanzamos. Si por lo que sea la nos hemos metido en un problemas sin saber
cómo y la distancia de un obstáculo es menor de digamos 15 cm, retrocedemos. Y si el obstáculo esta entre 15 y 30 cm, lo que hacemos es girar a la
izquierda.

En todos los movimientos aplicamos un delay para asegurarnos de que el Rover se va moviendo poco a poco.

Vamos a partir del programa de la sesión anterior en la que teníamos los movimientos trabajados y simplemente cambiamos el setup de acuerdo con
el principio descrito arriba.

Tenemos que instalar la Libreria new_ping en caso de que no la tengáis instalada, y si no sabeís como hacerlo, aquí teneís el procedimiento habitual .

Veamos un poco el programa: Prog_95_0 . Empezamos con las librerías y algunas definiciones como es habitual:

#include <NewPing.h>
#include <AFMotor.h>

#define TRIGGER_PIN 50 // Pin conectado al trigger.


#define ECHO_PIN 48 // Pin conectado al echo del sensor.
#define MAX_DISTANCE 200

Los defines, corresponden a los pines que hemos elegido en el MEGA y el max_distance especifica la máxima medida que me devuelve la librería del
sonar, no tiene mucha importancia aquí. Tenemos ahora, que crear una instancia del sonar para uso del programa

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);

Y en cuanto al setup, es de lo más simple. Definimos el pin 52 como de salida y lo ponemos en HIGH para que alimente el sonar, y ponemos un
pequeño delay para asegúranos de que la alimentación es estable

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void setup()
{
pinMode(52, OUTPUT) ; // Usaremos el pin 52 como VCC de 5V
digitalWrite(52, HIGH) ;
delay(50); // Por si acaso
}

En cuanto al loop, tenemos que empezar enviando un pulso para medir la distancia:

unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS)
int dist = uS / US_ROUNDTRIP_CM ;

Y ahora ya podemos pasar a decidir el movimiento de acuerdo a las reglas que mencionábamos arriba:

if (dist > 30)


Avance() ;
else if ( dist < 15)
{
Retroceso() ;
delay(500);
giroIzquierda() ;
delay(500);
}
else
{
giroIzquierda() ;
delay (400);
}
delay(250);

El resultado es bastante errático y con un comportamiento bastante extraño, como robótico en el peor sentido, y además se atasca sin que este muy
claro porque, pero como primera aproximación puede valer.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Aquí os pongo un mini video con el resultado

MEJORANDO LA NAVEGACIÓN AUTÓNOMA.

Para ser una primera prueba no está del todo mal. Seguro que podríamos imaginar algún algoritmo un poco más sofisticado que mejorase la
navegación.

Por ejemplo podríamos imaginar que el tiempo en que el robot está girando, dependa de la distancia al obstáculo detectado: Cuanto más próximo,
más tiempo gira, O que la dirección en la que gira sea aleatoria.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Otro modo de mejorar la toma de decisiones, seria incluir más sensores y basarnos en ellos para los giros. Podríamos usar un sensor de luz y
 Aunque tendríamos que pensar en alguna manera de evitar que gire una vez a cada lado y siempre se dé de
frente contra el obstáculo al final.

movernos buscando siempre el punto más luminoso de la habitación.

Imaginaros que usáramos dos sensores de distancia ligeramente desviados de la dirección del movimiento. De este modo podríamos considerar que si
uno detecta un obstáculo, digamos a la derecha y el otro sensor no, la conclusión seria girar a la izquierda y viceversa.

De este modo con dos sensores de ultrasonidos, podríamos hacer giros adaptativos en función de la posición relativa de los obstáculos.

Como no tengo otro sensor disponible, me voy a quedar aquí, pero si el tema os interesa sería muy fácil de pensar en cómo darle vida propia al
movimiento autónomo. Os lo dejo como tareas pendientes y si alguno se os ocurre alguna solución ingeniosa, no dejéis de contármelo.

RESUMEN DE LA SESIÓN

  Seguimos usando la controladora de Adafruit MotorShield.

 Vimos un algoritmo muy básico para mover el robot de modo autónomo

 Planteamos algunos métodos de sofisticar el movimiento.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Anterior Siguiente

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

CONTROLANDO EL ROVER CON UN MANDO PS2


Usando un mando inalámbrico práctico

Home 
 Controlando El Rover Con Un Mando PS2

OBJETIVOS

  Seguimos jugando con los motores de corriente continua y la controladora Motor Shield V1 de Adafruit.

 Vamos a usar un controlador inalámbrico tipo PlayStation 2 para gobernar manualmente el Rover
4×4.

 Veremos cómo usar las librerías de control: PSX.

 Mostraremos cómo detectar las pulsaciones básicas de los botones del mando .

MATERIAL REQUERIDO.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
+
Out of
13.30€ 9.00€ Stock

+ IVA IVA

ARDUINO
MEGA MOTOR SHIELD
V1
 Añadir al
carrito Leer más

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


17.00€

60.00€
Out of
Stock
+ IVA
50.00€

+ IVA
MANDO PLAY2
ROBOT SIN HILOS
ROVER 4×4
 Añadir al
Leer más carrito

Un control como Dios manda

El control mediante Bluetooth es práctico porque siempre tenemos a mano un móvil con él, pero un poco errático y al final siempre nos deja la

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


sensación de ser un tanto incomodo o de fundir las baterías del móvil demasiado deprisa y en el mejor de los casos, incómodo para estar un rato con
él.

Por eso, y como siempre solemos comentaros, al final, alguien tenía que venir con una solución “como Dios manda” y por eso el mercado nos
proporciona una impecable para controlar nuestros robots, motores o proyectos varios con un mando único, que a muchos nos resultará familiar: Un
mando como el de la PlayStation 2 inalámbrico.

Estos mandos se pueden conseguir por poco dinero en estos momentos (Gran cosa las bajadas de precios de todos los componentes electrónicos) y
tiene la enorme virtud de ser ergonómicos y muy cómodos de manejar, además de estar dotados de dos joysticks analógicos y como 14 botones
incluidos.

Estos mandos vienen con un receptor inalámbrico, que podemos conectar a nuestros Arduinos y usarlos para recibir las señales de control, sin
complicarnos mucho la vida, y un mando inalámbrico aparte muy similar al que habréis usado más de uno para jugar con la PS2 de Sony.

En esta sesión vamos a ver como conectar este tipo de mando inalámbrico a nuestros Arduinos y veréis que gracias a las librerías que nuevamente se
ha trabajado Mr. Bill Porter, son pero que muy fáciles de implementar y usar.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


CONECTANDO EL RECEPTOR REMOTO

Como estamos montando un Rover 4×4 vamos a utilizar un Arduino Mega como el que venimos usando en las sesiones anteriores, para que el que
quiera pueda tener un robot funcional.

Cuando empecé a mirar en Internet la información de este tipo de mandos me pareció bastante confusa y lo que es peor me pasé un buen número
de horas tratando de hacerlo funcionar sin éxito

El problema que puede ocurrir al conectar el receptor inalámbrico a tu Duino es que lo enchufes al revés (Yo desde luego lo hice y me dio una tarea
que no veas hasta que me di cuenta) porque la información que hay en Internet es un poco oscura y hay que leer entre líneas para comprender de
que va el tema. En cuanto lo conectas bien no hay pérdida posible.

 Si buscáis información en Internet, os encontrareis con que suelen describirte que es cada pin en función de
un código de colores, que quizás sea estándar con los mandos de Sony , pero que con los compatibles solo
va a servir para confundiros, así que olvidaros de los colores.

En su lugar usad este diagrama, mirando desde le frontal del receptor (Desde donde no salen cables)

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Tampoco es necesario que os compliquéis la vida entendiendo la utilidad de cada cable, ya que la librería que vamos a usar, se va a encargar de la
gestión a condición de que definamos correctamente los pines.

Lo más cómodo es que conectéis los pines a vuestro Arduino en secuencia. En mi caso que uso un MEGA y la tabla de conexión seria así:

CONEXIÓN RECEPTOR PS2 A ARDUINO MEGA

RECEPTOR 1 2 3 4 5 6 7 8 9

MEGA 22 24 26 28 30 32 34 36 38

PIN data command vibration GND 5V Attention Clock – acknoledge

Si disponéis de un pin header plano o a 90º es ideal para esto, porque dispondréis de un peine de pines que se conecta directamente a los
conectores de la Mega y el enganche es más fiable, porque están agrupados.

De nuevo, tenemos un par de pines que son GND y 5V, pero como el consumo es despreciable podemos poner en HIGH el pin 30 y en LOW el pin
28.

 Aunque en la documentación dice que el pin 30 debe ser alimentado a 3.3V yo he probado con 5V sin
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
ningún problema y eso que lo he tendido encendido largo y tendido.

EL PROGRAMA DE CONTROL

Lo primero es descargar la librería PS2X_lib y que la instaléis siguiendo el procedimiento habitual .

Como ya es costumbre de la casa, vamos a empezar con un programa mínimo para comprobar unos pocos botones y después iremos viendo el resto
de los mandos disponibles.

Vamos a empezar incluyendo la librería y creando un controlador tipo para el manejo del mando. Prog_96_1

#include <PS2X_lib.h> //for v1.6


PS2X ps2x; // Creamos la clase del mando PS2

Después vamos a definir el setup para que nos alimente el receptor con GND y 5V.

Serial.begin(57600);
pinMode(28, OUTPUT) ; pinMode(30, OUTPUT);
digitalWrite(28, LOW); //Set Ground for remote
digitalWrite(30, HIGH); // Set 5V for remote
delay(500);

Ya habíamos usado antes este truco de alimentar algo con un pin del Arduino, pero recordar que este no debe superar los 40 mA Vamos a hora a
definir los pines que vamos a usar en la librería con la línea:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


error = ps2x.config_gamepad(34,24,32,22, true, true)
//(clock, command, attention, data, Pressures?, Rumble?)

Fijaros que es aquí donde especificamos que pines vamos a usar y a que funciones del mando a distancia corresponden, por eso elegí que fueran
consecutivos (Recordad que la vagancia es muy valiosa si te ahorra trabajo inútil ), pero podéis definir los que queráis en función del modelo de
Arduino que estéis usando.

Y por último, en el setup, vamos a asegurarnos de que hay un mando disponible e imprimimos el tipo en caso afirmativo:

error = ps2x.config_gamepad(34,24,32,22, true, true);


if(error == 0)
Serial.println("Controlador encontrado y configurado");
type = ps2x.readType();
if ( type == 1)
Serial.println("Hallado controlador DualShock.");

Después de esto, si hemos detectado correctamente el mando ya podemos pasar a controlar los botones que se pulsan, Pero antes tenemos que
salir si no hemos detectado el mando:

String S, Sentido = "" ;


if(error == 1) return; //Salir si no encontramos mando

Vamos a hacer un pequeño programa que detecte los botones de la mano izquierda: UP, DOWN, LEFT, RIGTH.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
while(true)
{ ps2x.read_gamepad(); //Leemos el mando

if(ps2x.Button(PSB_PAD_UP)) //Es TRUE mientras se pulsa el boton


Serial.println("UP");
else if(ps2x.Button(PSB_PAD_DOWN))
Serial.println("DOWN");
else if(ps2x.Button(PSB_PAD_RIGHT))
Serial.println("RIGHT");
else if(ps2x.Button(PSB_PAD_LEFT))
Serial.println("LEFT");
else
Serial.println("STOP");
}

Si volcáis este programa Prog_96_1 a vuestro Arduino, veréis que detecta con un mensaje en la consola el botón que pulsáis. Naturalmente la librería
provee variables para todos los botones disponibles en el mando mediante la función ps2x.Button().

BOTONES DE LA IZQUIERDA

BOTON UP DOWN RGHT LEFT

FLAG PSB_PAD_UP PSB_PAD_DOWN PSB_PAD_RIGHT PSB_PAD_LEFT

BOTONES DE LA DERECHA

BOTON Circle Red Cross Blue Square Pink Green Triangle

FLAG PSB_RED PSB_BLUE PSB_PINK PSB_GREEN

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Más los botones centrales, de SELCT ( PSB_SELECT) y Start (PSB_START) . Para los botones traseros tenemos:

BOTONES TRASEROS

BOTON L1 L2 R1 R2

FLAG PSB_L1 PSB_L2 PSB_R1 PSB_R2

Los botones de la izquierda, tienen además, la curiosidad de que detectan de modo analógico la presión que ejerces en ellos con valores entre 0 y
255, mediante el comando

ps2x.Analog( Flag )

Donde Flag representa cualquiera de los valores indicados en la primera table. Por ejemplo para imprimir la intensidad con que s epulsa el botón UP,
bastaría con hacer:

Serial.println(ps2x.Analog(PSAB_PAD_UP), DEC);

LEYENDO LOS JOYSTICKS DEL MANDO

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Por ultimo para detectar el movimiento de los dos joysticks incluidos en el mando, tenemos que entender que al ser analógicos tenemos que leer de
cada uno, dos valores, X e Y, tal y como hacíamos en una sesión previa Joystick y Servo .

Como el mando nos devuelve un valor entre 0 y 255, cuando el joystick esta en reposo en la posición central, la lectura que nos da es de 127 tanto
en X como en Y. Espero que el siguiente gráfico os resulte sencillo:

Para leer los joysticks tenemos que leer independientemente la posición en X e Y de cada uno de ellos

JOYSTICK IZQUIERDO JOYSTICK DERECHO

EJE X Y X Y

FLAG PSS_LX PSS_LY PSS_RX PSS_RY

Para leer los valores de los joysticks podemos usar el siguiente trozo de código:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Serial.print("Stick Values:");
Serial.print(ps2x.Analog(PSS_LY), DEC);
Serial.print(",");
Serial.print(ps2x.Analog(PSS_LX), DEC);
Serial.print(",");
Serial.print(ps2x.Analog(PSS_RY), DEC);
Serial.print(",");
Serial.println(ps2x.Analog(PSS_RX), DEC);

Ahora te puede parecer muy complicado pero es una tontería ( En serio), simplemente el mando tiene tantos botones que hay que usar un montón de
flags para definir cada uno, pero siempre es lo mismo.

La librería viene con un ejemplo magnifico de uso, pero tiene el inconveniente de que muestra todas las posibilidades a la vez y puede ser un poco
avasallador, pero si vais a usar este mando desde luego os recomiendo que la echéis una ojeada.

 El ejemplo es muy claro y auto expiclativa pero usa poco menos que todos los botones y comprueba
ademas si tu mando es un DUal SHock controller tipico o si por el contrarion esla guitarra del Guitar Hero,
lo que abre un monton de posibilidades con una guitarra de esas y aplicaciones musicales en Arduino.

Para aquellos que hayáis hecho el montaje como el de este ejemplo, os pongo el ejemplo corregido para que os funcione a la primera, en la que
simplemente he adaptado el ejemplo incluido a nuestros pines. Prog_96_2.

MOVIENDO NUESTRO ROBOT CON EL MANDO DE LA PS2

Solo nos queda ya montar un programa completo que incorpore el control de los motores y la dirección del movimiento respondiendo a las
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
pulsaciones del mando a distancia.

Vamos a empezar usando los 4 botones de la izquierda como controles simples de dirección. Para ello tenemos que incluir un par de librerías. Una
para el control de la controladora de motores y otra para el manejo del mando de la PS2: Prog_96_3

#include <AFMotor.h>
#include <PS2X_lib.h> //for v1.6
PS2X ps2x; // Creamos la clase del mando PS2

AF_DCMotor Motor1(1); // Instanciamos los motores


AF_DCMotor Motor2(2);
AF_DCMotor Motor3(3);
AF_DCMotor Motor4(4);

Y definimos algunas variables que usaremos luego

int error = 0; // Para reconocer el mando


byte type = 0; // Tipo del mando. Volveremos sobre ello
int Vel = 180 ; // Define la velocidad base del Rover

En el setup, definimos los pines que alimenten el mando de la PS2

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void setup()
{ Serial.begin(57600);
pinMode(28, OUTPUT) ; pinMode(30, OUTPUT);
digitalWrite(28, LOW); // Ground para el receptor
digitalWrite(30, HIGH); // 5V para el receptor
delay(500);

// GamePad(clock, command, attention, data, Pressures?, Rumble?)


error = ps2x.config_gamepad(34,24,32,22, true, true);
if(error == 0)
Serial.println("Controlador encontrado y configurado");
type = ps2x.readType();
if ( type == 1)
Serial.println("Hallado controlador DualShock.");
}

Fijaros en la línea

error = ps2x.config_gamepad(34,24,32,22, true, true);

Aquí es donde inicializamos el controlador de la PS2 con los pines que usamos y nos aseguramos de que no haya error, para indicar que ha
encontrado un mando compatible. Y por último leemos el tipo de mando que ha encontrado, que puede ser de varios tipos, Tipo DualShock = 1 o
tipo Guitar Hero = 2.

Por último el loop es una variante del programa Prog_76_1, al que añadimos el control de los movimientos del robot que ya vimos en las sesiones
previas.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void loop()
{
if(error == 1) return; //Salir si no encontramos mando
While(true)
{ ps2x.read_gamepad(); //Leemos el mando
if(ps2x.Button(PSB_PAD_UP)) //Es TRUE mientras se pulsa el boton
{ Serial.println("UP"); Avance(); }
else if(ps2x.Button(PSB_PAD_DOWN))
{ Serial.println("DOWN"); Retroceso(); }
else if(ps2x.Button(PSB_PAD_RIGHT))
{ Serial.println("RIGHT"); giroDerecha();}
else if(ps2x.Button(PSB_PAD_LEFT))
{ Serial.println("LEFT"); giroIzquierda() ; }
else
{ Serial.println("STOP"); Paro() ; }
delay(500); // Para que no saque mensajes continuamente
}
}

Aquí os dejo el programa completo Prog_96_3. Y un video con el resultado del robot montado y completo

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


RESUMEN DE LA SESIÓN

  Presentamos un mando tipo PS2 para gobernar remotamente nuestros proyectos

 Os presentamos las librerías PSX para el control de los mandos de Sony DualShock y Guitar Hero.

 Vimos el modo de vincular estos mandos a nuestros proyectos y la forma de reconocer por programa las
pulsaciones realizadas.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Anterior Siguiente

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

CONTROLANDO UN ROVER 4×4 POR BLUETOOTH


Home 
 Controlando Un Rover 4×4 Por Bluetooth

OBJETIVOS

  Seguimos jugando con los motores de corriente continua y la controladora Motor Shield V1 de Adafruit.

 Controlaremos el Rover desde nuestro smartphone o tablet por bluetooth

 Programaremos los movimientos básicos de robot.

 Mostraremos una aplicación Android para poder controlar el Rover mediante bluetooth

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


+
Out of
13.30€ 9.00€ Stock

+ IVA IVA

ARDUINO
MEGA MOTOR SHIELD
V1
 Añadir al
carrito Leer más

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Out of
3.50€ +
60.00€ Stock
IVA
50.00€

+ IVA

ROBOT LEVEL
ROVER 4×4 CONVERTER
3.3V 5V
Leer más
 Añadir al
carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


6.80€ +
IVA

MODULO
BLUETOOTH
HC-05
 Añadir al
carrito

INTRODUCCION

Hemos dedicado varios tutoriales al Rover 4×4 ya en nuestra página, en concreto los tutoriales:

 Un pequeño robot con tracción 4×4.

 Dirigiendo un robot 4×4.

 Un robot 4×4 autónomo.


PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
 Controlando el Rover con un mando PS2.

Y ya que nos pasamos todo el día enganchados al móvil y que cada vez la tendencia es usarlo para todo, creemos que faltaba un tutorial con el que
pudiéramos manejarlo directamente con nuestro smartphone o nuestra tablet.

En las sesiones previas hemos visto los conceptos básicos de los motores CC y cómo usar una controladora tipo Motor Shield, para gobernar varios
motores simultáneamente, también hemos hablado de cómo gobernar el giro con tracción independiente a las cuatro ruedas controlando de forma
diferencial la velocidad de giro de las ruedas.

Toda la teoría está ya en los tutoriales previos, así que si no los habéis visto aún o se os ha olvidado un poco podéis repasarlos y refrescar
conceptos.

Lo único que añadiremos es un pequeño módulo bluetooth, en este caso el HC-05, un conversor de voltaje de 5V a 3.3V para el módulo y un
powerbank, como el que usamos para cargar el móvil, con el que alimentaremos nuestro Arduino Mega.

Vamos con el diagrama de conexión

DIAGRAMA DE CONEXIÓN

La conexión del circuito es realmente simple, sólo tenemos que pinchar el Motor Shield v1 al Arduino Mega (fijaos en que el pin 0 del Motor Shield
coincida con el RX0 del Arduino Mega y que el A5 del Motor Shield coincida con el A5 del Arduino Mega), los cables para la transmisión y recepción
de datos, RX y TX, y la alimentación del módulo bluetooth.

El esquema Fritzing del Motor Shield es diferente del que vamos a utilizar, pero lamentándolo mucho no está disponible así que usamos este otro
porque ocupa los mismos pines aunque la disposición de los componentes en el shield sea algo diferente. Luego explicaremos como realizar las
conexiones basándonos en una fotografía.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


En el Arduino Mega vamos a utilizar el puerto Serie número 1 para la transmisión y recepción de datos con el módulo bluetooth, es decir, los pines
RX1 y TX1. Como siempre hay que recordar que el cable RX del módulo bluetooth va con el TX del Arduino y viceversa.

Como pasa en muchos módulos vamos a usar un conversor de voltaje para alimentar el bluetooth con 3.3 V en lugar de los 5V que da la salida de
los pines de Arduino. En nuestro caso es un YP-6, pero hay un montón de ellos disponibles. Conectamos los cables del Arduino a los pines Vin y
GND del conversor y los Vout y GND a nuestro módulo bluetooth.

En cuanto a la conexión de los motores hay que tener en cuenta que están numerados del M1 al M4, girando en el sentido contrario a las agujas del
reloj, siendo el M1 y el M2 los motores de las ruedas delanteras y M3 y M4 los de las ruedas traseras. Siguiendo el código de colores el rojo es para
el positivo y el negro para el negativo, GND. Como usamos 6 pilas AA de 1,5 V estaremos alimentando los motores con 9V en total y el Motor Shield
se encargará de repartir la alimentación individualmente a cada motor.

Hay que fijarse en el cuadrado amarillo de la derecha en el que están serigrafiadas las letras PWR, Power o potencia, es muy importante. En el
cuadrado podemos observar un par de pines que pueden ser unidos mediante un jumper. Si el jumper estuviera uniendo los dos pines significaría que
estaríamos usando la misma alimentación de los motores para alimentar también a nuestro Arduino Mega, lo cual es una mala idea porque le
estamos proporcionando 9V cuando nuestro Arduino sólo necesita 5V. Aparte de posibles comportamientos erráticos podríamos correr el riesgo de
freír a nuestro Arduino Mega por lo que dejaremos los pines al aire, indicando que usaremos alimentación independiente a través del puerto USB del

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Arduino con el powerbank para hacer funcionar la placa.

En el cuadrado amarillo de la izquierda vemos también serigrafiadas las letras EXT_PWR ( External Power , alimentación externa) y +M (Alimentación
positiva de los motores), GND. En este conector es donde deberemos conectar los cables de alimentación de nuestro portapilas.

Sólo nos queda conectar el powerbank mediante un cable USB A-B, como el de las impresoras, a nuestro Arduino para poder alimentarlo. Es una
solución bastante económica, versátil, fácil de recargar y que no pesa demasiado para poder ser usado en proyectos en los que queramos mover
nuestros Arduinos sin tener que usar baterías más pesadas, de ácido y plomo, por ejemplo.

¡Voilá! Ya tenemos listo nuestro Rover bluetooth para cargar nuestro programa.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


EL PROGRAMA DE CONTROL

Lo primero es descargar la librería adafruit-Adafruit-Motor-Shield-library-8119eec y que la instaléis siguiendo el procedimiento habitual .

Como vamos a utilizar el Motor Shield, lo primero que debemos hacer es importar la librería que nos permita utilizarlo:

#include <AFMotor.h>

Ahora lo siguiente es definir cada uno de los motores que queremos controlar:

AF_DCMotor Motor1(1); // Delante Derecha


AF_DCMotor Motor2(2); // Delante Izquierda
AF_DCMotor Motor3(3); // Detrás Izquierda
AF_DCMotor Motor4(4); // Detrás Derecha

Acto seguido definimos la velocidad y la proporción de giro que usaremos para gobernar los motores:

int Vel = 180 ; // Define la velocidad base del Rover


float P = 0.25 ; // Proporcion de giro

Vamos ahora con la función setup(), en la que definimos el pin 49 del Arduino Mega como salida (con el que alimentaremos nuestro módulo
bluetooth HC-05) para después activarlo. Lo único que queda es activar la comunicación serie del puerto 1 del Arduino Mega estableciendo una
velocidad de 38400 bps, que es la velocidad por defecto en los módulos bluetooth.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void setup()
{
pinMode(49, OUTPUT); // A través de este pin alimentamos al módulo bluetooth
digitalWrite(49, HIGH);
Serial1.begin(38400); // Velocidad por defecto en los módulos HC-05
}

Dentro de la función loop(), lo que hacemos es comprobar si existen datos disponibles a través del puerto serie 1 utilizando la función available(),
Serial1.available(). Si existe algún dato disponible definimos una variable de tipo char que almacene su valor y después analizamos la cadena usando
la función analizarCadena(c).

void loop()
{
if (Serial1.available()){
char c;
c = Serial1.read();
analizarCadena(c);
}
}

Aquí empieza la parte interesante, la función analizarCadena(). Esta función recibe como entrada el dato que el Arduino Mega recibe del módulo
bluetooth, char c, es decir, un dato de tipo caracter. Lo que debemos hacer es analizarlo para saber qué órdenes debemos mandar a los motores.

Usamos una triquiñuela para pasar de un tipo char a un tipo string, definiendo una cadena vacía, String s=””, y después concatenándola con el
caracter recibido para formar una cadena con el dato que hemos recibido a través del bluetooth. Este ejemplo es muy sencillo y no haría falta, pero
dependiendo de la cadena que recibáis podría venir muy bien poder usar las funciones disponibles para el manejo de cadenas.

En nuestro caso hemos usado una app gratuita que se llama Bluetooth Electronics y que además permite modificar el panel de control para
controlar el módulo bluetooth. Tampoco sería necesario en nuestro caso ya que lo único que vamos a usar es lo que en el programa llama pad para
manejar el Rover en 9 direcciones, pero puede ser interesante para futuros proyectos.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Si usáis otro programa para manejar el Rover debéis averiguar qué es lo que manda el programa al Arduino a través del módulo bluetooth para poder
mandar las órdenes a los motores.

La modificación que habría que realizar para ver qué es lo que manda es mínima. Habría que incluir estas instrucciones dentro de la función setup()
para inicializar el puerto serie y ver la salida en el monitor de la consola serie:

Serial.begin(9600);
Serial.println("A la espera de ordenes");
Serial.println("----------------------");
Serial.println("");

Y después dentro de la función loop() añadir una instrucción para ver qué es lo que recibimos, la instrucción Serial.write(c):

void loop()
{
if (Serial1.available()){
char c;
c = Serial1.read();
Serial.write(c);
analizarCadena(c);
}
}

De esta manera ya sabríamos que es lo que manda la aplicación cada vez que pulsamos una tecla y podemos programar la respuesta desde el
programa de Arduino.

En este caso el programa manda los siguientes datos:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


En realidad mientras mantenemos pulsadas las teclas del mando manda un número del 1 al 8 y cuando lo soltamos manda un cero. Cuando
detectemos que se ha mandado un cero lo usaremos para mandar al Rover la orden de frenar, ya que no habrá ninguna tecla pulsada en ese
momento.

Lo bueno de este programa es que se pueden editar los valores que queremos que mande cuando pulsemos las teclas. Lo veremos más adelante
cuando echemos un vistazo a cómo funciona el programa.

Utilizamos un bucle if múltiple con las diferentes opciones y analizamos la cadena usando la función startsWith(), es decir, empieza por. Según el
valor que obtengamos le damos las órdenes correspondientes al Rover.

void analizarCadena(char c){


String s="";
s += c;
if(s.startsWith("1")){
// Adelante
Avance(); PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Avance();
}
else if(s.startsWith("5")){
// Adelante a la Derecha
Avance();
giroDerecha();
}
else if(s.startsWith("2")){
// Derecha
giroDerecha();
}
else if(s.startsWith("6")){
// Abajo a la Derecha
RetrocesoIzquierda();
}
else if(s.startsWith("3")){
// Abajo
Retroceso();
}
else if(s.startsWith("7")){
// Abajo a la Izquierda
RetrocesoDerecha();
}
else if(s.startsWith("4")){
// Izquierda

giroIzquierda();
}
else if(s.startsWith("8")){
// Adelante a la Izquierda
Avance();
giroIzquierda();
}
else if(s.startsWith("0")){
// Frena
Paro();
}
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
}

Lo único que queda ya es introducir las funciones que gobiernan el avance, retroceso, giro, freno o control de velocidad de los motores.

void SetVel(int v1, int v2, int v3, int v4)


{
Motor1.setSpeed(v1);
Motor2.setSpeed(v2);
Motor3.setSpeed(v3);
Motor4.setSpeed(v4);
}

void Avance()
{
SetVel(Vel,Vel,Vel,Vel);
Motor1.run(FORWARD) ;
Motor2.run(FORWARD);
Motor3.run(FORWARD);
Motor4.run(FORWARD);
}

void Retroceso()
{
SetVel(Vel,Vel,Vel,Vel);
Motor1.run(BACKWARD) ;
Motor2.run(BACKWARD);
Motor3.run(BACKWARD);
Motor4.run(BACKWARD);
}

void Paro()
{
Motor1.run(RELEASE);
Motor2.run(RELEASE);
Motor3.run(RELEASE);
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Motor3.run(RELEASE);
Motor4.run(RELEASE);
}

void giroIzquierda()
{
int v = Vel * P ;
SetVel( v, Vel, v, Vel) ;
Motor1.run(FORWARD) ;
Motor2.run(FORWARD);
Motor3.run(FORWARD);
Motor4.run(FORWARD);
}

void giroDerecha()
{
int v = Vel * P ;
SetVel( Vel, v, Vel, v) ;
Motor1.run(FORWARD) ;
Motor2.run(FORWARD);
Motor3.run(FORWARD);
Motor4.run(FORWARD);
}

void RetrocesoDerecha()
{
int v = Vel * P ;
SetVel( v, Vel, v, Vel) ;
Motor1.run(BACKWARD) ;
Motor2.run(BACKWARD);
Motor3.run(BACKWARD);
Motor4.run(BACKWARD);
}

void RetrocesoIzquierda()
{
int v = Vel * P ;
SetVel( Vel, v, Vel, v) ;
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
SetVel( Vel, v, Vel, v) ;
Motor1.run(BACKWARD) ;
Motor2.run(BACKWARD);
Motor3.run(BACKWARD);
Motor4.run(BACKWARD);
}

LA APP BLUETOOTH

Hemos estado probando distintas aplicaciones y esta es bastante sencilla de utilizar, aunque el panel de control nos va a quedar un poco viudo…
sólo un pad con las nueve direcciones. Pero dicen que la belleza reside en la simplicidad así que vamos allá con la aplicación.

Lo primero que debemos hacer es conectarnos a Google Play y buscar Bluetooth Electronics.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Una vez que la hayamos descargado e instalado, abriremos la aplicación. Tendremos que tener el bluetooth del teléfono o tablet activado, sino una
ventana nos avisará de que una aplicación está intentado activarlo, le diremos “Permitir” y veremos la siguiente pantalla:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Si pulsamos el botón Discover, descubrir dispositivos bluetooth al alcance, veremos una pantalla muy similar a esta. Aquí se ven los dispositivos que
han estado emparejados con nuestra tablet o móvil a la derecha, debajo de Paired Devices , y a la izquierda los que ha descubierto ahora, debajo de
Discovered Devices .

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


En la lista de dispositivos descubiertos aparecerá el nombre o nombres de los dispositivos descubiertos y su dirección MAC. En la imagen ya
estamos conectados al dispositivo, pero si no pulsaríamos en el botón Connect, conectar, y la aplicación se conectaría al dispositivo. En la parte
superior aparecerá de nuevo el nombre del dispositivo al que estamos conectados y su dirección MAC. Pulsaremos en el botón Done, hecho, y

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


avanzaremos a la siguiente pantalla.

En la siguiente pantalla tenemos una serie de paneles con los que poder trastear. Algunos vienen ya predefinidos, pero a través del botón Edit,
editar, podremos modificarlos a nuestro antojo.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Nos moveremos hasta el panel número 9, que es un panel vacío y le daremos al botón Edit para poder insertar nuestro control pad. Dentro de esta
nueva ventana nos encontramos con una lista de controles en la parte de la derecha debajo del nombre del panel que estamos editando.

Nos moveremos hasta la opción Pads y seleccionaremos el segundo por la izquierda. Usando el dedo seleccionamos el control, lo arrastramos y lo
soltamos dentro de la zona de despliegue del panel. Hay mucho sitio y no vamos a usar ningún otro, así que podéis ponerlo donde queráis, aunque
convendría centrarlo un poco.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Observad una cosa, si seleccionamos el pad vemos que abajo a la derecha aparecen unos valores para arriba, abajo, izquierda y derecha y también un
botón que pone Edit. Estos son los valores que el programa manda al Arduino según qué tecla pulsemos, pero si recordáis, dijimos que podían
cambiarse y poner los que quisiéramos. Si pulsamos el botón Edit nos aparecerá la siguiente ventana:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Aquí están todos los valores que manda dentro de la sección “Direction strings to send” , o sea, cadenas de dirección para mandar según cada una
de las direcciones que pulsemos.

La cadena de freno es la que llama “Release String”, es decir, el valor que manda cuando dejamos de pulsar una tecla.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Después tenemos dos opciones:

 Mandar solamente la cadena cuando cambie la tecla pulsada, “Send on change”

 Mandar continuamente la cadena mientras tengamos la tecla pulsada, “Send Continuously while pressed”. Si seleccionáramos esta opción
también podríamos definir cada cuantos milisegundos queremos que se mande la cadena, dentro de la casilla “Repeat every (ms)”.

Nosotros dejaremos seleccionada la opción que viene por defecto, “Send on Change”, para que sólo mande la cadena cada vez que cambie la tecla
que esté pulsada.

Como algo opcional, podríamos añadir a la cadena algún caracter de inicialización o finalización dentro de las casillas “Start with” o “End with”,
respectivamente, aunque no lo vemos necesario.

Pulsaríamos el botón OK y saldríamos guardando los cambios.

Ya sólo tenemos que darle al botón regresar para volver a la pantalla anterior pero esta vez, seleccionaremos el panel 9 y pulsaremos el botón Run,
ejecutar.

Ahora viene la mejor parte, ya podemos utilizar el mando y empezar a juguetear con nuestro Rover, al menos hasta que se acaben las pilas.

Iremos haciendo más cosas con el Rover pero no está mal para ir abriendo boca.

Nota:

Esta es la versión 2.0 del programa que soporta la opción de un control deslizante para modificar la velocidad: bt_rover_v2

RESUMEN DE LA SESIÓN

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


  Seguimos usando la controladora de Adafruit MotorShield

 Hemos visto cómo manejar nuestro Rover mediante bluetooth a través de nuestro móvil o tablet.

 Hemos aprendido cómo usar una aplicación Android para controlar el Rover desde nuestro móvil o tablet
mediante bluetooth.

 Hemos aprendido un nuevo uso para el powerbank de nuestro móvil, alimentar a nuestro Arduino.

Anterior Siguiente

(27) Comments

Ave01 27 Ago 2017


Excelente tutorial, como siempre. Sólo dos comentarios: la versión 2.0 del programa que se incluye no compila, por un
par de errores: falta una “{” antes de la línea “void SetVel(int v1, int v2, int v3, int v4)” (cerrando la función
Reply analizarCadena); y sobra una “{” al final del programa. Aunque no tiene importancia, los comentarios iniciales sobran, y
no se corresponden con el funcionamiento del programa.

En mi caso tuve problemas al alimentar el módulo Bluetooth HC-05 desde el pin 49: enlazaba, pero no recibía los
comandos. Se solucionó conectando el módulo a los 5V que proporciona la MEGA en los pines de la esquina que están
entre el Pin 21 y el Pin 22. No necesité usar ningún divisor de tensión o conversor de voltaje con mi módulo. Tras esto
se puede eliminar las líneas:
pinMode(49, OUTPUT); // this pin will pull the HC-05 pin 9 (key pin) HIGH to switch module to AT mode

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


digitalWrite(49, HIGH);

Gracias de nuevo por los tutoriales.

RAM1968 15 Ago 2017


Hola, excelente tutorial mi duda es que al momento de compilar me da el error:
Arduino:1.8.3 (Windows 7), Tarjeta:”ESP32 Dev Module, QIO, 80MHz, 115200, None”
Reply

Ivan 19 Ago 2017


Hola, tiene pinta de que tienes mal seleccioanda la placa en el IDE.

Reply

Danilo 03 Jul 2017


Hola, estoy haciendo un vehiculo de 2 ruedas en arduino uno. No tengo Motor Shield, les queria preguntar si hay alguna
manera de configurar y declarar en arduino los motores
Reply

Ivan 03 Jul 2017


Hola Danilo, el problema es que Arduino por si solo puede no tener potencia suficiente para mover el coche aunque
uses el pin de 5v y transistores. Además para poder invertir el sentido de giro vas a necesitar montar un H-Bridge.
Reply

Bryan 30 Abr 2017


¿por que me sale: “avance was not declarated in this scope”??

Reply

Ivan 01 May 2017


hola Bryan, seguramente no has incluido la función void avance(); en tu programa. Un saludo.

Reply
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Pável 02 Abr 2017
Hola, por alguna razón al subir el programa, marca error con el siguiente mensaje, “analizarCadena” was not declared in
this scope; por lo tanto cúal es la solución?
Reply

Ivan 04 Abr 2017


¿Has incluido la función en el programa?

Reply

leonnnc 27 Mar 2017


hola quisera sabe si algune me puede ayudar bueno tengo estos dispocitivos arduino uno, Un Motor Shield V1, Un chasis
robot con 4 motores, y un nfr24L01 necesito saber como conectar para que con joystick shiel con un nfr24L01 se pueda
Reply comunicar asi tener la conexion gracias de anteamos sus apoyo

admin 28 Mar 2017


Hola Leon,

Reply Puedes encontrar toda la operativa del robot sin problems en nuestros tutoriales y la unica parate un poco distinta es
lo referente al NRF24L01. Pero es bastante pareceido a los ejemplos que hemos hecho en la pagina con este modulo,
ya que el joystic shield simplemente te brinda una plataforma comoda para montar el modulo RF y puedes seguir los
pasos del tutorial de nuestra web

Darius Beltran 15 Nov 2016


Hola
quiero usar el bluetooth HC-06 pero no se como pasarlo en el sketch.
Reply Me pueden decir como lo añado al sketch porfavor.

Ivan 16 Nov 2016


Hola Darius, el sketch ya incluye la utilización del bluetooth utilizando el puerto serie serial1 del arduino mega. No sé
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
muy bien a que te refieres con tu consulta. Saludos!

Reply

William 18 Sep 2016


No pude conseguir el arduino mega, como puedo hacer para utilizar el bluetooth, hay alguna manera de utilizar los pines
analogicos, o utiizar los pines Tx y Rx??
Reply

Ivan 19 Sep 2016


Hola William, puedes usar la librería SoftwareSerial para comunicar con el bluetooth. Lo que pasa es que el shield que
usamos se reserva todos los pines que podrías usar con la librería, ya que sólo te quedan libres el 2 y el 13, y el 13 no
Reply es compatible con la librería SoftwareSerial. Por eso es necesario utilizar el Arduino Mega.

De todas formas tienes un grupo de sesiones dedicadas por completo el bluetooth. Te dejo el enlace:
https://www.prometec.net/indice-bluetooth/

Un saludote!

Yuri Sullcaccori Huaman 16 Sep 2016


Buen dia, disculpe como puedo variar esta parte de codigo “int Vel = 180 ; // Define la velocidad base del Rover” visto
que es la variable que regula la velocidad del motor.. variarlo desde 100 a 255 por una app usando un slider..
Reply

admin 20 Sep 2016


Hola Yuri, la forma mas sencilla que se me ocurre es leer el slider y modificar el valor de vel en funcion del valor leido

Reply

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Joseba Gonzalez 21 Sep 2016
Hola Yuri, verás que he incluido la versión V2 del programa en un enlace antes del resumen, que incluye un control
deslizante para regular la velocidad del Rover.
Reply
Sólo tienes que añadir un control deslizante en el panel que estés editando, definir su rango entre 0 y 255, después
añadir la letra “S” al campo “Starts With” y la “E” al campo “Ends With”. De esta manera definimos los caracteres de
inicio y de fin de cadena para el mensaje que manda el control deslizante al programa de Arduino.

Con eso ya tendría que funcionar el Rover con control de velocidad.

Si tienes alguna duda sobre cómo funciona la nueva función analizarCadena() sólo tienes que decirlo.

Aquí va el nuevo código, para que le echéis un ojo:

void loop()
{
analizarCadena();
// Keep reading from Arduino Serial Monitor and send to HC-05
if (Serial.available())
Serial1.write(Serial.read());
}

void analizarCadena(){
if (Serial1.available()){
char c;
String s="";
c = Serial1.read();
s += c;
if(s.startsWith("S")){
// Modificamos la velocidad
long velocidad;
velocidad = Serial1.parseInt();
Vel = (int) velocidad;
return;
}
else if (s.toInt()>0 && s.toInt()<9){
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
int m = s.toInt();
switch(m){
case 1:
Serial.println("Arriba");
Avance();
break;
case 5:
Serial.println("Arriba a la Derecha");
Avance();
giroDerecha();
break;
case 2:
Serial.println("Derecha");
giroDerecha();
break;
case 6:
Serial.println("Abajo a la Derecha");
RetrocesoIzquierda();
break;
case 3:
Serial.println("Abajo");
Retroceso();
break;
case 7:
Serial.println("Abajo a la Izquierda");
RetrocesoDerecha();
break;
case 4:
Serial.println("Izquierda");
giroIzquierda();
break;
case 8:
Serial.println("Arriba a la Izquierda");
Avance();
giroIzquierda();
break;
case 0:
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
case 0:
Serial.println("Echa el freno");
Paro();
break;
}
}
}

Un saludo

Martín Smith 01 Ago 2016


Porque usar el conversor si arduino tiene una salida de 3.3v?

Reply

Joseba Gonzalez 01 Ago 2016


Hola Martin:
El Motor Shield tapa la salida de 3.3V del Arduino Mega por lo que no puedes usarla. Algunos adaptadores funcionan
Reply con doble voltaje: de 5V y de 3.3V, así que si tienes una entrada de 5V puedes usarla directamente, sin el conversor
de voltaje. También se puede usar la salida de 5V que tiene el Motor Shield en lugar de usar el pin 49 como fuente de
voltaje.

Un saludo

gusito 26 Jul 2016


ya esta, lo solucione….muchas gracias

Reply

Ivan 26 Jul 2016


Estupendo!

Reply

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


gusito 26 Jul 2016
Gracias Ivan, tengo otra pregunta, estoy utilizando el arduino mega y el modulo bluetooth HC06, los txd y rxd, son los
mismos el GND también pero el VSS no es lo mismo, donde lo conecto??
Reply

gusito 23 Jul 2016


Hola Ivan, estoy teniendo problemas a la hora de compilar, me lanza error con Serial1 , me dice que no esta
declarado…..le he puesto bien la librería y se ven de color naranja las letras, no se que estoy haciendo mal…..podrías
Reply ayudarme?
gracias

Ivan 23 Jul 2016


Hola! Has comprobado que como placa tengas seleccionada la Arduino Mega en el IDE? Porque el error puede venir si
tienes seleccionado por ejemplo el Arduino Uno.
Reply
Un saludote!

Guillermo 19 Jul 2016


¿Por qué se necesita el conversor de corriente? ¿si no se usara se estropearía el módulo bluetooth? y si se usa
Powerbank para alimentar la placa, ¿entonces para que se necesita el portapilas?
Reply

Ivan 20 Jul 2016


Hola Guillermo, el conversor lo usamos para bajar el voltaje y adaptarlo al módulo. Si no podría romperse y si no lo
hiciera disiparía la energía sobrante en forma de calor, lo cual es muy poco eficiente. Con el conversor nos quitamos
Reply ese problema.

El Powerbank lo usamos para alimentar las placas mientras que con el portapilas lo que alimentamos son los motores.
Un saludo.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


GIVE A REPLY

Message

Name (required) Email (required)

URL

Post comment
WordPress
WordPress Anti-Spam
Anti-Spam by
by WP-SpamShield
WP-SpamShield

Copyright Prometec
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

CONOCIENDO LOS SERVOS


Arduino con servo y potenciometro

Home 
 Conociendo Los Servos

OBJETIVOS

  Que es un servo.

 Comprender la diferencia con un motor normal.

 Introducir el concepto de librería en C++.

 La función map().

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


MATERIAL REQUERIDO.

Arduino Uno o similar.

Esta sesión acepta cualquier otro modelo de Arduino .

Una Protoboard más cables.

Una Potenciómetro.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Un Servo con sus horns,

Esas pequeñas piezas de plástico que se ponen en el eje

QUE ES UN SERVO

Normalmente los motores habituales lo que hacen es transformar la energía eléctrica ( O química ) en un giro continuo que podemos usar para
desarrollar trabajo mecánico.

En la sesión 13 utilizamos un pequeño motor de corriente continua y regulamos la velocidad de giro mediante una señal PWM de Arduino.

Los servos son también motores de corriente continua, pero en lugar de diseñarse para obtener un giro continuo que podamos aprovechar ( para
mover una rueda por ejemplo), se diseñan para que se muevan un angulo fijo en respuesta a una señal de control, y se mantengan fijos en esa
posición.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Imaginad por ejemplo un timón de un avión o barco. No queremos un giro continuo, sino un motor al que le pueda indicar el ángulo que deseamos en
grados y que mantenga esa orientación hasta que le demos una orden en contrario.

Estos servos o servomotores son muy frecuentes en Aero modelismo y en robótica, por la capacidad que presentan para moverse a un ángulo
concreto y mantenerse allí. De hecho se suelen diseñar para que giren un ángulo proporcional a una señal PWM, de forma que su control es muy
preciso. Un servo suele estar formado por:

Un servo suele estar formado por:

 Una reductora.Un circuito de control..

 Un motor de CC.

 Un circuito de control

En la práctica se comporta como un bloque funcional que posiciona su


eje en un ángulo preciso en función de la señal de control

Habitualmente los servos tiene un margen de operación, es decir, pueden moverse entre 0º y ángulo dado, que suele ser de 180º, pero existen
modelos comerciales de todas la características imaginables (incluyendo servos de 360º ).

Normalmente estos pequeños servos funcionan sobre 5V y el control se realiza mediante una señal de control PWM, en la que el ancho el pulso
indica el ángulo que deseamos adopte el eje.

Un servo tiene un conector de 3 hilos, 5V ( rojo), GND ( negro o marrón) y el otro Control ( amarillo o blanco) .

Podríamos escribir un pequeño programa en Arduino que controle estos pulsos y los relacione con el ángulo buscado, pero antes de que nadie se
asuste, los servos (y otras cosas) son tan habituales, que ya ha habido gente que han escrito estos programas y los han puesto a nuestra disposición.

De este modo podemos manejar un servo sin preocuparnos para nada de cómo realizar el control de las señales, o de la operación interna, basta con
instalar estos programas en una forma especial llamada librería.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 Una librería es un conjunto de definiciones y funciones escritas en C++ de Arduino, que podemos utilizar en
nuestros programas. Podemos ver el código de estos programas, aunque normalmente se requiere un nivel
medio alto en C++ para comprender su funcionamiento.

La ventaja de trabajar con una plataforma tan bien establecida como Arduino, es que hay cantidad de gente en el mundo desarrollando librerías, casi
para cualquier cosa que podáis imaginar.

Y aún hay algo mejor: Son gratis .

Veréis que en las próximas sesiones vamos a utilizar librerías para cantidad de cosas, pero hoy vamos a comenzar con la primera, la librería servo.

USANDO NUESTRA PRIMERA LIBRERÍA: SERVO

Servo es una librería estándar en Arduino. Eso quiere decir que viene incluida cuando instaláis el IDE, a diferencia de otras librerías que debemos
buscar, descargar de Internet e instalar para poder usarlas.

Para usar una librería estándar, basta con pedirle al IDE que la incluya en nuestro programa. Id al menú Programa \ Importar Librería y os saldrá un
desplegable con todas las librerías que tenéis instaladas en el IDE.

Por ahora solo nos interesa la librería Servo. Pinchad en ella. Arduino incluirá una línea al principio de vuestro programa como esta:

#include <Servo.h>

A partir de ahora ya podemos utilizar las funciones disponibles en la librería.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 Normalmente para usar una librería hay que leer la documentación, en la que se detalla la forma de usarla,
que funciones tenemos disponibles, que parámetros pasarlas…etc.

 Como es vuestra primera librería, y nosotros ya nos hemos leído el manual, vamos a llevaros de la mano.
Veréis que es de lo más fácil.

Vamos a montar un circuito en el que hagamos moverse al servo de forma controlada, e iremos viendo las instrucciones necesarias.

ESQUEMA ELECTRÓNICO DEL CIRCUITO

Vamos a conectar el servo primero a GND y 5V y luego el pin de control, a un pin de Arduino que permita PWM (Recordad esto o de lo contrario os
costara ver el problema). Recordad que es el ancho el pulso lo que controla el ángulo.

Vamos también a conectar un potenciómetro a la puerta A0 para jugar con el servo.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


El diagrama de conexión para la protoboard es igual de sencillo:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


EL PROGRAMA DE CONTROL

Vamos a empezar con una línea que ya conocíamos el include y otra nueva:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


#include <Servo.h>
Servo servo1;

Para poder utilizar la librería debemos crear, lo que se conoce como un objeto tipo Servo que llamamos servo1.

C++ es un lenguaje orientado a objetos, esto significa que podemos definir objetos tipo (como servos) sin más que declarar un nuevo objeto del tipo
que deseamos. En la jerga de la programación se llama crear una instancia, o instanciar un nuevo objeto.

Así, esa segunda línea significa que vamos a crear una nueva instancia de tipo Servo que llamamos servo1.

 Aunque ahora os pueda parecer una forma extraña de hacer las cosas, la programación orientada a objetos
(OOP por sus siglas en inglés), es una de las metodologías más potentes de las ciencias de computación
actuales y todos los lenguajes de programación que se precien, han incorporado las ideas de la OOP.

 Entrar en la teoría del OOP, desborda con mucho las pretensiones de este humilde tutorial de Arduino, por
ahora nos limitaremos a mostraros como usar los objetos.

Una vez creada la instancia del objeto ( y podemos crear tantas como necesitemos, para manejar varios servos a la vez ) tenemos que incluir una línea
en la función setup() para informar a C++ que vamos a conectar ese objeto abstracto que todavía es servo1 a un pin físico del Arduino para
controlarlo. En nuestro caso el pin 9:

servo1.attach(9);

Una vez cumplido el trámite para gobernar la posición del servo recurrimos a

servo1.write( angulo);

Donde Angulo es el valor en grados de la posición que deseamos. Fácil ¿No?

Vamos a escribir un programa que vaya barriendo un Angulo en grados y moviendo el servo a esa posición.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


#include <Servo.h> // Incluir la librería Servo
Servo servo1; // Crear un objeto tipo Servo llamado servo1
int angulo = 0 ;

void setup()
{
servo1.attach(9) ; // Conectar servo1 al pin 9
}

void loop()
{
for(angulo = 0; angulo <= 180; angulo += 1) //incrementa angulo 1 grado
{
servo1.write(angulo);
delay(25);
}
for(angulo = 180; angulo >=0; angulo -=1 ) //decrementa angulo 1 grado
{
servo1.write( angulo );
delay(25);
}
}

Veréis como el servo se va moviendo primero hacia adelante y luego retrocede para volver a empezar.

Vamos ahora a hacer que el valor del potenciómetro represente la posición del servo de manera que el servo se mueva siguiendo al potenciómetro.
Para ello hay que entender que el valor que leamos en la puerta A0 está comprendido entre 0 y 1024, y que estos valores tienen que distribuirse entre
0 y 180º. Así que para calcular el Angulo correspondiente basta con hacer:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Como la experiencia me ha demostrado, que los errores haciendo este tipo proporciones tienden a infinito, voy a aprovechar para presentaros la
función map(), que hace exactamente eso de un modo cómodo, librándonos de los float ( aunque para aprender no os vendría mal hacer así el
programa y luego usar el map()).

angulo = map( analogRead(A0), 0, 1024, 0, 180);

Traducido quiere decir: Haz la proporción de los valores que leas en A0, entre 0 y 1024, en un valor comprendido entre 0 y 180 y asignale ese valor al
ángulo. //Prog_16_2

#include <Servo.h> // Incluir la librería Servo


Servo servo1; // Crear un objeto tipo Servo llamado servo1
int angulo = 0 ;

void setup()
{
servo1.attach(9) ; // Conectar servo1 al pin 9
}

void loop()
{
angulo = map( analogRead(A0), 0, 1024, 0, 180);
servo1.write(angulo);
delay(250);
}

Aqui teneis un peqeño video, mostrando el movimiento del servo

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


RESUMEN DE LA SESIÓN

  Hemos presentado los servos y hemos vista una par de programas sencillos para usarlos.

 Hemos introducido algún concepto básico de programación orientada a objetos para que podáis utilizar
las librerías.

 Hemos definido las librerías como conjuntos de funciones y objetos que podemos utilizar sin
preocuparnos de cómo funcionan internamente.

 Las librerías son un sistema excepcional de utilizar elementos electrónicos sin tener que entrar en los

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


detalles técnicos más o menos complicados. Esto nos abre un potencial enorme de componentes a
nuestra disposición.

 Introdujimos otra función más para nuestro arsenal: map().

Anterior Siguiente

« COMENTARIOS MÁS VIEJOS

(99) Comments

Sergio 26 Dic 2017


Hola buenas, he comprado un servo FS5103R. ¿Puedo alimentar este servo directamente desde un pin de Arduino, o
necesito una fuente de alimentación externa?
Reply Gracias.

Ivan 02 Ene 2018


Hola Sergio, funciona a 5 voltios así que sí deberías.

Reply

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Sergio 04 Ene 2018
¿Pero que pasa con la Intensidad máxima? Es decir, quiero alimentar dos motores como ese, algún que otro
led, etc. porque estoy haciendo un vehículo RC. Mi duda es de que manera puedo alimentar el proyecto sin
Reply quemar el arduino.
Gracias

Ivan 08 Ene 2018


Hola Sergio, yo para este tipo de proyectos suelo inclinarme hacia las baterías LiPo como estas;
https://www.prometec.net/producto/bateria-lipo-74v-1200-ma/
Reply

Diego López 26 Oct 2017


Buenas tardes, estoy empezando en el mundo del arduino siguiendo todos los tuturiales y me gustaria saber qué servo
debo comprar o cual me recomiendan?
Reply

Ivan 27 Oct 2017


Hla Diego, depende de para qué lo quieras usar. Si es sólo para trastear y aprender te puede valer uno como el de la
sesión. Si es para algo más serio habría que mirarlo mejor. Un saludo.
Reply

Alejandro 27 Jul 2017


Buenas, ¿alguien sabe por qué mi servo vibra a partir de los 160 grados aproximadamente? Los primeros 160 grados los
gira perfectamente pero a partir de estos empieza a vibrar. También me gustaría saber por qué el servo funciona si
Reply conectas la tarjeta mediante USB al ordenador y no lo hace si conectas una pila de 9V al conector Jack de la tarjeta. Por
cierto, tengo el mismo servo que el del video final del proyecto, el sg90, muchas gracias.

admin 01 Ago 2017


Alejandro, el SG90 es un servo ecellente para inciarse porque es barato y funciona…. pero no es d elos mejores y
tiene tendencia a estropearse con facilidad y esa vibracion suena a eso.
Reply Si con el usb te funciona el servo esta bien (mas o menos) y si con la pila no, indica que la pila esta gastada

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Alejandro 23 Ago 2017
Muchas gracias por tu ayuda, probaré a cambiarle la pila y no lo usaré a mas de 160 grados, un placer contar
contigo,
Reply Un saludo

Andres 14 Jul 2017


Saludos.

Reply Donde puedo encontrar informacion del consumo electrico del servo, cuando no esta funcionando? Lo quiero usar como
apagador para un rele, y asi reducir el consumo electrico de un sistema de riego que funcione solo con baterias. De
antemano gracias.

Ivan 17 Jul 2017


Por lo que veo por ahí

Reply Consumo sin carga: 220 ±50mA


Consumo con carga: 650 ±80mA

Mario 22 Feb 2017


Hola, ya me compré la servocontroladora https://www.prometec.net/producto/servo-shield-x16/ y estoy intentando
programar 12 servos, pero llega un momento en que ya con 6 servos, se desestabiliza todo y se giran todos a 0º sin que
Reply pueda controlarlos.
Estoy conectando el arduino a través del cable USB y a la Servo-Shieldx16 a 6V de una fuente de alimentación externa,
limitada a 2A (no se si debería poner más, pero no creo que sea ese el problema).
¿Alguno sabe que es lo que me pasa? ¿Me pueden ayudar? Muchas gracias de antemano.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Ivan 22 Feb 2017
Hola MArio, a mí me ocurre eso cuando la alimetnación es insufciente, pero yo estoy manejando 8 con un portapilas
de 4, o sea 6V, a parte del usb a Arduino.
Reply

Mario 23 Feb 2017


Gracias Ivan, es que me resulta extraño porque es una buena fuente de alimentación, debería de funcionar
mejor que con las pilas. ¿Cuando estará listo el tutorial de la Shield x 16? Lo mismo estoy haciendo algo mal.
Reply

Ivan 25 Feb 2017


Hola Mario, pues sí, debería funcionar bien con la fuente. Intentaremos sacar tiempo para subir el
tutorial esta semana o la siguiente. Un saludo.
Reply

Mario 02 Feb 2017


Hola, buenas tardes. Alguno ha utilizado la servocontroladora Pololu Maestro con Arduino para conectar muchos servos?
Yo lo estoy intentado pero no consigo mover todos a la vez, sin que se vuelvan “locos”. Y si no, me recomendáis la
Reply tarjeta https://www.prometec.net/producto/servo-shield-x16/ ? Alguno ha movido con fluidez 12 servos? Un saludo

Ivan 02 Feb 2017


Hola Mario, yo no he utilizado ninguna de las dos, pero ahora estoy trabajando con un proyecto que debería mover 8 a
la vez y seguramente usaré esta segunda tarjeta. En cuanto la pruebe te digo pero en principio deberías de poder
Reply manejar hasta 16 servos de forma independiente.Un saludo.

Mario 10 Feb 2017


Muchas gracias Ivan, si por favor, hazme saber en cuanto pruebes la tarjeta shield-x16 si te funciona bien,
tengo pensamiento de comprarmela en estos días. Saludos!
Reply

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Ivan 10 Feb 2017
Hola Mario, pues ya lo he usado para controlar 8 servos de un robot de cuatro patas y funciona
perfectamente. En cuanto tengamos tiempo le hacemos un tutorial para explicar cómo se usa. Un
Reply saludo.

Mario 10 Feb 2017


Genial! Yo sería controlar 12 y 16, espero que también me sirva. Entonces voy a
comprarmela ahora mismo. El tutorial lo pondréis en el enlace de compra de la tarjeta
imagino, no? Pues estaré atento. Muchas gracias. Saludos

Ivan 13 Feb 2017


Hola Mario, eso es, lo pondremos en el blog y directamente en la ficha del producto.
Un saludo.

GIVE A REPLY

Message

Name (required) Email (required)

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


URL

Post comment
WordPress
WordPress Anti-Spam
Anti-Spam by
by WP-SpamShield
WP-SpamShield

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

CIRCUITO CON JOYSTICK Y SERVO


Manejando joysticks con Arduino

Home 
 Circuito Con Joystick Y Servo

OBJETIVOS

  Presentando un pequeño joystick.

 Leyendo el joystick.

 Moviendo el servo mediante el stick .

 Filtrando las lecturas.

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Arduino Uno o similar.

Esta sesión acepta cualquier otro modelo de Arduino .

Una Protoboard mas cables.

Un Joystick.

Un Servo con sus horns, esas pequeñas piezas de plástico que se ponen en el eje.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


QUE ES UN JOYSTICK

Un joystick suele estar formado por dos potenciómetros a 90º que transforman el movimiento en X e Y del mando en una señal eléctrica proporcional
a su posición y que además suele incluir un botón.

Así pues, suelen tener 5 pines: X, Y, botón y 6V más GND.

En realidad ya usamos todos estos componentes previamente y la única curiosidad del joystick es que resulta un elemento muy cómodo para
posicionar algo, aunque no sea demasiado preciso.

Vamos a montar un circuito con un servo como en la sesión previa y usaremos uno de los ejes del joystick para posicionar un servo, y si pulsamos el
botón encendemos un LED. (Ignoraremos el otro eje Y, aunque podríamos usarlo para posicionar un segundo servo).
El pin correspondiente al botón suele venir marcado como SW de Switch.

Aquí tenemos el diagrama eléctrico:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Y para la protoboard:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


EL PROGRAMA DE CONTROL

Vamos con el programa ( Prog_17_1):

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


#include <Servo.h> // Incluir la librería Servo
Servo servo1; // Crear un objeto tipo Servo llamado servo1
int angulo = 0 ;
int Eje_X = A1 ;
int Eje_Y = A2 ;
int boton = 4 , LED = 12 ;

void setup()
{
servo1.attach(6) ; // Conectar servo1 al pin 6
pinMode( boton, INPUT_PULLUP) ;
}

void loop()
{
angulo = map( analogRead(A1), 0, 1024, 0, 180);
servo1.write(angulo);
if ( ! digitalRead(boton))
digitalWrite(LED, HIGH);
else
digitalWrite(LED, LOW);
delay(250) ;
}

 La parte que corresponde al servo es exactamente lo mismo que en la sesión 16. Por lo demás hemos
incluido unas definiciones al principio indicando que hemos conectado el eje X a la entrada analógica A1 y el
eje Y a la entrada A2.

 El pulsador está conectado al pin digital 4 y el LED al 12, de forma que si queremos cambiar de pines, por la
razón que sea, bastara con actualizar esta lista al principio del programa.

Insistir en que hemos definido la entrada correspondiente al boto del joystick como INPUT_PULLUP y no como INPUT, porque de este modo no
necesitamos incluir una resistencia, sino que Arduino conecta un pullup internamente

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Por eso leeremos LOW al pulsarlo y entre tanto será HIGH, por ese motivo invertimos la condición en el if. Encenderemos el botón solo cuando
pulsemos.

El servo sigue la posicion del joystick y cuando soltamos vuelve al centro.

Pero hay algo de epiléptico en el movimiento del servo (y más con uno barato como éste que estoy usando). Recibe muchas interferencias y el
movimiento es muy convulso, porque, aún si el servo tuviera una cierta precisión (lo que es una suposición entre optimista y muy optimista) los
potenciómetros y los convertidores analógicos a digital siempre tienen un margen de ruido.

Seguro que se nos puede ocurrir una forma de mejorar ese movimiento. Pensadlo, ¿Que podemos hacer para filtrar ese ruido?

No, en serio. Piénsalo primero antes de seguir.

Vale. En el mundo real, las cosas no son nunca blancas o negras, sino más bien en tonos grises (o muy frecuentemente chocolates), por eso no es
buena idea enviar las lecturas directamente al control el servo, o de lo que sea que estamos moviendo.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Hay que filtrar un poco la señal. Sin entrar mucho en este tema (sobre el que hay enciclopedias),vamos a usar una técnica muy básica, pero muy
eficaz en muchas ocasiones y que os conviene conocer.

Vamos a leer el potenciómetro para decidir si subimos o bajamos el valor del Angulo. No para calcular Angulo directamente.

Como el potenciómetro nos da valores entre 0 y 10000, cuando está centrado o suelto, leerá sobre 500, poco más o menos (aunque bailará). Así que
le vamos a dar un margen de tolerancia. Solo aumentaremos el Angulo, un valor dado, si la lectura del potenciómetro sobrepasa el valor de 600 y lo
disminuiremos cuando baje de 400.

De este modo pequeñas oscilaciones alrededor del punto medio, no nos afectarán. Es decir las hemos filtrado. Esto reflejado en el programa, podría
ser algo así: Prog_17_2

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


#include <Servo.h> // Incluir la librería Servo
Servo servo1; // Crear un objeto tipo Servo llamado servo1
int angulo = 90 ; // Empezamos en el centro
int salto = 3 ; // Controla el salto por movimiento
int Eje_X = A1 ;
int Eje_Y = A2 ;

void setup()
{
servo1.attach(6) ; // Conectar servo1 al pin 6
pinMode( boton, INPUT_PULLUP) ;
}

void loop()
{
int p = analogRead(A1);
if ( p < 400 ) // Si la lectura es menor de 400
angulo = angulo - salto ; // disminuimos el angulo
else if (p>600) // Si mayor de 600
angulo = angulo + salto ; // Aumentamos el angulo
servo1.write(angulo); // Y este es el que mueve el servo
delay (50); // Este delay regula la velocidad del movimiento
}

Creo que comprobareis que el movimiento es más fluido y uniforme, y que prácticamente elimina las convulsiones del servo. Además usamos este
método para dejar clavado al servo en la posición que nos interesa (Aunque soltemos el mando), algo que del otro modo sería imposible.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


RESUMEN DE LA SESIÓN

  Hemos visto que un joystick son dos potenciómetros a 90º mas un pulsador, ambos normales y
corrientes.

 Aprovechamos el montaje anterior para mover el servo con el joystick y mapear su valor entre 0 y 180º

 Hemos introducido el concepto de filtrado de señales, que de por si es una rama específica de la
electrónica y la computación, y una, que cada día es mas importante en todos los ámbitos de
la tecnología.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Anterior Siguiente

« COMENTARIOS MÁS VIEJOS

(88) Comments

Nicolas 11 Dic 2017


hola buenos dias, lo que pasa es que necesito hacer un proyecto de un auto teledirigido para la facultad, donde con el
joystick de un control de Playstation3 pueda dirigir la direccion de un Servomotor
Reply

Ivan 13 Dic 2017


Hola Nicolás, es obligatorio que sea con el mando oficial de la play 3?

Reply

Rob 17 Nov 2017


Al principio tuve problemas con los pines del joystick, pero una vez que me percaté de que estaban en otra posición
funcionó todo perfecto
Reply

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Ivan 17 Nov 2017
Estupendo Rob, un saludo.

Reply

Stalyn 06 Nov 2017


hola se podria controlar dos motoreductores con un jostick ?

Reply

Ivan 06 Nov 2017


Supongo que sí, utilizando un eje para cada motor.

Reply

GIVE A REPLY

Message

Name (required) Email (required)

URL PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


URL

Post comment
WordPress
WordPress Anti-Spam
Anti-Spam by
by WP-SpamShield
WP-SpamShield

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

MOTORES PASO A PASO


Conociendo los motores paso a paso.

Home 
 Motores Paso A Paso

OBJETIVOS

 Presentar y comprender los motores paso a paso.

 Ver las carcateristicas que los definen y porque son diferentes delos servos o motores CC normales.

 Conocer los distintos tipos de motores paso a paso.

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Mucha calma y tranquilidad para leer un poco de teoria

MATERIAL REQUERIDO.

En sesiones previas hemos ido jugando con motores de corriente continua y también con motores Servos. Cada uno de ellos tiene su utilidad,
dependiendo de lo que queramos, pero imagínate que queremos mover con una cierta precisión los dos ejes de una impresora de chorro de tinta.

Un servo no será adecuado porque tiende a fijar una posición y quedarse allí y el problema de los motores de corriente continua es que cuando le das
una orden resulta complicado saber cuánto se ha movido exactamente, porque no tenemos en principio ningún mecanismo de realimentación que nos
informe.

Suponte que medimos exactamente la alimentación de 1 segundo a uno de esos motores… ¿Pero cómo saber cuántas revoluciones o fracciones de
revolución ha dado en ese tiempo?

Podemos incluir un sistema de realimentación como un sensor de efecto Hall y un pequeño imán en la rueda, o un disco transparente con múltiples
marcas en el borde, de modo que una foto sensor detecte el número de marcas que han pasado por delante de él.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 Ambos procedimientos son muy frecuentes y existe sensores hechos para esto directamente
disponibles en la industria, y ruedas con ellos incluidos.

.
Pero aun así, tendremos información de que nos hemos pasado o no pero no será fácil corregir la posición. Necesitamos un sistema de controlar con
precisión el movimiento de un motor eléctrico y aquí es donde aparecen los motores pasos a paso o stepper motors.

Un motor paso a paso es parecido a los motores de continua que vimos antes, pero en lugar de montar un sistema de asegurarnos de que siempre
hay una bobina fuera del equilibrio, en un motor paso a paso montamos un sistema de varias bobinas que garantizan que solo se mueve la distancia
(O paso) entre las bobinas contiguas.

Pues menudo asco de motor ¿O sea que solo se mueve un paso? Y entonces ¿Cómo hago para que gire de forma continuada?

Simplemente controlando cuidadosamente la alimentación de los grupos bobinas que fuerzan el movimiento de un paso y la secuencia en la que
alimentamos las bobinas.

De alguna manera hemos convertido en digital el movimiento del motor, ya que controlamos el movimiento que puede hacer,saltando entre
posiciones discretas, dando pulsos a las bobinas contiguas cuando queremos mantener el giro. Veamos un ejemplo con una ilustración sacada de la
Wikipedia:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Recordad que la fuerza que mueve un motor es fácil de sentir cuando tratas de unir los polos
iguales de dos imanes permanentes. Por eso cuando excitamos una de las bobinas de la imagen,
el rotor gira un pequeño paso y queda listo para que excitemos la segunda bobina y luego la
siguiente.

Aquí se puede controlar con precisión el movimiento del motor porque lo diseñamos para eso, y
para que se mueva a medida que nosotros vamos alimentando en secuencia las bobinas
correspondientes y si dejamos de hacerlo, el motor se para fulminantemente y sabemos a ciencia
cierta donde está.

Controlarlos es un poco más difícil que controlar un motor CC normal, porque para moverlo no
basta con dar tension y olvidarnos, si no que hay que secuenciar la excitación de las bobinas en
un orden preciso y en un tiempo preciso (Para poder controlar la velocidad) , pero ¿Y eso que
importa? Nuestros Arduinos son geniales para hacer este tipo de control en modo automático.

A cambio los motores de paso a paso tienen una serie de ventajas:

 Podemos posicionar uno de estos motores con mucha precisión con un sencillo control digital.

 Son ideales para robots y demás, porque se puede sincronizar su movimiento velocidad y aceleración, con
gran facilidad (Y un poco de cálculo)

 Máximo par motor a bajas velocidades. Porque están diseñados para eso, en cambio un motor CC normal
tiene muy poco par a baja revoluciones.

Y como en la vida no hay nada perfecto, también tienen sus inconvenientes:

 Para mantener el motor clavado en una posición hay que mantener excitada al menos una de las bobinas, lo
que nos coloca en la absurda situación de que consume en parado tanto o más que en marcha.

 Normalmente están diseñados para que el par motor sea máximo a baja velocidad y eso hace que a gran
velocidad el par no sea especialmente bueno.

 A diferencia de los servos, los motores paso a paso no tiene un modo de saber dónde está cuando arrancas
por ejemplo, y eso supone que solemos necesitar con ellos algún tipo de fin de carrera para saber dónde
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
está el cero o el tope, aunque luego el posicionamiento es perfecto.

QUE BUSCAR AL COMPRAR UN MOTOR DE PASOS

Si normalmente el mercado ofrece electrónica especializada para cualquier necesidad que se os pueda ocurrir, en el caso de los motores paso a paso
la situación es inabarcable, y hay modelos para miles opciones necesidades y configuraciones.

Por eso vamos a centrarnos en unas pocas características para empezar y ya iremos viendo más adelante como evoluciona la cosa.

Un motor paso a paso se define con los siguientes paramentos:

 Par motor o torque: Es lo que os define la capacidad del motor para mover objetos.
Normalmente se expresa en kilogramos por centímetro. Cuanto mayor más potente el motor.

 Tensión de alimentación del motor, y resistencia de las bobinas. Lo que nos indica la
Intensidad de la corriente que absorbe en carga.

 Pasos por vuelta. Cuanto más, mejor precisión tiene el posicionamiento del motor y se suele
medir como numero de pasos por vuelta o por un Angulo que equivale a 360º de una vuelta
dividido por el número de pasos.

 Y si vais a diseñar un circuito manual es imprescindible conocer la inductancia de las bobinas


(Normalmente en mili Henrios).

Por supuesto, los que venís a por nota, os habréis dado cuenta de que si queremos aumentar la precisión del posicionado, tenemos que aumentar el
número de bobinas que incluye el motor y esto es caro, así que en general se suelen utilizar reductoras mecánicas que mejoran la precisión por poca
tela.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Si tienes un motor de pasos de digamos 4 bobinas, una vuelta completa serian 4 pasos, pero con una reductora de 16:1 se convertiría en un motor de
16 x 4 = 64 pasos para alcanzar la vuelta completa.

Además el par motor aumenta considerablemente, pero a cambio la velocidad disminuye, y por eso en la práctica hay que revisar tanto el par como
la relación de la reductora, dependiendo de tus necesidades.

MOTORES PASO A PASO UNIPOLARES Y BIPOLARES

Lo mismo que con los motores de corriente continua típicos, el problema viene cuando queremos cambiar la dirección de giro (Ya que un motor que
solo avanza no suele ser demasiado útil)

¿Cómo podemos hacer para invertir el sentido de giro de uno de estos motores? Fíjate en la siguiente imagen:

El caso de la izquierda o Motor Bipolar solo tiene un par de espiras ( Normalmente dos pares de espiras conectadas) , lo que requiere invertir la
dirección de la corriente para invertir la dirección de giro, pero esto es algo que no podemos hacer con Arduino sin electrónica externa, es decir un
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
H-Bridge que ya vimos.

El caso de la derecha tiene las espiras partidas y conectadas por la mitad, lo que nos permite gobernar la dirección del motor sin necesidad de un H-
Bridge, simplemente usando la pata central como GND y alimentar uno u otro extremo con diferentes salidas de nuestro Arduino y un par de
transistores. A estos motores se les llama unipolares.

Motor 28BYJ-48 Unipolar


Motor Nema 17 bipolar

Por norma general, la mayoría de motores paso a paso que usaremos con Arduinos serán bipolares y son bastante típicos los Nema 17. Son motores
de 3,2 Kg / cm, o sea con fuerza, y son los que encontraréis por ejemplo en las impresoras 3D típicas, las Reprap. Pero en esta sesión vamos a usar
un motor de pasos mucho más modesto de 5 hilos y 4 fases, y que viene incluido en el kit de inicio

¿Cuantos hilos usa el control de un motor unipolar de paso a paso?

Pues depende. Básicamente depende de como se configuren los devanados y cada forma tiene sus propias ventajas en inconvenientes.

CONFIGURACION COMENTARIOS

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


En el caso de los unipolares, el mercado ofrece soluciones variadas en cuanto al número de
hilos de control que ofrece. Pueden ser 5, si unimos las patas centrales y sacamos los 4
extremos más uno de las dos patas centrales unidas.

Podemos convertirlo en uno de 5 hilos uniendo las patas centrales de cada espira

Naturalmente es el que más posibilidades y versatilidad ofrece

Las diferentes configuraciones nos permiten hacer un móntatelo tú mismo, en función de que busquemos más par motor, o más velocidad o menos
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
resistencia o…. lo que se te ocurra.

Para este tutorial, vamos a usar un pequeño motor unipolar BYJ48, que viene incluido en el kit de inicio
prometec.net.

Veamos como manejarlo, con unos graficos magnificos que he pillado en la pagina de Todorobots

Si nombramos los hilos a la manera del grafico de la izquierda, entonces la secuencia para hacer girar el motor es
como sigue:

PASO BOBINA A BOBINA B BOBINA C BOBINA D

1 ON ON OFF OFF

2 OFF ON ON OFF

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


3 OFF OFF ON ON

4 ON OFF OFF ON

El movimiento resultante se parece a esto ( Gira contra el reloj ):

Es la secuencia que recomienda el fabricante, porque al haber siempre dos bobinas activas tenemos un par motor (Torque) importante para avanzar y
para mantener la posición.

Pero también podríamos activar solo una bobina cada vez de esta manera:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


PASO BOBINA A BOBINA B BOBINA C BOBINA D

1 ON OFF OFF OFF

2 OFF ON OFF OFF

3 OFF OFF ON OFF

4 OFF OFF OFF ON

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Que produciría un movimiento como este:

El consumo es menor, ya que solo se activa un devanado cada vez, pero también disminuye el par por el mismo motivo. Y por ultimo podríamos
hacer un mix:

PASO BOBINA A BOBINA B BOBINA C BOBINA D

1 ON OFF OFF OFF

2 ON ON OFF OFF

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


3 OFF ON OFF OFF

4 OFF ON ON OFF

5 OFF OFF ON OFF

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


6 OFF OFF ON ON

7 OFF OFF OFF ON

8 ON OFF OFF ON

Donde vamos jugando con excitar una o dos bobinas para tener un movimiento mas suave y de mas pasos, con un resultado similar a esto:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


En la proxima sesion comenzaremos a jugar con un motor sencillo paso a paso, para ver como lo controlamos con nuestros programas.

RESUMEN DE LA SESIÓN

 Hemos presentado los motores paso a paso, que aun sinedo de CC son diferenetes de los servos y de los
motores de giro continuo.

 Vimos como funcionan y como se diseñan para moverse solo cuando se lo ordenadmos con un pulso, y
como retienen su posición mientras estén alimentados.

 Vimos que hay varios tipos y hablamos de los Unipolares y los Bipolares

Anterior Siguiente

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

MOTORES PASO A PASO: 28BYJ-48


Primer contacto con un motor paso a paso

Home 
 Motores Paso A Paso: 28BYJ-48

OBJETIVOS

  Insistir con los motores paso a paso.

 Montar un pequeño motor 28BYJ-48 con su adaptador.

 Escribir un primer programa de control muy sencillo.

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


4.50€ +
9.60€ +
IVA
IVA

ARDUINO PROTOBOARD
UNO REV 3 830 PINES320.
 Añadir al  Añadir al
carrito carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


2.00€ + 3.60€ +
IVA IVA

CABLES
DUPONT MOTOR
HEMBRA- STEPPER 4
HEMBRA FASES 5V
 Añadir al  Añadir al
carrito carrito

VOLVIENDO CON LOS MOTORES PASO A PASO

En la sesión anterior dimos un pequeño repaso a la teoría que hay detrás de los motores paso a paso e intentamos sentar las cuatro ideas
importantes que debéis conocer para elegir y usar con éxito, uno de esto motores.

En esta sesión, vamos a usar un pequeño motor paso a paso unipolar, muy común en el mundo Arduino por su pequeño tamaño y bajo coste, el
28BYJ-48 y el adaptador que suele venir con él, basado en el chip ULN2003A.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Veremos en primer lugar las características que presenta y después montaremos un pequeño circuito básico, para mover el motor. Como siempre
intentaremos que el ejemplo sea lo más simple posible para que en esta primera ocasión veáis con claridad la forma de manejarlos.

Y poco más que decir en esta pequeña introducción. Vamos pues, a meternos directamente en harina.

EL MOTOR PASO A PASO 28BYJ-48

Este pequeño motor es muy habitual en los proyectos con pequeños robots y posicionadores caseros sencillos, porque aunque no es demasiado
potente, ni rápido tiene varias características más que simpáticas, además de ser muy barato (Unos pocos euros ).

Y como no podía ser de otra manera, empezaremos por buscar su manual ( Va que sí, que vosotros podéis encontrarlo en Internet ).

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Es un motorcito unipolar con las siguientes características:

 Tensión nominal de entre 5V y 12 V.

 4 Fases.

 Resistencia 50 Ω.

 Par motor de 34 Newton / metro más o menos 0,34 Kg por cm.

 Consumo de unos 55 mA.

 8 pasos por vuelta.

 Reductora de 1 / 64 .

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Traduciendo esto a cristiano, quiere decir que como es de 4 pasos (Steps), u 8 medios pasos (O half Steps) por vuelta y usa una reductora de 1 /64,
por lo que necesitamos dar 8 * 64 = 512 impulsos para completar un giro completo a medios pasos.

 Sé que parece confuso. Hay 4 bobinas, si las excitamos de una en una tenemos 4 pasos x
64=256 pasos por vuelta. Pero también podemos excitar la bobina mediante medios pasos,
como veíamos en las tablas de la sesión previa (que es el ejemplo que vamos a hacer) y por
eso a medios pasos una vuelta son 8 * 64 = 512 impulsos

Además si no recuerdo mal de mis lejanos días de universidad, un par de 0,34 Kg por cm, significa que con una polea de un 1cm de diámetro
colocado en el eje, este pequeño motor levantaría un peso de 350 gramos contra la gravedad, lo que no está mal.

Este es su diagrama de conexión de bobinas, y además marca los colores del cable en función de su conexión interna. El motor presenta un conector
al extremo en el que podemos pinchar cables de protoboard si hay que moverlo directamente, o bien para conectarlo a su adaptador.

Fijaros que su consumo es muy bajo, de unos 55 mA, dentro del rango que nuestro USB proporciona a Arduino ( Siempre que no intentemos
alimentarlo con un pin) y lo alimentaremos mediante la breakboard típica que le acompaña, que suele usar un integrado del tipo ULN2003A que es
un array de transistores Darlington, que soporta hasta 500 mA y que ya dispone de un conector para el motor y de unos pines (IN1 – IN4) para
conectar a nuestro Arduino.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 Sin entrar en muchos detalles, un Darlington suele ser un par de transistores bipolares colocados juntos y
que se manejan como uno único.

 La ventaja de este esquema es que aumenta mucho la ganancia del transistor resultante y además permite
la conducción de grandes corrientes y tensiones.

 Hemos usado uno de estos transistores para alimentar una tira Ed LEDS aquí.

CONECTANDO EL MOTOR 28BYJ-48

Pues usando la breakboard no tiene mucho mérito. Conectad el motor primero a su conector, que tiene una posición para impedir que lo coloques al
revés y después vamos a colocar las 4 fases a nuestro Arduino de modo que podamos excitarlas de forma independiente.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Es importante que entendáis la idea de que vamos a ir excitando cada una de las fases (O varias simultáneamente) en secuencia levantando a HIGH
el pin de Arduino correspondiente.

No merece la pena montar un esquema de protoboard para esto. Para conectar vuestro Arduino usad la siguiente tabla:

ARDUINO 12 11 10 9

BREAKOUT IN1 IN2 IN3 IN4

Conectad GND y Vcc a los pines correspondientes del adaptador y eso es todo ( Gran ventaja cuando usas módulos a medida ) vamos con el
programa.

EL PROGRAMA DE CONTROL

Mientras que los motores CC normales, están diseñados para que al alimentarlos giren de forma continua, un motor paso a paso está diseñado para
girar un pasito cada vez que alimentas una de las fases.

Por eso nuestro programa tendrá que gestionar la secuencia en la que excitamos las bobinas para que el motor vaya avanzando de forma continua.

En un motor de 4 fases como este que vamos a usar hay tres maneras de hacer esta secuencia como veíamos en la sesión anterior.

Excitando dos bobinas cada vez ( Suele ser lo que recomienda el fabricante )

PASO BOBINA A BOBINA B BOBINA C BOBINA D

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


1 ON ON OFF OFF

2 OFF ON ON OFF

3 OFF OFF ON ON

4 ON OFF OFF ON

Tendríamos máximo par, buena velocidad y alto consumo.

Excitando solo una bobina cada vez ( Se le llama wave drive ):

PASO BOBINA A BOBINA B BOBINA C BOBINA D

1 ON OFF OFF OFF

2 OFF ON OFF OFF

3 OFF OFF ON OFF

4 OFF OFF OFF ON

Que produciría un par menor ( Porque solo se activa una bobina en lugar de dos ) y consumo bajo.

O podríamos dar medios pasos así:

PASO BOBINA A BOBINA B BOBINA C BOBINA D

1 ON OFF OFF OFF

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


2 ON ON OFF OFF

3 OFF ON OFF OFF

4 OFF ON ON OFF

5 OFF OFF ON OFF

6 OFF OFF ON ON

7 OFF OFF OFF ON

8 ON OFF OFF ON

El movimiento es más suave y lento que con los métodos anteriores, y el consumo y el par es también intermedio.

Y naturalmente lo habituales, ya os habréis sospechado que vamos a definir unos arrays con estas tablas para secuenciar el movimiento. Por ejemplo
en el caso de usar medios pasos el array sería algo así:

int Paso [ 8 ][ 4 ] =
{ {1, 0, 0, 0},
{1, 1, 0, 0},
{0, 1, 0, 0},
{0, 1, 1, 0},
{0, 0, 1, 0},
{0, 0, 1, 1},
{0, 0, 0, 1},
{1, 0, 0, 1}
};

Y seguro que no tendréis problema en definir el array correspondiente a los otros dos tipos de movimiento

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Nuestro programa Prog_98_1 recorrerá el array y alimentara las bobinas de acuerdo a los valores que presenta. Empecemos con algunas
definiciones:

#define IN1 12
#define IN2 11
#define IN3 10
#define IN4 9

int steps_left=4095;
boolean Direction = true;
int Steps = 0; // Define el paso actual de la secuencia

Los defines indican a que pines de nuestro Arduino vamos a conectar cada una de los terminales de las bobinas del motor. Después algunas
variables para control y un array que representa la secuencia. El setup es bastante sencillo

void setup()
{ pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(IN3, OUTPUT);
pinMode(IN4, OUTPUT);
}

Vamos a definir una función llamada stepper() que avanza un paso cada vez que la invocamos, en realidad medio paso dada la matriz de excitación y
que controle en que punto de la secuencia estamos.

Así, el programa principal quedaría: Prog_98_1

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void loop()
{ while(steps_left>0)
{
stepper() ; // Avanza un paso
steps_left-- ; // Un paso menos
delay (1) ;
}
delay(300);
Direction =! Direction; // Invertimos la direceccion de giro
steps_left = 4095;
}

Usamos Steps_left para definir el número de pasos que queremos girar, y por eso mientras queden pasos pendientes seguimos en el while, que lo que
hace es avanzar un paso, disminuir el número de pasos pendientes y hacer un delay que controla la velocidad de giro.

Cuando acaba el while, hacemos un delay para poder apreciar el final e invertimos el valor de direction para cambiar la dirección de giro.Vamos con la
funcion Stepper que parece más complicada:

void stepper() //Avanza un paso


{ digitalWrite( IN1, Paso[Steps][ 0] );
digitalWrite( IN2, Paso[Steps][ 1] );
digitalWrite( IN3, Paso[Steps][ 2] );
digitalWrite( IN4, Paso[Steps][ 3] );

SetDirection();
}

Lo se, da asco. Es tan fácil que aburre. Usamos la variable Steps para saber en cuál de los 8 estados posibles de la matriz estamos y escribimos en
las bobinas los valores que corresponden a esa situación.

Es SetDirection() quien va a controlar la dirección de giro y el valor de Steps, vamos a ver como:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void SetDirection()
{
if(Direction)
Steps++;
else
Steps--;

Steps = ( Steps + 8 ) % 8 ;
}

Es muy fácil ver que si giramos en la dirección digamos positiva, hay que ir incrementando Steps para mantener el giro. Y tampoco es complicado ver
que en el giro contrario hay que irlo decrementando para que lea el array al revés. Pero quizás la última línea merece una explicación aparte.

A medida que vamos incrementando Steps, queremos que cuando pase de 7 vuelva a 0 y esto se consigue muy fácil haciendo

Steps = Steps % 8

Es decir tomando el modulo con respecto a 8, pero si lo vamos decrementando, alcanzaremos valores negativos, y el módulo de algo negativo sigue
siendo negativo, lo que no nos vale, porque necesitamos que el siguiente valor a 0 sea 7 y no -1.

Esto es lo que conseguimos de una tacada haciendo

Steps = ( Steps + 8 ) % 8 ;

Compruébalo si no me crees.

 He visto en Internet que esto lo hacen con un programita así:

if (Steps>7)
Steps=0 ;

if (Steps<0)
Steps=7 ;

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 Pero mi sentido de la estética y la vagancia me impiden escribir tanto y además son completamente
equivalentes (Y además es un código mas compacto y quedón el primero)

El resultado es un motorcito girando primero en una dirección y después en la contraria tranquilamente.

RESUMEN DE LA SESIÓN

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


  Montamos un primer circuito de control de nuestro motor paso a paso 28BYJ-48.

 Vimos las varias maneras de controlarlo según como excitemos las fases del motor.

 Programamos un ejemplo con 8 semipasos para que el motor gire suavemente.

Anterior Siguiente

« COMENTARIOS MÁS VIEJOS

(96) Comments

Juan antonio 24 Oct 2017


“Además si no recuerdo mal de mis lejanos días de universidad, un par de 0,34 Kg por cm, significa que con una polea de
un 1cm de diámetro colocado en el eje, este pequeño motor levantaría un peso de 350 gramos contra la gravedad, lo que
Reply no está mal”

El par el M=F*d donde M(par en N*m), F(fuerza en N), d(distancia en m). Despejando F y calculando para 1cm de radio
de polea tenemos

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


F=M/d= 34Nm/0,01m=3400N, teniendo en cuenta que fuerza=masa por aceleración
masa=fuerza/aceleración=3400/10=340kg que podria levantar el motor con una polea de 1cm de radio

Alvaro 28 Sep 2017


Hola una consulta, necesito instalar 6 en una placa, tengo un mega. se puede?

Reply

Ivan 02 Oct 2017


Hola Álvaro, si usas el driver que usamos en el tutorial sólo necesitas 4 pines para cada motor, osea 24 en tota, así
que con el Mega deberías poder. Pero necesitarás alimentarlos externamente porque no creo que con los 5V de
Reply Arduino de para todos. Un saludo.

Julian 20 Sep 2017


Hola,excelente tutorial, pero tengo una duda, como puedo lograr que el motor al momento de desenergizarlo y volverlo a
energizar cumpla el ciclo de la vuelta o la media vuelta con la que inició, lo pregunto por que modifiqué el programa para
Reply que el motor diera solamente media vuelta siempre entre los mismos puntos pero al momento de estar en uno de los
extremos lo desenergizo y energizo simulando un fallo en el suministro eléctrico y he notado que el Programa toma
como referencia el punto donde fue desenergizado el motor, comenzando su ciclo desde ese punto hasta otro punto
totalmente diferente al que requiero.

admin 20 Sep 2017


Hola Julian,

Reply Los motores en general no tienen una referencia de posicion que puedas usar para volver a un punto incical concreto.
Por eso si necesitas arrancar desde un punto especifico, necesitas hacer girar el motor hasta que alcances alguna
marca o tope que te indique ese punto a partir del cual puedes empezar. Si lo usas para mover un carro, puedes
ponerle un fin de carrera o algo asi para detectar que has llegado al limite

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Luis J. 02 Sep 2017
Muchas gracias por estos magníficos tutoriales.
En tu ejemplo, el programa que muestras mueve perfectamente un motor paso a paso. Yo deseo hacer un robot y
Reply necesito que tenga dos ruedas cada una con su motor. He intentado modificar tu programa para dos motores, pero no
consigo definir los pines:
// Motor-1
digitalWrite( 1IN1, Paso[Steps][ 0] ); // Se activan
digitalWrite( 1IN2, Paso[Steps][ 1] ); // Las bobinas
digitalWrite( 1IN3, Paso[Steps][ 2] ); // Correspondientes
digitalWrite( 1IN4, Paso[Steps][ 3] ); // a esta posición
// Motor-2
digitalWrite( 2IN1, Paso[Steps][ 0] ); // Se activan
digitalWrite( 2IN2, Paso[Steps][ 1] ); // Las bobinas
digitalWrite( 2IN3, Paso[Steps][ 2] ); // Correspondientes
digitalWrite( 2IN4, Paso[Steps][ 3] ); // a esta posición
Este código me produce error. ¿Cómo debería hacerlo?

admin 04 Sep 2017


Hola Luis, no se si entiendo tu pregunta

Reply

Marc 20 Ago 2017


Buenas, soy novato con Arduino. Estoy haciendo una casa domótica y quiero configurar el Stepper para que de un
número determinado de vueltas y luego pare, pero no me aclaro con el programa que habéis hecho debido a mi poca
Reply experiencia. Por eso agradecería que me dijerais como puedo hacer una acción tan simple como determinar el número
de vueltas que tiene que dar el motor y que luego se pare indefinidamente. Increíbles tutoriales, de gran ayuda.

Ivan 22 Ago 2017


Hola Marc, hay una variable steps-left en el que ponemos los pasos que queremos que de antes de cambiar de sentido.
Cada vuelta son 4096 pasos. Un saludo.
Reply

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Carlos Serrano Sanchez 16 Ago 2017
Buenas soy algo novato en esto y necesito utilizar este motor para representar una persiana en una maqueta. Bien, la
altura a la que esta situado el motor no es proporcional al tiempo que gira dado que no puede recoger ni bajar la tela.
Reply Como podría hacer que cada vuelta tanto hacia adelante como hacia atrás durase algo mas para así poder desenrollar la
persiana completa?

Agradecería respuesta lo antes posible, gracias.

Ivan 19 Ago 2017


Hola Carlos, si quieres que tarde más no tienes más que meterle un delay dentro del bucle en el que avanza los pasos.
Si quieres que dé más vueltassólo tienes que aumentar el número de pasos. un saludo.
Reply

Ave01 03 Jul 2017


Otro excelente tutorial, explicado de forma muy didáctica. He intentado reproducirlo, y después de varios intentos
infructuosos, me he dado cuenta que mi kit Arduino trae un motor 28BYJ-48, idéntico en código y a la foto del ejemplo,
Reply pero de 12V, tal como lo trae escrito e indica su datasheet (http://www.raspberrypi-spy.co.uk/wp-
content/uploads/2012/07/Stepper-Motor-28BJY-48-Datasheet.pdf). El motor de mi kit no funciona con 5V, es necesario
alimentarlo de forma externa con 12V. Lo comento por si acaso otras personas tuvieran el mismo problema. Gracias de
nuevo por los tutoriales.

Ivan 04 Jul 2017


Hola! Gracias por el aporte. Nuestros tutoriales están hechos con el Kit que vendemos en la página en el que el motor
es de 5V. Hay muchos otros kits, , y hay que andar con cuidado, aunque es raro que traigan un motor de 12V para
Reply trabajar con Arduino.

Muchas gracias por el aviso, seguro que hay gente con el mismo problema que te agradecerá haberlo compartido. Un
saludo.

luis 16 Jun 2017


el 4095 del step_left para que es???? o que funcion tiene???

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Reply

Ivan 18 Jun 2017


Son la cantidad de pasos que queremos que haga el mtor.

Reply

Alb. 04 Ago 2017


Hay algo que no entiendo.
Lo he compiado todo tal cual y motor da 1 vuelta en cada direccion.
Reply Si hay 512 pasos por vuelta deberia dar 8 vueltas.
¿Por que solo da una?

¿Por que avanza 8 veces mas lento de lo que deberia?

Ivan 06 Ago 2017


Hola! El 28BYJ-48 tiene 64 pasos por vuelta y un reductor interno con una relación de 1/64. En
conjunto hacen 4096 pasos por vuelta.
Reply

joaquin 03 Sep 2017


Hola!
Disculpa Iván, pero yo tampoco lo entiendo (algo me estoy perdiendo, porque el
sketch funciona impecable…). Se supone que este motor es de 4 pasos, que con la
matriz definida “se convierten” en 8 medios pasos, y que unido a la reductora 1/64,
nos daría que para una vuelta completa necesitamos 512 pasos para una vuelta
completa. Sin embargo, se definen 4096 pasos para una vuelta completa que es lo
que funciona. ¿Me podrías ayudar a ver lo que me estoy perdiendo? Gracias de
antemano!

julio 08 Jun 2017


Hola, disculpa quiero conectar un motor a pasos bipolar con un sensor de luz al arduino uno.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
lo que quiero es que el motor se mueva cuando el sensor no detecte luz y se detenga cuando el sensor la detecte

Reply

Ivan 08 Jun 2017


Hola Julio, no tienes más que poner un if en el que leas el sensor en una entrada y sí está detectando luz haces que el
motor dé un paso.
Reply

GIVE A REPLY

Message

Name (required) Email (required)

URL

Post comment
WordPress
WordPress Anti-Spam
Anti-Spam by
by WP-SpamShield
WP-SpamShield

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

MAS SOBRE MOTORES PASO A PASO


Controlando un motor unipolar como si fuera bipolar

Home 
 Mas Sobre Motores Paso A Paso

OBJETIVOS

  Seguimos jugando con los motores paso a paso.

 Diferencias entre motores unipolares y bipolares.

 Convirtiendo un motor unipolar en bipolar.

 Gobernando un motor bipolar con L293D H-Bridge.

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


4.50€ +
9.60€ +
IVA
IVA

ARDUINO PROTOBOARD
UNO REV 3 830 PINES320.
 Añadir al  Añadir al
carrito carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


2.00€ + 3.60€ +
IVA IVA

CABLES
DUPONT MOTOR
MACHO- STEPPER 4
MACHO FASES 5V
 Añadir al  Añadir al
carrito carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


1.00€ +
IVA

H-BRIDGE
L293D
 Añadir al
carrito

MOTORES UNIPOLARES Y BIPOLARES

En las dos últimas sesiones empezamos a hablar de motores pasos a paso y de la jerga que los rodea. Vimos que había motores unipolares y
motores bipolares y además dijimos que según el fabricante nos puede entregar 4, 5, 6, u 8 hilos de control.

Revisando un poco lo dicho hasta ahora, si alguien que no había visto nunca un motor paso a paso, ha entendido algo será un milagro. Y
francamente, viendo lo mucho que se escribe por i

Internet del tema, y el barullo semi interesado que pueden montarte, acabaras convenciéndote de que esto no es lo tuyo, pero no señor.

Los motores paso a paso , son una cosa sencilla, pero son muy versátiles y conviene ir pasito a pasito, porque si haces caso a todo lo que lees la
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
cosa se puede complicar mucho, así que vamos a dedicar esta sesión recapitular un poco y demostrarte que no es para tanto.

Recuerda que un motor paso a paso se diseña para que solo se mueva un paso cada vez que excitamos una de sus bobinas ( O varias según el caso ) y
por eso, el circuito de control, o sea nuestro Arduino, tiene que ir excitando en secuencia las bobinas del motor, y por eso tenemos que volver a las
configuraciones de las bobinas porque son las que definen como puedo excitar el motor.

Pero tienes que saber algo importante, casi son todos parecidos, ( solo casi). Fíjate en estas imágenes de configuraciones:

Al final vamos a tener al menos 4 bobinas,


enfrentadas dos a dos (Porque si no va a costar que el motor gire ), pero la cuestión es cómo saca el fabricante los hilos de las bobinas al exterior,
para que podamos controlar el motor.

En el caso del de 5 hilos, primero excitamos un lado de la bobina del primer grupo y luego la media bobina del otro grupo, después vuelta a la
primera bobina, pero del otro lado y al final la que falta. Pero fíjate que el caso del motor de 5 hilos es igual que el de 6, solo que en el primero el
fabricante une los dos hilos centrales.

Y el caso de 8 hilos, es casi lo mismo pero, el fabricante te entrega 8 hilos para que los gobiernes como quieras. ¿Pero… para motores y bobinas
similares hay alguna diferencia en esto? Pues poco menos que no (Algo hay pero ahora pasamos de ello ).

 No te preocupes por ahora de esto, ya tendrás tiempo más delante de entender las pequeñas
diferencias, que tienen que ver con el consumo, el par o la velocidad de giro, por ahora
olvídate de todo esto.

En la práctica eres tu quien configura la excitación de las bobinas porque parece que cuantos más opciones te ofrece el fabricante, más sofisticado
es el motor (Y el precio claro, no te olvides de la pasta ), pero es bien fácil convertir un motor unipolar de 8 hilos en uno 6 o de 5 y uno de 6 en uno
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
de 5.

Vale, más o menos los motores paso a paso unipolares son poco más o menos equivalentes, pero en cambio los bipolares son muy distintos ¿No?

Vale, pues tampoco. Fíjate en el esquema que parece muy diferente:

Tienes marcado en rojo el hilo que une los comunes de las dos bobinas en el motor unipolar. ¿Qué pasa si simplemente los dejas al aire sin conectar?
Pues querido amigo, que acabas de conseguir un precioso motor bipolar.

Así que al final, en todo este asunto hay mucho teatro, por parte de unos que esperan cobrarte más por el Show, y porque algunos que no han
entendido nada, esperan convencerte de que te dejes aconsejar por ellos que son los que más saben de esto.

Hay un tema básico en que si se diferencian los motores unipolares y bipolares, y es que con un unipolar puedes usar un par de transistores
Darlington para excitar una u otra mitad de cada bobina, como hacíamos en la sesión anterior y la costumbre es usar un integrado del tipo del
ULN2003A.

En cambio un motor bipolar no puede ser gobernado de ese modo, porque hay que revertir el sentido de circulación de la corriente según en qué fase
estés y para eso necesitamos un viejo conocido nuestro: Un H-bridge .

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 Recordad que un H-Bridge es capaz de invertir la dirección de circulación de la corriente en su
salida.

Y como no queremos que nadie se quede con dudas, en esta sesión vamos a mover el motorcito que hemos visto, el 28BYJ-48, unipolar, mediante
un sencillo H-bridge, el LS293D manejándolo como si fuera bipolar ( Hoy tengo ganas de guerra, que queréis que os diga ) y montaremos un
pequeño circuito para gobernarlo.

En la sesión anterior controlamos el giro y la secuencia de fases del motor directamente, pero en esta ocasión aprovecharemos para ver que
Arduino dispone de una librería para gobernar motores paso a paso, a un mayor nivel de abstracción desentendiéndonos de tan agotador trabajo .

ESQUEMA DEL CIRCUITO

Coma ya vimos el H-Bridge L293D en una sesión previa, no vamos a insistir con el y os remito a la sesión correspondiente. Recordemos que este
chip tenía dos puentes H-Bridge y que en aquella sesión solo usamos uno de ellos porque era mas que suficiente para gobernar un motor de corriente
continua.

La diferencia es que ahora tenemos que manejar los dos H-bridges, porque vamos a tener dos juegos de bobinas, y por ello poned un poco de
cuidado con el cableado, porque vamos a conectar unos cuantos cables a la protoboard, y como ya es costumbre con uno mal puesto probablemente
dejará de funcionar.

Recordad, también, que para manejar nuestro motor 28BYJ-48 unipolar, como bipolar basta con que nos olvidemos casualmente, de usar el hilo
común de las bobinas que en el conector viene de color rojo y listo.

 En Internet he visto varios artículos que recomendaban desmontar el motor y cortar la pista
interna que da al cable rojo, o bien cortar el cable rojo.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 Jesús, que agresivos. Yo prefiero dejar sin conectar el cable correspondiente y no estropear un
motorcito que nos puede dar mucho juego manejándolo de un modo u otro según nos
convenga.

Vamos con el esquema:

Y para la protoboard, tenemos:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 A riesgo de ponerme pesado, fijaros en que el cable rojo está sin conectar, para forzar a que
usemos este motor como bipolar.

EL PROGRAMA DE CONTROL

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Lo primero que vamos a hacer es desentendernos de los detalles de bajo nivel y vamos a usar una librería llamada stepper.h que viene de serie con el
IDE moderno de Arduino, por lo que no hace falta que la instales, basta con invocarla: Prog_99_1

#include <Stepper.h>

Para crear una instancia del motor paso a paso, tenemos que definir que pines usamos para gobernar las entradas del motor. Si habéis usado las
conexiones que os hemos marcado en el esquema:

const int in1Pin = 12;


const int in2Pin = 11;
const int in3Pin = 10;
const int in4Pin = 9;

Ahora tenemos que definir el número de pasos que nuestro motor tiene por vuelta y crear una instancia de la clase Stepper, pasándole los pines de
control definidos:

#define STEPS 512 // Define el numero de pasos del motor. 512 para 28BYJ-48
Stepper motor(STEPS, in1Pin, in2Pin, in3Pin, in4Pin);

El resto es gimnasia:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void setup()
{ pinMode(in1Pin, OUTPUT);
pinMode(in2Pin, OUTPUT);
pinMode(in3Pin, OUTPUT);
pinMode(in4Pin, OUTPUT);

Serial.begin(115200);
motor.setSpeed(25); // Fijar la velocidad en rpms
}

Lo único digno de mención es la última línea, donde fijamos la velocidad del motor en revoluciones por minuto.

 Yo sé que vais a intentar acelerar un poco el motor, porque es lento que da asco, pero tenéis que entender
que la excitación de las bobinas supone la creación de los campos magnéticos que inducen la fuerza
electromotriz y eso lleva un cierto tiempo.

 Dicho de otro modo: Si fijáis una velocidad superior a la que vuestro motor puede excitarse, sencillamente
quedará inmóvil (Lo sé la vida es dura)

 Estos motorcitos tienen un buen par motor, porque tienen una reductora 64: 1, lo que significa que es 64
veces más lento que el motor a pelo.

Para no aburrirnos, vamos a seguir la costumbre de Internet, para este ejemplo, de recibir por la puerta serie un número entero y usarlo como un
número de pasos que el motor debe avanzar si es positivo o retroceder si es negativo:

void loop()
{
if (Serial.available())
{ int steps = Serial.parseInt();
Serial.println(steps);
motor.step(steps);
}
}

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Pues eso es todo. Para probarlo basta con que después de volcar el programa al Arduino, abráis el terminal serie y marquéis algún numero como
1024 o -2048 y el motor girará lentamente el número de pasos que le especifiquéis.

Aquí os dejo el mini video correspondiente para que veáis el resultado

RESUMEN DE LA SESIÓN

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


  Vimos que no hay tantas diferencias entre un motor paso a paso unipolar y bipolar.

 Nos dimos cuenta de lo sencillo que es, usar un bipolar como si fuera unipolar.

 Montamos un pequeño circuito con un H-Bridge para manejar el motor .

Anterior Siguiente

(38) Comments

Robert 12 Nov 2017


oye me puedes explicar porque el giro. completo es 2048? no era 512?
le pongo 512 y gira 90°, ya lo hice y no tuve ningún problema en que funcionara pero si quisiera comprender mas sobre el
Reply giro.

admin 13 Nov 2017


Hola Robert, no estoy seguro del motivo de los 2048 pasos por vuelta porque hace tiempo que no lo miro, pero al final
es el fabricante el que te dice cuantos pasos son por vuelta para el mutor sin reductora y luego lo multiplicas por el
Reply valor de la reductora. esos es todo

Nicolas 03 Nov 2017


Hola que tal. Estoy realizando un proyecto para la universidad donde tengo que establecer una serie de datos que hagan

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Reply accionar el motor paso a paso. Los datos son 0 o 1 por segundo, es decir si en el segundo 1 hay un 1 el motor se
moverá, si en el segundo 2 hay un 0 el motor no se moverá, y así durante un total de 10 minutos. Tienen idea como
puedo hacerlo? Gracias!

Ivan 06 Nov 2017


Hola Nicolas, no tienes más que hacer un contador con la función milis(). Así puedes contar y por ejemplo cambiar una
variable de 0 a 1 cada segundo. Si la variable está a 0 lo mueves y a 1 lo paras.
Reply

Javier Padilla 16 Jul 2017


Hola, el esquema tiene errores:
La alimentacion, los “enables”, el “vmotor”, de todas formas un excelente tutorial. Saludos
Reply

Roman 10 May 2017


Kaixo! Muchas gracias por los tutoriales, son muy instructivos!
Pero quería comentarte que el esquema tiene varios errores de conexión en el L293D. La protoboard por el contrario
Reply está bien cableada y funciona bien, aunque a mi con velocidad 25 no se mueve. He leído por ahí que la librería estándar
Stepper.h no va muy bien con este motorcillo. Recomiendan el uso de AccelStepper, con la que he conseguido muy
buenos resultados.

Un saludo!

admin 11 May 2017


Muchas gracias por todo Roman, revisaremos el tema

Reply

Cristobal 28 Abr 2017


buenas, tengo un programa que creo que deberia funcionar pero no es asi, el motor esta todo el tiempo en movimiento y
yo solo quiero que funcione con los botones. El programa en cuestión:
Reply

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


int boton2 = 3;
int motorPin1 = 8;
int motorPin2 = 9;
int motorPin3 = 10;
int motorPin4 = 11;

int motor_speed = 4;
int val1 = 0;
int val2 = 0;

void setup()
{
pinMode(boton1,INPUT);
pinMode(boton2,INPUT);
pinMode(motorPin1,OUTPUT);
pinMode(motorPin2,OUTPUT);
pinMode(motorPin3,OUTPUT);
pinMode(motorPin4,OUTPUT);
}

void loop()
{
val1 = digitalRead(boton1);
if(val1 == HIGH)
{
digitalWrite(motorPin1,HIGH);
digitalWrite(motorPin2,LOW);
digitalWrite(motorPin3,LOW);
digitalWrite(motorPin4,LOW);
delay (motor_speed);
digitalWrite(motorPin1,LOW);
digitalWrite(motorPin2,HIGH);
digitalWrite(motorPin3,LOW);
digitalWrite(motorPin4,LOW);
delay (motor_speed);
digitalWrite(motorPin1,LOW);

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


digitalWrite(motorPin2,LOW);
digitalWrite(motorPin3,HIGH);
digitalWrite(motorPin4,LOW);
delay (motor_speed);
digitalWrite(motorPin1,LOW);
digitalWrite(motorPin2,LOW);
digitalWrite(motorPin3,LOW);
digitalWrite(motorPin4,HIGH);
delay (motor_speed);
}
val2 = digitalRead (boton2);
if(val2 == HIGH)
{
digitalWrite(motorPin4,HIGH);
digitalWrite(motorPin3,LOW);
digitalWrite(motorPin2,LOW);
digitalWrite(motorPin1,LOW);
delay (motor_speed);
digitalWrite(motorPin4,LOW);
digitalWrite(motorPin3,HIGH);
digitalWrite(motorPin2,LOW);
digitalWrite(motorPin1,LOW);
delay (motor_speed);
digitalWrite(motorPin4,LOW);
digitalWrite(motorPin3,LOW);
digitalWrite(motorPin2,HIGH);
digitalWrite(motorPin1,LOW);
delay (motor_speed);
digitalWrite(motorPin4,LOW);
digitalWrite(motorPin3,LOW);
digitalWrite(motorPin2,LOW);
digitalWrite(motorPin1 ,HIGH);
delay (motor_speed);
}

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


gracias de antemano por esta magnífica página que me ha ayudado mucho.

Ivan 01 May 2017


Hola Cristobal, prueba a poner otro if, en el que le digas que si no ay nada pulsado se pare, a ver si te funciona. Un
saludo.
Reply

JUAN LUIS 22 Oct 2016


Hola amigos del foro y admin, tengo creo un problema y es el siguiente: copio el programa correctamente y realizo las
conexiones de igual forma Y me funciona bien con un valor positivo PERO al ingresar un valor negativo el motor no gira
Reply en sentido contrario, se queda medio trabado o me gira positivamente …. queria saber que problema tengo en este
momento , sera el motor paso a paso que esta malo?
PD: es la misma referencia que aca se mensiona y el codigo es copiado (esta exactamente igual), me funciona con
valores positivos pero cuando ingreso negativos no genera un giro contrario.
A que se puede deber este problema?
Gracias

admin 23 Oct 2016


Hola Juan Luis,

Reply Pues no se que decirte porque ya ves que el ejemplo es de lo mas sencillo, hay un hilo que controla la direccion del
motor. Yo lo revisaria por si acaso

Beto 22 Oct 2016


Hola Amigos del foro.
Quería contarles que hice un gran avance (me parece) en cuanto a mi proyecto, “Tope Automatico”.
Reply Lo que logré es que al teclear los mm., estos, se vean en el LCD, luego apretando otra tecla (‘B’), el motor se mueve
una determinada cantidad de pasos, desplazando por supuesto al tope hasta la medida indicada.

Hasta aqui todo barbaro.


Ahora pido ayuda…..

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


El problema es que no se como hacer, para que una vez que el motor llegó a su destino se quede como en Pausa. Ya
que si sigo apretando la tecla (‘B’) el ciclo se vuelve a repetir infinitas veces .

Ademas apretando otra tecla (‘C’) logro borrar la pantalla, pero, al volver a cargar otra medida, me vuelve a aparecer el
numero anterior más este.

No se que hacer para que mi programa “se olvide” del dato anterior y pueda comenzar de nuevo…

Ojalá alguien me pueda echar una mano, porque estoy estancado con esto…
Gracias
Saludos, Beto.

Mauro 17 Ene 2017


hola, estoy desarrollando también un tope automático, la idea es hacerlo con un motor nema 23 y un tornillo de bolas,
aunque por ahora estoy preparando un prototipo con una varilla roscada hasta probarlo si funciona. Ahora estoy
Reply tratando de armar el programa para la arduino usando como variables los steps (para pasarlos a mm con el map) y
controlarlo con un teclado y presentarlo en un lcd de 16×2, como hiciste para conectarlos a todos? gracias

Demian Jacome 14 Sep 2016


Hola buenas tardes tengo un motor NEMA 23 y al momento de probarlo con este programa lo único que hace es vibrar y
no gira para ninguno de los lados, la alimentación del motor es de 12v con una fuente ATX, su consumo es de 2A,
Reply anteriormente lo probé con otro motor NMB PM55L-048-HPG9 que es de 48 pasos y todo resultó perfecto, también lo
alimenté con 12V pero su consumo es más bajo de 800mA y el NEMA 23 es de 200 pasos, probé variando los pasos del
motor en el programa y la velocidad aun así no para de vibrar, me podrías decir que estoy haciendo mal por favor

Mil gracias!!
Saludos

admin 15 Sep 2016


No sabria que decirte Demian, porque aparentemente y por lo que he visto en internet es similar al Nema 17 que
hemos utilizado en algun otro tuto, pero yo probaria a bajarle la velocidad a ver que pasa ¿Vale?
Reply

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Beto 26 Ago 2016
Hola Ivan
Gracias por tu aporte, todo me ayuda…
Reply Saludos, Beto.

Beto 25 Ago 2016


Hola admin…. gracias por responder.
Veras, a la parte mecanica, no le tengo miedo, lo que no estoy logrando es la electronica. Por el momento logro ingresar
Reply el valor en el lcd mediante el teclado, pero no logro que a determinado valor, el motor gire x vueltas.
Otra cosa que estoy analizando es lo de las operaciones aritméticas (suma y resta), para que cuando se encuentre en
una posicion y se le ingrese una nueva medida, pueda restar o sumar y se mueva desde ahí (ojalá me entiendas), en vez
de tener que resetear y arrancar desde cero todas las veces.
Si tenés algun dato o consejo… desde ya muchas gracias…
Beto.

Ivan 26 Ago 2016


Hola Beto, no estoy seguro de entender bien, pero si lo que quieres es que cuando el metas un valor por el puerto
serie el motor avance un cierto número de pasaos hacia uno u otro lado, sólo tendrías que poner un par de
Reply condicionales if y si se cumple la condición usar la instrucción motor.step(steps); donde steps sea el número de pasos
que quieras que se mueva.

Un saludote!

Roberto 10 Ago 2016


Hola … ante todo felicitarte por este tutorial, me parece magnífico. Estoy leyendo todo lo que encuentro.
Quería hacerte una consulta a ver si me puedes orientar.
Reply Estoy en un proyecto para mover un tope corredizo, es para una sierra de corte de perfiles de aluminio. La idea es que
al introducir una medida determinada mediante un teclado, el carro ( tope) se desplaze hasta ese punto y seria bueno
además poderle poner un LCD que indique la medida.
Tengo para eso una placa arduino 1, un teclado matricial 4×4, un LCD de 16 x 2 y un motor pap con su driver. Pero se
me complica para armar todo y no encuentro ningún proyecto parecido.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Ojala me puedas echar una mano.
Desde ya muchas gracias.
Saludos… Beto Porporato’ Córdoba’ Argentina.

admin 11 Ago 2016


Hola Roberto, como todo en la vida la complicacion esta en los detalles, pero si dispones del motor paso a paso, basta
con controlar su avance o retorceso con por ejemplo un tornillo de un modo similar a como se mueven las impresoras
Reply 3d. Pero antes tienes que montar la parte mecanica y luego calcular cuantas vueltas de tu motor son x cm, el resto
sera bastante sencillo

Brian 05 May 2016


Hola soy nuevo en esto pero tengo una duda, Estoy por empezar un plotter que maneja viromes, lapices, etc. Pero aun
no puedo solucionar el problema de los motores en total usara 3 pero no se que componente comprar son unipolares
Reply osea tienen 4 cables. ¿Como me recomiendas iniciar?
Muy buena pagina siempre vuelvo a esto para este tema pero ya es hora de iniciar y aun no se que hacer.

admin 05 May 2016


Que proyecto mas guapo Briam, me encanta, llevo años queriendo hacerlo yo mismo pero siempre voy joido de tiempo
y ….
Reply Bueno entiendo que vas a necesitar dos motores paso a paso, te recomendaria un tipo NEMA 17 que son los que
parece que todo el mundo usa para el movimineto XY y luego probablemente un servo sencillo para levantar y baja el
lapiz como el https://www.prometec.net/producto/servo-mg90s-180o/

José Manuel 04 Abr 2016


Perdona. Me refería al Ramps 1.4. Gracias anticipadas

Reply

admin 05 Abr 2016


Vale, claro que puedes utilizar una Ramps para controlar motores paso a paso, esta diseñad apara eso y tiene

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Reply capacidad para hasta 5 motores de una cierta potencia, pero naturalmente tambien tiene que servir con pequeños
motores.
En cuanto a la consulta que me haces sobre el unir o separar los cables de los motores, depende un poco de cada
motor y de la sequencia que uses en la excitacion de als bobinas. No tiene porque disminuir el par aunque separes las
bobinas y las manejes independientemente… a condicion de que actives el mismo numero de bobinas en cada step
¿Vale?

José Manuel 03 Abr 2016


Hola:
Antes de nada enhorabuena por la página y gracias por tu esfuerzo.
Reply He realizado el montaje y funciona correctamente. ¿Seria posible utilizar este motor con Ramos 1.4?. ¿Disminuye el par
con respecto a cuándo se destruye el puente entre bobinados del cable rojo?.
Gracias anticipadas por tu atención.
Un saludo!

admin 04 Abr 2016


Hola Jose Manuel, no se que es Ramos 1.4

Reply

David 06 Mar 2016


Hola buenas tardes, tengo un motor de 8 hilos, heredado de mi padre y ahora lo quiero hacer mover con arduino, esta
nuevo pero la referencia ya no se encuentra por internet, es un motor japonés de la fuji electrochemical co. ref smr58-
Reply 4801-a 2239376-0001 de 5v 5ohms. Mi padre lo hacía mover con unos TIP122 para mejorar su potencia. Quisiera me
ayudaras para moverlo con el arduino, saber cómo puedo hacerlo.

admin 06 Mar 2016


Hola David, es seguramente un motor paso a paso de 8 bobinas que puedes convertir facilmente en uno de 5 hilos.
Para ello tienes que buscar las dos bobinas en oposicon y unir sus hilos centrales de ese modo tendras 6 hilos y si a su
Reply vez unes los dos centrales a masa tendras un precioso motor paso a paso de 4 hile + comun o masa

Tendras que haer pruebas para acertar cual es cual si no viene marcado de algun modo explicito
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Demian Jacome 22 Feb 2016
Hola!!!
Como haces para ingresarle los datos al arduino??
Reply

admin 22 Feb 2016


Hola Demian, ¿a que te refieres?

Reply

Jesús Sánchez 22 Feb 2016


Hola Demian.
Abre el monitor Serial y lo haces a traves del teclado
Reply Saludos.

martin 30 Oct 2015


hola.. como hago para hacer andar 2 motores secuenciales. estoy haciendo una cinta transportadora y al final mueve un
elevador. y no se como hacer q luego q termine de hacer un trabajo el motor comience el otro. muchas gracias y espero
Reply su respuesta

admin 31 Oct 2015


Hola Martín,

Reply No estoy seguro de comprender bien tu pregunta, pero me imagino que te refieres a como hacer que al pasar de la
cinta al elevador esta arranque y pare la cinta transportadora. SI es así la solución fácil es arrancar los dos a la vez y
olvidarte de las complicaciones. si por lo que sea no conviene, tienes que detectar el paso de lo que estas moviendo
por el final de la cinta .

Para eso puedes usar un final de carrera con una pértiga, o bien mas limpio, un sensor óptico que detecte el paquete

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Ya me dirás si te puede servir

A_Bug Bot 26 Ago 2015


Lo mejor que he encontrado en la red sobre tutoriales de ARduino en castellano. Gracias

Reply

Carlos espinosa 19 Ago 2015


Hola, si quiero probar con un motor pap de 12V, como sería la conexión. Gracias

Reply

admin 20 Ago 2015


Hola Carlos, pues exactamente igual, pero poniendo 12V en lugar de 5. Tanto el motor shield shield V1 como el L293D
te soportan motores de 12V, pero si usas el shield asegurate de aislar el jumper de alimentacion del control de la
Reply alimentacion de los motores o haras parrillada

Jose 08 Jul 2015


Hola buenas tardes, quería hacerte una pregunta, soy nuevo en esto y no me aclaro mucho, pero veo una discrepancia
entre el circuito y la protoboard
Reply Concretamente en las conexiones a tierra de las patas 4, 5 ,12 y 13 del H-Bridge que según el esquema tienen que
conectar a tierra y están conectadas al positivo.
Quiero probarlo pero me parece que podría haber un error, por favor si tienes un momento míralo y me dices algo.

Muchas gracias

admin 09 Jul 2015


Hola Jose, tienes toda la razon. HAbia una serie de errores en la protoboard que creo ya estan corregidos,
compruebalo y dime si ves cualquier otro problema. Muchas gracias por indicarmelo
Reply

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


GIVE A REPLY

Message

Name (required) Email (required)

URL

Post comment
WordPress
WordPress Anti-Spam
Anti-Spam by
by WP-SpamShield
WP-SpamShield

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

MOTOR SHIELD V1 Y MOTORES PASO A PASO


Ahorrando conexiones con los steppers

Home 
 Motor Shield V1 Y Motores Paso A Paso

OBJETIVOS

  Seguimos jugando con los motores paso a paso

 Conectando un motor paso a paso con Motor Shield V1.

 Programado el movimiento con la librería AF_Motor.

 Controlando el Stepping del Motor .

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


4.50€ +
9.60€ +
IVA
IVA

ARDUINO PROTOBOARD
UNO REV 3 830 PINES320.
 Añadir al  Añadir al
carrito carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


2.00€ + 3.60€ +
IVA IVA

CABLES
DUPONT MOTOR
MACHO- STEPPER 4
MACHO FASES 5V
 Añadir al  Añadir al
carrito carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


+
Out of
9.00€ Stock

IVA

MOTOR
SHIELD V1
Leer más

MANEJANDO VARIOS MOTORES PASO A PASO

En la sesión anterior vimos que podíamos manejar un motor paso a paso unipolar como bipolar, mediante un integrado H -Bridge L293D.

Vimos que controlar un motor paso a paso es un pelín más complicado que controlar un motor de corriente continua ( O un servo ya que estamos )
porque no podemos simplemente dar una señal y esperar que se ponga a girar, si no que debemos controlar el movimiento mediante el control de la
excitación de las bobinas (O coils en inglés ).

Y como un motor paso a paso debe tener al menos 2 bobinas, necesitamos por tanto 2 H -Bridge , es decir un integrado del tipo L293D completo
( Que tiene dos H-Bridges) y un buen número de cables colgando para conectar todo a nuestro Arduino.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Como esto es un auténtico asco y una garantía de errores o de cables cambiados o sueltos, en cuanto necesitas manejar un par de motores paso a
paso, y no digamos ya los 5 motores paso a paso de una impresora 3D tipo RepRap, tenemos un lio.

Por ello y como no podía ser de otra manera, siempre hay alguien que ha tenido el problema y nos vende una solución. En este caso vamos a ver
cómo manejar motores paso a paso con un viejo conocido nuestro: El Adafruit Motor Shield V1 .

En el pasado usamos este shield para manejar cuatro motores CC para el Rover 4×4, ya que incluye dos integrados L293D, pero para mover
motores paso a paso necesitamos 2 H-Bridge por cada motor, por lo que solo podemos manejar dos Steppers con él.

 Precisamente por la limitación de H-Bridges en los chips internos, podemos manejar 4 motores

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


CC, o dos motores Stepper, o también 2 motores CC y un Stepper.

Vamos a dedicar esta sesión a ver como manejamos los motores Stepper con este sencillo y accesible Shield, antes de pasar a otros Shields
dedicados más complejos

CONECTANDO MOTORES PASO A PASO AL MOTOR SHIELD V1

Lo primero que tenéis que recordar es que necesitamos manejar las dos bobinas del motor independientemente, y eso nos lleva a tener que
identificar los bornes de las bobinas claramente para conectarlas adecuadamente.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


El primer motor paso a paso debe conectarse a M1 y M2, y el segundo motor a M3 M4. Donde M1 y M2 conectan cada una de las bobinas del motor
1. Al otro lado conectamos las bobinas del segundo motor.

Para usar el motor 28BYJ, ya vimos la distribución de conexiones en este esquema de colores:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Tenéis que hacer estas conexiones:

MOTOR SHIELD MOTOR

A 2 Pink
M1
B 4 Orange

A 1 Azul
M2
B 3 Yellow

GND GND 5 Red

Fijaros que el Motor Shield tiene entre M1 y M2 una conexion para GND, con lo que podemos conectar directamente el pin correspondiente y
manejar el motor como unipolar, o dejarlo al aire y tratarlo como bipolar

En caso de que el motor paso a paso que vayáis a usar sea diferente de este, siempre podéis buscar en Internet el manual de vuestro motor y hacer
las conexiones correspondientes.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


PROGRAMA DE CONTROL

El programa es muy sencillo ya que la librería de adafruit-Adafruit-Motor-Shield-library-1.0.0-0-g89a0973 se encarga de la parte más molesta, de
gestionar los timings y el control de las bobinas.

Para ello tenemos que incluir la librería y definir una instancia de la clase AF_stepper, para nuestro motor, con un par de parámetros:

#include <AFMotor.h>
AF_Stepper motor(256, 1); // A la puerta M1 M2

256 son los Steps por vuelta para nuestro motor ( Podéis probar diferentes valores y ver lo que pasa) y 1 significa que usamos el motor conectado a
M1 M2. SI conectamos un segundo motor a M3 M4, sería el motor 2.

void setup()
{
Serial.begin(9600);
Serial.println("Stepper test!");
motor.setSpeed(50); // 50 rpm
}

En el setup, fijamos la velocidad mediante setSpeed a 50 rpm.

 Os recomiendo que juguéis cambiando la velocidad y vayáis viendo lo que pasa. (¿Quien dijo
miedo?)

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Para presentar el programa principal, conviene antes que recordemos las diferentes maneras de excitar las bobinas de un motor paso a paso .
Recordad que podíamos excitar solo una bobina cada vez (Single Coil ), o dos bobinas a la vez ( Double Coil ), o una mezcla de ambas de forma
alternativa para generar medios pasos ( Interleve).

 Si queréis repasar esto un poquito podéis volver a la sesión previa donde ya vimos todo esto.

Cada uno de esos métodos tiene ventajas e inconvenientes y es cuestión de decidir cuál usar dependiendo de lo que queramos hacer. Podemos
hacer un Pequeño resumen de cada modo:

SINGLE: Solo se excita una bobina cada vez ( También se le suele llamar Wave Drive ), No suele ser lo más frecuente porque el par es
relativamente bajo, pero a cambio el consumo de energía es bajo.

DOUBLE: Se excitan dos bobinas cada vez ( También se le llama Full Stepping ). Es bastante frecuente si lo que se busca es par motor
máximo, el doble que en single coil, pero también el doble de consumo.

INTERLEAVE : Se excitan pares de bobinas, lo que nos permite doble resolución, con un par y consumo intermedios. Naturalmente con
el doble de posiciones la velocidad es la mitad.

MICROSTEPPING: En ligar de alimentar las bobinas con todo o nada, usamos tensiones PWM con una ciertas relaciones entre la
alimentación de las dos bobinas, con lo que la transición entre pasos es más suave.

Reduce mucho el ruido del motor y la tensión mecánica, mejorando la vida útil del motor, pero a cambio la precisión se reduce y el par también

Entrar en una discusión detallado de estas técnicas sobrepasa con mucho la intención de este humilde tutorial y si tenéis interés, no vais a tener
dificultad en bucear en Internet para encontrar sesudas discusiones al respecto.

De momento es suficiente con decir que la librería os permite cambiar sin problemas y sobre la marcha, el tipo de stepping de estos motores:

Así pues, ya podemos presentar el loop:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void loop()
{
Serial.println("Single coil steps");
motor.step(2000, FORWARD, SINGLE);
motor.step(1000, BACKWARD, SINGLE);
delay(1000);

Serial.println("Double coil steps");


motor.step(2000, FORWARD, DOUBLE);
motor.step(1000, BACKWARD, DOUBLE);
delay(1000);

Serial.println("Interleave coil steps");


motor.step(2000, FORWARD, INTERLEAVE);
motor.step(1000, BACKWARD, INTERLEAVE);
delay(1000);

Serial.println("Micrsostep steps");
motor.step(2000, FORWARD, MICROSTEP);
motor.step(1000, BACKWARD, MICROSTEP);
delay(1000);
}

La instrucción motor.step(), recibe el número de pasos a girar el motor, el sentido de giro como FORWARD y BACKWARD, y el método de
excitación de las bobinas como SINGLE, DOUBLE, INTERLEAVE o MICROSTEP.

Aquí os dejo un mini video con el resultado:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


MANEJANDO MÁS STEPPERS Y DE MÁS POTENCIA

El Adafruit motor Shield es un juguete muy simpático que os permitirá por muy poco dinero jugar con los motores y hacer pequeños proyectos que
manejen cargas pequeñas.

Pero este Shield se queda pequeño en cuanto haya que poner fuerza encima de la mesa, y para eso Adafruit ( Entre otros muchos ) diseñó la versión
V2 de la que espero hablar en futuras sesiones de modo específico:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Si rebuscáis un poco entre los vendedores encontrareis que hay tantos Shields de control de motores como casi de fabricantes y es conveniente que
busquéis uno con un buen soporte de librería para no volveros muy locos al manejarlo.

Y cuando se requiere manejar 4 o 5 motores de paso a paso con una cierta potencia hay diferentes Shields disponibles para ello. Por ejemplo, las
impresoras 3D de RepRap, o Prusa, las más comunes, utilizan un shield para 5 motores paso a paso con drivers de una cierta potencia, llamada
RAMPS:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


La RAMPS es un Shield para Arduino MEGA, que lleva control para 5 motores paso a paso con controladores Pololu. En la imagen superior podeis
ver los cinco controladores instalados en el shield y los disipadores de aluminio que lleva cada uno.

En algun momento hablaremos de esta controladora que es muy barata porque se usa para las impresoras 3D y se vende como rosquillas lo que hace
que haya disponible un software estándard parametrizable para su control.

RESUMEN DE LA SESIÓN

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


  Vimos un nuevo uso del Motor Shield V1 para manejar motores paso a paso.

 Comprobamos que es más seguro usar un shield para manejar vatios Steppers que usar un circuito,
porque disminuye grandemente el número de conexiones necesarias.

 Usamos la librería AF_Motor para mover los Steppers de un modo cómodo.

 Vimos que hay varias formas de hacer el stepping y cómo controlarlo

Anterior Siguiente

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

MOTOR SHIELD V1 Y SERVOS


Moviendo servos con el motor SHield V1

Home 
 Motor Shield V1 Y Servos

OBJETIVOS

  Volver sobre los servos.

 Ver cómo usarlos con el Motor Shield V1.

 Presentar otros Shields con más posibilidades.

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


+ +
Out of
9.60€ 9.00€ Stock

IVA IVA

ARDUINO
UNO REV 3 MOTOR SHIELD
V1
 Añadir al
carrito Leer más

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


9.20€ +
IVA

SERVO
FUTABA
MG945
 Añadir al
carrito

VOLVIENDO A LOS SERVOS

En una sesión previa, ya hicimos una primera aproximación al servo motor. Vimos que son motores de corriente continua diseñados no para girar
sin fin, sino que se concebidos de modo que se muevan a una posición específica y se mantengan en ella.

Vimos que podíamos usar señales PWM como medio de controlar con precisión el angulo en que queremos posicionar el servo.

Este tipo de posicionamiento mediante servos, es de lo más interesante en el caso de timones de navegación y vuelo, o posicionamiento de brazos
robots, y están muy extendidos tanto en la industria, como en los aficionados al radio control.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Un servo típico se define en función del angulo que puede girar, el par que puede desarrollar y el consumo que tiene. Para esta sesión voy a usar un
par de servos típicos que tengo por aquí, pero tanto da cualquier otro.

Veamos sus características:

MODEL: TGY-9018MG

Operating Voltage: 4.8V / 6.0V

Operating Current: 200mA / 250mA

Operating Speed: 0.12sec.60º/ 0.10sec.60º

Stall Torque: 2.3kg.cm /2.5kg.cm

Size: 23X12.1X25.8mm

Weight: 13g

Dead Band: ≤7uSec

Operating Travel: 60º +/- 10º

Potentiometer: indirect Drive

Leyendo las características, vemos que podemos alimentarlo entre 4,8 y 6V. Sin problemas con nuestro Arduino, y consumirá entre 200 y 250 mA y
con esto hay que tener un poco cuidado, porque si estamos alimentando nuestro Arduino con USB, este solo puede proporcionar un máximo de
500mA

Eso quiere decir que podemos manejar un servo sin problemas, pero si metemos el segundo servo pueden empezaran a pasar cosas raras:

2x 250 500 mA y aún falta alimentar el propio Arduino.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Por eso, aunque resulta muy sencillo manejar servos con nuestros Duinos, es importante fijarte en el consumo, porque de lo contrario habrá
problemas.

 Por si alguien está pensando que 250mA es mucho más de los 40 mA que cualquier pin de Arduino puede
proporcionar, tened en cuenta que la señal PWM no alimenta el servo, sino que proporciona la señal de
control.

 Por eso la alimentación se hace a través de Vcc y GND y no podríamos alimentarlo con un pin de Arduino,
pero sí de las líneas principales, a condición de no sobrepasar la capacidad de la fuente (0,5 A en el caso de
un USB típico)

Nos detalla un par de 2,5 Kg por cm, lo que significa que si usamos un brazo de un cm alrededor de su eje, puede levantar 2,5 Kg, lo que no está
nada mal para un motorcito tan pequeño como este.

Así pues no tenemos ningún problema en alimentar nuestro servo con un programa sencillo como este que ya vimos:

#include <Servo.h> // Incluir la librería Servo


Servo servo1; // Crear un objeto tipo Servo llamado servo1
int angulo = 0 ;

void setup()
{ servo1.attach(9) ; } // Conectar servo1 al pin 9

void loop()
{ for(angulo = 0; angulo <= 180; angulo += 1)
{ servo1.write(angulo);
delay(25);
}

Aquí os dejo un pequeño vídeo con el resultado

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


USANDO EL MOTOR SHIELD V1 CON SERVOS

Cuando hablamos en sesiones anteriores que el Adafruit Motor Shield V1 , dijimos que podía manejar cuatro motores de continua o dos motores
paso a paso y vimos las razones de que esto fuera así, pero hasta ahora no habíamos comentado que el motor shield V1, puede manejar dos servos
adicionales también.

Pero ¿Por qué iba a querer usar el motor Shield para majear servos, si puedo manejarlos directamente desde el propio Arduino?

Bueno en primer lugar porque si usas un Arduino UNO ibas a ir mal de conectores para conectar los servos, porque el Shield te los tapa (Aunque

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


esto se puede arreglar)

En segundo lugar porque un servo tiene normalmente un conector de 3 pines y para conectarlo a nuestros Duinos hay que poner cables, mientras
que el Shield trae un par de conectores para servo directos y es mas limpio.

En tercer lugar, porque el Motor Shield te permite usar una fuente de alimentación independiente de la que usa tu Arduino y esto puede ser
importante, ya que hay servos de 12 y 24V y no podrías alimentarlos directamente. El shield te ofrece un sistema fácil de combinar ambas cosas.

Y en tercer lugar porque hay proyectos que necesitan más de un motor o tipo de motor, y con este shield podrías usar simultáneamente un motor
paso a paso con 2 motores de continua y dos servos (Con alimentación externa indudablemente pero resulta factible).

Por eso, porque la vida es complicada, los chicos de Adafruit nos proporcionan la capacidad de manejar los servos directamente desde la librería que
acompaña al shield.

Pero tened en cuenta de que la librería hace poco más que definir la forma de usar los pines digitales 9 y 10, para el control de los servos mediante
una señal PWM y proporcionarnos una forma coherente de manejar estos motores por software, igual o muy similar a la que usamos para mover los
motores de continua o Steppers.

SERVOS Y MOTOR SHIELD 1.0

Fijaros en la imagen y veréis en la esquina superior izquierda, las conexiones de los servos 1 y 2, que son independientes del resto de los motores.

Servo1 y Servo2 utilizan los pines digitales 9y 10 de Arduino respectivamente.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Nos queda ahora ver como usamos los servos con este Shield mediante un programa, que en realidad tiene poco mérito, porque usamos la librería
estándar de servos además de la del shield motor, y después instanciamos un par de servos directamente, por el procedimiento habitual:

#include <AFMotor.h>
#include <Servo.h>
Servo servo1, servo2 ;

El resto del programa se parece mucho al que pusimos un poco mas arriba:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


#include <AFMotor.h>
#include <Servo.h>
Servo servo1, servo2 ;

void setup()
{ Serial.begin(115200);
servo1.attach(9); // El servo 1 se controla con el pin 9
servo2.attach(10); // El servo 2 se controla con el pin 10
}
void loop()
{ for (int ang =0 ; ang <180 ; ang++)
{ servo1.write( ang) ;
servo2.write( ang );
delay(25);
}
delay(1000);
}

Fijaros que barremos un ángulo de 0 a 180º porque aparentemente este servo se comporta así, con un ángulo de 90º se coloca en la posición central
y luego puede moverse a 0º o hasta 180º, pero esto es algo que tenéis que comprobar con vuestro servo.

 Si le dais un ángulo superior a lo que puede moverse, simplemente zumbara y no podrá haceros caso,
porque para eso tiene topes.

 En un servo pequeño como esto no es grave, pero evitaría algo así en servos de una cierta potencia y
precio por si acaso.

Aquí os dejo un pequeño video con los dos servos en movimiento:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


OTROS SHIELDS

Este Motor Shield V1 está pensado como un sistema sencillo y de bajo coste para introducirse en el mundo de los pequeños motores, y no es
llevéis a engaño, se pueden hacer muchas cosas con el especialmente para interesar a gente que desea empezar de modo sencillo sin complicaciones
ni tener que empeñar un riñón en las compras.

Pero a medida que vuestros proyectos vayan creciendo, el Motor Shield V1 se os quedara corto, primero porque su capacidad de alimentar motores
es limitada sin una fuente externa y en segundo lugar porque con solo 2 servos no vas a hacer un robot muy interesante.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Por eso, cuando necesitéis usar más de dos servos por ejemplo, vais a necesitar otro shield o tarjeta de expansión que os permita crecer.

Y estáis de suerte porque naturalmente el mercado nos ofrece todo una plétora de soluciones en forma de shields y tarjetas integradas que nos
permiten controlar múltiples servos, pero hay algunas cosas que necesitáis tener en cuenta antes de comprar una.

Lo primero cuantos servos vais a usar y cuál es el consumo máximo en carga, porque tenéis que prever una alimentación suficiente para el peor
caso. Por ejemplo si necesitas 12 servos de 250 mA, tienes un consumo de 3A en el peor caso. Quizás nunca se de pero tienes que preverlo, y no
todos los shield o tarjetas pueden aguantarlo aunque parezca que sí, asegúrate.

Lo segundo es si quieres comprar un shield para tu Arduino, o una tarjeta que ya incluya un Arduino y más cosas, y hay muchos así.

Por ejemplo es fácil encontrar tarjetas como estas:

Que incluyen un chip compatible con Arduino UNO la primera y con MEGA la segunda para mayor potencia y por el número de pines necesarios.
Suelen encontrarse con capacidad para controlar 16, 24 y 32 servos.

La propia tarjeta incluye USB y Arduino para manejar directamente los servos, pero fíjate que ninguna de estas tarjetas tiene alimentación propia y
por tanto necesitas prever el uso de una fuente externa.

Imagínate que quieres hacer algo así como una araña robot. Cada pata necesita tres grados de libertad: Girar el hombro arriba y abajo para levantar
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
la pata y girar el hombro adelante y atrás para avanzar y por ultimo girar el codo arriba y abajo (De momento ignoramos el tobillo ) y como una araña
usa 8 patas, salimos por la bonita cantidad de 24 servos mínimo para hacer una araña.

Algo así va a llevar a límite a este tipo de controladoras y por eso las hay de hasta 32 servos que yo haya visto. Tengo por aquí una que compre hace
un tiempo (Para una araña robótica precisamente ) que es de lo más grande que he visto:

Se llama Spider Controller e incluye el corazón de un Arduino Mega y es compatible con él y además 48 conectores para servo y una fuente de
alimentación de 3ª, junto con el USB para programarlo, lo que le convierte en el mayor monstruo que he visto nunca para controlar servos.

Quizás mas adelante lo usemos un día para algo ( Una Araña no me suena mal )

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


RESUMEN DE LA SESIÓN

  Hemos visto cómo usar el Motor Shield V1 para controlar un par de servos.

 Vimos tanto como conectarlos en los pines asociados como lo necesario para programarlos mediante la
librería de Adafruit.

 Vimos las limitaciones de este shield con los servos.

 Presentamos otras posibilidades en cuanto a Shields con capacidad para controlar mayor número de
servos.

Anterior Siguiente

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

ADAFRUIT MOTOR SHIELD V2


Home 
 Adafruit Motor Shield V2

ADAFRUIT MOTOR SHIELD V2

  Presentar el Adafruit Motor Shield V2 .

 Ver sus características básicas.

 Mostrar un programa sencillo para mover un motor CC.

 Mostrar un programa sencillo para mover un motor paso a paso.

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


15.00€
9.60€ +
+ IVA
IVA

ARDUINO MOTOR SHIELD


UNO REV 3 V2
 Añadir al  Añadir al
carrito carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


6.20€ + 10.50€

IVA + IVA

RUEDA +
MOTOR MOTOR NEMA 17
STEPPER
 Añadir al
 Añadir al
carrito
carrito

Esta sesión es poco más que una traducción libre del magnífico documento de Adafruit sobre este Shield y que podéis encontrar aquí, y en el
que encontrareis una información mucho más extensa sobre este Shield, de lo que pretendemos en este sencillo tutorial.

CONTROLADORAS DE MOTORES

Hemos dedicado ya unas cuantas sesiones a hablar del Motor Shield V1 , que era una pieza de lo más simpática y accesible y que te permitía iniciarte
con los motores de un modo económico sin demasiadas complicaciones.

Con un Shield de unos pocos euros y una librería sencilla puedes manejar 4 motores de continua o dos de paso a paso y además dos servos.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Pero como todo en la vida las ventajas suelen venir a cambio de ciertos compromisos. En este caso el Motor Shield V1 , solo es capaz de
soportar una carga limitada de un máximo de 0,6 Amperios.

Cunado necesitas cargas superiores ya vimos que existían otros Shields como el Ardumoto, que acepta cargas de hasta 2A lo que no está mal,
pero que como en la vida no existe la felicidad completa, tiene el inconveniente de vernos limitados a dos motores de continua o único paso a paso.

Y claro más de uno empezó a preguntarse… ¿ Tenemos que elegir entre un Shield excelente y versátil pero poco potente y uno más potente pero
limitado?

Y como siempre que unos cuantos empiezan a hacerse este tipo de preguntas hay algún ingeniero avispado ( Normalmente varios ) que huele el
dólar y te ofrece una solución para el problema.

En este caso los chicos de Adafruit, que son los padres del Motor Shield V1 , decidieron rediseñarlo, pero con más potencia y manteniendo las
prestaciones del Shield original, y al resultado le dieron el ingenioso nombre , quien lo diría, de Motor Shield V2 .

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Y esta es la tesis de esta pequeña sesión. Presentaros esta pequeña joyita que es el Motor Shield V2 , que reproduce las características más
interesantes del V1, como el número de motores que puede gobernar a la vez que aumenta la intensidad que puede aceptar para el gobierno de los
diferentes motores, y por si alguien quiere más, permite apilar varios Shields V2 para controlar un número mayor de motores.

 En el próxima capitulo veremos cómo, porque requiere una explicación más tranquila de lo que ahora
mismo seria posible

MOTOR SHIELD V2 DE ADAFRUIT

De Nuevo el Motor Shield V2 permite manejar 4 motores de corriente continua o 2 motores de paso a paso, o bien 2 motores de continua y un
paso a paso, y además 2 servos adicionales, y lo hace rediseñando de arriba abajo el Shield V1.

En lugar de un chip L293D que ya nos es de lo más familiar, emplea un MOSFET TB6612 driver con una capacidad de 1,2 Amperios por canal y
picos de hasta 3 Amperios, y con circuito de protección térmica incluida.

Además incluye un chip generador de PWM propio, con lo que libera nuestro Arduino de esta tarea y todo el conjunto se controla mediante el bus
I2C.

Otra caracteristica nueva, muy de agradecer es que además permite apilar los Shield uno encima de otro hasta 32, lo que le da la capacidad de
controlar un disparatado número de motores, pero que por ellos no quede, y por ultimo además de permitir separar la alimentación de motores y
servos de la de nuestro Arduino, incluye un área de prototipos para soldar directamente lo que se nos ocurra sin necesidad de otros Shields.

Aquí tenéis la distribución del Shield V2:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Recordad que siempre es buena idea separar la alimentación de vuestros motores de la de Arduino para evitar cosas raras, pero especialmente si
vuestros motores usan una tensión diferente de 5V.

 No os preocupéis por cual es el positivo y el negativo. No tiene importancia, pero sí que importa que
todos los conectéis del mismo modo, más que nada, para que cuando quieras avanzar, todas las ruedas lo
hagan en la misma dirección.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
 Si los conectáis al atolondradamente cuando deis la orden de avanzar el espectáculo será un tanto caótico,
fijo.

Para alimentar vuestros motores con una fuente externa, retirad el jumper de alimentación común y usad los bornes externos de alimentación de
motores, veréis que se ilumina un pequeño LED azul para indicaros que hay tensión en la entrada.

CONTROLANDO MOTORES CC CON EL NUEVO SHIELD

Antes de nada, como el Motor Shield V2 es un rediseño del original con diferentes componentes hay que utilizar una librería diferente de la que
vimos con el Shield V1: Adafruit_Motor_Shield_V2_Library-master

Una vez descargada , instaladla por el procedimiento habitual que ya tenéis dominado y veamos cómo se usa la nueva librería, mediante C++

Para empezar hay que incluir algunas llamadas a librerías:

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

Ya hemos comentado que este Shield se controla mediante I2C para poder gobernar mayor número de motores, pero de eso se encarga la
librería, así que no os preocupéis.

Ahora tenemos que crear una instancia por cada motor que vayamos a manejar. Como esto solo es un ejemplo de uso y soy un vago irreductible,
solo voy a conectar un motor y de ese modo espero que el ejemplo mínimo sea lo más didáctico posible.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Adafruit_MotorShield AFMS = Adafruit_MotorShield();

Hemos creado con esto una instancia de motor, pero ahora debemos indicar a la librería el tipo del mismo, porque permite varios tipos , y es la
librería la que va a hacer el control final:

Adafruit_DCMotor *myMotor = AFMS.getMotor(1);

Lo que solo significa que AFMS va devolver un puntero a un motor de tipo DC, y por cierto el 1 entre paréntesis, significa que lo hemos conectado
a las bornes del M1. El resto ya no tiene dificultad.

void setup ()
{ AFMS.begin(); // create with the default frequency 1.6KHz
myMotor->setSpeed(150);
myMotor->run(FORWARD);
myMotor->run(RELEASE);
}

Simplemente inicializamos el control del motor con el begin() muy al estilo de como lo hacemos con la puerta serie y después fijamos la velocidad
consetSpeed, al que le pasamos un valor entre 0 y 255 para indicar la velocidad deseada.

 Ojo, si das valores muy bajos probablemente tu motor se parará por completo. Usa un mínimo de 80, pero
esto depende de tu motor y de lo eficaz que sea (Y el que yo voy a usar no es de los mejores).

Para controlar el movimiento del motor usamos las keyword FORWARD ( Adelante), REVERSE ( Atrás) y RELEASE ( Liberar o parar). Veamos un
pequeño ejemplo de uso de un motor CC:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void loop()
{ uint8_t i;

myMotor->run(FORWARD);
for (i=0; i<255; i++)
{ myMotor->setSpeed(i);
delay(10);
}

for (i=255; i!=0; i--)


{ myMotor->setSpeed(i);
delay(10);
}

myMotor->run(BACKWARD);
for (i=0; i<255; i++)
{ myMotor->setSpeed(i);
delay(10);
}
for (i=255; i!=0; i--)
{ myMotor->setSpeed(i);
delay(10);
}

myMotor->run(RELEASE);
delay(1000);
}

Aquí estamos usando un operador del que no hemos hablado aun, (Y del que no quiero hablar por ahora ) que es “->”. No le hagáis mucho caso y
usadlo sin más. No muerde aunque parezca raro

Como veis la idea es simplemente fijar la dirección hacia adelante y luego hacia atrás e ir variando la velocidad de giro del motor. EL resultado lo
podéis ver en este mini Video:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


CONTROLANDO UN MOTOR PASO A PASO

Si ya conoces los motores paso a paso, poco voy yo a poder contarte, pero si eres nuevo en el tema, te recomiendo que empieces por la
introducción a los Steppers que hicimos en unas sesiones previas y que te vendrán muy bien para coger 4 ideas importantes, antes de meternos en
harina en esta sesión.

Esas sesiones eran:

97 Motores paso a paso.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


98 Motores paso a paso: 28BYJ-48.
99 Controlando un motor unipolar como bipolar.
100 Motor Shield V1 y motores paso a paso.

No es muy distinto controlar un Stepper de un motor CC pero hay pequeñas diferencias que nos conviene tener en cuenta. Para empezar los
motores paso a paso pueden tener un número de hilos desde 4 en adelante.

Yo voy a usar un típico motor bipolar para no complicarme la vida. Un NEMA 17 , que es un Stepper muy potente y uno de los típicos, de por ejemplo
las impresoras 3D, de 4 hilos.

Recordad que necesitamos usar 4 pines para controlar un motor bipolar, y atentos al
conectar los hilos, que aquí sí que importa el orden, y si los ponéis al azar el motor hará
cosas raras.

Muchas veces no está muy claro el orden en que debe ponerse los hilos, porque además
hay fabricantes que los suministran con un conector mono y otros simplemente con los
hilos colgando (Para ahorra hasta los céntimos, que la competencia es feroz)

Si no tenéis claro como conectarlos probad a seguir el mismo orden que os fija la salida
del motor y haced una prueba con cuidado. En mi caso voy a conectar las dos bobinas
de mi motor (Son 4 hilos en total) a los conectores M3 y M4 asegurándoos que dejáis libre
el borne rotulado como GND (Que se usaría para Steppers de 5 y 6 hilos )

Os pongo una foto de mi montaje por si os sirve a alguien:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Si vuestro motor paso a paso es de 5 hilos, habrá uno que es el común y lo conectáis a GND. Y si es de 6 hilos basta con unir el punto medio de
ambas bobinas y conectadlos directamente al GND

PROGRAMA DE CONTROL

El programa para controlar Steppers es muy similar al de los motores de continua, pero, naturalmente tiene sus propias manías, que veremos
enseguida Empezamos con las definiciones previas habituales:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_MS_PWMServoDriver.h"

Y definir las instancias precisas de cada motor:

Adafruit_MotorShield AFMS = Adafruit_MotorShield();


Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2)

En el setup usamos begin para inicalizar el motor y fijamos la velocidad de giro:

void setup()
{ AFMS.begin();
myMotor->setSpeed(10); // 10 rpm
}

Aquí la curiosidad radica en que lo que pasamos la velocidad es el número de revoluciones por minuto que queremos y podemos ir ya al loop:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void loop()
{ Serial.println("Single coil steps");
myMotor->step(100, FORWARD, SINGLE); // Avanza 100 pasos
myMotor->step(100, BACKWARD, SINGLE); // Retrocede 100 pasos

Serial.println("Double coil steps");


myMotor->step(100, FORWARD, DOUBLE);
myMotor->step(100, BACKWARD, DOUBLE);

Serial.println("Interleave coil steps");


myMotor->step(100, FORWARD, INTERLEAVE);
myMotor->step(100, BACKWARD, INTERLEAVE);

Serial.println("Microstep steps");
myMotor->step(50, FORWARD, MICROSTEP);
myMotor->step(50, BACKWARD, MICROSTEP);
}

La librería nos permite manejar las bobinas del motor de los diferentes modos posibles y que ya vimos en sesiones previas (Y por eso si no entiendes
nada, es buen momento para que las eches una ojeadilla)

Aquí va un mini video con el resultado de este programa y un motor Nema 17:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Como no quisiera ponerme aún más pesado de lo habitual y en atención a nuestros sufridos lectores, dejaremos para la próxima sesión como mover
servos con este Shield y también daremos un repaso a cómo usar varios Shields apilados para manejar más motores de los que un único Motor
Shield V2 puede abarcar.

RESUMEN DE LA SESIÓN

  Hemos visto las posibilidades y el interés del Adafruit Motor Shield V2.

 Diseñada para suplir las limitacions del Motor Shield V1

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


 Presentamos un par de programas sencillos para mover tanto motores de continua CC como paso a
paso o steppers.

Anterior Siguiente

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

ADAFRUIT MOTOR SHIELD V2 II


Controlando servos y apilando shields

Home 
 Adafruit Motor Shield V2 II

OBJETIVOS

  Seguimos con el Adafruit Motor Shield V2 .

 Ver como conectar un par de servos a él.

 Mostrar un programa sencillo para mover un par de servos.

 Mostrar como apilar Shields y como cambiar sus direcciones I2C.

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


9.60€ + 15.00€

IVA + IVA

ARDUINO
UNO REV 3 MOTOR SHIELD
V2
 Añadir al
 Añadir al
carrito
carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


9.20€ +
IVA

SERVO
FUTABA
MG945
 Añadir al
carrito

Esta sesión es poco más que una traducción libre del magnífico documento de Adafruit sobre este Shield y que podéis encontrar aquí, y en el
que encontrareis una información mucho más extensa sobre este Shield, de lo que pretendemos en este sencillo tutorial.

MOTOR SHIELD V2

En la sesión previa como hablamos de cómo usar este Motor Shield V2 para controlar motores CC y Steppers o paso a paso y también comentamos
porque este Shield era de lo más interesante porque aceptaba intensidades del doble de lo que aceptaba el V1.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Esto está muy bien, pero su gran ventaja no era tanto esto como el hecho de que permite apilar estos Shields para el caso de que necesitemos
manejar más de 4 motores CC o más de 2 Steppers.

Si. Eso significa que puedes poner un Shield V2 encima de otro y así hasta un número ridículamente grande e Shields ( Como 32 ), lo que permite
manejar hasta 128 motores CC o 64 Steppers.

No es fácil imaginar que proyecto puede requerir semejante número de motores, pero Adafruit ha aplicado el conocido principio de “Mas madera…”
y que por nosotros no quede.

Como cada Shield incorpora un controlador I2C basta con cambiar la dirección de cada Shield y asegurarnos de que no hay conflicto de direcciones,
para tener el asunto resuelto y a otro tema.

En esta sesión trataremos este tema de como fijar esta dirección I2C del Shield, no solo para poderlos apilar, sino también por si en algún momento
queréis usar este Shield en combinación con algún otro dispositivo, con la mala fortuna de que tengáis un conflicto de direcciones.

Veremos cómo cambiar esta configuración, y veremos también, en la próxima sesión, que hay otros Shield de Adafruit que utilizan el mismo sistema
para cambiar el direccionamiento I2C.

Pero antes y para descansar un poco, veremos cómo usar Servos con este Shield, porque lo dejamos en la última sesión para no ponerme
demasiado pesado, y estaba pendiente.

MOTOR SHIELD V2 Y SERVOS

Los servos son unos motores de lo más simpáticos que básicamente se diseñan, no para que giren a una determinada velocidad, sino más bien, para
giren un cierto ángulo y se mantengan allí quietos.

Imaginad un timón de un barco o los alerones de un avión. Quieres darle una señal de control y que el motor tome una posición angular sostenida

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


que ayude a dirigir la nave.

 También hay servos de 360º que giran de continuo y de los que hablaremos en algún
momento en el futuro.

.
Ya hemos hablado en más de una ocasión de los servos y por eso no quisiera repetirme, y el objetivo de este rollo. simplemente era hacer las
presentaciones y mostraros como los podemos usarlos cómodamente desde el Motor Shield V2 .

Para empezar este Shield no está pensado para muchos servos, no señor, solamente permite 2. En el futuro hablaremos de un Shield pensado para
manejar un gran número de servos (Que asombrosamente recibe el creativo nombre de Adafruit Servo Shield ), pero en este caso permite un par de
ellos además de los motores CC y pasó a paso que ya vimos.

El Shield V2 dispone de 2 conectores tipo servo junto a la entrada de USB:

Están rotulados como Servo 1 y 2 y un poco más a la derecha podéis ver que los pines de control son el 10 y 9 respectivamente. El único problema
que podéis tener con los servos es que cada fabricante pinta los cables de color que se le pone y no es fácil a veces saber cuál es cual.

Los servos tienen siempre tres hilos: GND, Vcc y señal. Si la cosa fuera tan fácil que los fabricantes se pusieran de acuerdo y pusieran el Vcc en rojo
( Esto prácticamente se cumple siempre) y el GND en negro ( Normalmente es así ) el otro seria la señal y no habría confusión posible.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Pero como sois gente despierta, ya sospecháis que esto sería demasiado fácil y no van a desaprovechar una ocasión de ser unos capullos. ¡¡Faltaría
más!!

Por eso parece un buen momento para pintar aquí una tablita con el código de colores que suelen emplear, dependiendo del fabricante:

Por ejemplo los servos que yo voy a usar en este tuto son tan simpáticos que son Marrón, Rojo y Amarillo ( Es por subir el nivel ). Por lo demás es
bastante fácil conectar los servos:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Y para manejarlos podéis usar el programa de siempre porque los servos no tienen problemas.

CONTROLANDO LOS SERVOS

Los servos se controlan muy fácil con un programa como este:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


#include <Servo.h> // Incluir la librería Servo
Servo servo1; // Crear un objeto tipo Servo llamado servo1
Servo servo2;

void setup()
{ servo1.attach(9) ; // Conectar servo1 al pin 9
servo2.attach(10);
}

void loop()
{ servo1.write(0);
servo2.write(120);
delay(400);

servo1.write(30);
servo2.write(90);
delay(400);

servo1.write(60);
servo2.write(600);
delay(400);

servo1.write(90);
servo2.write(30);
delay(400);

servo1.write(120);
servo2.write(0);
delay(400);
}

Incluimos la Liberia Servo y creamos dos objetos del tipo servo1 y servo2, y después simplemente escribimos el ángulo que queremos que gire.

Para darle algo de gracia vamos a mover dos servos diferentes al revés y que el video quede un poco más vistoso ( Y porque si no, me aburro ). Aquí
tenéis un mini video con el resultado:
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
ALIMENTANDO LOS SERVOS

Según viene de fábrica el Motor Shield V2 , alimenta directamente los servos mediante el regulador de Arduino lo que supone una limitación
importante de potencia. Si usáis un par de servos sin carga, como en el ejemplo que os he puesto en el vídeo, no habrá problemas, pero en cuanto
metáis un servo de una cierta potencia o le pidáis un cierto esfuerzo, el alimentador de Arduino se demostrará insuficiente.

Además si la intensidad se agacha, son muy probables daños irreparables en tu Arduino o en los servos y no es cosa de broma porque al final
pueden valer pasta.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Por eso, si prevéis que vamos a necesitar un poco más de potencia de la que Arduino puede suministrar es buena idea usar los conectores que el
Shield V2 trae para alimentación externa de los servos:

El recuadro rojo destaca los conectores verdes que disponéis al efecto, pero ( No iba a ser tan fácil ) estos conectores vienen unidos por una pista del
circuito impreso a Vcc y GND por lo que si queremos usar una tensión diferente es necesario cortar una pista del circuito impreso o PCB

Aquí tenéis localizada la pista a cortar:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


APILANDO SHIELDS V2 DE ADAFRUIT

Ya hemos comentado que este Shield tiene la agradable propiedad de permitir apilar múltiples unidades una encima de otra, hasta 32 unidades. De
este modo el número de motores que podemos controlar crece con facilidad hasta un número descabellado.

La ventaja de incluir controladores I2C en el propio chip permite que cambiemos la dirección I2C de cada Shield y por eso pueden trabajar en
paralelo.

Como además el propio Shield incorpora un chip de gestión del PWM , no hay que preocuparse por la precisión de estos aun cuando el número de
motores sea alto.

La única condición es que la dirección I2C de cada Shield sea distinta ( Recordad que el bus I2C está pensado para conectar múltiples dispositivos a
los mismos hilos de comunicaciones)

 Cuidado: Por muchos Shields que apiles, el número de servos posibles siguen siendo solo 2, porque estos
están unidos a los pines 9 y de 10 de Arduino

 Pronto veremos un Shield dedicado a manejar múltiples servos, pero no es este.

Fíjate en esta zona:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Hay 5 pares de conexiones en vertical aisladas por defecto. Cada uno de esos pares representa un digito binario para la dirección. El par de la
derecha representa el bit menos significante y a medida que nos movemos hacia la izquierda son bits de más peso.

Si eso ha sonado raro, tranquilos que parece difícil pero es una tontería. De la misma manera que el numero binario 00010 representa los bits desde
el menos significante a la derecha hacia el más significante a la izquierda, lo hacemos en este caso.

La idea es que montas el número binario soldando el par que te interesa y como hay 5 pares puedes hacer 2 5 combinaciones, o sea 32 y por eso el
límite del máximo número de Shields que puedes apilar ¿Qué te parece ?

La dirección base del Shield V2 viene de fábrica a 0x60 hex y la dirección final se calcula sumándole el numero binario que soldéis con estos pares.

Por ejemplo, si sueldas los 2 pares de la derecha, habrás configurado el número 3, 00011 en binario y asignarás la dirección 60+3 = 0x63 hex. Eso es
todo.

Cuando envías una orden al motor Shield V2 , puedes omitir la dirección hexadecimal del mismo pero entonces Arduino asumirá que es la dirección
0x60. Para ordenar algo a un Shield con dirección diferente, tienes que especificar la dirección concreta para quien es la orden y por eso puedes
manejar más motores sin más que especificar a que Shield está conectado. ¿Elegante. a que si ?

Quedaros con la copla porque volveremos a ver más Shields que usan este mismo sistema para asignar direcciones.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
RESUMEN DE LA SESIÓN

  Hemos visto mas posibilidades del Adafruit Motor Shield V2 .

 Vimos como conectar servos a él

 Presentamos unos programas sencillos para mover un par de servos.

 Vimos como asignar y cambiar la dirección I2C de cada Shield.

 Vimos que podíamos apilar estos Shields para aumentar el número de motores a controlar.

Anterior Siguiente

(13) Comments

Antonio 21 Mar 2017


Buenas, enhorabuena por estos magníficos tutoriales.
Me gustaria apilar dos shields, no se como distingir entres los motores de un y otro shield, entendi lo de las direcciones
Reply pero mi nivel del uso de Arduino no atina donde meter esta direccion para distiguir un o otro shield, es posible una
ayuda?
Gracias.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Ivan 21 Mar 2017
Al principio del programa es donde le dirías que dirección tienen los shield con estas instrucciones:

Reply Adafruit_MotorShield AFMS1(0x61); // Rightmost jumper closed


Adafruit_MotorShield AFMS2(0x60); // Default address, no jumpers

En el setup los inicializas:

AFMS1.begin(); // Start the bottom shield


AFMS2.begin(); // Start the top shield

Luego sólo tienes que llamar cada vez al shield que necesites, por ejemplo:

// On the top shield, connect two steppers, each with 200 steps
Adafruit_StepperMotor *myStepper1 = AFMS1.getStepper(200, 1);
Adafruit_StepperMotor *myStepper2 = AFMS1.getStepper(200, 2);

// On the bottom shield connect a stepper to port M3/M4 with 200 steps
Adafruit_StepperMotor *myStepper3 = AFMS2.getStepper(200, 2);
// And a DC Motor to port M1
Adafruit_DCMotor *myMotor1 = AFMS2.getMotor(1);

Antonio 21 Mar 2017


Muchas gracias por la ayuda, lo probe y va perfecto.

Reply

Ivan 22 Mar 2017


Estupendo!

Reply

Antonio 19 Mar 2017


PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Gracias por estos magníficos tutoriales.
Una pregunta, si apilo dos o mas shield, como ago para llamar a un o otro motor conectado a cada shield?
Supomiendo tener dos shields con dos motores paso a paso cada uno.
Reply

Ivan 21 Mar 2017


Hola Antonio, como los shields son I2C, tienes que soldar los pines que valen para cambiarle la dirección para poder
diferenciarlos. Y una vez hecho eso llamas a cada shield por su dirección. Te dejo un enlace que te puede ayudar y si
Reply no entiendes algo nos comentas. Un saludo.
https://learn.adafruit.com/adafruit-motor-shield-v2-for-arduino/stacking-shields

eric 16 Jul 2016


He comenzado por el esquema eléctrico de la botonera y la conexión con al ATX . No he podido encontrar el ADAFRUIT
entre los componentes , pero imaginar que el ADAFRUIT esta acomplado encima. Sería correcta esta configuración
Reply electrica?

Al adafruit tendría que conectarle por ejemplo en +12 v el pin 11 del ATX y en GND el pin 24 con los bornes de
alimentación del Adafruit . Creo que hasta ahora estoy en lo cierto , pero agradezco cualquier ayuda o correción.
Gracias.

Esquema:
https://drive.google.com/file/d/0B7E0rOkFsC59RGpOekxFcERwWEE/view?usp=sharing

ERIC 15 Jul 2016


Hola !

Reply Gracias por la fantástica web que tenéis , estoy encontrando un montón de información .

Tengo algunas dudas.


Gracías a esta entrada
https://www.prometec.net/adafruit-motor-shield-v2/

descubrí los como usar los motores paso a paso y los diferentes tipos de movimientos que pueden hacer.
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
Single coil steps, Double coil steps, Interleave coil steps, Microstep steps

Y gracias a esta entrada aprendí como usar las fuentes ATX ( la verdad es que muy muy interesante) y ademas de como
encenderla con un pulsador y con un led a modo de ” test” de que todo esta correcto .

https://www.prometec.net/fuentes-atx/

Ahora pregunto yo …

Sería posible unir las dos cosas? Es decir :

Utilizar la ATX para darle alimentación al Adafruit Motor Shield V2 y ademas que la acción del motor fuera cordinada con
una botonera? Un botón para ” Adelante” y un botón para ” Atras ”

Alguna ayuda?

gracias.
EG

admin 15 Jul 2016


Naturalmente que si Eric. No vas a tener problemas porque ya has visto como manejar los motores y con el mismo
arduino puedes gobernar la fuente ATX.
Reply
De hecho te recomiendo que uses la fuente ATX para alimentar tanto el arduino a 5V directamente como los motores
a 12V,

ERIC 16 Jul 2016


Muchas gracias admin ,

Reply ahora no lo que no veo tan claro es como hacerlo… alguna sugerencia por donde empezar? estoy mas
perdido que un pulpo en un garaje. !

gracias.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


admin 17 Jul 2016
No le tengas miedo. Sigue la sesion de como usar la fuente ATX para alimentar tu arduino y
despues conecta los motores a 12 de la salida d ela fuente
Reply

Juanma 05 Abr 2016


Una pregunta cuando te compras el SHIELD V2 de Adafruit y te llega a casa ya lo unes con el arduino o hay que soldar?
gracias
Reply

admin 05 Abr 2016


Hla Juanma, No. El modelo que traemos viene soldado y montado, no tienes mas que enchufar tus motores y listo

Reply

GIVE A REPLY

Message

Name (required) Email (required)

URL
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
URL

Post comment
WordPress
WordPress Anti-Spam
Anti-Spam by
by WP-SpamShield
WP-SpamShield

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

ARDUMOTO SHIELD Y L298


Controlando motores de un cierto consumo con Arduino

Home 
 Ardumoto Shield Y L298

OBJETIVOS

  Presentar el chip L298, dual full bridge para control de motores.

 Presentar el Shield Ardumoto.

 Consumo de hasta 2 Amperios por cada motor.

 Ver la forma de programar su uso.

MATERIAL REQUERIDO.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


9.60€ + 16.00€

IVA + IVA

ARDUINO
UNO REV 3 ARDUMOTO
SHIELD
 Añadir al
 Añadir al
carrito
carrito

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


6.20€ +
IVA

RUEDA +
MOTOR
 Añadir al
carrito

Esta sesión es poco mas que una traducción libre de la página de Sparkfun Ardumoto Hookup guide

MÁS SOBRE MOTORES DE CC

Ya vimos en varias sesiones anteriores como manejar motores de corriente continua (CC) directamente mediante señales PWM y también como usar
un sistema un poco más cómodo para manejar 4 motores mediante el Motor Shield V1.

Vimos que este Motor Shield V1, era cómodo y práctico para mover hasta 4 motores CC, y la pregunta es entonces ¿Por qué ver más chips /
Shields de control de motores?

La realidad es que el Motor Shield V1 es un juguete esplendido para iniciaros con el control de motores en Arduino y por muy poco dinero, pero
PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API
enseguida encontrareis que este Shield V1 está un poco limitado por la intensidad máxima que toleraba en su diseño, y que no podía sobrepasar 0,6
Amp, lo que no da para mucho en cualquier proyecto en el que tengáis que usar motores de continua con algo más de consumo.

En cuanto empecéis a buscar motores de una cierta potencia veréis que el consumo se dispara con rapidez impidiendo usar drivers sencillos como los
que hemos visto hasta ahora.

Por eso el mercado, siempre atento a las oportunidades, nos brinda otras soluciones cuando la carga a mover crece, y una solución es utilizar drivers
cuya capacidad de carga sea un poco superior.

No es difícil encontrar chips y Shields para Arduino que resuelven este problema, pero la documentación suele ser el primer defecto de muchas de
estas soluciones (Por su inexistencia) y el precio puede crecer muy rápidamente sino se elige con cuidado.

Por eso, entre las muchas soluciones disponibles, hemos optado por presentaros un chip típico para estas ocasiones, el L298 , que es muy
interesante porque nos permite gobernar dos motores de continua, con una carga de hasta 2 Amperios por cada uno, e incluye todo lo necesario
para invertir la dirección de movimiento de estos y para controlar la velocidad de giro. Todo en un único chip.

Es muy frecuente encontrar este chip gobernando pequeños robots de dos ruedas y en esta sesión presentaremos este chip L298 y también un
Shield llamado Ardumoto que nos permitirá controlar con comodidad un par de motores de corriente continua de un modo conveniente sin
necesidad de grandes desembolsos.

FULL-BRIDGE MOTOR DRIVER DUAL L298

Vamos a empezar viendo un poco las características del L298 . Básicamente este chip es un controlador doble full bridge, es decir que permite
manejar dos motores (De corriente continua o de paso a paso) y controlar tanto la velocidad como el sentido de giro de ambos motores.

Se presenta en dos versiones, en formato para soldar a una PCB (O protoboard) y en formato SMD, de soldadura en superficie que resulta un poco

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


más complicado de soldar en casa:

Según su data sheet, puede entregar hasta 50V a los motores manteniendo 2Amp de carga y hasta 3Amp de pico (Que mejor no sea sostenido, si os
gusta vuestro chip)

2 Amperios sostenidos es ya un consumo medio y con una cierta capacidad para desarrollar trabajo, por lo que este chip es muy apreciado en esos

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


pequeños proyectos que tienen que mover por ejemplo un par de ruedas, o elevar un cierto peso. También se recomienda si tenéis que excitar
solenoides o relés de un cierto tamaño cuyo consumo excede los mínimos que hemos visto hasta ahora.

Por eso os lo encontrareis una y otra vez en diferentes proyectos Arduino, porque es un chip competente, muy extendido y de precio moderado, y
en muchas ocasiones se encuentra ubicado en un Shield como el que vamos a usar en esta sesión…

ARDUMOTO SHIELD

La manera más cómoda de usar este chip es mediante un pequeño shield que nos permita conectarlo a nuestros Duinos, sin demasiada
complicación y el Ardumoto Shield es uno diseñado con esa intención. Originalmente diseñado por SparkFun, ha sido rápidamente copiado por los
fabricantes chinos que ofrecen replicas directas del mismo.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Incluye dos únicos bridge, lo que nos limita a dos motores CC o a un único paso a paso , pero a cambio tenemos todo el control mediante pines
directos de Arduino.

También podéis apreciar que dispone de una pequeña área de pruebas y prototipos, donde podréis soldar componentes adicionales, como LEDS,
Bluetooth o WIFI o cualquier otra cosa que se os pueda ocurrir, y que siempre viene bien cuando montas motores.

El shield utiliza 2 pines de Arduino para controlar cada motor. Uno regula la dirección de giro y el otro la velocidad mediante una señal PWM, lo que
hacen un total de 4 pines dejando libres el resto.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


El Ardumoto Shield se reserva los pines 12 y 13 para controlar la velocidad, y los pines 3 y 11, para controlar el sentido de giro de los motores A y B
respectivamente.

PIN ARDUINO USO NOTAS

3 PWM Motor A Valores de 0 a 255

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


11 PWM Motor B Valores de 0 a 255

12 Sentido Motor A Es un Bool True / False

13 Sentido Motor B Es un Bool True / False

A mano izquierda podéis ver las conexiones para los motores A y B, así como un conector para alimentar los motores independientemente de la
alimentación de Arduino.

No tiene demasiada importancia en qué orden conectáis los cables de los motores, siempre y cuando lo tengáis claro. Os recomiendo que os fijéis en
los colores de los cables y conectéis ambos pares de igual modo para evitar sorpresas.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Fijares también, que a los laterales de donde conectamos los motores hay un par de LEDs de colores que indican el estado del motor y su sentido de
giro (En el video del final se aprecian bastante mejor) .

EL PROGRAMA DE CONTROL

El shield Ardumoto usa simplemente los pines de control que mostramos en la tabla más arriba, por lo que no requiere ninguna librería especial para
mover los motores sino que usamos Arduino y sus pines para controlar el L298N y por tanto la velocidad y sentido de los motores conectados.

El programa que nos presenta SparkFun es de lo más sencillo y le vamos a usar como ejemplo de control. Empezamos con algunas definiciones para
implicar el programa:

#define CW 0 //Sentido ClockWise


#define CCW 1 //Sentido Counter ClockWise

#define MOTOR_A 0
#define MOTOR_B 1

const byte PWMA = 3; // PWM control (speed) for motor A


const byte PWMB = 11; // PWM control (speed) for motor B
const byte DIRA = 12; // Direction control for motor A
const byte DIRB = 13; // Direction control for motor B

Y ahora vamos a definir un par de funciones sencillas de manejo. La primera la usaremos para arrancar uno de los motores con un sentido y
velocidad dados:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


void driveArdumoto(byte motor, byte dir, byte spd)
{ if (motor == MOTOR_A)
{ digitalWrite(DIRA, dir);
analogWrite(PWMA, spd);
}
else if (motor == MOTOR_B)
{ digitalWrite(DIRB, dir);
analogWrite(PWMB, spd);
}
}

Y la segunda es aún más sencilla, para parar el motor:

void stopArdumoto(byte motor)


{ driveArdumoto(motor, 0, 0); }

Y como tenemos que programar los pines, porque no tenemos una librería que nos haga el trabajo sucio, podemos definir una función que lo haga:

void setupArdumoto()
{ pinMode(PWMA, OUTPUT);
pinMode(PWMB, OUTPUT);
pinMode(DIRA, OUTPUT);
pinMode(DIRB, OUTPUT);

digitalWrite(PWMA, LOW);
digitalWrite(PWMB, LOW);
digitalWrite(DIRA, LOW);
digitalWrite(DIRB, LOW);
}

EL resto del programa tiene poco mérito. Básicamente vamos llamando a Ardumoto() para hacer girar los motores en diferente sentido y con distinta
velocidad.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


No pretende ser más que un pequeño ejemplo de como podéis realizar el control de los motores conectados al Ardumoto Shield. Prog_201

void loop()
{ // Mueve solo el Motor A, a diferentes velocidades
driveArdumoto(MOTOR_A, CCW, 255); // Motor A, avance a toda maquina
delay(1000); // Motor A girará 1 segundo

driveArdumoto(MOTOR_A, CW, 127); // Motor A, avance a media potencia


delay(1000);

stopArdumoto(MOTOR_A); // Parar Motor A

// Mueve solo el Motor B a varias velocidades


driveArdumoto(MOTOR_B, CCW, 255); // Motor B, retoceso a toda maquina
delay(1000);
driveArdumoto(MOTOR_B, CW, 127); // Motor B, avance media
delay(1000);

stopArdumoto(MOTOR_B); // Para Motor B

// Ahora girar ambos motores


driveArdumoto(MOTOR_A, CW, 255); // Motor A avance toda
driveArdumoto(MOTOR_B, CW, 255); // Motor B avance toda
delay(1000);

// Ahora retroceso a media maquina


driveArdumoto(MOTOR_A, CCW, 127); // Motor A at max speed.
driveArdumoto(MOTOR_B, CCW, 127); // Motor B at max speed.
}

Y solo nos queda un pequeño video mostrando el resultado final:

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


RESUMEN DE LA SESIÓN

  Hemos presentado el L298, un chip de doble bridge completo muy habitual en los montajes de pequeños
robots móviles.

 Hemos visto cómo usar el Ardumoto Shield.

 Presentamos un pequeño ejemplo de programación

 El Ardumoto Shield se puede usar para controlar dos motores CC o uno paso a paso .

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Anterior Siguiente

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


TIENDA ARDUINO RASPBERRY PI IMPRESORA 3D FORO CONTACTO

ÍNDICE BRAZO ROBOT DE DOS EJES


Soporte servos pan & tilt

Home 
 Índice Brazo Robot De Dos Ejes

Montaje del brazo robótico de dos ejes


Control del brazo robótico con un joystick.

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API


Brazo robótico y el Nunchuk de la Wii

Copyright Prometec

PDF created on http://www.htm2pdf.co.uk via the HTML to PDF API

Vous aimerez peut-être aussi