¿Detener un servo antes de que alcance la posición final?

0

Tengo problemas para encontrar una solución para un proyecto. Actualmente, hay un servomotor que acciona un dedo robótico. La posición del servo determina la curvatura del dedo (dedo recto - > servo 0 grados, curvado hacia adentro - > servo 100 grados). En la punta del dedo hay un sensor de presión.

Digamos que le digo al servo que se mueva a 100 grados. El dedo se doblará hasta que las puntas de los dedos entren en contacto con un objeto. Cuando el sensor de presión detecta que el dedo presiona la cantidad de presión sobre el objeto por encima de X, el servo se detendrá en su posición actual, digamos 50 grados.

El problema es que no sé cómo hacer que el servo se detenga en su posición actual. El servo siempre va a la posición final en la que inicialmente lo puse. ¿Cómo se puede implementar esto?

He pensado en 2 soluciones, ninguna de las cuales es ideal:

  1. Cuando el sensor de presión alcanza un umbral, apague PWM al servo por completo. Esto debería impedir que el servo se mueva más, pero no creo que mantenga la posición. También esto crea desafíos para el siguiente comando de movimiento.
  2. Tenga otro sensor que mida la posición actual (grados) del servo. Cuando el sensor de presión cruza el umbral, baje la posición actual y actualice el ciclo de trabajo a la posición actual. El problema con esto es que necesito encontrar una manera de medir la posición actual.

¿Puede alguien asesorar sobre una mejor manera de implementar esto?

    
pregunta Splaty

2 respuestas

2

No tienes que decirle al servo "ir de 0 a 100 grados".

Puedes avanzar un solo grado en un bucle y leer el sensor de presión en el bucle.

Me gusta esto:

Angle=0 while (pressure<threshold and Angle<100) SetServoPostion(Angle) sleep(4) //wait 4 mSecondsfor servo to move pressure=ReadAnalogInput(pressuresensor) Angle=Angle+1 end while

Como alternativa, tienes un temporizador que llama a la rutina de incremento cada 10 ms o lo que sea, y haz que compruebe la presión antes de realizar el siguiente incremento.

Además de no aplastar lo que se supone que debe mantener tu servo, este método también te da una idea bastante buena de dónde está exactamente el servo: no necesitas un segundo sensor para eso, y no necesitas hackear el servo para leer su potenciómetro de posición.

El retraso dado en el ejemplo aún cerrará la pinza en 400mSegundos, por lo que aún tendrá la misma capacidad de respuesta.

    
respondido por el JRE
1

Esta es una solución barata y tramposa, pero aquí va.

Debe cerrar el circuito de retroalimentación, y la única retroalimentación que tiene es un sensor de presión.

  1. Establezca la posición en un lugar más lejano que el objeto con el que espera colisionar
  2. Choca con el objeto, que activa el sensor de presión y bloquea el servo
  3. Ajuste la posición de destino del servo hacia abajo hasta que detecte una disminución en la presión
  4. Ajusta tu posición para obtener la cantidad de fuerza que deseas.

Esto tiene algunas desventajas bastante obvias en comparación con el uso de algo más avanzado que un servo RC, pero usa lo que tienes, ¿no?

Ahora, si no te importa abrir los servos, hay un potenciómetro que debería mostrar la posición relativa para ti ...

    
respondido por el Daniel

Lea otras preguntas en las etiquetas