Movimiento suave con los servos

Uno de los problemas que tienen los servos es que su movimiento es bastante brusco, como podía apreciarse en el vídeo que pusimos en Añadiendo movimiento: servos. Con el montaje que había pensado eso era un problema, porque la cámara tiene un cierto peso y en alguna ocasión podía salir disparada, o desencajarse, como puede imaginarse viendo:

Más pruebas #frikeando #voz #motores #raspi #c3po

A video posted by Fernando Tricas García (@ftricas) on

La solución para el problema es relativamente sencilla: cuando queremos llevar el motor a una determinada posición podemos ir haciéndolo con pequeños pasos. La idea es indicarle una sucesión de posiciones cada vez más próxima al objetivo. Así, aunque los movimientos son bruscos, al ser pasos cortos no afectan tanto al objeto que va montado sobre el motor (en este caso la cámara).
El código podría ser como el de esta función:

def move(self, servo, pos, posIni=MIN, inc=10):

	servoGPIO=18
	servoGPIO=17
	posFin=posIni + (MAX-MIN)*pos
	steps=abs(posFin - posIni) / inc

	print "Pos ini", posIni
	print "Pos fin", posFin
	print "Steps", steps
	print int(steps)

	if pos < 0:
		pos = -pos
		sign = -1
	else:
		sign = 1

	for i in range(int(steps)):
		servo.set_servo(servoGPIO,posIni+10*i*sign)
		time.sleep(VEL)

	print "Pos ini", posIni
	print "Pos fin", posFin
	print "Steps", steps
	print int(steps)

	servo.stop_servo(servoGPIO)

Esto es, suponiendo que partimos de una posición inicial (posIni) y que queremos movernos un cierto porcentaje (un número real entre 0 y 1) calculamos la posición final sabiendo el recorrido total (MAX-MIN):

posFin=posIni + (MAX-MIN)*pos

Y calculamos el número de pasos que daremos basándonos en un incrementos de 10 (inc=10):


steps=abs(posFin - posIni) / inc

Se usa el valor absoluto porque el movimiento puede ser en ambas direcciones (según en qué punto esté el motor), de lo que se ocupa el condicional:


if pos < 0:
...

Finalmente, se hacen los movimientos con el bucle:

for i in range(int(steps)):
	servo.set_servo(servoGPIO,posIni+10*i*sign)
	time.sleep(VEL)

El resultado se parece al que se aprecia en este vídeo:

Montamos la cámara en el motor que se mueve más despacio #raspi

A video posted by Fernando Tricas García (@ftricas) on

Donde se puede observar un movimiento de ida y vuelta con un improvisado modelo. Se puede regular la velocidad con el tiempo que se tarda entre uno de estos pequeños movimientos y el siguiente (parámetro VEL).

Seguramente habría sido mejor elegir otro tipo de motores, pero esto resuelve de manera razonable nuestro problema.

Un pensamiento en “Movimiento suave con los servos

  1. Pingback: Una cámara móvil | Mbpfernand0's Blog

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s