Tabla de contenido:

Brazo robótico: Jensen: 4 pasos
Brazo robótico: Jensen: 4 pasos

Video: Brazo robótico: Jensen: 4 pasos

Video: Brazo robótico: Jensen: 4 pasos
Video: Robot con el Mecanismo de Theo Jansen | Four Legs Walking Machine Model 2024, Octubre
Anonim
Brazo robótico: Jensen
Brazo robótico: Jensen

Jensen es un brazo robótico construido en la plataforma Arduino con un enfoque en la planificación de movimiento intuitiva, realizado como un proyecto independiente de 1 crédito bajo la tutoría de Charles B. Malloch, PhD. Puede replicar una serie de movimientos programados moviendo manualmente el brazo. Me inspiré para construirlo al ver otros brazos robóticos construidos en el espacio de fabricación UMass Amherst M5. Además, quería aprender a utilizar el software CAD y quería hacer un proyecto avanzado de Arduino. Vi esto como una oportunidad para hacer todas esas cosas.

Paso 1: Diseño y alcance originales

Diseño y alcance originales
Diseño y alcance originales

El software CAD que elegí aprender para este proyecto fue OnShape, y lo primero que modelé fue un servo analógico HiTec HS-422. Elegí el servo porque estaba disponible para mí localmente y era un precio razonable. También sirvió como una buena práctica para aprender OnShape antes de pasar a diseñar mis propias piezas. En este punto inicial del proyecto, tenía una idea general de lo que quería que fuera capaz de hacer el brazo. Quería que tuviera un rango de movimiento decente y una pinza para levantar cosas. Estas especificaciones generales informaron el diseño mientras seguía modelándolo en CAD. Otra limitación de diseño que tenía en este momento era el tamaño de la cama de impresión en mi impresora 3D. Es por eso que la base que ves en la foto de arriba es un cuadrado relativamente primitivo.

Durante esta etapa del proyecto, también estaba haciendo una lluvia de ideas sobre cómo quería controlar el brazo. Un brazo robótico en el que me había inspirado en el Maker Space usaba un brazo títere para controlarlo. Otro usó un método de programación de ruta intuitivo en el que el usuario movía el brazo a varias posiciones. El brazo luego volvería a recorrer esas posiciones.

Mi plan original era terminar la construcción del brazo y luego implementar ambos métodos de control. También quería crear una aplicación informática para controlarlo en algún momento después de eso. Como probablemente pueda ver, terminé reduciendo el alcance de este aspecto del proyecto. Cuando comencé a trabajar en esos dos primeros métodos de control, rápidamente descubrí que el de programación de ruta intuitiva era más complicado de lo que pensaba. Fue entonces cuando decidí convertirlo en mi enfoque y poner los otros métodos de control en espera indefinida.

Paso 2: Control

Control
Control

El método de control que elegí funciona así: mueves el brazo con las manos en varias posiciones y "guardas" esas posiciones. Cada posición tiene información sobre el ángulo entre cada eslabón del brazo. Una vez que haya terminado de guardar posiciones, presione un botón de reproducción y el brazo regresa a cada una de esas posiciones en secuencia.

En este método de control, había muchas cosas que resolver. Para que cada servo regresara a un ángulo guardado, tuve que "guardar" de alguna manera esos ángulos en primer lugar. Esto requería que el Arduino Uno que estaba usando pudiera recibir el ángulo actual de cada servo. Mi amigo Jeremy Paradie, quien hizo un brazo robótico que usa este método de control, me dio una pista sobre cómo usar el potenciómetro interno de cada servo de hobby. Este es el potenciómetro que el servo usa para codificar su ángulo. Elegí un servo de prueba, soldé un cable al pin del medio del potenciómetro interno y perforé un agujero en la caja para alimentar el cable afuera.

Ahora podría recibir el ángulo actual leyendo el voltaje en el pin central del potenciómetro. Sin embargo, hubo dos nuevos problemas. En primer lugar, hubo ruido en forma de picos de voltaje en la señal proveniente del pin del medio. Este problema se convirtió en un problema real más tarde. En segundo lugar, el rango de valores para enviar un ángulo y recibir un ángulo era diferente.

Decirle a los servomotores de hobby que se muevan en algún ángulo entre 0 y 180 grados implica enviarle una señal PWM con un tiempo alto correspondiente al ángulo. Por el contrario, usar un pin de entrada analógica del Arduino para leer el voltaje en el pin central del potenciómetro mientras se mueve la bocina del servo entre 0 y 180 grados devuelve un rango de valores separado. Por lo tanto, se necesitaban algunos cálculos matemáticos para traducir un valor de entrada guardado en el valor de salida PWM correspondiente necesario para devolver el servo al mismo ángulo.

Mi primer pensamiento fue usar un mapa de rango simple para encontrar el PWM de salida correspondiente para cada ángulo guardado. Esto funcionó, pero no fue muy preciso. En el caso de mi proyecto, el rango de valores de tiempo alto de PWM correspondientes a un rango de ángulo de 180 grados fue mucho mayor que el rango de valores de entrada analógica. Además, estos dos rangos no eran continuos y estaban compuestos únicamente por números enteros. Por lo tanto, cuando asigné un valor de entrada guardado a un valor de salida, se perdió la precisión. Fue en este punto que pensé que necesitaba un bucle de control para llevar mis servos a donde tenían que estar.

Escribí un código para un bucle de control PID en el que la entrada era el voltaje del pin medio y la salida era la salida PWM, pero rápidamente descubrí que solo necesitaba un control integral. En este escenario, tanto la salida como la entrada representaban ángulos, por lo que agregar control proporcional y derivado tendía a hacer que se sobrepasara o tuviera un comportamiento indeseable. Después de ajustar el control integral, todavía había dos problemas. En primer lugar, si el error inicial entre el ángulo actual y el deseado fuera grande, el servo se aceleraría demasiado rápido. Podría reducir la constante para el control integral, pero eso hizo que el movimiento general fuera demasiado lento. En segundo lugar, la moción estaba nerviosa. Esto fue el resultado del ruido en la señal de entrada analógica. El lazo de control estaba leyendo continuamente esta señal, por lo que los picos de voltaje provocaron un movimiento de nerviosismo. (En este punto también pasé de mi único servo de prueba al ensamblaje que se muestra arriba. También hice un objeto de bucle de control para cada servo en el software).

Resolví el problema de la aceleración demasiado rápida colocando un filtro de promedio móvil ponderado exponencialmente (EWMA) en la salida. Al promediar la salida, se redujeron los grandes picos de movimiento (incluida la fluctuación del ruido). Sin embargo, el ruido en la señal de entrada seguía siendo un problema, por lo que la siguiente etapa de mi proyecto estaba tratando de resolverlo.

Paso 3: ruido

Ruido
Ruido

En la foto de arriba

En rojo: señal de entrada original

En azul: señal de entrada después del procesamiento

El primer paso para reducir el ruido en la señal de entrada fue comprender su causa. Probar la señal en un osciloscopio reveló que los picos de voltaje ocurrían a una velocidad de 50Hz. Sucedió que sabía que la señal PWM que se enviaba a los servos también tenía una frecuencia de 50Hz, así que supuse que los picos de voltaje tenían algo que ver con eso. Supuse que el movimiento de los servos de alguna manera estaba causando picos de voltaje en el pin V + de los potenciómetros, lo que a su vez estaba alterando la lectura en el pin del medio.

Aquí es donde hice mi primer intento de reducir el ruido. Abrí cada servo nuevamente y agregué un cable proveniente del pin V + en el potenciómetro. Necesitaba más entradas analógicas para leerlas que las que tenía el Arduino Uno, así que también me mudé a un Arduino Mega en este punto. En mi código, cambié la entrada del ángulo de ser una lectura analógica del voltaje en el pin del medio a una relación entre el voltaje en el pin del medio y el voltaje en el pin V +. Mi esperanza era que si hubiera un pico de voltaje en los pines, se cancelaría en la relación.

Volví a armar todo y lo probé, pero los picos seguían ocurriendo. Lo que debería haber hecho en este punto era sondear mi terreno. En cambio, mi siguiente idea fue poner los potenciómetros en una fuente de alimentación separada por completo. Desconecté los cables V + de las entradas analógicas del Arduino y los conecté a una fuente de alimentación separada. Había sondeado los pines antes, así que sabía a qué voltaje alimentarlos. También corté la conexión entre la placa de control y el pin V + en cada servo. Volví a armar todo, revirtí el código de entrada del ángulo a cómo era antes y luego lo probé. Como era de esperar, no hubo más picos de voltaje en el pin de entrada. Sin embargo, había un nuevo problema: poner los potenciómetros en una fuente de alimentación separada había estropeado por completo los lazos de control internos de los servos. Aunque los pines V + recibían el mismo voltaje que antes, el movimiento de los servos era errático e inestable.

No entendí por qué estaba sucediendo esto, así que finalmente probé mi conexión a tierra en los servos. Hubo una caída de voltaje promedio de aproximadamente 0,3 voltios a través del suelo, y se disparó aún más cuando los servos consumieron corriente. Entonces me quedó claro que esos pines ya no podían considerarse "tierra" y podrían describirse mejor como pines de "referencia". Los tableros de control en los servos deben haber estado midiendo el voltaje en el pin central del potenciómetro en relación con el voltaje en los pines V + y de referencia. Encender los potenciómetros por separado estropeó esa medida relativa porque ahora, en lugar de que ocurra un pico de voltaje en todos los pines, solo sucedió en el pin de referencia.

Mi mentor, el Dr. Malloch, me ayudó a depurar todo esto y me sugirió que también midiera el voltaje en el pin del medio en relación con los otros pines. Eso es lo que hice en mi tercer y último intento de reducir el ruido de la entrada de ángulo. Abrí cada servo, volví a conectar el cable que había cortado y agregué un tercer cable proveniente del pin de referencia en el potenciómetro. En mi código, hice que la entrada del ángulo fuera equivalente a la siguiente expresión: (pin central - pin de referencia) / (V + pin - pin de referencia). Lo probé y redujo con éxito los efectos de los picos de voltaje. Además, también puse un filtro EWMA en esta entrada. Esta señal procesada y la señal original se muestran arriba.

Paso 4: Resumiendo las cosas

Terminando las cosas
Terminando las cosas

Con el problema del ruido resuelto lo mejor que pude, me puse a arreglar y hacer las partes finales del diseño. El brazo estaba poniendo demasiado peso sobre el servo en la base, así que hice una nueva base que soporta el peso del brazo usando un cojinete grande. También imprimí la pinza y la lijé un poco para que funcionara.

Estoy muy satisfecho con el resultado final. La planificación de movimiento intuitiva funciona de manera consistente y el movimiento es suave y preciso, considerando todo. Si alguien más quisiera hacer este proyecto, primero le recomendaría encarecidamente que hiciera una versión más simple del mismo. En retrospectiva, hacer algo como esto usando servomotores de hobby fue muy ingenuo, y la dificultad que tuve para hacerlo funcionar demuestra eso. Considero un milagro que el brazo funcione tan bien como lo hace. Todavía quiero hacer un brazo robótico que pueda interactuar con una computadora, ejecutar programas más complejos y moverse con mayor precisión, así que para mi próximo proyecto haré eso. Utilizaré servos de robótica digital de alta calidad y, con suerte, eso me permitirá evitar muchos de los problemas que encontré en este proyecto.

Documento CAD:

cad.onshape.com/documents/818ea878dda7ca2f…

Recomendado: