Shields y componentes 28

Analisis : MotorShield de Sparkfun

MotorShield de Sparkfun

En Ovtoaster nos hemos hecho con una MotorShield de Sparkfun y vamos hacer un pequeño análisis de sus características y una explicación de como ponerla a punto para su funcionamiento.

Como explicamos en el articulo ¿ Que es Arduino ? Las shields son placas que extienden las capacidades de nuestro Arduino, esta motorshield particularmente nos va a permitir controlar motores DC ( Corriente Continua ). Pero antes tenemos que saber que para nuestros proyectos electrónicos podemos utilizar tres tipos de motores:

 

Motores paso a paso
Son capaces de avanzar una serie de grados (paso) por cada pulso que se le aplique. Son utilizados en maquinas de gran precisión en las que se controla en todo momento la posición del motor, como por ejemplo robots, impresoras..

  •   Ventajas: alta precisión y repetibilidad en cuanto al posicionamiento
  •   Inconvenientes: caros y de conexión compleja

Un motor paso a paso

Servo-motores
Un servomotor es un motor eléctrico que consta con la capacidad de ser controlado, tanto en sentido de giro como en posición

  • Los Servomotores de Rotación Continua hacen uso de (PWM) para controlar la dirección o posición.
  • Los Servomotores permiten controlar la posición en un ángulo de 180º

Un servomotor

Motores de corriente continua
Sus características principales son :

  • Económicos
  • Facilidad de regulación de velocidad: en función de la tensión de alimentación mediante PWM
  • Inversión de giro al cambiar la polaridad de la alimentación, mediante puente en H con transistores o con un circuito integrado

Un motor DC

Puedes pinchar en los tipos de motores para ver una descripción de estos
¡¡¡Recuerda!!!

En este caso vamos a controlar motores de corriente continua ( Motores DC desde ahora ). Los motores DC se suelen utilizar cuando no necesitamos precisión, por ejemplo en las ruedas de un robot, estos motores son económicos y fáciles de conectar.

Los motores DC utilizan señales analógicas que se pueden simular mediante señales digitales con la modulación por ancho de pulso. Todo este proceso nos lo facilita la shield, de esta manera nos olvidamos de tener que montar un circuito para poder controlar el motor y tenernos que preocupar de cambiar la polaridad de la alimentación para que gire en el otro sentido.

Preparando la placa : Ensamblaje

MotorShield de Sparkfun sin montarA la shield le tenemos que soldar los pines que se conectaran a nuestra placa Arduino, que no nos de miedo porque es una tarea realmente sencilla, para cualquiera que ya allá soldado alguna vez esto sera coser y cantar y para quien no, la curva de aprendizaje es realmente pequeña, coge el estañador, estaño y unos cables desechables y practica unas cuantas veces antes de meterte con la placa.

Ensamblando las patillas

 

Tenemos que ir soldando uno por uno y tener cuidado de que no hagan contacto entre ellos, ni mas ni menos. Si nos equivocamos no pasa nada, podemos rectificar volviendo a calentar el estaño y retirándolo.

También tendremos que soldar los dos terminales donde irán los cables de los motores de la misma forma.

Preparando la placa : Conexión con Arduino

Una vez los pines estén ensamblados tenemos que conectar la shield a Arduino, los pines coinciden perfectamente, aun así tener cuidado de que no se tuerzan. Una vez coloquemos la shield tendremos los pines de Arduino en la shield.

Pines ocupados

Las shields extienden las capacidades de nuestro Arduino pero necesitan utilizar pines para su funcionamiento, en este caso la shield utiliza los pines 12 ( Dirección A ) y 3 ( PWM A ) para el control del motor en la salida 1/2 de la shield y los pines 13 ( Dirección B) y 11 ( PWM B) para el control del motor conectado a la salida 3/4 por lo que estos 4 pines no pueden ser utilizados si tenemos motores conectados, si no tenemos motores conectados o solamente tenemos uno podremos utilizar los pines destinados a estos motores no ocupados.

¿Solamente dos motores?

Se pueden controlar dos motores, pero se pueden conectar mas, es decir, si conectamos mas de un motor a las salidas 1/2 estos motores tendrán que funcionar en la misma velocidad y girar en el mismo sentido.

Esquema eléctrico

Como conectar los motoresa a la placa

El esquema eléctrico es muy sencillo, tenemos que conectar los cables negativos ( cable verde en el esquema ) a los pines 1 y 3 y los cables positivos ( cables amarillos en el esquema ) a los pines 2 y 4.

Esquema de la Placa

Os dejo el esquema elaborado por Sparkfun de la Shield :

Esquema Motor-Shield de Sparkfun

Ademas aquí teneis su Link de Descarga : Esquema

Programa de ejemplo

En este ejemplo modificamos todos los valores que podemos, es decir, velocidad de rotación y dirección por lo que el ejemplo nos sirve para controlar nuestros motores en cualquier proyecto.

EJ

 

 

int pwm_a = 3;   //El control PWN para el motor en los pines 1/2 esta en el pin digital 3 
int pwm_b = 11;  //El control PWN para el motor en los pines 3/4 esta en el pin digital 11
int dir_a = 12;  //El control de dirección para el motor en los pines 1/2 esta en el pin digital 12
int dir_b = 13;  //El control de dirección para el motor en los pines 3/4 esta en el pin digital 13

void setup()
{
  // Colocamos los pines de los motores en modo salida.
  pinMode(pwm_a, OUTPUT);  
  pinMode(pwm_b, OUTPUT);
  pinMode(dir_a, OUTPUT);
  pinMode(dir_b, OUTPUT);

 // En primera instancia colocamos la velocidad de los motores a 200/255 = 78%
  analogWrite(pwm_a, 200);        
  analogWrite(pwm_b, 200);

}

// Programa que se va ejecutar continuamente
void loop()
{
// Aqui controlamos la dirección de los motores pudiendo ser HIGH o LOW
  digitalWrite(dir_a, LOW); 
  digitalWrite(dir_b, LOW); 

  delay(1000);

// Cambiamos la velocidad de los motores a 255/255 = 100%
  analogWrite(pwm_a, 255);      
  analogWrite(pwm_b, 255);

  delay(1000);

// Cambiamos la dirección de los motores
  digitalWrite(dir_a, HIGH); 
  digitalWrite(dir_b, HIGH); 

  delay(1000);

}

En funcionamiento

Un vídeo de dos motores controlados por la shield, se puede observar como los leds de la shield cambian cuando los motores cambian de sentido.

¡¡Quiero una!!

Antes de nada decir que existen muchas placas que realizan esta función a la perfección, no tenemos porque comprar la de Sparkfun.

En este caso la placa la hemos comprado en la tienda BricoGeek, os dejo el enlace a la placa : http://www.bricogeek.com/shop/shields-arduino/429-ardumoto-driver-de-motores-para-arduino.html, pero también se puede comprar en otras tiendas. Personalmente me gusta Bricogeek, nunca me han dado problemas y los precios no están mal ademas los envíos en España son muy rápidos.

Cuidado!
Tanto los pines como los terminales para los motores no vienen incluidos con la shield, por lo que tendremos que comprarlos aparte ( las dos cosas no superan los 2€ )

Sobre el autor / 

AsierPH

Entusiasta de las tecnologías libres y fundador de OvToaster.com | “Las obras de conocimiento deben ser libres, no hay excusas para que no sea así“

Articulos relacionados

28 comentarios

  1. Fernando 20 abril, 2014 at 10:30 pm -  Responder

    He juntado sin querer un cable entre GND iy VIN y ha pegado un chispaz y huele a quemado. He metido un programa para ver si hace algo y no funciona. Y me he dado cuenta que hay un chip m7 que esta como partido.
    Como se si ha roto el ardumoto o el arduino o las dos cosas, para poder comprar otro. Gracias

    • AsierPH 21 abril, 2014 at 1:47 pm -  Responder

      Pues lo mejor es que pruebes por separado, primero prueba el Arduino con un programa sencillo, si esta no funciona sustituye solamente esta y si funciona prueba el ardumoto conectado, si no funciona es problema del segundo.
      ¡¡Fernando hay que tener cuidado!! 😉

  2. Fernando 15 abril, 2014 at 7:20 pm -  Responder

    Y como se si le llega bien la señal? Hay alguna manera de comprobarlo?

  3. Fernando 15 abril, 2014 at 3:38 pm -  Responder

    Entonces si cojo el codigo de arduino que viene en su pagina tal cual y solamente cambio el 10 por el 3, segun te he dicho estaria bien no?

    • AsierPH 15 abril, 2014 at 4:18 pm -  Responder

      Si cambias los pines de su shield por las de la tuya debería funcionar correctamente si.
      Lo mas importante que tienes que saber es que Arduino funciona según la señal que le llega en la serial, si consigues que le llegue esa señal correctamente ( con el programa en processing y todo ) ya lo tienes prácticamente terminado.

  4. AsierPH 15 abril, 2014 at 8:32 am -  Responder

    Los pines de los motores son indiferentes para el funcionamiento de todo el conjunto, el Arduino por donde recoge los datos para funcionar es desde la conexión serial para despues utilizar este código en los condicionales y actuar en los motores ( en los pines ). El ardumoto funciona con los pines que tienes en el articulo.
    Asegurate de que el serial esta bien conectado por que es por donde Arduino recibe los datos.
    En la parte de processing y demás no puedo ayudarte, lo siento.

  5. Fernando 14 abril, 2014 at 4:16 pm -  Responder

    Lo he ejecutado y debajo en un cuadro negro me salta unas frases naranjas, pero no veo nada que ponga error o algo por el estilo.
    Tampoco entiendo mucho del programa, estoy buscando alguien que entienda de Processing. Mira a ver si sabes de alguien.

    Creo que el problema viene del arduino. En el proyecto conecta los motores con una “motor shield r3” y yo lo estoy haciendo con el “ardumoto” la unica diferencia que tiene es que yo utilizo los pines 12 ( Dirección A ) y 3 ( PWM A ) para el control del motor en la salida 1/2 de la shield y los pines 13 ( Dirección B) y 11 ( PWM B) para el control del motor conectado a la salida 3/4

    En el shield suyo utiliza utiliza los pines 12 ( Dirección A ) y 10 ( PWM A ) para el control del motor en la salida 1/2 de la shield y los pines 13 ( Dirección B) y 11 ( PWM B) para el control del motor conectado a la salida 3/4

    Cambia el pin 3 del ardumoto por el pin 10 en la shield

  6. Fernando 14 abril, 2014 at 11:20 am -  Responder

    No me funciona la ultima parte del Processing.
    Una vez metido y conectado, llego al paso donde se tiene que ver la imagen y eso lo hace perfecto.
    Pero cuando meto el programa del Processing no me funciona. Sabes cual puede ser el problema

    • AsierPH 14 abril, 2014 at 3:18 pm -  Responder

      Buenas Fernando,
      Pues la verdad es que creo que en esto no te puedo ayudar como es debido, según leo en el proyecto se conecta mediante ssh a la raspberry y con el programa en processing mandas las instrucciones. ¿Consigues ejecutar el programa y no funciona correctamente o directamente no consigues ejecutarlo?

  7. Fernando 24 marzo, 2014 at 4:53 pm -  Responder

    Muchisimas gracias eres crack!!
    En cuanto tenga todo montado y vea que funciona, te mando un video con todos los detalles no te preocupes
    Un abrazo

  8. Fernando 24 marzo, 2014 at 10:02 am -  Responder

    Lo que hace ahora el coche creo que esta bien con respecto lo que indica el programa que tiene qe hacer:
    1º El coche va hacia adelante durante 2 sg.
    2º Depues va para atras otros 2 sg.
    3º Se para el coche durante 2 sg.
    4º Gira las ruedas delanteras hacia la izquierda y va hacia atras durante 2 sg.
    5º Gira las ruedas delanteras hacia la derecha y continua hacia atras 2 sg.
    6º Continua hacia atras con las ruedas giradas durante 2 sg.

    Observacion: despues el punto 3º cuando se para coche, funciona hacia atras porque no hay ninguna funcion que le indique que vaya para adelante, entonces lo que he hecho es poner un adelante(); justo antes la funcion izquierda en el void loop asi:

    // Girar a la izquierda
    analogWrite(pwm_a, velocidad);
    analogWrite(pwm_b, velocidad);
    adelante();
    izquierda();
    delay(2000);

    Ahora en los puntos 4º 5º y 6º el coche va hacia adelante

    • AsierPH 24 marzo, 2014 at 11:12 am -  Responder

      Buen trabajo Fernando! Bien aquí tienes el código para la versión completa : http://ovtoaster.com/wp-content/uploads/ProgramaModificado1.zip
      Para que este funcione hace falta que la Raspberry este conectada al serial como indica en el proyecto inicial!
      Una vez tengas todo montado comentame si todo esta bien y si puedes enseñame un vídeo para ver como mola jajaja

  9. Fernando 23 marzo, 2014 at 10:46 am -  Responder

    Como hago para saber eso??
    Yo al principio del programa tengo definido esto
    int dir_a = 12;
    int dir_b = 13;
    int pwm_a = 3;
    int pwm_b = 11;

    Y para mi tambien es complicado perdona por no aclararte mucho pero es que de arduino no entiendo mucho que digamos jajaja
    A ver como te he dicho el motor de atras va conectado a los pines 3/4 y el delantero a los pines 1/2
    Creo que dir_a=12 es la que controla el sentido y que dir_b=13 es la que controla la direccion

    • AsierPH 23 marzo, 2014 at 2:59 pm -  Responder

      No te preocupes :), nos esta costando mas de la cuenta por esto pero lo sacamos poco a poco.
      Aquí tienes http://ovtoaster.com/wp-content/uploads/ProgramaPrueba2.zip
      Prueba este código y dime como actúa, según las indicaciones que me das es como debería funcionar, si en algún caso va hacia el lado contrario o lo que sea cambia el valor HIGH y LOW entre ellos, pero en principio así esta bien.
      Comentame a ver que tal!

  10. Fernando 22 marzo, 2014 at 10:51 pm -  Responder

    A ver te cuento
    Los dos motores que tengo son de continua como los que tienes en el video que tu has hecho. Y los he conectado a los pines que has conectado tu a los tuyos
    El motor de atras tiene un cable marron que lo he conectado al pin 3 del ardumoto, y un cable azul que esta conectado al pin 4
    El motor de delante tambien es de continua pero tiene como te he dicho tienes unos engranajes que le hacen girar para un lado u otro. Tiene un cable amarillo que lo he conectado al pin 1 y un cable verde que va conectado al pin 2.
    Luego he metido en el programa esto:

    void izquierda()
    {
    digitalWrite(dir_a, HIGH);
    digitalWrite(dir_b, HIGH);
    }
    void derecha()
    {
    digitalWrite(dir_a, LOW);
    digitalWrite(dir_b, LOW);
    }
    y en el void loop despues he puesto esto:

    analogWrite(pwm_a, velocidad);
    analogWrite(pwm_b, velocidad);
    izquierda();
    delay(2000);
    derecha();
    delay (2000);

    y lo que hacia es primero girar a la izquierda y despues a la derecha
    Te vale con esta explicacion?

    • AsierPH 22 marzo, 2014 at 11:33 pm -  Responder

      Vale, según cuentas ( y es difícil entender todo sin el aparato delante jajaja ) o el dir_a o el dir_b controlan la dirección, a ver si es posible que hagas un par de pruebas mas y me indiques cual de estos dos ( si el dir_a o el dir_b) es. Una vez que este identificado cual de los dos controla la dirección, abría que identificar cual hace cambiar de sentido los motores, para poder hacer ir hacia delante y hacia atrás. Si no es el dir_a es el dir_b y viceversa.
      Lo siento por no poder darte la respuesta directamente, pero es que sin tener el aparato delante se hace difícil identificar los pines y todo xD, haz esas dos pruebas ( para identificar la dirección y el sentido ) y dime cual es cual.

  11. Fernando 22 marzo, 2014 at 9:35 pm -  Responder

    Mira es este coche:
    http://www.super-hobby.es/products/Savanna.html
    Exacto el motor que va a las ruedas traseras es fijo, pero en cambio el motor de las ruedas delanteras tiene unos engranajes para que las ruedas puedan girar.
    Creo que el codigo que habias hecho consistia en apagar un motor y encender otro para poder girar
    Si me facilitas un correo o me escribes a mi correo, te puedo facilitar fotos para que veas como esta formado.

    • AsierPH 22 marzo, 2014 at 9:54 pm -  Responder

      ¿Y este engranaje donde va conectado? me refiero, ¿en que pin lo estas conectando en el Arduino? ¿Es como en el proyecto que estas montando que gira a la derecha y a la izquierda según el valor HIGH o LOW? Pruebame eso y si gira a la derecha y izquierda según HIGH y LOW, dime el pin en el que tienes conectado este mecanismo y te mando el código.

  12. Fernando 22 marzo, 2014 at 8:57 pm -  Responder

    Ahora mismo solamente tengo conectado el ardumoto a los motores, todavia no he conectado la raspberry ni nada.
    Y he metido el codigo de prueba que me has pasado, te voy a especificar exactamente lo que hace. Para que me puedas ayudar mejor
    1º: Gira las ruedas delanteras hacia la izquierda y va hacia delante con la ruedas giradas claramente durante dos segundos
    2º: Gira las ruedas hacia la derecha y mientras va hacia atras durante otros dos segundos
    3º: Se para el coche durante dos segundos(las ruedas aqui no vuelven a ponerse rectas siguen giradas a la derecha)
    4º: Las ruedas siguen giradas hacia la derecha y va mientras hacia adelante durante dos segundos
    5º: Gira las ruedas ahora hacia la izquierda y va hacia atras durante dos segundos
    6º: Continua otros dos segundos con las ruedas giradas a la izquierda y hacia atras (no va hacia adelante)

    Otra cosa he puesto una madera en medio para ver el movimiento de las ruedas, pero cuando lo bajo para que haga los movimientos no consigue andar hace el intento, yo pienso qe el chasis(plasticos del coche) lo hacen pesado.Cuando conecte la pila al arduino tendra mas fuerza, que ahora cuando lo conecto mediante el cable del ordenador?

    • AsierPH 22 marzo, 2014 at 9:21 pm -  Responder

      Hola Fernando,
      creo e cometido un fallo, bueno… mas que un fallo a sido un mal entendido, ¿me podrías decir como es el chasis y como van colocados los motores en el chasis? Ya me fije que en el código del proyecto había una variable para manejar una dirección, pero en un principio supuse que era una particularidad o extensión de la que tu no disponías, según me cuentas parece que las 4 ruedas no son fijas no? y si es el caso, ¿tengo que entender que conectando esa direccion a un pin va funcionar de la misma manera que en la de proyecto ese?
      Te pregunto todo esto para poder afinar mas el codigo xD

      Sobre lo que me comentas de las potencia del robot, todo depende de las pilas, yo normalmente uso una batería Lipo que ofrece mucha potencia. Creo que las pilas si deberían ofrecer mas potencia que el cable.

  13. Fernando 19 marzo, 2014 at 9:47 am -  Responder

    Me queda montar lo que es la raspberry y meter el programa.
    Entonces según el programa que me has enviado de arduino, no tengo que modificar nada en la raspberry. Lo demás sigue igual ¿no?
    Me podrías pasar el código de las funciones básicas, según tengo conectado los motores para ver si están bien o hay que cambiar los cables. Hacer una función donde por ejemplo: primero gire a la izq. luego a la derecha, después vaya hacia adelante y luego hacia atrás.

    • AsierPH 19 marzo, 2014 at 10:52 am -  Responder

      Si, el programa en Raspberry y todo lo demás es lo mismo, lo único que cambia es el modo de actuación en los condicionales.
      Aquí te dejo un código de prueba : http://ovtoaster.com/wp-content/uploads/ProgramaPrueba.zip
      Este código lo que hace es mover el “robot” de forma automática, entre cada función e metido un delay de 2 segundos que puedes modificar por si quieres mas tiempo( cambia el valor Delay(2000); a los milisegundos que quieras ).
      Por otra parte me preocupa que las funciones girar derecha y girar izquierda no funcionen correctamente, por el hecho de que estas dos funciones que yo te e pasado lo que hacen es girar sobre uno mismo, no girar según van hacia adelante, prueba lo que tienes e intenta montarlo completamente y después intentamos mirar si algo falla.

  14. Fernando 19 marzo, 2014 at 1:17 am -  Responder

    Muchas gracias de veras
    Estoy en ello en cuanto lo tenga te confirmo si me ha salido bien.
    Solamente una cosa segun has hecho el programa, mi intencion es la de meter el programa y poder luego manejarlo con el ordenador, mediante la conexion de la raspberry y todo eso.
    Lo que te quiero decir es que si el programa que me has hecho una vez metido en el arduino va a funcionar solo? o hasta que no conecte lo demas no voy a poder manejarlo.

    Otra cosa la instalacion del programa en raspberry pi tu sabrias manejarlo?
    un saludo

    • AsierPH 19 marzo, 2014 at 7:33 am -  Responder

      Vale tu confírmame,
      El programa de Arduino no te va funcionar independientemente por que en la linea de código que utilizas Serial.read(); estas leyendo por el serial el bit que te da la raspberry y en función de este bit los motores actúan de la forma elegida. Aun así se podría programar unas funciones básicas para hacer unas pruebas ( antes de instalar el montaje completo ).
      La verdad que raspberry no e manejado directamente ( quiero hacerlo ) pero son sistemas Linux normales y de eso si que entiendo, intenta montarlo a ver que sale y si tienes algún problema intento ayudarte en lo que pueda.

  15. Fernando 18 marzo, 2014 at 9:33 pm -  Responder

    Hola me gustaría saber si me puedes echar una mano.
    Mira me he puesto a hacer este proyecto: http://www.sistemasorp.es/2013/03/23/televigilancia-con-un-coche-rc-arduino-y-la-raspberry-pi/
    Y la motor shield que utiliza no es “ardumoto”, es un modelo antiguo que ya esta descatalogado. Entonces era para ver si puedes echar un vistazo al programa que hace en arduino (que viene en la pagina) y decirme que tengo que cambiar para que haga la misma funcion pero con el ardumoto
    Te agradecería mucho que me ayudases

    • AsierPH 18 marzo, 2014 at 11:23 pm -  Responder

      Muy buenas Fernando,
      Aquí te dejo el equivalente del código de ese proyecto para la shield ardumoto ( un zip con el codigo dentro ) : http://ovtoaster.com/wp-content/uploads/ProgramaModificado.zip
      A bote pronto y sin hacer pruebas, ese es el equivalente y debería funcionar de la misma manera, aun así puede que surja algún problema.
      Si la función izquierda y derecha hacen lo contrario ( esto depende de como conectes los motores ), cambia los valores HIGH y LOW unos por otros en las funciones izquierda() y derecha() y vuelve a probar.
      Otro problema puede ser que la función parar(); no cumpla como lo tiene que hacer, pero me imagino que si cumplirá.
      Prueba el programa y comentame que tal ha ido, si en algún caso se comporta como no debería, lo miramos e intentamos corregirlo.
      Un saludo y compartir es agradecer 😉

  16. galo 22 enero, 2014 at 2:17 am -  Responder

    congratulaciones, es un trabajo interesante para ponerlo en práctica.
    me gustaría saber si me ayuda indicado donde encontrar los esquemas.
    saludos
    gracias …

    • Ghz 22 enero, 2014 at 1:26 pm -  Responder

      Muchas gracias Galo! He actualizado el articulo con un nuevo apartado que contiene el esquema que me has pedido. Ademas también hay un enlace al pdf con el esquema.
      Un saludo!

Deja tu comentario

Tu correo no sera publicado. Los campos requeridos están marcados *