TODOPIC

FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: snorkman en 06 de Febrero de 2009, 02:10:49

Título: Una ayuda con los encoders...por favor :)
Publicado por: snorkman en 06 de Febrero de 2009, 02:10:49
Hola gente buenas noches, soy Milton de Posadas. Actualmente estoy cursando mi tercer año de Ing. Electronica, y me he metido de lleno en la parte de programar los pic para realizar un controlador MIDI.

Para empezar, he programado un codigo para el controlador mas simple: un pote y un boton.

Mi problema es que, como no estoy familiarizado con la parte de conversion ADC, uso 2 botones (a parte del tercero) en vez del pote para aumentar o disminuir el volumen.

La pregunta es  ¿es muy dificil de usar un encoder que reemplace a estos 2 botones? El valor de el parametro varia de 0 a 127.

Espero haber sido claro con mi pregunta, y si alguien mas esta interesado en programar los pic para controladores MIDI con gusto les doy una mano. Yo programo actualmente en basic con el PIC SIMULATOR IDE.
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: Nocturno en 06 de Febrero de 2009, 02:35:59
Usar un encoder es muy simple.
Tienen dos salidas de onda cuadrada desfasadas 90º. Contando los pulsos de una de ellas puedes saber cuánto se ha movido. Precisamente cuando se produce el flanco (puedes elegir el ascendente o el descendente) de la primera, mirando la otra sabrás si está girando hacia un lado o hacia el otro.

Por tanto mi recomendación es que metas una salida del encoder a un pin de interrupción externa del micro, y en la interrupción lo primero que haces es comprobar el estado de la otra salida, que estará conectada a un pin sin interrupci´no del micro. Si el estado es 1, incrementas un contador; si el estado es 0, decrementas un contador. Así de simple.
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: micro_pepe en 06 de Febrero de 2009, 13:32:35
Hola, si piensas programar en CCS, visita este enlace: http://www.todopic.com.ar/foros/index.php?topic=24106.msg201486#msg201486

De todas formas en ese hilo viene un enlace a un articulo que explica el funcionamiento de un encoder y como detectar el giro.

Un saludo.
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: snorkman en 06 de Febrero de 2009, 23:08:34
hola pepe que tal? la verdad es que aun no me direccione para el lado del C para pic (a pesar de que en la facu usamos el ANJUTA IDE).......actualmente trabajo en basic
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: snorkman en 06 de Febrero de 2009, 23:35:07
Hola Nocturno, que tal? creo que he captado masomenos la idea de como programar.....

Que tipo de encoder necesito para este uso?

El pin comun del encoder, a donde va? GND o +5?

Serias tan amable de decirme si el codigo de ejemplo es correcto para un encoder??

/---------------------------------------------------------------------------------------------------------------------------------------------/
' Este codigo esta para que el encoder aumente el valor de una variable al girar a la derecha y disminuya el valor de la misma al girar a la izquierda

If PORTA.0=1 and PORTA.1=0 then 'SI GIRA A LA DERECHA
   entrada= entrada + 1
   Waitms 5
End if

If PORTA.1=1 and PORTA.0=0 then 'SI GIRA A LA IZQUIERDA
   entrada= entrada - 1
   Waitms 5
End if

/---------------------------------------------------------------------------------------------------------------------------------------------/
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: Nocturno en 07 de Febrero de 2009, 03:28:36
Ese código no te servirá si está en un bucle, porque si el encoder está parado en una de las dos posiciones descritas en los "if" se irán incrementando o decrementando hasta el infinito.
Debes meterlo en una interrupción por flanco ascendente o descendente para que te funcione, y te puedes ahorrar una de las dos condiciones de cada IF puesto que sabes cuál es el estado del pin que lanzó la interrupción.
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: snorkman en 07 de Febrero de 2009, 04:08:13
hola Nocturno gracias por la pronta respuesta........

Ahora que lo decis, me doy cuenta y tenes razon. Sera que me podes tirar algun ejemplin? :mrgreen:
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: Nocturno en 07 de Febrero de 2009, 04:41:48
Lo siento, no puedo.

Pega aquí tu código si tienes dudas y las vamos viendo.
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: alogic.on en 07 de Febrero de 2009, 07:16:13
hola si necesitas algo de info sobre un controlador midi puedes ver el que hice, esta aqui (http://www.todopic.com.ar/foros/index.php?topic=18800.msg146034#msg146034). pero yo lo programe en ensamblador, el encoder esta conectado como me dijo Nocturno hace ya mucho jej, a la patilla portb0 y la interrupcion activada por flanco ascendente, en cada interrupcion se lee el estado portb1 y se sabe en que sentido ha girado

un saludo espero te sirva


Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: Marttyn en 07 de Febrero de 2009, 08:08:45
Ese código no te servirá si está en un bucle, porque si el encoder está parado en una de las dos posiciones descritas en los "if" se irán incrementando o decrementando hasta el infinito.
Debes meterlo en una interrupción por flanco ascendente o descendente para que te funcione, y te puedes ahorrar una de las dos condiciones de cada IF puesto que sabes cuál es el estado del pin que lanzó la interrupción.

depende del tipo de encoder. yo compre un pack de 10 a sureelectronics (el chino de ebay). estos tienen como 20 pasos por vuelta, y cada paso hace un "tick" que se siente al tacto. en cada tic hacen todo el recorrido del codigo gray (2bits). ademas, mientras esta en reposo no conduce ninguno de los 2, por lo que como tiene un pull up siempre esta a "1".

mi codigo quedo muy simple:

Código: C
  1. void INT_EXT_isr(void){ //monitoriza rotary encoder
  2.         flagGiro = TRUE;
  3.         Sentido = ENC_B;
  4. }

flagGiro es un flag para avisar al programa que se giro el encoder.
Sentido es un short que indica a que lado se giro el encoder.
El pin A del encoder esta conectado a la interrupcion externa.
ENC_B es el pin del pic donde tengo conectado el pin B del encoder.
la int_ext esta configurada en flaco descendente.

con algunas modificaciones podrias usar un bucle para comprobar el estado del encoder, siempre y cuando se comporte como el mio  :mrgreen:
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: snorkman en 07 de Febrero de 2009, 13:22:28
Hoal Marttyn, como te va?? Cuanto te salieron esos encoders y donde los compraste??

Creo que el tipo de encoder del q hablas es el que necesito... cada "tick" q decis vos que hace cuando avanza seria un 0 en la entrada?? o un 1??

Disculpen por las repetidas preguntas. :-)
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: snorkman en 07 de Febrero de 2009, 13:28:59
Alogic.On la verdad es que tu controlador me dejo realmente....... :shock: WOW!

Una sola palabras------------------>>> EXCELENTE
El encoder lo usas debajo de tu jog wheel?
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: Marttyn en 07 de Febrero de 2009, 13:34:27
Los que compre yo son estos:
http://cgi.ebay.es/12mm-Rotary-Encoder-Switch-With-Keyswitch-10pcs_W0QQitemZ350126007559QQihZ022QQcategoryZ67003QQcmdZViewItemQQ_trksidZp1713.m153.l1262

como te comento, la interrupcion se activa cuando detecta un pulso bajo en el pin A del encoder, y en la interrupcion miro en que estado esta el pin B del encoder, si esta en 0 giro a la derecha, si es 1 giro a la izquierda.

salu2
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: snorkman en 07 de Febrero de 2009, 14:00:20
ok, gracias por la data.....estoy ansioso por empezar a probar el encoder
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: alogic.on en 07 de Febrero de 2009, 17:52:46
el plato es un cd transparente y el disco un acetato de 0,5 impreso con una laser, con adobe ilustrator y la herramienta de hacer estrellas se hace muy bien. el brazo son un par de leds IR y fotodiodos montados en un bastidor para regular la altura y la separacion entre ellos

un saludo
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: snorkman en 08 de Febrero de 2009, 22:27:57
Bueno creo que ya he entendido...y me gustaria q me corrijan nuevamente el codigo.

Tendria conectado un pin del encoder en RA0 y el otro pin al RA1. De manera que mientras que hay un "1" en RA0 verifica la entrada en RA1; si  hay un "1" aumenta el valor de la variable  o un "0" disminuye el valor de la misma.


/---------------------------------------------------------------------------------------------------------------------------------------------/
' Este codigo aumenta el valor de una variable al girar a la derecha y disminuye el valor de la misma al girar a la izquierda

While PORTA.0 = 1

   If PORTA.1 = 1  then  'SI GIRA A LA DERECHA
      entrada = entrada + 1
      Waitms 5
   End if

   If PORTA.1 = 0 then  'SI GIRA A LA IZQUIERDA
      entrada = entrada - 1
      Waitms 5
   End if
Wend
/---------------------------------------------------------------------------------------------------------------------------------------------/

podria funcionar??? :roll: :roll: :?:.....DESDE YA MUCHAS GRACIAS
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: Nocturno en 09 de Febrero de 2009, 03:15:22
Has vuelto a cometer el mismo error de antes: si el encoder está parado incrementará continuamente.
¿Porqué no lo metes en la interrupción externa?
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: Marttyn en 09 de Febrero de 2009, 08:31:01
por un lado ocurriria lo que dice nocturno, y por otro, si RA0 es cero, no entra en el bucle, logico... pero no volveria a comprobar el estado de RA0 a menos que metas todo en un bucle constante.
podrias hacer asi:

Código: QBasic/QuickBASIC
  1. WHILE TRUE  'bucle infinito
  2. IF PORTA.0 = 0 THEN  'detecta cuando se giro el encoder
  3.    IF PORTA.1 = 1  THEN  'SI GIRA A LA DERECHA
  4.       entrada = entrada + 1
  5.    END IF
  6.  
  7.    IF PORTA.1 = 0 THEN  'SI GIRA A LA IZQUIERDA
  8.       entrada = entrada - 1
  9.    END IF
  10.  
  11.    Waitms 5
  12. END IF
  13. WEND

no manejo el basic, asi que comprueba que la sintaxis sea correcta.
puse el waitms fuera de los IF, asi te ahorras una linea de codigo  :mrgreen:
por cierto, esto funcionara solo si el encoder es de los que hacen todo el codigo por cada "tick" como comentaba en otro post. porque sino puede ocurrir lo que dice manolo.
salu2
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: Nocturno en 09 de Febrero de 2009, 13:59:12
Incluso aunque haga click, puede ocurrir que la velocidad de giro del encoder sea lo suficientemente lenta como para que el bucle se ejecute varias veces.
Si no se puede meter en una interrupción, que es lo suyo, habría que chequear que se produzca una nueva iteración del bucle hasta que cambie de estado la entrada.
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: Marttyn en 09 de Febrero de 2009, 15:11:35
Incluso aunque haga click, puede ocurrir que la velocidad de giro del encoder sea lo suficientemente lenta como para que el bucle se ejecute varias veces.
Si no se puede meter en una interrupción, que es lo suyo, habría que chequear que se produzca una nueva iteración del bucle hasta que cambie de estado la entrada.

alli esta el "waitms 5". eso evitara que entre en el mismo bucle varias veces. si el comportamiento no es el esperado se puede aumentar el wait a 20, o incluso a 100 ms si hiciera falta.

igualmente, como bien dices, los suyo es una interrupcion.
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: Nocturno en 09 de Febrero de 2009, 17:09:26
No me parece adecuado, Marttyn. Será difícil encontrar una temporización que te sirva para cuando el encoder va lento y para cuando va rápido.
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: Marttyn en 09 de Febrero de 2009, 18:12:48
Hay muchas posibilidades de que tengas razon... pero si el pibe insiste en hacerlo con RA0 y RA1 que le vamos a hacer?  :D :D
Si no le queda otra, o no tiene mas pines disponibles que pruebe asi. Mas no le podemos insistir para que lo haga por una interrupcion  :P
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: Nocturno en 09 de Febrero de 2009, 20:25:06
Sí se puede hacer, aunque sigue sin ser la solución buena.

Código: QBasic/QuickBASIC
  1. WHILE TRUE  'bucle infinito
  2. IF PORTA.0 = 0 THEN  'detecta cuando se giro el encoder
  3.    IF PORTA.1 = 1  THEN  'SI GIRA A LA DERECHA
  4.       entrada = entrada + 1
  5.    END IF
  6.  
  7.    IF PORTA.1 = 0 THEN  'SI GIRA A LA IZQUIERDA
  8.       entrada = entrada - 1
  9.    END IF
  10.  
  11.    WHILE PORTA.0 = 0
  12.    END WHILE
  13.  
  14.  
  15.  
  16. END IF
  17. WEND

Añadiendo ese while no pasará de ciclo hasta que el encoder cambie de estado. Desconozco si la sintaxis del While es correcta, pero espero que se pille la idea.
Título: Re: Una ayuda con los encoders...por favor :)
Publicado por: snorkman en 09 de Febrero de 2009, 22:56:09
Bueno che....disuclpen no me quiero meter a hacer una interrupcion externa porque no soy EL PROGRAMADOR....voy a ver si me sale un intento de interrupcion