Encoder rotatorio Omron E6B2-CWZ6E

Hola amigos del foro!!
En esta ocasión vengo a preguntarles sobre como puedo acondicionar la señal de un encoder rotativo de 1000 P/R.
Fotos del Datasheet
Rating Encoder OMRON.jpgDiagrama de salida Endoder OMRON.jpg
Mi duda es la siguiente, como bien explique mas arriba, el encoder por cada vuela envía 1000 pulsos a cada una de sus salidas (A y B). El problema es que
con apenas moverlo, la cuenta se dispara es demasiado sensible. Lo que busco es acondicionar los pulsos, para que por cada vuelta me cuente 360 pulsos un Arduino y lo muestre en un display. Un conocido me comento, que tenia que hacer un prescaler, pero la verdad que no entiendo bien como haría esto en un Arduino.
Por lo que yo entiendo, cuanto mayor es la cantidad de pulsos que me de el encoder, mayor resolucion tengo. Por lo tanto si yo quiero que por vuelta el Arduino me
muestre en pantalla 360 pulsos, menor sera el error del conteo por vuelta. ¿Es así esto?
Este es el programa que yo estoy usando, pero lo que yo necesito, es modificarlo para que el Arduino me cuente 360 P/R.


C++:
volatile unsigned int temp, counter = 0; //This variable will increase or decrease depending on the rotation of encoder
#include <LiquidCrystal_I2C.h>   
LiquidCrystal_I2C lcd (0x27, 2, 1, 0, 4, 5, 6, 7);

void setup() {
    lcd.setBacklightPin(3,POSITIVE);  // puerto P3 de PCF8574 como positivo
    lcd.setBacklight(HIGH);// habilita iluminacion posterior de LCD
    lcd.begin(16, 2);     // 16 columnas por 2 lineas para LCD 1602A
    lcd.setCursor(0, 0);
    lcd.clear();

  pinMode(2, INPUT_PULLUP); // internal pullup input pin 2
 
  pinMode(3, INPUT_PULLUP); // internalเป็น pullup input pin 3
//Setting up interrupt
  //A rising pulse from encodenren activated ai0(). AttachInterrupt 0 is DigitalPin nr 2 on moust Arduino.
  attachInterrupt(0, ai0, RISING);
  
  //B rising pulse from encodenren activated ai1(). AttachInterrupt 1 is DigitalPin nr 3 on moust Arduino.
  attachInterrupt(1, ai1, RISING);
  }
  
  void loop() {
  // Send the value of counter
  if( counter != temp ){
  temp = counter;
   delay(200);
   lcd.clear();
  }
 
 
  lcd.setCursor(0,0);
    lcd.print(counter);
  }
  
  void ai0() {
  // ai0 is activated if DigitalPin nr 2 is going from LOW to HIGH
  // Check pin 3 to determine the direction
  if(digitalRead(3)==LOW) {
  counter++;
  }else{
  counter--;
  }
  }
  
  void ai1() {
  // ai0 is activated if DigitalPin nr 3 is going from LOW to HIGH
  // Check with pin 2 to determine the direction
  if(digitalRead(2)==LOW) {
  counter--;
  }else{
  counter++;
  }
  }
 
Última edición:

Fogonazo

"Qualified exorcist approved by the Vatican"
1000 NO es divisible por 360, da un número irracional 2,777777777777. . . . . . .
 
Bueno, me equivoque. Yo lo que quiero conseguir es que me cuente los pasos de un motor P.A.P de 200 pasos. Que por cada paso tiene 1.8°. Lo que busco es que cuando el motor de un giro, el encoder cuente 200 y el motor se frene. Obviamente haciendo todos los arreglos para que no se pase de pasos el motor. Por qué en realidad, el encoder le va a decir al motor que frene. Pero bueno, esa es otra historia.
 

Fogonazo

"Qualified exorcist approved by the Vatican"
Bueno, me equivoque. Yo lo que quiero conseguir es que me cuente los pasos de un motor P.A.P de 200 pasos. Que por cada paso tiene 1.8°. Lo que busco es que cuando el motor de un giro, el encoder cuente 200 y el motor se frene. Obviamente haciendo todos los arreglos para que no se pase de pasos el motor. Por qué en realidad, el encoder le va a decir al motor que frene. Pero bueno, esa es otra historia.
¿ Sabes por que el motor paso a paso se denomina así ?
 

Fogonazo

"Qualified exorcist approved by the Vatican"
Si!
Alguien me podría dar alguna pista de como hacer un prescaler en Arduino?
No existe prescaler que divida por números irracionales por eso mi comentario
1000 NO es divisible por 360, da un número irracional 2,777777777777. . . . . . .
¿ Sabes por que el motor paso a paso se denomina así ?
¿ Leíste algo sobre el funcionamiento del motor paso a paso ?, ¿ Cierto que NO ? ;)
 
Hola, simplemente cuenta los pulsos del encoder y multiplicarlo por 0,36. (Regla de tres simple) De esa forma te lo expresa en 360PR.
Recuerda utilizar la señal RESET, que entrega dicho encoder, para poner a 0, la variable contador del Arduino.
No existe prescaler que divida por números irracionales por eso mi comentario


¿ Leíste algo sobre el funcionamiento del motor paso a paso ?, ¿ Cierto que NO ? ;)
Si que se cómo funcionan, vi su funcionamiento en la secundaria en máquinas eléctricas. Y los use para armar una impresora 3d y un CNC router
 

Fogonazo

"Qualified exorcist approved by the Vatican"
Por lo que estás preguntando aquí parece que no comprendes su funcionamiento
. . . . Yo lo que quiero conseguir es que me cuente los pasos de un motor P.A.P de 200 pasos. Que por cada paso tiene 1.8°. Lo que busco es que cuando el motor de un giro, el encoder cuente 200 y el motor se frene. Obviamente haciendo todos los arreglos para que no se pase de pasos el motor. Por qué en realidad, el encoder le va a decir al motor que frene. Pero bueno, esa es otra historia. . . .
El motor PaP NO necesita que alguien externo cuente los pasos
El solito avanza o retrocede tantos pasos como se le envíen por programa. Salvo que esté mal calculado el torque y se saltee pasos
 
Por lo que estás preguntando aquí parece que no comprendes su funcionamiento

El motor PaP NO necesita que alguien externo cuente los pasos
El solito avanza o retrocede tantos pasos como se le envíen por programa. Salvo que esté mal calculado el torque y se saltee pasos
Acá me voy a contradecir. Pero yo lo voy a usar, para que me cuente los pasos que da el motor pap por medio del encoder. Estos pulsos que me da el encoder, los voy a leer con Arduino, pero yo quiero bajar la resolución del encoder a 200 que son los pasos que da el motor. Este valor se va a mostrar en una pantalla LCD y voy a hacer un programa que por medio de un teclado se ingrese por ejemplo 10 pasos y el motor se pare, y en pantalla me muestre los 10 pasos dados. Espero se entienda.
 

Emis

Well-known-juntamugre
Si es para aprendizaje me parece perfecto utilizar un encoder para conocer la posición del motor PAP. Por más que se por software que logras saber la posición exacta.


Ahora mi duda es, al tener 200 pasos y cada paso son 1.8°, con 1000 pulsos del encoder detectaría cada paso pasos son 0.36°, pero si tengo que a cada 1.8° x 1000 / 360° puede detectar 5 pulsos por cada paso del PAP, eso es correcto?
 

DOSMETROS

High 2m Modereitor
Por eso , la mayoría de máquinas o aparatos que no usan encoder deben realizar un movimiento prefijado para encontrar el cero
 
Por lo que estás preguntando aquí parece que no comprendes su funcionamiento

El motor PaP NO necesita que alguien externo cuente los pasos
El solito avanza o retrocede tantos pasos como se le envíen por programa. Salvo que esté mal calculado el torque y se saltee pasos
Si, ya lo sé a eso, del motor paso a paso, pero yo quiero saber en qué posición está. Pero yo lo que necesito, es escalar la resolución del encoder.
Si es para aprendizaje me parece perfecto utilizar un encoder para conocer la posición del motor PAP. Por más que se por software que logras saber la posición exacta.


Ahora mi duda es, al tener 200 pasos y cada paso son 1.8°, con 1000 pulsos del encoder detectaría cada paso pasos son 0.36°, pero si tengo que a cada 1.8° x 1000 / 360° puede detectar 5 pulsos por cada paso del PAP, eso es correcto?
Si, por qué si realizas la división de 1000/200=5. Osea como vos decís, cada 5 pulsos del encoder, un paso del motor. Pero, y por favor, pido que me corrijan, un encoder puede saltarse pasos, por eso, yo lo que quiero encontrar, es la manera de que; por ejemplo, en un paso del motor, el encoder se comió uno o dos lecturas, no pase nada, ya que con un pulso de los 5, bastaría para contabilizar el paso motor.
Hola, si sólo vas a usar un encoder para contar pasos, pues es más simple contarlos con el propio software que controla al motor.
Hola! No es solo para contar pasos, yo con esos pulsos, voy a realizar un programa que hará distintos procesos. Pero yo lo que pedí, era si alguien sabía, como por medio de Arduino, hacer un programa para escalar la resolución del encoder. Esa es la pregunta principal.
 
Última edición:
No entiendo bien que es eso del encoder se salto pasos, el encoder no se salta nada, sino no serviría para su fín, imaginate poner un encoder para saber la posición de un eje peeeeero que tenes que dudar si se "comio" o no uno o dos pasos. Imaginate un encoder de los viejos mouses saltandose pasos, no dibujas algo con el raton ni que seas mago o sepas cuando se "salta" y cuanto se salta...

Bien, partiendo de eso, el encoder bien montado y conectado no se va a comer nada tenes ya vos mismo escrita la solución. 5 pasos del encoder es un paso del motor, setea una variable y listo. No le busques mas la vuelta. Despues si seteas un cero sumas o restas esa variable o una auxiliar que lleve la suma o resta de los distintos movimientos.

Si por alguna razon tu montaje no es perfecto podes hasta usar un redondeo al mayor o menor, o lo que sería ideal corregir el montaje.
 

Arriba