Autor Tema: Arduino+uln2003A+Motores PAP= Consulta  (Leído 2776 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Arduino+uln2003A+Motores PAP= Consulta
« en: 02 de Diciembre de 2015, 11:59:25 »
Muy buenas gente del foro! El año pasado estuve preguntando y recolectando info la cual me sirvió de mucho! Ahora tengo una duda con un programa que tengo el cual funciona y quiero agregarle algo.
Acá les pongo mi programa para controlar con motores PAP lo que sería las secuencias para las barreras de entrada y salida de un estacionamiento automatizado en el cual por medio de 4 pulsadores, dos de entrada y dos de salida, se realizan dichas secuencias:
Código: [Seleccionar]
int reedswitch = 0;
int entrada = 2;   //pin
int reedswitch1 = 0;
int entrada1 = 3; //pin
int reedswitch2 = 0;
int salida = A4; //pin
int reedswitch3 = 0;
int salida1 = A5; //pin



int motorPin1 = 4;
int motorPin2 = 5;
int motorPin3 = 6;
int motorPin4 = 7;
int motorPinA = A0;
int motorPinB = A1;
int motorPinC = A2;
int motorPinD = A3;
int delayTime = 100; //delay que determina la espera entre pasos
int delayTime1 = 60; //delay que determina la velocidad de giro entro pasos
int count = 0;

void setup()
{
  pinMode (2, INPUT); //entrada
  pinMode (3, INPUT); //entrada
 
  pinMode (A4, INPUT); //salida
  pinMode (A5, INPUT); //salida


 
  pinMode (motorPin1, OUTPUT);
  pinMode (motorPin2, OUTPUT);
  pinMode (motorPin3, OUTPUT);
  pinMode (motorPin4, OUTPUT);

  pinMode (motorPinA, OUTPUT);
  pinMode (motorPinB, OUTPUT);
  pinMode (motorPinC, OUTPUT);
  pinMode (motorPinD, OUTPUT);
 
 
}
void loop()
{


    reedswitch = digitalRead(entrada);
    if (reedswitch == HIGH)
 
 for (count = 0; count < 3; count++) //aca uso el for para determinar los grados de giro
  {
  //Punto A (primer paso)
  digitalWrite (motorPin1, HIGH);
  digitalWrite (motorPin2, LOW);
  digitalWrite (motorPin3, LOW);
  digitalWrite (motorPin4, HIGH);
  delay (delayTime1);
 
  //Punto B (segundo paso)
  digitalWrite (motorPin1, HIGH);
  digitalWrite (motorPin2, HIGH);
  digitalWrite (motorPin3, LOW);
  digitalWrite (motorPin4, LOW);
  delay (delayTime1);
 
  //Punto C (tercer paso)
  digitalWrite (motorPin1, LOW);
  digitalWrite (motorPin2, HIGH);
  digitalWrite (motorPin3, HIGH);
  digitalWrite (motorPin4, LOW);
  delay (delayTime1);
 
  //Punto D (cuarto paso)
  digitalWrite (motorPin1, LOW);
  digitalWrite (motorPin2, LOW);
  digitalWrite (motorPin3, HIGH);
  digitalWrite (motorPin4, HIGH);
  delay (delayTime1);
}
  delay (delayTime);

     reedswitch1 = digitalRead(entrada1);
     if (reedswitch1 == HIGH)
 
   
for (count = 0; count < 3; count++) //aca uso el for para determinar los grados de giro
  {
 
  digitalWrite (motorPin1, LOW);
  digitalWrite (motorPin2, LOW);
  digitalWrite (motorPin3, HIGH);
  digitalWrite (motorPin4, HIGH);
  delay (delayTime1);
 
   digitalWrite (motorPin1, LOW);
  digitalWrite (motorPin2, HIGH);
  digitalWrite (motorPin3, HIGH);
  digitalWrite (motorPin4, LOW);
  delay (delayTime1);
 
  digitalWrite (motorPin1, HIGH);
  digitalWrite (motorPin2, HIGH);
  digitalWrite (motorPin3, LOW);
  digitalWrite (motorPin4, LOW);
  delay (delayTime1);
 
  digitalWrite (motorPin1, HIGH);
  digitalWrite (motorPin2, LOW);
  digitalWrite (motorPin3, LOW);
  digitalWrite (motorPin4, HIGH);
  delay (delayTime1);
 
  delay (delayTime);
 
  }

// Ahora para la salida

reedswitch2 = digitalRead(salida);
    if (reedswitch2 == HIGH)

 for (count = 0; count < 3; count++) //aca uso el for para determinar los grados de giro
  {
  //Punto A (primer paso)
  digitalWrite (motorPinA, HIGH);
  digitalWrite (motorPinB, LOW);
  digitalWrite (motorPinC, LOW);
  digitalWrite (motorPinD, HIGH);
  delay (delayTime1);
 
  //Punto B (segundo paso)
  digitalWrite (motorPinA, HIGH);
  digitalWrite (motorPinB, HIGH);
  digitalWrite (motorPinC, LOW);
  digitalWrite (motorPinD, LOW);
  delay (delayTime1);
 
  //Punto C (tercer paso)
  digitalWrite (motorPinA, LOW);
  digitalWrite (motorPinB, HIGH);
  digitalWrite (motorPinC, HIGH);
  digitalWrite (motorPinD, LOW);
  delay (delayTime1);
 
  //Punto D (cuarto paso)
  digitalWrite (motorPinA, LOW);
  digitalWrite (motorPinB, LOW);
  digitalWrite (motorPinC, HIGH);
  digitalWrite (motorPinD, HIGH);
  delay (delayTime1);
}
  delay (delayTime);

     reedswitch3 = digitalRead(salida1);
     if (reedswitch3 == HIGH)
 
for (count = 0; count < 3; count++) //aca uso el for para determinar los grados de giro
  {
 
  digitalWrite (motorPinA, LOW);
  digitalWrite (motorPinB, LOW);
  digitalWrite (motorPinC, HIGH);
  digitalWrite (motorPinD, HIGH);
  delay (delayTime1);
 
   digitalWrite (motorPinA, LOW);
  digitalWrite (motorPinB, HIGH);
  digitalWrite (motorPinC, HIGH);
  digitalWrite (motorPinD, LOW);
  delay (delayTime1);
 
  digitalWrite (motorPinA, HIGH);
  digitalWrite (motorPinB, HIGH);
  digitalWrite (motorPinC, LOW);
  digitalWrite (motorPinD, LOW);
  delay (delayTime1);
 
  digitalWrite (motorPinA, HIGH);
  digitalWrite (motorPinB, LOW);
  digitalWrite (motorPinC, LOW);
  digitalWrite (motorPinD, HIGH);
  delay (delayTime1);
 
  delay (delayTime);
 
  }
 
 
}
Bueno, esto funciona, pero lo que tengo ganas de hacer es que como en el estacionamiento sólo hay cuatro lugares disponibles, implementar un contador que cuente las veces que la barrera de entrada deja pasar los coches, al momento que quiera entrar otro y esta lleno, osea que se pulse el pulsador, no se abra hasta que salga uno por la salida. Alguna ayudita? (En el código dice reedswitch pero son pulsadores)
Gracias.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Arduino+uln2003A+Motores PAP= Consulta
« Respuesta #1 en: 02 de Diciembre de 2015, 21:33:48 »
Cambia :

    if (reedswitch == HIGH)

Por

Entrada:
    if ( contador < 4 && reedswitch == HIGH)  //Pregunto ademas si hay 4 vehiculos dentro, si hay menos entonces entra al if
    {
        contador++;     // Si habia menos, incremento en 1, cuando llegue a 4 no va a permitir que se entre mas aca


Salida
    if (reedswitch2 == HIGH)
    {
        if (!contador) contador--;        //Quito un auto si contador no es 0, es por si las dudas se activa algo mal, da la oportunidad de salir

Y con eso ya estaria

Desconectado Fedextrem

  • PIC10
  • *
  • Mensajes: 25
Re:Arduino+uln2003A+Motores PAP= Consulta
« Respuesta #2 en: 03 de Diciembre de 2015, 16:27:18 »
Gracias! Sirvió así, sólo le saque el "if(!contador)" y ya andaba joya.
Un saludo!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Arduino+uln2003A+Motores PAP= Consulta
« Respuesta #3 en: 03 de Diciembre de 2015, 21:02:16 »
Gracias! Sirvió así, sólo le saque el "if(!contador)" y ya andaba joya.
Un saludo!

Si sacas eso, permitis que el contador pueda pasar de 0 a 256 al restarsele 1, si es que se trata de un entero sin signo, lo cual si tu sensor de salida se activa varias veces, en ves de llega a 0 y quedarse ahi "contador" lo que estarias haciendo es un underflow y llevandolo a valores de 250 por ejemplo, con la necesidad de presionar 6 veces el de entrada para que vuelva al valor 0 y funcione nuevamente.


 

anything