jueves, 31 de marzo de 2016

Uso de LDR y motor paso a paso con Arduino

Como ejemplo de los transistores Darlington, hemos visto en clase el integrado ULN2003.

Una de sus aplicaciones es como driver de motores, porque la corriente por sus salidas (de hasta 500mA) puede excitar a las bobinas de dichos motores.

Como ejemplo de utilización de este driver vamos a realizar la siguiente práctica.

Divisor resistivo de tensión:
- LDR conectada de +5V a entrada analógica A0
- Resistencia de 10k conectada entre GND y la entrada A0.

La LDR tendrá alta resistencia en ausencia de luz, cayendo más tensión en la LDR que en la R. En presencia de luz será al contrario.

Los pines 8-9-10-11 serán salidas digitales del arduino, que conectamos a las entradas IN1-IN2-IN3-IN4 del ULN2003. Las salidas del mismo orden de este integrado, irán conectadas a las bobinas del motor.

La aplicación que se nos ha ocurrido consiste en la automatización de un parking para que juegue el niño. En esta práctica nos centramos en una barrera de acceso al parking. Con el divisor resistivo detectamos si hay un coche que quiere acceder. En ese caso se pone en marcha la barrera, que estará 5 segundos en alto y bajará de nuevo a su situación de reposo.
Con el pin 13 de arduino hemos pensado en poner un semáforo:
- Un LED rojo se encenderá mientras la barrera está en marcha,
- Y un LED verde se encenderá cuando no haya ningún vehículo sobre el LDR.

El código que hemos pensado es éste:

//Utilizo una LDR y una R=10K como divisor de tensión
// La LDR a +5V y la R a masa.
// Con la entrada analógica A0 de Arduino leo la tensión, que va a depender de la luz
//Declaración de los pines del arduino para conectar al ULN2003 y correspondencia con los del motor 28BYJ48
#define motor1  8    // pin 1 del ULN2003, corresponde a Azul del motor (pin 1)
#define motor2  9    // pin 2 del ULN2003, corresponde a Rosa del motor (pin 2)
#define motor3  10   // pin 3 del ULN2003, corresponde a Amarillo del motor (pin 3)
#define motor4  11   // pin 4 del ULN2003, corresponde a Naranja del motor (pin 4)
                        // El cable rojo del 28BYJ48 (pin 5) se conecta a VCC
#define LED 13  // para encender LED en el pin13
int velocidadmotor = 1000;  //variable para velocidad de pasos del motorto set stepper speed
int conta = 0;          // variable para llevar la cuenta de los pasos
int cuentas90g = 128; // número de pasos para giro de 90º http://www.prometec.net/motor-28byj-48/
//Array para excitar al ULN2003 que a su vez ataca al motor
int nivelesSalida[8] = {B01000, B01100, B00100, B00110, B00010, B00011, B00001, B01001};
// Lo vamos a girar en secuencia de medio paso, tal y como explican en http://www.prometec.net/motor-28byj-48/


void setup() {
   //declare the motor pins as outputs
  pinMode(motor1, OUTPUT);
  pinMode(motor2, OUTPUT);
  pinMode(motor3, OUTPUT);
  pinMode(motor4, OUTPUT);
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}
void loop() {

  float sensorLDR = analogRead(A0)*5.0/1023; //convierto lectura A0 a tensión

  Serial.println(sensorLDR); //para ver en "monitor serie" el valor
  if(sensorLDR <3.0) //midiendo la tensión, veo que este valor delimita presencia/ausencia de luz
    {
     digitalWrite(LED, HIGH); //activo LED =puerta va a abrirse
     for(conta=0;conta<cuentas90g;conta++) //se repite los pasos necesarios para 90grados
      giroID();  //sentido del reloj
   
    delay(5000); //tiempo con la barrera abierta
    for(conta=0;conta<(cuentas90g);conta++) //idem para el otro lado
      giroDI();
    }
  else
    digitalWrite(LED,LOW);
 
  delay(100); // tiempo de espera antes de volver a comprobar el estado de la LDR
}
// giro Derecha a Izq.
//
void giroDI()
{
  for(int i = 0; i < 8; i++)
  {
    SalidaDato(i); //sacar por Outputs el valor 'i' del array
    delayMicroseconds(velocidadmotor);
  }
}
void giroID()  //giro Izq. a Derecha
{
  for(int i = 7; i >= 0; i--)
  {
    SalidaDato(i);
    delayMicroseconds(velocidadmotor);
  }
}
void SalidaDato(int posi)  // sacamos por los pines de arduino los bits correspondientes
{
  digitalWrite(motor1, bitRead(nivelesSalida[posi], 0)); //usamos la función bitRead para extraer el bit 0
  digitalWrite(motor2, bitRead(nivelesSalida[posi], 1)); //idem con bit 1
  digitalWrite(motor3, bitRead(nivelesSalida[posi], 2)); //idem
  digitalWrite(motor4, bitRead(nivelesSalida[posi], 3)); //idem
}

No hay comentarios:

Publicar un comentario

Vista previa de imágenes en Twitter

Quizás te ha cambiado el aspecto de la cronología de tu cuenta de Twitter y no sabes cómo ha sido. A veces, sin que tú hayas tocado nada de...