Datos personales

Mi foto
Algun dia, las maquinas también tendrán sueños...

miércoles, 30 de marzo de 2016

Encoder óptico e interrupciones con Arduino.

Durante mi construcción del robot balancin me vi en muchos problemas en cuanto a la información de encoders ópticos con arduino, por eso me dispuse a hacer este post para explicar, una vez mas, muy brevemente su funcionamiento, en este caso voy a usar los siguientes materiales.

- Arduino Uno.
- Motor Faulhaber con reducción
- Modulo driver de motores L298n
- Protoboard
- 2 resistencias de 1K
- 4 resistencias de 10K
- 2 leds
- 1 resistencia de 120 ohms
y otras cosas como cables y una fuente de 12v. para el motor

Por supuesto tendrán que ver el vídeo para continuar




las conexiones son las siguientes:






Luego vamos a armar el siguiente circuito(serán 2 iguales, uno por cada canal):




Con este circuito podremos ver si nuestro encoder esta en buen estado, cuando un sensor deja pasar la luz el led prenderá, por lo tanto a su salida tendremos una tensión de aproximadamente 5V.



Si ustedes tienen un motor Pololu de este tipo u otro que genere a la salidas del encoder 5v.
no sera necesario armar el circuito
solo tendrán que identificar la alimentación y la salida de ambos canales del encoder



una vez comprobado que el encoder funciona bien podremos pasar a conectarlo al arduino

2 de estos, 1 por cada canal





El módulo no recibirá alimentación de 5v. ya que usaremos el jumper para activar el regulador que trae integrado

En el vídeo cargue un código de ejemplo en el que el motor gira hacia un lado y cuando el encoder marca los 1800 ticks (pulsaciones) gira hacia el otro lado, cuando llega a -1800 regresa y así se mantiene indefinidamente, eso es solo un ejemplo, ustedes seguramente podrán usarlo y programar lo que necesiten, en el vídeo mencione que este motor se puede usar como servo pero solo si NO tiene una carga física pesada, de lo contrario se forzaría el motor, a menos que el motor tenga una reducción muy grande,  para leer lo mas rapido posible las pulsaciones vamos a utilizar la librería
digitalWriteFast.h que pueden descargar aquí,
En cuanto al código de ejemplo lo podrán descargar de aquí

Eso es todo, cualquier duda o queja no duden en comentar y recuerden apoyarme con su suscripción a mi canal de Youtube y a mi Blog, gracias.

22 comentarios:

  1. hola ejecuto el programa pero tengo un problema en arduino me podrías ayudar:


    C:\Users\Gateway\Documents\Arduino\libraries\digitalWriteFast/digitalWriteFast.h:25:0: warning: "digitalPinToTimer" redefined [enabled by default]

    #define digitalPinToTimer(P) \

    ^

    In file included from sketch\EncoderOptico1.ino.cpp:1:0:

    C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:171:0: note: this is the location of the previous definition

    #define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) )

    ResponderEliminar
  2. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  3. Excelente post, muchísimas gracias !

    ResponderEliminar
  4. Excelente post, muchísimas gracias !

    ResponderEliminar
  5. Tengo una pregunta, las otras dos salidas del encoder a donde se conectan?

    ResponderEliminar
    Respuestas
    1. Destornillé la placa y se observa algo parecido a un capacitor, aunque en la placa dice R1, se introduce a una cavidad del disipador, así que creo que es un termopar para sensar la temperatura del actuador.

      Eliminar
  6. Entonces no es necesario usar otro transistor? Veo que en tu diagrama tiene uno y en el material no lo nombras

    ResponderEliminar
  7. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  8. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  9. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  10. Por favor me dices que problemas tengo. In function 'void setup()':

    EncoderOptico1:34: error: 'Encoder1A' was not declared in this scope

    exit status 1
    'Encoder1A' was not declared in this scope

    Ya instale la libreria
    Gracias

    ResponderEliminar
  11. Buen post, estaba buscando información de ese motor Faulhaber M124. ¿cuál es la tensión que arroja el encoder? porque mencionas que no la lee el arduino y por eso el circuito extra con transistor.

    Y el conteo es de 800 por la reducción del motor. Se puede mejorar la cantidad de conteos por vuelta si se hace interrupción en ambas salidas del encoder, empleando para esto el pin 3 de Arduino UNO.

    ResponderEliminar
    Respuestas
    1. Si activas las resistencias pull up no necesitas el circuito extra.

      Eliminar
  12. Me faltó mencionar que debes quitar las resistencias de 10K a 5V que van a los pines A y B del encoder. Simplemente conecta las salidas A y B al arduino y activa las pull up. (Poner en HIGH los pines de entrada).

    Si empleas las 2 interrupciones el encoder da 3000 "ticks" por vuelta.

    ResponderEliminar
    Respuestas
    1. Hola, disculpa este ultimo comentario es para ya no hacer el circuito que marcas arriba?

      Eliminar
    2. es correcto se puede usar sin transistores ya me funciono, disculpa si es que sigues por aquí como es el programa para mejorar la cantidad de conteos por vuelta crees que me lo puedas pasar

      Eliminar
    3. entonces pueden ir los canales directo a la tarjeta?

      Eliminar
  13. Hola, me podrias propocionar el circuito ya completo, que lo he probado asi como en las imagenes y no me funciona. Gracias.

    ResponderEliminar
  14. Saludos! Una pregunta, compilé el código y no me marca errores, pero el Monitor Serial únicamente arroja basura. Tampoco me queda muy claro a donde se conecta la patilla 9 PWM de Arduino.
    De antemano muchas gracias por el post :D

    ResponderEliminar
  15. No entiendo como están conectadas las resistencias que están en la placa, me podría ayudar por favor

    ResponderEliminar