Hola a todos,
hace mucho que os leo a la gran mayoría y os agradezco la comunidad que tenéis montada porque me ha sido de ayuda en otros casos.
Hoy escribo por primera vez para ver si me podéis orientar con lo que me traigo entre manos.
Soy un neofito en esto de arduino y la poca idea que tengo de programación es lo que he ido aprendiendo de este foro y tutoriales varios, por ello, aún me cuesta reconocer en qué estoy fallando.
Me dedico al mundo del arte y estoy haciendo una instalación escultórica donde una pieza suspendida se eleva y baja gracias a un cabestrante o polipasto. Mi necesidad es que la pieza suspendida suba o baje a dos puntos determinados, imaginemos un punto A(alto) y un punto B(bajo).
El motor está conectado a dos relés, uno para cada sentido de giro del motor (cuando se activa uno me suelta cuerda y cuando activo el otro relé, me recoge la cuerda). Lo malo es que el motor no mantiene la misma velocidad en ambos sentidos, cuando gira en un sentido va más rápido que en el sentido contrario. Esto me impide que, por ejemplo, al programar un tiempo de bajada de tres segundos y un tiempo de subida de otros tres segundos, la pieza quede suspendida en el mismo punto que estaba anteriormente, provocando un desfase que va a más a medida que se repite el bucle programado.
En este punto, he de deciros que también he descartado la opción de poner interruptores de final de carrera, por razones estéticas y como no puedo programarlo por tiempos, estoy buscando la manera de hacerlo contando los pulsos de un sensor que me cuente las vueltas que da el motor (son muy pocas RPM, unas 20RPM, una vuelta cada 3 segundos). Para esto, estoy haciendo pruebas con un sensor de infrarrojos y también con uno electromagnético que son los que me permitirían poderse montar junto al tambor del motor.
Pues bien, por mi falta de conocimientos con la programación, no sé por qué el siguiente código no me funciona.
int sensor = 4; //sensor infrarrojos o electromagnético para contar vueltas del motor
int rele1 = 13; //suelta cuerda (baja la carga)
int rele2 = 12; //recoge cuerda (sube la carga)
int conta = 0;
int estadoCero = 0;
void setup() {
Serial.begin(9600); //iniciar puerto serie
pinMode(sensor, INPUT); //definir pin como entrada
pinMode(rele1, OUTPUT); //definir pin como salida
pinMode(rele2, OUTPUT); //definir pin como salida
delay(8000); //tiempo de espera hasta el inicio
digitalWrite(rele1, HIGH); //activa el motor en un sentido para SOLTAR cuerda
}
void loop()
{
int pl = digitalRead(sensor); //lectura digital del sensor
if (pl!=estadoCero){
if (pl==LOW)
{
conta++;
Serial.println(conta);
}
}
estadoCero=pl;
if (conta==3){ //cuenta 3 vueltas del motor
digitalWrite(rele1, LOW); //detiene el motor para dejar de SOLTAR cuerda
delay(8000); //espera un tiempo
digitalWrite(rele2, HIGH); //activa el motor para RECOGER cuerda
}
if (conta==6){ //cuenta hasta 6 vueltas (3 vueltas soltando, 3 vueltas recogiendo)
digitalWrite(rele2, LOW); // detiene el motor para dejar de RECOGER
conta=0; //Reinicia el contador desde 0
delay(8000); //Nuevo tiempo de espera para comenzar con bucle
digitalWrite(rele1, HIGH);
}
}
Con este código, consigo que el motor, hacia una dirección, se pare una vez contado el número de pulsos programado, pero cuando se activa el giro en el otro sentido, el contador no sigue su cuenta y nunca se me detiene.
Por ello os pido que si sois tan amables de indicarme dónde véis el fallo(o los fallos) estaré muy agradecido. Si tenéis un nuevo enfoque de cómo debería realizarlo, también os agradecería la orientación.
Un saludo a todos.