Tabla de contenido:

Escáner de punto XYZ con codificadores rotativos recuperados: 5 pasos
Escáner de punto XYZ con codificadores rotativos recuperados: 5 pasos

Video: Escáner de punto XYZ con codificadores rotativos recuperados: 5 pasos

Video: Escáner de punto XYZ con codificadores rotativos recuperados: 5 pasos
Video: ENCODER CON PIC... CONTROL CNC SERVOASISTIDO 2024, Mes de julio
Anonim
Escáner de punto XYZ con codificadores rotativos recuperados
Escáner de punto XYZ con codificadores rotativos recuperados

Habiendo adquirido una gran cantidad de codificadores ópticos rotativos desechados de mi lugar de trabajo, finalmente decidí hacer algo divertido / útil con ellos.

Recientemente compré una nueva impresora 3D para mi hogar y ¡qué podría complementarla mejor que un escáner 3D! Este proyecto también me brindó la oportunidad perfecta de emplear mi impresora 3D para fabricar las piezas necesarias.

Suministros

Encoders ópticos y sensores ópticos correspondientes

Arduino UNO

escudo de creación de prototipos opcional

rieles de barra de acero

acceso a una impresora 3D

Paso 1: los codificadores ópticos

Los codificadores ópticos
Los codificadores ópticos
Los codificadores ópticos
Los codificadores ópticos
Los codificadores ópticos
Los codificadores ópticos

Casi cualquier codificador rotatorio podría usarse para este proyecto, siempre que le proporcione un número relativamente alto de 'clics' por mm. Obviamente, diferentes codificadores requerirán una solución de montaje adecuada.

Usé un medidor de continuidad para rastrear el diagrama de cableado de los fotosensores.

Paso 2: Piezas impresas en 3D

Piezas impresas en 3D
Piezas impresas en 3D
Piezas impresas en 3D
Piezas impresas en 3D

Estas partes albergan los codificadores rotativos y proporcionan un deslizamiento para el riel. La carcasa del codificador único tiene dos orificios en la parte posterior para que se monten los rieles transversales. La carcasa del codificador doble es simplemente dos carcasas individuales fusionadas en ángulo recto.

Diseñé estos soportes en fusion360 para que se adapten a mi elección de codificadores y rieles, el eje del codificador tiene un trozo corto de funda de goma de tirachinas, para ayudarlo a sujetar mejor el eje de acero inoxidable.

Desea que el eje se deslice libremente y caiga a través de la carcasa cuando se sostiene verticalmente, pero debe ejercer suficiente presión sobre el codificador para que no se deslice. Lo que funcionó para mí fue permitir que la corredera del eje se superpusiera con el eje del codificador en 0,5 mm. La goma de tirachinas es lo suficientemente suave como para deformarse en esa cantidad y proporcionar una buena tracción.

Paso 3: diagrama de cableado

Diagrama de cableado
Diagrama de cableado

El circuito es muy sencillo. Los opto-sensores requieren algo de corriente para los diodos emisores de infrarrojos, una tierra y resistencias pull-up para los fotodiodos.

Me decidí por 5 mA para los diodos emisores en serie, en este codificador en particular, la caída de voltaje en los diodos es de 3,65 V. Estoy usando un suministro de 5V del Arduino, que deja 1.35V para la resistencia, a 5mA esto resulta ser 270 ohmios.

Se seleccionaron 10k ohmios para los pull-ups ya que los fotodiodos solo pueden absorber una pequeña corriente, también se usaron 10k ohmios para el botón pulsador. Hay un botón disponible para usar en la placa prototipo que ya está conectada a tierra, solo proporcione una resistencia pull-up y conéctela al pin de entrada deseado.

Paso 4: Código Arduino

Código Arduino
Código Arduino
Código Arduino
Código Arduino
Código Arduino
Código Arduino

El código necesita una pequeña explicación ya que su funcionamiento puede no ser obvio de inmediato, sin embargo, tuvo que optimizarse de esta manera para poder procesar 3 codificadores con la suficiente rapidez.

En primer lugar, solo queremos procesar datos de dirección SI ha habido un cambio en la posición del codificador.

cambios = nuevo_valor ^ valor almacenado;

Para obtener más resolución de mis codificadores, tuve que procesar los bordes ascendentes y descendentes.

En mi configuración, mi resolución es de 24 clics por 1 cm.

Esto nos deja con algunos escenarios.

S1 es constante 0 y S2 cambia de 0 a 1

S1 es constante 0 y S2 cambia de 1 a 0

S1 es constante 1 y S2 cambia de 0 a 1

S1 es constante 1 y S2 cambia de 1 a 0

S2 es constante 0 y S1 cambia de 0 a 1

S2 es constante 0 y S1 cambia de 1 a 0

S2 es constante 1 y S1 cambia de 0 a 1

S2 es constante 1 y S1 cambia de 1 a 0

Estas condiciones se entienden mejor en las tablas de verdad anteriores, también cada condición produce una 'dirección', arbitrariamente nombrada 0 o 1.

Los gráficos nos dan dos pistas vitales:

1) un gráfico es el inverso completo del otro, por lo que si tenemos uno, podemos calcular fácilmente el otro simplemente invirtiendo la salida. Invertimos la salida solo si un pin está cambiando y no el otro, podemos elegir uno arbitrariamente.

2) el gráfico en sí es simplemente el XOR de las señales S1 y S2. (el otro cuadro es el NO de este).

Ahora entender el código es simple.

// leer en PORT en paralelo // recordar que los pares adyacentes pertenecen al mismo estado del codificador = PINB & 0x3f; // qué pines han cambiado si cualquier diff = hold ^ state; // XOR señales adyacentes de S1 y S2 para obtener la tabla de verdad // la forma más fácil es hacer una copia del estado actual // y desplazarla hacia la derecha un bit lookup = state >> 1; // ahora los bits están alineados para XOR dir = lookup ^ state; // recuerde, la tabla debe invertirse si una // de las entradas permaneció constante, no necesitamos una instrucción IF // para esto. Actualmente, el bit de dirección deseado // es el bit de la mano derecha de cada par en la variable 'dir' // el bit de la mano izquierda no tiene sentido // la variable 'diff' tiene el bit que cambió 'set' // así que tenemos '01' o '10' // XOR esto con el byte 'dir' o // invertirá o no el bit significativo. dir ^ = diff; // ahora actualiza la variable de retención hold = state; // si alguno de los bits ha cambiado para este codificador if (diff & 0x03) {// determina la dirección if (dir & 0x01) {// según su hadware y cableado ya sea ++ o - --z; } más {++ z; }} // lo mismo para el resto if (diff & 0x0c) {if (dir & 0x04) {++ y; } else {--y; }} if (diff & 0x30) {if (dir & 0x10) {--x; } más {++ x; }}

Cuando se presiona el botón, enviamos el valor XYZ actual a un programa de terminal.

Los datos en serie son lentos, pero durante el funcionamiento normal las posiciones de los codificadores no cambiarán durante este tiempo de todos modos.

Los datos se envían como recuentos sin procesar. Podrías hacer los cálculos y enviar los datos en mm o pulgadas, etc. Encuentro que los valores brutos son igual de buenos porque podemos escalar el objeto más adelante en el software.

Paso 5: primer escaneo

Primer escaneo
Primer escaneo
Primer escaneo
Primer escaneo
Primer escaneo
Primer escaneo
Primer escaneo
Primer escaneo

Reunir los puntos es un proceso lento, suelo la sonda en la esquina superior izquierda y reinicio el Arduino.

Esto pone a cero la posición como hogar.

Luego mueva la sonda a la ubicación del objetivo, manténgala firme y presione el botón 'instantánea'.

Para esta pieza de muestra bastante grande, tomé solo ~ 140 puntos, por lo que los detalles no son excelentes en el producto final.

Guarde los datos en un archivo. PCD y agregue el encabezado

#. PCD v.7 - Formato de archivo de datos de nube de puntos VERSIÓN.7 CAMPOS x y z TAMAÑO 4 4 4 TIPO F F F RECUENTO 1 1 1 ANCHO (su recuento de puntos) ALTURA 1 PUNTO DE VISTA 0 0 0 1 0 0 0 PUNTOS (su recuento de puntos)

Ponga su cuenta de puntos en el encabezado, esto es fácil en cualquier editor que le proporcione números de línea.

Por encima de los puntos se pueden ver en freeCad, luego se exportan desde freeCad como archivo. PLY.

Abra. PLY en MeshLab y muestre el objeto. ¡¡Hecho!!

Recomendado: