Reporte Técnico: Encoder Incremental
HEDS-65xx/HEDL-65xx
*1. Descripción General El encoder HEDS-65xx/HEDL-65xx es un dispositivo incremental
óptico diseñado para medir posición, velocidad y dirección de movimiento. Este modelo es
ampliamente utilizado en aplicaciones que requieren alta precisión y confiabilidad, como:
Sistemas de posicionamiento.
Manipuladores robóticos.
Mesas de trabajo automatizadas.
Impresoras y trazadores.
El encoder funciona detectando cambios en la posición de un eje rotativo mediante una
rueda de código óptica, un LED emisor y un detector óptico.
*2. Especificaciones Técnicas
Caracterı́sticas Clave
Resolución: Hasta 1024 cuentas por revolución (PPR).
Temperatura de operación: Hasta 100 °C, adecuado para entornos industriales.
Compatibilidad de eje: Diámetro máximo del eje de 5/8 pulgadas (15.875 mm).
Alimentación: Voltaje de operación de +5V DC.
Señales de salida:
– Canales A y B: Señales digitales cuadradas en cuadratura con un desplazamiento
de 90°.
– Canal I: Pulso de ı́ndice único por revolución.
1
– Señales inversas -A, -B, -I (en modelos diferenciales).
*3. Funcionamiento
Principio de Operación
1. Emisión de luz: Un LED emisor proyecta luz hacia una rueda de código.
2. Modulación de luz: La rueda de código contiene ranuras que interrumpen la luz según
la rotación del eje.
3. Detección óptica: Los detectores convierten la luz modulada en señales digitales cuadradas.
Salidas Digitales
A y B: Proporcionan información sobre la posición y la dirección del movimiento. La
secuencia de activación indica:
– Si A cambia antes que B, el movimiento es horario.
– Si B cambia antes que A, el movimiento es antihorario.
I (Índice): Genera un pulso único por revolución, útil como referencia de posición.
*4. Cálculos Esenciales
Resolución Angular
La resolución del encoder determina el ángulo medido por cada pulso:
360
Ángulo por pulso =
Resolución (PPR)
Ejemplo: Para un encoder de 1024 PPR:
360
Ángulo por pulso = = 0.3516 por pulso.
1024
Conversión de Pulsos a Ángulo
Ángulo actual = Pulsos contados × Ángulo por pulso
Ejemplo: Si se han contado 250 pulsos:
Ángulo actual = 250 × 0.3516 = 87.9
2
Velocidad Angular
Si se necesita calcular la velocidad angular:
∆Ángulo
Velocidad angular =
∆Tiempo
Ejemplo: Si el ángulo cambia de 87.9° a 105.5° en 0.2 segundos:
105.5 − 87.9
Velocidad angular = = 87.9/s
0.2 s
*5. Integración al Sistema
Lectura de Señales y Procesamiento
El encoder emite señales digitales cuadradas que deben ser leı́das y procesadas:
1. Captura de señales:
Usar entradas digitales de un microcontrolador (como Arduino).
Configurar interrupciones para detectar cambios en los canales A y B.
2. Cálculo en Tiempo Real:
Contar los pulsos en función de los cambios de estado de los canales.
Determinar la dirección con la relación entre A y B.
Calcular el ángulo acumulado utilizando la resolución del encoder.
3. Calibración:
Mover manualmente el eje hasta el lı́mite inferior y registrar los pulsos (posición
mı́nima).
Mover al lı́mite superior y registrar los pulsos (posición máxima).
Convertir estos pulsos a valores angulares para definir el rango operativo.
*6. Ejemplo de Código en Arduino
# define PIN_A 2
# define PIN_B 3
volatile int contadorPulsos = 0;
3
float anguloActual = 0.0;
const float resolucionPPR = 1024.0;
const float anguloPorPulso = 360.0 / resolucionPPR ;
void setup () {
pinMode ( PIN_A , INPUT ) ;
pinMode ( PIN_B , INPUT ) ;
attachInterrupt ( d i g i t a l P i n T o I n t e r r u p t ( PIN_A ) , procesarEncoder ,
CHANGE ) ;
attachInterrupt ( d i g i t a l P i n T o I n t e r r u p t ( PIN_B ) , procesarEncoder ,
CHANGE ) ;
Serial . begin (9600) ;
}
void procesarEncoder () {
int estadoA = digitalRead ( PIN_A ) ;
int estadoB = digitalRead ( PIN_B ) ;
if ( estadoA == estadoB ) {
contadorPulsos ++;
} else {
contadorPulsos - -;
}
anguloActual = contadorPulsos * anguloPorPulso ;
}
void loop () {
Serial . print ( " Pulsos : ␣ " ) ;
Serial . print ( contadorPulsos ) ;
Serial . print ( " Angulo : ␣ " ) ;
Serial . println ( anguloActual ) ;
delay (100) ;
}
*7. Ejemplo de Código en Python para Guardar Datos
import serial
import openpyxl
from openpyxl . styles import Font , Alignment
4
PUERTO_SERIAL = ’ COM3 ’
BAUD_RATE = 9600
arduino = serial . Serial ( PUERTO_SERIAL , BAUD_RATE )
wb = openpyxl . Workbook ()
hoja = wb . active
hoja . title = " Lecturas ␣ del ␣ Encoder "
hoja . append ([ " Tiempo ␣ ( s ) " , " Pulsos " , " Direcci \ ’ on " , " \ ’ Angulo ␣ (\
textdegree ) " ])
inicio_tiempo = time . time ()
try :
while True :
linea = arduino . readline () . decode ( ’utf -8 ’) . strip ()
datos = linea . split ( " | " )
pulsos = datos [0]. split ( " : " ) [1]. strip ()
direccion = datos [1]. split ( " : " ) [1]. strip ()
angulo = datos [2]. split ( " : " ) [1]. strip ()
tiempo_actual = time . time () - inicio_tiempo
hoja . append ([ round ( tiempo_actual , 2) , int ( pulsos ) , direccion ,
float ( angulo ) ])
except KeyboardI nterr upt :
arduino . close ()
wb . save ( " datos_encoder . xlsx " )
*8. Aplicación en el Proyecto
Calibración del Sistema
1. Liberación del Freno:
Mover manualmente el brazo para registrar los pulsos correspondientes a los lı́mites
fı́sicos.
2. Definición del Rango Angular:
Lı́mite inferior: 0 pulsos (0°).
5
Lı́mite superior: 512 pulsos (180° para un rango semicircular).
3. Uso en Tiempo Real:
Monitorear el ángulo calculado para controlar la posición del brazo robótico dentro
de los lı́mites definidos.
*9. Conclusión El encoder HEDS-65xx/HEDL-65xx ofrece una solución precisa y confiable
para medir movimiento angular en aplicaciones como brazos robóticos. Su integración permite:
Determinar la posición angular con alta precisión.
Monitorear y controlar el movimiento del sistema.
Establecer lı́mites fı́sicos mediante calibración manual.
Este encoder, combinado con un procesamiento adecuado, es una herramienta esencial para
sistemas de control que requieren alta resolución y robustez en entornos industriales.