martes, 26 de marzo de 2013

CONTROL DE LA VELOCIDAD DE UN MOTOR A TRAVÉS DE ARDUINO Y XBEE (2º parte)

En esta seguda parte realizaremos el conexionado del hadware completo utlizando los siguientes componentes:

.-. 2 Arduinos Uno.
.-. 2 Mochilas o "shields" XBee.
.-. 2 Módulos XBee Serie 2,
.-. 1 Motor DC típico de jugetería.
.-. 1 C.Integrado LD293B (Driver de corriente)
.-. 4 Diodos 1N4007
.-. 1 Pila de 9 Voltios.
.-. 1 Poténciometro 10k.

El circuito receptor está formado por una pareja Arduino Uno y Xbee que están conectados al Motor DC a través del driver de corriente LD293B y los cuatros diodos. Para darle mayor potencia al Motor lo alimentamos externamente con una pila de 9 Voltios. El esquema (salvo los diodos que actúan como protección del motor y que están en la foto posterior) se muestra en la siguiente figura.

Realmente es un montaje típico del que se puede encontrar mucha información en la red, lo único destacable es que la velocidad del motor va a se regulada inalámbricamente a través del módulo XBee y desde otro Arduino separado físicamente del primero.



Véase por otra parte el montaje un tanto burdo pero válido para comprobar el correcto funcionamiento del proyecto. Del arduino sólo utlizo dos lineas PWM (9 y 10) aunque se podría igualmente usar la linea EN del canal 1 (LD293B)  a mayores para regular la tensión media que le llega al motor. Lo he hecho así porque he recuperado o hackeado un viejo "modulito" de un viejo robot que contiene el LD293B, los diodos ya soldados al igual que los terminales. El único incoveniente es que no posee un terminal para ese pin EN del chip.

El programa en este arduino receptor es de lo más simple:


// Módulo RECEPTOR conectado al motor DC
// by german tojeiro 3/2013

int pinE1 = 10;  // entrada 1 Motor
int pinE2 = 9;  // entrada 2 Motor

int valorPot= 0;
int valorVeloc = 0;

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

 void loop()
  {
    digitalWrite( pinE2, LOW);
  
   if (Serial.available() > 0)       // Comprobamos que el canal serie XBee está disponible
     {
       valorPot= Serial.read();    // Leemos el valor que nos envia inalámbricamente Emisor Xbee

       analogWrite(pinE1,valorPot);

 // Lo escribimos en el la salida del otor, el motor girará en un sentido ccon velocidad variable
     }
  }



Básicamente comporbamos si el canal XBee está disponible y si es así, leemos el puerto serial y se lo enviamos a la patilla 10 del arduino (PWM); la patilla 9 está siempre a cero con lo que girará siempre en un sentido. Se podría haber dotado al proyecto de un interruptor para cambiar el sentido de giro, pero bueno, es algo que dejaré para la parte final del proyecto.

Vayamos ahora con el Módulo Arduino + XBee emisor. Ëste consta de un potenciometro conectado a la entrada analógica A2. Se lee continuamente, se mapean los valores y se envia inalámbricamente. Tambien muy sencillo.

 
La foto del montaje ya que mi cámara de video es mala es la siguiente:





El potenciometro está escondido debajo del arduino, pero no tiene mayor complicación, sólo es un componente resistivo de 10 k conectado a la entrada analógica A2.

El programa es el siguiente:


 // Módulo EMISOR conectado al POTENCIOMETRO
// by german tojeiro 3/2013


int pinPot = 2; // Lectura analógica del Potenciometro
int valorPot= 0;
 

void setup()
  { 
  Serial.begin(9600);   // Establecemos la velocidad de trasmisión del módulo XBee.
  }

  void loop()
  {
 
   valorPot = analogRead(pinPot);      // Lee el valor del potenciometro
   if (Serial.available() > 0)                // Comprobamos que el canal serie XBee está disponible
     {
       valorVeloc = map(valorPot, 0, 1023, 0, 255); //Convierte un valor entre 0 y 1023 al rango 0-255
       Serial.print(valorVeloc);                    
// Enviamos el dato a través del módulo XBee.  
       delay(100);
     }
     
  }


Obsérvese que el dato leido por el poténciometro puede variar enter 0 y 1023 y sin embargo la salida PWM del pin 10 sólo lo puede hacer entre 0 y 255; de ahi que escalemos o mapeemos el intervalo de valores con la función MAP.

En la próxima entrega del tuto intentaremos realizar algo más curioso como es gobernar la velocidad del motor desde LABVIEW.






No hay comentarios:

Publicar un comentario