domingo, 5 de febrero de 2012
Giro conseguido!
Después de unas cuantas pruebas hemos conseguido que la araña gire bastante bien, además de fijar los angulos correctos de subida y giro para que sean óptimos en cuanto a velocidad y estabilidad.
miércoles, 1 de febrero de 2012
Robot caminante
¡Lo hemos conseguido! Nuestra araña ya camina, y no lo hace nada mal. En el siguiente vídeo podéis ver sus primeros pasos.
viernes, 27 de enero de 2012
Pruebas de movimiento
Después de estar probando la clase OutputCompare podemos ver que, de esta forma, el cuadrúpedo se levanta rápidamente al alimentarlo y se mantiene erguido ya que los ocho servos ejercen fuerza suficiente simultáneamente.
Un gran problema que hemos observado es la estabilidad del cuerpo del robot. El objetivo es levantar una pata cada vez y conseguir que pueda sostenerse con las tres restantes, pero vemos que tiende a caerse hacia los lados. Hemos minimizado este problema añadiéndole doble pata y apretando los tornillos para que se mueva lo menos posible, a pesar de ello, el robot sigue cayéndose al no ser perfectamente simétrico.
Intentaremos resolver este problema moviendo las patas muy rápidamente, para así corregir la inclinación antes de que el robot pueda llegar a tocar el suelo. Acortaremos la duración de cada movimiento ajustando el Thread Sleep (tiempo de espera para poder ejecutar la siguiente instrucción).
En el siguiente ejemplo tenemos un bucle en el que vamos moviendo cada servo a un ángulo determinado, pero entre cada movimiento ponemos un valor de espera en milisegundos.
while (true)
{
servo1.Mover(45);
Thread.Sleep(1000);
servo1.Mover(90);
Thread.Sleep(1000);
...
miércoles, 25 de enero de 2012
Clase OutputCompare
Al probar de mover todos los servos usando threads, observamos que se producia un movimiento más lento y entrecortado (a trompicones), ya que al parecer nuestra placa era incapaz de ejecutar un programa con ocho hilos a la vez. Así que estamos provando otro método que funcione mejor, se trata de la clase OutputCompare.
Utilizando esta clase se puede configurar uno o varios pines para que retengan su salida en el estado deseado durante un tiempo concreto. El OuputCompare es muy fácil de implementar ya que no es necesario generar la señal PWM que activa los servos, simplemente tenemos que darle el valor del ancho de pulso y la espera (tiempo que dura el valor alto y bajo).
Utilizando esta clase se puede configurar uno o varios pines para que retengan su salida en el estado deseado durante un tiempo concreto. El OuputCompare es muy fácil de implementar ya que no es necesario generar la señal PWM que activa los servos, simplemente tenemos que darle el valor del ancho de pulso y la espera (tiempo que dura el valor alto y bajo).
A continuación, mostramos un sencillo ejemplo para mover el servo a tres posiciones distintas:
public static void Main()
{
OutputCompare oc = new OutputCompare((Cpu.Pin)FEZ_Pin.Digital.Di0, true, 2);
while (true)
{
oc.Set(true, new uint[] { 2200, 17800 }, 0, 2, true); // Servo hacia la derecha
Thread.Sleep(1000);
oc.Set(true, new uint[] { 1200, 1800 }, 0, 2, true); // Servo en el centro
Thread.Sleep(1000);
oc.Set(true, new uint[] { 200, 19800 }, 0, 2, true); // Servo hacia la izquierda
Thread.Sleep(1000);
}
}
viernes, 20 de enero de 2012
Montaje completado!
Tras un duro trabajo en casa y en la cafetería de la uni (las servilletas nos delatan), conseguimos montar la estructura del bot que podemos observar en la foto inferior.
Aquí lo tenemos ya terminado con duplex y todo! El cableado y las conexiones las hemos fijado de ésta manera para que evite malos contactos y desconexiones durante el movimiento.
Aquí podeis ver a los creadores, ahora solo queda darle vida! Esperemos que no explote al conectarlo ;)
martes, 17 de enero de 2012
Moviendo las patas
Estamos acabando de construir el robot, pero mientras tanto queríamos ver una de las patas en funcionamiento. En el siguiente vídeo podemos observar el movimiento de los dos miembros de la pata. Como ya sabéis ésto se consigue realizando un giro completo con ambos servos.
En el vídeo vemos como los servos se mueven uno después del otro, y no conjuntamente. Esto es debido a que en nuestro programa la función MoveServo nos crea un bucle, y hasta que éste no termina no se ejecuta la siguiente instrucción. Para arreglar esto usaremos hilos de ejecución (threads) para mover cada servo independientemente, y así poder hacerlos girar al mismo tiempo cuando sea necesario.
miércoles, 11 de enero de 2012
Diseño finalizado!
En las imagenes inferiores tenemos el diseño con las cotas que posteriormente utilicé para plasmarlo en la madera para llevarlo al taller.
Ayer fuimos al taller y cortamos las piezas para montar una pata, al menos, para poder seguir programando en clase. El lunes que viene vamos otra vez para acabar el centro del quadropod y acabar de montarlo complétamente. Todo parece ir bien por el momento.
sábado, 7 de enero de 2012
Diseño 3D ProEngineer
Ya está acabado el diseño. En la imagen inferior podemos verlo (le faltan dos piezas en la imagen).Ya tenemos todos los materiales comprados (madera, tornillos, etc...) y estamos a la espera de ir el martes al taller para poder cortarlo decentemente. Lo hemos probado con una sierra que teníamos en casa pero... va a ser que no.
El diseño lo vamos a modificar para que tenga las cuatro patas en las esquinas, es decir, que entre pata y pata haya 90 grados para poder rotar más fácilmente.
viernes, 6 de enero de 2012
Simulación del movimiento
Para hacer que nuestra araña pueda caminar, primero hemos tenido que pensar en cómo se han de mover cada una de las patas para lograr desplazar el cuerpo del robot. Tras buscar distintos ejemplos a través de internet, finalmente, hemos encontrado el siguiente vídeo del robot Silo4.
Esta simulación nos ha servido de gran ayuda para entender el movimiento que deseamos reproducir, y nos hemos basado en ella para desarrollar el programa que utilizará nuestro Quadrapod.
La araña tendrá cuatro patas y cada una de ellas dos servomotores. Ésto nos permitirá mover las patas verticalmente (levantar o bajar) y horizontalmente (avanzar o retroceder).
martes, 3 de enero de 2012
Nueva función con grados
A pesar de no tener nada montado todavía hemos decidido hacer el código ya que será una buena base una vez lo tengamos montado para corregir, esperemos que pequeños, errores. Aquí os dejo una función que utilizamos para poder mover el servo a un ángulo deseado siguiendo las especificaciones dadas en esta página web: http://bansky.net/blog/2008/05/control-servos-from-micro-framework/.
Consideramos 0.5ms como 180º y 2.5ms como 0º.
public void MoveServoByAngle(double angle)
{
double pulseWidth = 2500 - 11.1111 * angle;
double pause = 25000 - pulseWidth;
for (int i = 0; i < 30; i++)
{
servoPort.Write(true);
DelayMicroSecByAngle(pulseWidth);
servoPort.Write(false);
DelayMicroSecByAngle(pause);
}
}
Próximente colgaré los diseños 3D en ProEngineer que vamos a cortar en madera contrachapada de 3mm para montar el quadropod. Lo que haremos, como no tenemos ni idea de qué tornillos vamos a utilizar y de si será estable o no, será montar una de las cuatro patas para el miércoles que viene dia 11 y así ver como se comporta e intentar utilizar threads para mover ambos servos a la vez.
Suscribirse a:
Entradas (Atom)