Contar vueltas motor DC Solo con encoder optico?

Buenas tardes, acabo de terminar un proyecto que me a costado un poquito llevar a cabo el montaje en si. Tambien fué posible gracias a la ayuda de un "maestro del foro" con mucha paciencia. :confused: Ahora que lo tengo terminado, es cuando veo los "defectos" que tiene. ( ya que sobre papel va perfectamente como se deseaba)

Estoy usando un Arduino Uno + placa de relé + sensor sonido +motor DC 24v. ( con su correspondiente Fuente) Esto funciona asi: Ahora mismo cuando hago una palmada, me activa un relé que me cierra el circuito para que el motor me gire en un sentido durante.......x segundos. ( concretamente, me baja una compuerta de casa) Cuando terminan los segundos el arduino me deja de alimentar el relé y el motor se detiene. ( hasta aqui todo bien )

Cuando vuelvo a dar otra palmada , me activa otro relé diferente y el motor gira en el sentido opuesto al anterior durante ......x segundos, (para que me suba la compuerta ) ( aqui es cuando me he encontrado el "problema") , resulta que No siempre se queda parado en la pisicion INICIAL , Ya que debido al esfuerzo/consumo del motor en ocasiones necesita X + 0.5segundo mas de trabajo , o en otras ocasiones me sobra X - 1 segundo de trabajo. Con lo que dandole al coco creo que lo podria resolver instalandole un Encoder optico al eje del motor ( lo tendria muy sencillo) , para que en vez de controlar el motor con segundos, poder controlarlo con posicion. Osea decirle al arduino : cuando empiezes a mover el motor y cuentes .....X vueltas te paras! Asi me aseguro que si tarda mas en subir o en bajar, siempre voy a llegar a las mismas posiciones.

Mi pregunta es :

Con el material que dispongo, solamente me haria falta el Encoder Optico ( con su correspondiente plato dentado) ? Me serviria uno como este ? http://www.luisllamas.es/2016/06/usar-un-optointerruptor-con-arduino/

Pd: He leido que para estas cosas se necesitan un controlador Pid, pero yo no quiero saber cuales son las revoluciones del motor, ni ajustar su velocidad, ect.... Solo quiero decirle al arduino cuantas vueltas tiene el motor para detenerlo en el momento justo.

Algo mas simple mi amigo, es usar switch de inicio y fin de carrera. Nada de enconder. Pones un microswich en una posición que marque el inicio y otro será el que indique el final. El arduino lo mueve de un lugar al otro.

Pued esa era mi ultima opcion, pero queria ver si era factible usar encoder, mas que nada por que al cabo del uso terminan desajustandose y pienso que no serian tan preciso como en Encoder. Pero si no se me recomienda hacerlo, haré caso.... Tan engorroso seria usar encoder?

Hola. En principio no sería tan engorroso, pero el hecho de ser (sólo un poco) más difícil de programar que con los finales de carrera, no significa que sea más efectivo. Por ejemplo, imagina que se reinicia el arduino por cualquier razón a mitad de recorrido. El encoder dejaría de ser efectivo, al haber perdido la referencia de posición inicial. Existe un principio al que los que andan en estos mundos llaman KISS (keep it simple, stupid) que en muchas ocasiones perdemos de vista al apuntar a un objetivo. La opción de surbyte, aunque te pueda parecer tosca, es la más simple y efectiva. No obstante, si quieres usar la opción del encoder (por experimentar o porque ves alguna ventaja) no debería ser complicado aplicarlo.

Pues creo que lo ajustaré con los finales de carrera, a ver que tal queda.
Detodas formas de manera paralela trastearé el dichoso Encoder, El saber no ocupa lugar, pero ante mi duda principal, alguien con experiencia en estos dispositivos me podria decir si unicamente con un simple encoder ( con su correspondiente disco dentado) podria llegar a usar un motor como antes explicaba ? O necesitaria de mas “accesorios” ?
Gracias chicos!

Lo que debes hacer con el encoder es llevarlo siempre a una posicion de referencia para lo que si o si necesitas la referencia o microswich porque sino quien le dice que esta en el comienzo o fin de la carrera? Se apaga arduino y como dijo noter.. no sabes donde esta, o bien tienes que armar un sistema que detecte perdida de energía, guarde el dato en la eeprom y luego leerla al reiniciar. Nada complicado peroooooooo que pasa si viene alguien y por jugar con el arduino sin energía mueve la puerta? Adios todo. Asi que microswitch y cada vez que enciende lo pones a 0 de ese modo o compras un encoder MAS CARO que tiene registro de su posición aun cuando se corte la energía porque tiene batería propia.

Metiéndome fuera de mi terreno, quizás también se podría adaptar un potenciómetro a la puerta, lo que nos permitiría saber la posición con un analogRead.

Me gusta...... esto se pone interesante. Jeje Lo de Surbyte lo he entendido perfectamente, pero lo del potenciometro de Noter no me queda claro...... te refieres a que mecanicamente la puerta mueva de posicion la ruleta del potenciometro? Voy mas allá; Por cierto cuantos grados se podria mover un potenciometro para que reconozca el arduino su posicion? Es decir, se que un potenciometro puede girar 360grados. Pero podria girar 10vueltas y eso saberlo el arduino? .......

Por cierto cuantos grados se podria mover un potenciometro para que reconozca el arduino su posicion?

No se porque hablas de multivuelta. Con 1 vuelta alcanza y sobra. Supongamos una vuelta = 360 grados Ahora una puerta se puede abrir 180 grados asi que eso sería desde 0 a 2.5V cada movimiento de 1/1024 pasos será detectado por el AD del arduino.

vale, aqui dejo un par de imagenes del proyecto que tengo montado :

La trampilla desciende ya que el eje al girar desenrolla el hilo de nylon y con la ayuda de la gravedad…baja.

Cuando el motor gira el eje en sentido opuesto, enrolla el nylon y la trampilla sube.
trampilla.pngtrampilla 2.png

Hola. Cuando agregues imágenes a tu post, en lugar del icono de la cadena (hipervínculo) usa el de la foto (imagen) para que se vea incrustada en el mensaje. Parece una tontería, pero pierdes potenciales ayudas por la "pereza" que da el descargar y abrir en programa externo (y luego eliminar) las imágenes vinculadas. Mira a ver si puedes editar tu post (more->edit) y corriges eso. En cuanto a lo del potenciómetro, visto tu esquema, creo tal vez lo podrías adaptar a una bisagra, con lo que sólo girará un cuarto de vuelta.

Buenas tardes. He estado trasteando el Encoder y me gusta el resultado que he coneguido, asi que voy a aportar mi humilde granito de arena a este foro por si en un futuro le pueda ayudar a alguien.

El material que estoy empleando es: Arduino Uno + sensor de sonido, Arduino Uno + Encoder optico, Placa de relés. Uso 2 Arduinos, por que tenía uno parado que queria darle uso.

Explico como me ha quedado el experimento de la trampilla que baja/sube del techo :

-Doy una palmada y el sensor de sonido la capta, en ese momento me cierra un relé "de varios que hay" durante 20 seg. y le entra tensión al motor que comienza a girar en sentido Down. Al mismo tiempo que comienza a girar, el encoder y el segundo Arduino comienzan su trabajo, mediante un disco dentado instalado en el eje del motor, el Encoder lee los dientes del disco y el Ardunio tien orden de que al contar 100 cortes debe de enviar señal a la placa de relé para que me active un (SEGUNDO relé ) el cual se abre el contacto e impide que siga llegando tension al motor y este se detiene durante 2seg. ( La alimentación del motor está conectada en SERIE entre 2 relés)

-Despues de estos 2 seg. el tiempo de 20seg. del 1º arduino ha finalizado y abre el relé y el 2º arduino despues de estos 2ºseg. cierra el contacto del su relé para que siga listo para la nueva orden de Up.

-Sabiendo que la 1º placa se encarga de activar un relé durante 20 seg. y la 2º lo haría después de 100 dientes del disco hay que tener en cuenta del tiempo de funcionamiento del 1º, es decir : Si comienza toda esta maniobra y cuando han pasado 10 segundos y el encoder ya ha contado 100 dientes, despues de 2 seg. de espera volverá a abrirse el relé con lo que volvería a activarse el motor durante los 8seg. restantes que le quedaban del 1º arduino. Asi que eso es cuestion de tener controlado la relación Tiempo/Cortes. Una vez ajustado eso todo debe de ir bien.

  • En la siguiente palmada todo funcionaría mas o menos igual cambiando un pequeño detalle, puesto que el problema que tenia era que en "ocasiones" necesitaba Mas o Menos tiempo en Seg. de funcionamiento del motor en Up debido a que la gravedad, consumo ect....lo requería. Asi que con este sistema le puedo dar un tiempo mas amplio de subida 25seg. por ejemplo, pero el conteo de los dientes es el mismo, 100 dientes. Con lo que me aseguro de que volverá EXACTAMENTE al mismo lugar de donde partió.

-El codigo del conteo de dientes, al alcanzar la meta de 100, detiene todo durante 2seg. ( para dejar terminar de trabajar al 1º arduino ) y después reinicia el contador a 0 para estar listo para volver a contar en dirección Up.

Aqui dejó el codigo del conteo y reinicio de dientes:

boolean anterior = 0;    
boolean actual = 0; 
int contador = 0;  


void setup() 
{
  Serial.begin(9600);  
  pinMode(2,INPUT);//Entrada lectura datos Encoder    
  pinMode (6,OUTPUT);//Salida para cerrar relé para motor
}

 boolean debounce(boolean dato_anterior) 
 {

   boolean dato_actual = digitalRead(2);
   if (dato_anterior != dato_actual)
   {
     delay(10);
     dato_actual = digitalRead(2);
   }
   return dato_actual;
 }  

void loop() 
{           
digitalWrite(6,LOW); // ----------------------RECUERDA QUE LOW ES CONTACTO CERRADO !!!!!!!!-------------------
  actual = debounce(anterior); 
  

  if ( anterior == 0 && actual == 1) 
  {
         contador++;              
         
         delay (100);          
         Serial.println(contador);
  }

 if (contador ==100)//Cuantos dientes quieres que cuente el Encoder? 
 {
  digitalWrite(6,HIGH);//---------------------RECUERDA QUE HIGH ES CONTACTO ABIERTO !!
  delay(2000);//Tiempo de bloqueo de paro del motor
   contador=-1;// REINICIO CONTADOR A 0
 }


    anterior = actual; 
}

Repasando esto creo que es mas dificil de explicar lo que hace, que lo que realmente hace. Si alguien le anima y cree que el codigo puede quedar mejorado cambiando algo, adeante. por mi parte doy concluido este asunto. Espero le sirva de ayuda a alguien que necesite algo de este estilo.

Muchas Gracias!!

Si esta terminado agrega [SOLUCIONADO] al título. También podrias hacer un pequeño video de tu trabajo y colocarlo aquí para que los interesados lo vean.