Archivo de la categoría: Motor cc

Control de motores brushless

En esta entrada aprenderemos a controlar un motor sin escobillas (brushless) usando Arduino y ESC. En caso de que desee más detalles sobre cómo funcionan los motores BLDC, puede ver el siguiente video que contiene una explicación del principio de funcionamiento de un motor sin escobillas y cómo controlar uno usando Arduino y ESC.

Para este ejemplo, tengo un motor A2212 con las siguientes especificaciones: tiene una clasificación de KV de 2200, se puede alimentar con una batería LiPo 2S, 3S o 4S y requiere 30A ESC. La clasificación KV en un motor sin escobillas define las RPM del motor por voltio sin carga.

A2212

En este caso, los 2200KV significa que, por ejemplo, si alimentamos el motor con una batería LiPo 2S que tiene un voltaje de 7,4 voltios, el motor puede alcanzar RPM máximas de 7,4 veces 2200, o sea, 16280 RPM.

Los motores sin escobillas consumen mucha energía y el método más común para alimentarlos es usar baterías LiPo. El número «S» de una batería LiPo indica cuántas celdas tiene la batería, y cada celda tiene un voltaje de 3,7 V.

Para este ejemplo, usaremos una batería LiPo 3S que tiene 3 celdas y es de 11,1 V. Entonces, puedo esperar que mi motor alcance un máximo de RPM de 24420.

Por último, aquí hay un ESC 30A que usaré para este ejemplo y coincidiré con los requisitos del motor. Por un lado el ESC tiene tres cables que controlan las tres fases del motor y por otro lado tiene dos cables, VCC y GND, para alimentación.

esc

También hay otro conjunto de tres cables que salen del ESC y esa es la línea de señal, +5V y tierra. Esta función del ESC se llama circuito eliminador de batería y, como sugiere el nombre, elimina la necesidad de una batería separada para un microcontrolador. Con esto, el ESC proporciona 5V regulados que pueden usarse para alimentar nuestro Arduino. Esta conexión es en realidad la misma que vemos en los servomotores.

Entonces, controlar un motor sin escobillas usando ESC y Arduino es tan simple como controlar un servo usando Arduino. Los ESC usan el mismo tipo de señal de control que el servo y esa es la señal PWM estándar de 50 Hz.

Brushless-motor-control-signal-50hz-PWM-same-as-servo-motor-768x487

Esto es muy conveniente, ya que, por ejemplo, cuando construimos un avión RC, generalmente necesitamos tanto servos como motores sin escobillas y, de esta manera, podemos controlarlos fácilmente con el mismo tipo de controlador.

Entonces, usando el Arduino, solo tenemos que generar la señal PWM de 50 Hz y, según el ancho de los pulsos o la duración del estado alto, que debe variar de 1 milisegundo a 2 milisegundos, el ESC impulsará el motor desde RPM mínimas hasta máximas.

Diagrama de circuito

Aquí está el diagrama del circuito para este ejemplo. Además del ESC, solo usaremos un potenciómetro simple para controlar la velocidad del motor.

diagrama

Componentes necesarios:

  • Motor sin escobillas
  • ESC 30A
  • Batería Li-Po
  • Placa Arduino
  • Potenciómetro
  • Protoboard y Jump Wires

Código Arduino para control

El código Arduino es realmente simple con solo unas pocas líneas de código.

#include <Servo.h>
Servo ESC;     // Creamos el objeto servo (ESC)
int potValue;  // valor dle potenciometro

void setup() {
  // Asociamos el ESC al pin 9
// (pin, min pulse width, max pulse width in microseconds)
ESC.attach(9,1000,2000);
ESC.writeMicroseconds(900); // send “stop” signal to ESC.
delay(4000); } void loop() { potValue = analogRead(A0); // (valores entre 0 and 1023) potValue = map(potValue, 0, 1023, 0, 180); // mapeamos ESC.write(potValue); // enviamos señal }

Descripción:

  • Necesitamos importar la librería Servo, porque con esta librería podemos generar fácilmente la señal PWM de 50 Hz, de lo contrario, las señales PWM que genera el Arduino están en diferentes frecuencias.
  • Necesitamos crear un objeto servo para el control ESC y definir una variable para almacenar la entrada analógica del potenciómetro.
  • En la sección setup(), usando la función attach(), definimos en qué pin Arduino es la señal de control del ESC conectado y también definimos el ancho de pulso mínimo y máximo de la señal PWM en microsegundos.

En la sección de loop(), primero leemos el potenciómetro, asignamos su valor de 0 a 1023 a un valor de 0 a 180 (mapaemos). Luego, usando la función write(), para enviar la señal al ESC o generamos la señal PWM de 50 Hz. Los valores de 0 a 180 corresponden a los valores de 1000 a 2000 microsegundos definidos en la sección setup().

Si subimos este código a nuestro Arduino y luego lo encendemos todo usando la batería, podemos controlar la velocidad del motor de cero al máximo usando el potenciómetro.

IMPORTANTE: Sin embargo, hay algunas cosas que debemos tener en cuenta aquí. Al alimentar inicialmente el motor, el valor de la señal debe ser igual o inferior al valor mínimo de 1 milisegundo. Esto se denomina armado del ESC, y el motor emite un pitido de confirmación para que sepamos que está armado correctamente. En caso de que tengamos un valor más alto al encender, lo que significa que aceleramos, el ESC no arrancará el motor hasta que aceleremos hasta el valor mínimo correcto. Esto es muy conveniente en términos de seguridad, porque el motor no arranca en caso de que tengamos el acelerador activado al conectar la batería.

Calibración ESC

Por último, expliquemos cómo funciona la calibración ESC. Cada ESC tiene sus propios puntos altos y bajos, y pueden variar ligeramente. Por ejemplo, el punto más bajo podría ser 1,2 milisegundos y el punto más alto podría ser 1,9 milisegundos. En tal caso, nuestro acelerador no hará nada en el primer 20% hasta que alcance ese valor de punto bajo de 1,2 milisegundos.

ESC-Calibration-Pulse-Width-High-and-Low-Point-adjustment-768x695

Para solucionar este problema, podemos calibrar el ESC o configurar los puntos altos y bajos como queramos. Para ese propósito, antes de encender el ESC, primero debemos acelerar nuestro potenciómetro al máximo o un valor al menos mayor que el punto medio actual. Luego, podemos encender el ESC y escucharemos algunos pitidos del motor que en realidad confirman que hemos establecido el nuevo punto alto.

Luego, pasados 2 segundos, debemos mover nuestro potenciómetro a la posición donde indicamos cuál será el nuevo punto bajo. Volveremos a escuchar los pitidos de confirmación y con eso hemos terminado con la calibración ESC. Ahora nuestro acelerador responderá de inmediato y podremos controlar el motor dentro de estos dos nuevos puntos.

Adafruit Motor Shield V2

Tiene la capacidad de manejar hasta 4 motores de CC o 2 motores paso a paso y dos servos, pero añade muchas mejoras.

Motor-Shield-V2

En lugar de un controlador darlington L293D, ahora tenemos los controladores MOSFET TB6612 con capacidad de corriente de 1,2A por canal (puede generar un pico de hasta 3A durante aproximadamente 20 ms a la vez). También tiene caídas de voltaje mucho más bajas en el motor, por lo que obtiene más torque de sus baterías, y también hay diodos de retorno incorporados.

En lugar de usar los pines PWM de Arduino, tenemos un chip controlador PWM totalmente dedicado a bordo. Este chip maneja todos los controles de motor y velocidad sobre I2C. Solo dos pines GPIO (SDA y SCL) más 5v y GND son necesarios para impulsar los múltiples motores, y dado que es I2C, también puede conectar cualquier otro dispositivo I2C a los mismos pines. Esto también lo hace compatible con cualquier Arduino, como el Uno, Leonardo, Due y Mega R3.

Diseño completamente apilable: 5 pines de selección de dirección significa hasta 32 shield apilables: ¡eso son 64 motores paso a paso o 128 motores de CC!

Veamos las especificaciones :

  • 2 conexiones para servos de 5V conectados al temporizador dedicado de alta resolución de Arduino.
  • 4 puentes H: el chipset TB6612 proporciona 1,2 A por puente (3 A para picos breves de 20 ms) con protección de apagado térmico y diodos internos de protección de contragolpe. Puede hacer funcionar motores de 4,5 V CC a 13,5 V CC.
  • Hasta 4 motores de CC bidireccionales con selección de velocidad individual de 8 bits (por lo tanto, aproximadamente 0,5% de resolución)
  • Hasta 2 motores paso a paso (unipolar o bipolar) de bobina simple, doble bobina, intercalados o micropasos.
  • Botón de reinicio de Arduino en la parte superior
  • Puente y bloque de terminales de 2 clavijas con protección de polaridad para conectar alimentación externa, para suministros lógicos / de motor separados.

Instalar la librería Adafruit Motor Shield V2

Para usar el shield en  Arduino, debes instalar la biblioteca Adafruit Motorshield v2. Esta biblioteca no es compatible con la biblioteca AF_Motor anterior utilizada para los shield v1. Sin embargo, si tiene un código para el shield anterior, adaptar el código para usar el nuevo shield no es difícil.

Para comenzar a controlar motores, debes instalar la biblioteca Adafruit_Motor_Shield_V2_Library . Está disponible en el administrador de la biblioteca de Arduino, por lo que recomendamos usarlo.

Desde el IDE abre el administrador de la biblioteca y escribe adafruit motor para localizar la biblioteca. Haga clic en Instalar.

adafruit_products_motor

También se instalará, alguna que otra librería para que esta funcione, como  la librería AccelStepper.

Motor de corriente continua.

La librería incluye algunos ejemplos para que puedas comenzar rápidamente. Podemos comenzar con el ejemplo del motor de CC. Puedes usar cualquier motor de CC que pueda ser alimentado de 6V a 12VDC.

Primero, reinicia el IDE para asegurarse de que la nueva librería esté cargada.

Enchufa el shield en el Arduino y conecta un motor de CC al puerto del motor 1; no importa qué cable vaya a qué bloque de terminales, ya que los motores son bidireccionales. Conéctalo a los dos puertos terminales superiores, no lo conectes al pin del medio (GND).

adafruit_products_dcmotortest

También debe suministrar 5-12 VCC para alimentar el motor. Hay dos maneras de hacer esto:

  • Puedes alimentar Arduino a través del conector de CC del shield e insertar el puente VIN.
  • Puede alimentar  Arduino a través del conector DC  o el puerto USB del arduino. Y Luego alimentar el shield a través del puerto del terminal de alimentación del motor de 5-12 VCC y retirar el puente VIN.

Si el LED verde junto al bloque de terminales de alimentación no se enciende con intensidad, ¡no continúes!

adafruit_products_powerLED

Una vez verificado que el motor está conectado correctamente y que el LED de encendido esté iluminado, podemos cargar nuestro código.

En el IDE, cargue Archivo-> Ejemplos-> Adafruit_MotorShield-> DCMotorTest

Deberías ver y escuchar que el motor de CC se enciende y se mueve hacia adelante y hacia atrás.

Prueba de motor paso a paso.

El escudo puede manejar steppers unipolares (5 hilos y 6 hilos) y bipolares (4 hilos). El código es el mismo para motores unipolares o bipolares, el cableado es ligeramente diferente.

Conecta el shield en el Arduino y conecta un motor paso a paso al puerto 2 del motor; a diferencia de los motores de CC, el orden de los cables sí ‘importa’. Conecta los dos puertos terminales superiores a la bobina n.° 1 y a los dos puertos terminales inferiores a la bobina n.° 2.

  • Si tienes un motor bipolar, no lo conectes nada al pin del medio (GND).
  • Si estás utilizando un motor unipolar con 5 cables, conecta el cable común a GND.
  • Si estás utilizando un motor unipolar con 6 cables, puedes conectar los dos ‘cables de la bobina central’ juntos a GND.

adafruit_products_steppertest

También debes suministrar de 5 a 12 VCC para alimentar el motor.

Igual que para los motres DC hay dos maneras de hacer esto:

  • Puedes alimentar Arduino a través del conector de CC del shield e insertar el puente VIN.
  • Puede alimentar  Arduino a través del conector DC  o el puerto USB del arduino. Y Luego alimentar el shield a través del puerto del terminal de alimentación del motor de 5-12 VCC y retirar el puente VIN.

Una vez que haya verificado que el motor está conectado correctamente y que el LED de encendido esté iluminado, podemos cargar nuestro código.

En el IDE, cargue Archivo-> Ejemplos-> Adafruit_MotorShield-> StepperTest

Deberías ver y escuchar que el motor paso a paso se enciende y se mueve hacia adelante y hacia atrás.

Hay cuatro formas de mover un motor paso a paso, con diferentes compensaciones de velocidad, torqué y suavidad. Este código de ejemplo demostrará los cuatro.

Library Reference

clase Adafruit_MotorShield

La clase Adafruit_MotorShield representa un shield de motor y debe crearse una instancia antes de que se pueda utilizar cualquier DCMotor o StepperMotors. Se deberá declarar un objeto tipo Adafruit_MotorShield para cada shield apilado.

Adafruit_MotorShield (uint8_t addr = 0x60);

El constructor tiene un parámetro opcional para especificar la dirección i2c del shield. La dirección predeterminada del constructor (0x60). Si tienes más de un shield, cada shield debe tener una dirección única.

void begin(uint16_t freq = 1600);

Se debe llamar a begin() en setup() para inicializar el shield. Se puede utilizar un parámetro de frecuencia opcional para especificar algo diferente al máximo predeterminado: frecuencia PWM de 1,6 KHz.

Adafruit_DCMotor * getMotor (uint8_t n);
Esta función devuelve uno de los 4 objetos de motor de CC predefinidos controlados por el shield. El parámetro especifica el canal de motor asociado: 1-4.

Adafruit_StepperMotor * getStepper (pasos uint16_t, uint8_t n);
Esta función devuelve uno de los 2 objetos de motor paso a paso predefinidos controlados por el shield. El primer parámetro especifica el número de pasos por revolución. El segundo parámetro especifica el canal paso a paso asociado: 1-2.

clase Adafruit_DCMotor

La clase Adafruit_DCMotor representa un motor de CC conectado al shield. Debe declarar un Adafruit_DCMotor para cada motor.

Adafruit_DCMotor ();
El constructor no acepta argumentos. El objeto de motor generalmente se inicializa asignando un objeto de motor recuperado de la clase del shield como se muestra a continuación:

// Crea un motor 
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 

// Selecciona port' M1, M2, M3 o M4. 
Adafruit_DCMotor *myMotor = AFMS.getMotor(1);
// otro motor en el puerto M2
Adafruit_DCMotor *myOtherMotor = AFMS.getMotor(2);

void run(uint8_t);

La función run () controla el estado del motor. El parámetro puede tener uno de 3 valores:

  • FORWARD – Gira hacia adelante.
  • BACKWARD – Gira en la dirección inversa.
  • RELEASE – Detener la rotación.

Ten en cuenta que las direcciones «FORWARD» y «BACKWARD» son arbitrarias. Si no coinciden con la dirección real de Tu vehículo o robot, simplemente cambiA los cables del motor.

También ten en cuenta que «RELEASE» simplemente corta la energía al motor. No aplica ningún frenado.

void setSpeed (uint8_t);

La función setSpeed () controla el nivel de potencia entregado al motor. El parámetro de velocidad es un valor entre 0 y 255.

Ten en cuenta que setSpeed solo controla la potencia entregada al motor. La velocidad real del motor dependerá de varios factores, entre ellos: el motor, la fuente de alimentación y la carga.

pasoapaso

clase Adafruit_StepperMotor

La clase Adafruit_StepperMotor representa un motor paso a paso unido al shield. Debes declarar un Adafruit_StepperMotor para cada motor paso a paso.

Adafruit_StepperMotor ();
El constructor no acepta argumentos. El motor paso a paso generalmente se inicializa asignando un objeto paso a paso recuperado del shield como se muestra a continuación:

// Crea motor I2C por defecto
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 

// Connecta un motor con 200 pasos por revolución (1.8 grados)
// para motor puerto #2 (M3 y M4)
Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

void step(uint16_t steps, uint8_t dir, uint8_t style = SINGLE);

La función step () controla el movimiento paso a paso.

  • El primer parámetro especifica cuántos pasos se deben mover.
  • El segundo parámetro especifica la dirección: FORWARD o BACKWARD.
  • El último parámetro especifica el estilo de paso: SINGLE, DOUBLE, INTERLEAVED o MICROSTEP

La función step() es sincrónica y no regresa hasta que se completan todos los pasos. Cuando se completa, el motor permanece encendido para aplicar un «par de retención» para mantener la posición.

void setSpeed ​​(uint16_t);
La función setSpeed ​​() controla la velocidad de rotación del motor paso a paso. La velocidad se especifica en RPM.

void release(void);

La función de release () quita toda la energía del motor. Llama a esta función para reducir los requisitos de potencia si no se requiere par de retención para mantener la posición.

Alimentación de motores

Lo primero que importa es saber qué voltaje va a utilizar el motor.
 
Lo segundo que hay que averiguar es cuánta corriente necesitará el motor. Los chips de controlador de motor que vienen con el kit están diseñados para proporcionar hasta 1.2 A por motor, con una corriente máxima de 3A. Ten en cuenta que una vez que se dirija hacia 2A probablemente debamos colocar un disipador de calor en el controlador del motor; de lo contrario, obtendremos un error térmico, y posiblemente quemando el chip.
 
No podemos hacer funcionar los motores con una batería de 9 V, ¡ es mejor no perder el tiempo  y baterías!
 
Es recomendable utilizar una batería grande de plomo-ácido o NiMH. También es recomendable  configurar dos fuentes de alimentación (fuente dividida), una para Arduino y otra para los motores. ¡El 99% de los ‘problemas extraños del motor’ se deben al ruido en la línea de alimentación por compartir fuentes de alimentación y / o no tener una fuente de alimentación lo suficientemente potente! Incluso los motores de CC pequeños pueden consumir hasta 3 amperios cuando se detienen.
 

Si desea tener una sola fuente de alimentación de CC para Arduino y motores.

Digamos que un adaptador o un solo paquete de baterías con salida de 6-12 VCC, simplemente conéctelo al conector de CC del Arduino o al bloque de terminales de alimentación de 2 pines en el escudo. IMPORTANTE: Coloca el puente de alimentación en el protector del motor.

Tenga en cuenta que puede tener problemas con los reinicios de Arduino si el suministro de la batería no puede proporcionar energía constante. No puedeS usar una batería de 9V para esto, debe ser de 4 a 8 baterías AA.

Si desea que  Arduino se alimente desde USB y los motores se alimenten con una fuente de alimentación de CC.

Conecta el cable USB. Luego conecta la alimentación del motor al bloque de terminales de alimentación en el shield. No coloques el puente en el shield.

Este es un método sugerido para alimentar tu proyecto de motor, ya que tiene una fuente dividida, una fuente de alimentación para la lógica y una fuente para motores.

Si desea tener 2 fuentes de alimentación de CC separadas para el Arduino y los motores.

Enchufa el suministro para el Arduino en el conector de CC y conecta el suministro del motor al bloque de terminales de alimentación. Asegúrate de que has quitado el puente del protector del motor.

Pase lo que pase, si desea utilizar el motor de CC o motores paso a paso, el LED de protección del motor debe estar encendido para indicar una buena potencia del motor.

Uso RC Servos

Los servos tienen una conexión de cabezal hembra de 3 pines, + 5V, tierra y entradas de señal. El shield simplemente saca las líneas de salida PWM de los pines 9 y 10 de Arduino a dos cabezales de 3 pines para que sea fácil de conectar.

Puedes utilizar la librería Servo incorporada.

La energía para los Servos proviene del regulador de 5V integrado de Arduino, alimentado directamente desde el conector de alimentación USB o DC en el Arduino.

Uso de motores de CC

Los motores de CC se utilizan para todo tipo de proyectos robóticos.

El shield puede accionar hasta 4 motores de CC bidireccionalmente. Eso significa que se pueden conducir hacia adelante y hacia atrás. La velocidad también se puede variar en incrementos del 0,5% utilizando el PWM integrado.

Para conectar un motor a M1, M2, M3 o M4.

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include"utility/Adafruit_MS_PWMServoDriver.h"

Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 

Adafruit_DCMotor *myMotor = AFMS.getMotor(1);

AFMS.begin();
myMotor->run(FORWARD);

Uso motores paso a paso.

Este protector de motor admite hasta 2 motores paso a paso. La librería funciona de manera idéntica para motores bipolares y unipolares.

  • Para motores unipolares: para conectar el paso a paso, primero averigüa qué pines están conectados a qué bobina y qué pines son  centrales. Si es un motor de 5 cables,  1  es la toma central para ambas bobinas. La bobina 1 debe conectarse a un puerto del motor (digamos M1 o M3) y la bobina 2 debe conectarse al otro puerto del motor (M2 o M4).
  • Para motores bipolares: es como los motores unipolares, excepto que no hay un quinto cable para conectar a tierra. El código es exactamente el mismo.

Ejecutar un motor paso a paso es un poco más complicado que ejecutar un motor de CC, pero sigue siendo muy fácil.

#include <Wire.h>
#include <Adafruit_MotorShield.h>
#include "utility/Adafruit_PWMServoDriver.h"

Adafruit_MotorShield AFMS = Adafruit_MotorShield(); 

Adafruit_StepperMotor *myMotor = AFMS.getStepper(200, 2);

Establezce la velocidad del motor usando setSpeed ​(rpm) donde rpm es la cantidad de revoluciones por minuto a que deseas que gire el motor paso a paso.

Luego, cada vez que desees que el motor se mueva, llama al procedimiento step (#steps, dirección, tipo de paso). #steps es la cantidad de pasos que le gustaría que siguiera. La dirección es FORWARD o BACKWARD y el tipo de paso es SINGLE, DOUBLE, INTERLEAVE o MICROSTEP.

  • SINGLE significa activación de bobina simple
  • DOUBLE significa que se activan 2 bobinas a la vez (para un par mayor)
  • INTERLEAVE significa que alterna entre simple y doble para obtener el doble de resolución (pero, por supuesto, es la mitad de la velocidad).
  • MICROSTEP es un método en el que las bobinas son PWM para crear un movimiento suave entre los pasos.

De forma predeterminada, el motor ‘mantendrá’ la posición después de que termine el movimiento. Si deseas liberar todas las bobinas, para que pueda girar libremente, llama a release().

Apilamiento de shields.

Lo único a tener en cuenta al apilar shields es que cada shield debe tener una dirección I2C única. La dirección predeterminada es 0x60.

Puedes ajustar la dirección de los shield para que oscile entre 0x60 y 0x7F para un total de 32 direcciones únicas.

La dirección binaria que se programa con los puentes de dirección se agrega a la dirección I2C base.

Para programar el desplazamiento de la dirección, usa una gota de soldadura para puentear el puente de dirección correspondiente para cada ‘1’ binario en la dirección.

El puente más a la derecha es el bit de dirección # 0, luego a la izquierda está el bit de dirección # 1, etc.hasta el bit de dirección # 4

adafruit_products_jumpera0

0: Dirección = 0x60 Offset = binario 0000 (no se requieren puentes)
1: Dirección = 0x61 Desplazamiento = binario 0001 (puente A0 como en la foto de arriba)
2: Dirección = 0x62 Desplazamiento = binario 0010 (puente A1, a la izquierda de A0)
3: Dirección = 0x63 Desplazamiento = binario 0011 (puente A0 y A1, dos puentes más a la derecha)
4: Dirección = 0x64 Offset = binario 0100 (puente A2, puente intermedio)

Escribir código para varios shield

Primero debemos crear un Controlador de shield de Motor para cada shield, con la dirección asignada.

Adafruit_MotorShield AFMSbot(0x61); // un jumper closed
Adafruit_MotorShield AFMStop(0x60); //  no jumpers

Un shield de motor se llamará AFMSbot (shield inferior) y otro es AFMStop (shield superior) para que podamos mantenerlos separados. Cuando crees el objeto de shield, especifica la dirección que se estableció anteriormente.

Entonces podemos solicitar los motores conectados a cada uno:

// En el shield superior, conectamos dos motores paso a paso, cada uno con 200 pasos
Adafruit_StepperMotor *myStepper2 = AFMStop.getStepper(200, 1);
Adafruit_StepperMotor *myStepper3 = AFMStop.getStepper(200, 2);

// En el shield inferior, conectamos un motor paso a paso, con 200 pasos
Adafruit_StepperMotor *myStepper1 = AFMSbot.getStepper(200, 2);
// y un motor DC al puerto 1 -> M1
Adafruit_DCMotor *myMotor1 = AFMSbot.getMotor(1);

Ambos shield deben iniciarse, antes de usar los motores conectados:

AFMSbot.begin(); // Start the bottom shield
AFMStop.begin(); // Start the top shield

Puedes probar este código por sí mismo configurando dos shield, ejecutando el ejemplo Archivo-> Ejemplos-> Adafruit_MotorShield-> StackingTest.

Fuentes:

Ideas motrices y tutoriales