Control de un pequeño motor por impulsos

DSC01850
El siguiente código les permite experimentar con el control de giro de un pequeño motor extraído de un celular viejo. Pueden seleccionar el número aproximado de giros y la dirección de giro, derecha o izquierda.

Funciona conectando directamente el motor a dos pines digitales del microcontrolador. Básicamente se le envían impulsos a muy alta velocidad (10 milisegundos) y se espera durante 100 milisegundos antes de enviar el siguiente impulso. El motor simula el funcionamiento de un motor paso-a-paso de muy bajo torque, pero suficiente para soportar figuras de papel. Gracias a Andrés por traer este ejemplo.

[blip.tv ?posts_id=2260444&dest=-1]

/*
 * Motor de celular
 * controlado directamente 
 * a través de dos pines digitales.
 *
 * Simula el comportamiento de un motor paso-a-paso.
 *
 * a. tamayo 
 * junio 7, 2009
 *
 */

int pinGiroDerecha = 2;   // pin digital para giro a la derecha 
int pinGiroIzquierda = 3; // pin digital para giro a la izquierda    

void setup()
{
  pinMode(pinGiroDerecha, OUTPUT);
  pinMode(pinGiroIzquierda, OUTPUT);
}

void loop()
{
 girosDerecha(2);  // número aprox. de vueltas a la derecha
 delay(2000);
 girosIzquierda(5);// número aprox. de vueltas a la izquierda
 delay(2000);
}

// giro a la derecha:
// cuando el pinGiroDerecha está en HIGH y el
   pinGiroIzquierda está en LOW
void girosDerecha(int girosD){
  for (int x = 0; x <= (girosD*10); x++){
  // 10: factor aproximado que relaciona el número de vueltas
  con el número de iteraciones
  digitalWrite(pinGiroDerecha, HIGH);     // gira a la derecha
  digitalWrite(pinGiroIzquierda, LOW);    // gira a la derecha
  delay(10);
  digitalWrite(pinGiroDerecha, LOW);      // no gira
  digitalWrite(pinGiroIzquierda, LOW);    // no gira
  delay(100);
  }
}

// giro a la izquierda:
// cuando el pinGiroIzquierda está en HIGH y el
   pinGiroDerecha está en LOW
void girosIzquierda(int girosI){
  for (int x = 0; x <= (girosI*10); x++){
  // 10: factor aproximado que relaciona el número de vueltas
  con el número de iteraciones
  digitalWrite(pinGiroIzquierda, HIGH);  // gira a la izquierda
  digitalWrite(pinGiroDerecha, LOW);     // gira a la izquierda
  delay(10);
  digitalWrite(pinGiroDerecha, LOW);     // no gira
  digitalWrite(pinGiroIzquierda, LOW);   // no gira
  delay(100);
  }
}
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s