sábado, 31 de marzo de 2012

Los fractales y las técnicas numéricas

Estudiando para una examen de técnicas numéricas, encontré el los apuntes un articulo sobre estas y los fractales, el problema es que estaba en ingles. Como quería saber lo que ponía y no iba recurrir al traductor de Google lo mande traducir. Me ha parecido muy interesante y he decidido publicarlo:

La guerra de las raíces

Hace unos 4000 años, los matemáticos sumerios tenían un método por el cual podían calcular la raíz cuadrada de un número. Y lo hacían con un proceso iterativo de retroalimentación con un paso. Dado un número a, su raíz cuadrada podía calcularse con el siguiente proceso iterativo:


xn+1 =

1


2

(xn +

a


xn

).

Para una estimación inicial dada, x0, iterar la ecuación y la secuencia de iteraciones converge en seguida con la raíz cuadrada de a. El método anterior de hallar la raíz cuadrada de un número es un caso especial de otro método más general de hallar las raíces de una ecuación no lineal, descubierto 4000 años después, denominado método de Newton para hallar raíces.

El método de Newton

El método de Newton es un procedimiento iterativo para hallar la solución de la ecuación F(x) = 0 mediante aproximaciones sucesivas, dada una estimación inicial. A partir de esta estimación inicial, por ejemplo, x0, se halla una mejor aproximación a la solución iterando la siguiente ecuación:


xn+1 = xn -

F(xn)


F¢(xn)

,


donde F’ (xn) es la derivada de la función F(x) cuyas raíces hay que hallar. Suponiendo que la primera derivada existe, las iteraciones del proceso de retroalimentación se aproxima progresivamente a la solución.

En 1879, sir Arthur Cayley estudió el método de Newton y formuló la siguiente pregunta: ¿Qué cero de la ecuación z3 – 1 = 0 en el plano complejo convergería el método si uno comienza con una estimación inicial arbitraria? Los escritos de Cayley motivaron gran parte del trabajo de Julia. Sesenta años más tarde, Mandelbrot estableció la fundación de Geometría Fractal, consciente del trabajo realizado por Pierre Fatou y Gastón Julia sobre procesos iterativos en plano complejo.

¡No está mal para 4000 años de historia! Entonces, la cuestión está en determinar a qué raíz convergería el método de Newton si una comenzara con una estimación inicial arbitraria. Efectivamente, el método de Newton funciona, y muy ‘seguramente’ el proceso conduce a una de las tres soluciones (casualmente las raíces de la ecuación z3 – 1 = 0 son 1, exp2π/3 y exp4π/3). Así que la pregunta es: si una comenzase con un gran número de puntos en el plano complejo como estimación inicial al método de Newton, ¿cómo se distribuyen estas estimaciones iniciales en el plano complejo? Mostramos una distribución, con código de colores, de las estimaciones iniciales que conducen a una de las tres soluciones. Procede de un experimento por ordenador de la cuadrícula de 500x500 en el plano complejo, entre -2 y 2, ambos a lo largo de los ejes real (X-) e imaginario (Y-). Las estimaciones iniciales aparecen de color rojo, amarillo o azul dependiendo de si el punto inicial se aproxima a la solución 1, exp2π/3 y exp4π/3, respectivamente. Las coordenadas de las tres raíces están señaladas con un signo +.


1. Proyección de las cuencas de atracción, con código de colores, de raíces cúbicas de la unidad. Los límites de X e Y son X[-2, 2] e Y[-2, 2].

2. Zoom de la región X [-0’05, 0’5] e Y [-0’7, -0’1] a partir de la proyección anterior. Efectivamente, el límite de la cuenca está completo.

En el lenguaje de la teoría de sistemas dinámicos, las raíces pueden considerarse como atractores de punto y las regiones del plano complejo con un comportamiento asíntoto respecto a una raíz determinada son las cuencas de atracción de dicha raíz. A partir de la proyección anterior queda claro que hay un límite muy complejo que separa las cuencas de atracción de las tres raíces. Esta complejidad continúa existiendo incluso si nos fijamos en las minúsculas diferencias que hay entre los valores iniciales de la estimación; este límite nunca se suaviza, ni siquiera en estas pequeñas diferencias. Así, si nos acercásemos con un primer plano, veríamos que los límites tienen una estructura muy compleja, similar a un conjunto de Cantor. En otras palabras, siempre que dos cuencas parecen encontrarse, descubrimos tras examinarlas más a fondo que la tercera cuenca de atracción está ahí entre ellas, y así sucesivamente hasta el infinito. Este complejo límite es un límite fractal. La competición de las raíces para conseguir todos los puntos del plano dista mucho de ser sencilla.


Fuente:

http://chaos4.phy.ohiou.edu/~thomas/fractal/newton.html


viernes, 23 de marzo de 2012

Prusa Mendel 2: Primeros pasos

Despiece

Hoy he empezado con el montaje de mi Prusa Mendel Iteration 2 llamada X-Wing. Esta dentro del proyecto Clone Wars de la UC3. He hecho hasta el paso 5 y solo me ha hecho falta como herramienta una regla.

Lo más dificil de la recolección de los materiales necesarios fue el corte de las varillas:



Estos son algunos apuntes o "modificaciones" que hay que tener en cuenta si vas a montar la Prusa 2 y que yo me he ido encontrando con respecto a las instrucciones visuales.

Apuntes para Prusa 2

Paso 1: Montaje de los triángulos

Para este paso utilizaremos las 6 varillas roscadas de 370mm.
En la pagina 9: Aclaración. Con la Prusa dos ya tenemos las "patas" de serie en las escuadras asi que cogemos dos escuadras con patas y las que no llevan patas se dejan para la parte de arriba.
Las propias escuadras llevan indicaciones mostrando su orientación.

Escuadras

Triángulos montados

Paso 2 Varillas delanteras

Para este paso utilizaremos las 2 varillas roscadas de 294mm.
En la página 18: Modificación. Vamos a hacer el siguiente cambio:

Debemos sustituir el montaje que viene por defecto:
Montaje por defecto

por este nuevo:


Nuevo montaje con las piezas que sobran

Con ello conseguimos que al no rozar la correa con la arandela esta no se desgaste. Ademas al quitarle la tuerca intermedia, los ejes con respecto al motor quedara mejor alineados.


Paso 3 Varillas traseras

Para este paso utilizaremos las 2 varillas roscadas de 294mm.
En la página 24: Modificación. Igual que antes, hacemos el siguiente cambio:

Debemos sustituir el montaje que viene por defecto

Montaje por defecto

por este nuevo:

Nuevo montaje

Con ello conseguimos que al no rozar la correa con la arandela esta no se desgaste. Ademas al quitarle la tuerca intermedia, los ejes con respecto al motor quedara


Paso 4 Varillas superiores

Para este paso utilizaremos las 2 varillas roscadas de 440mm.
No he encontrado ninguna modificación a hacer en este apartado.


Paso 5: Varilla transversal

Para este paso utilizaremos la varilla roscada de 440mm que sobra.
Debemos poner las varillas por debajo de los triángulos. Aquí te advierte que al ser una modificación reciente, en los siguientes pasos aparecerá por arriba.

Lo traduzco para mayor precisión

Insertar la varilla roscada 440 mm a través de las dos abrazaderas las barras en la parte inferior del marco. Asegúrese de que la varilla se situa en la parte inferior de la barra inferior del triángulo. Ajustese de modo que la misma longitud sobresalga en cada lado.

[Nota: de acuerdo con la edición # 10. Imágenes subsiguientes pueden mostrar que esta por encima de las barras, pero esto no es correcto.]


Desarrollo al 35%

He pensado que ahora mismo la estructura parece una andamiaje para construir un RoboSapiens gigante:

martes, 13 de marzo de 2012

Concursos robóticos

Los concursos robóticos se están poniendo de moda. Con esta entrada intento hacer una recopilación de los principales concursos y los principales equipos que están compitiendo:

Concursos para universitarios

LIGA FANUC: http://lnrc.es/comp_lnrc.php

Hispabot 2012

AESSBot
Campeonato de Euskadi
Ceabot
Cosmobot
CR JET
Robolid
Robotus

Concursos para alumnos de Bachillerato:

Galapabot: http://www.arcerobotica.org/portal2/index.php/competiciones/galapabot-12/
MadridBot
Malakabot

Concursos internacionales

Eurobot: http://www.eurobot.org/

Robocup: http://www.robocup.org/


Equipos

Smith

http://www.lne.es/verano/2011/07/31/robots-disenados-vencer/1109855.html

Equipo formado por un particular al que le gusta mucho construir robots y hacerlos competir

Últimos meritos del equipo:

1º en AESSBOT sumo (2012)

3ºen AESSBOT sumo (2012)

2º en Cosmocaixa Cosmobot Sumo (2012)

3º en Cosmocaixa Cosmobot Sumo (2012)

Robots del equipo:

- Smith xpc (velocista)

- Smith Speed (velocista)

- Smith Junior (sumo)

-Smith Molotov (sumo)

- Smith XXL (sumo)


D.P.E.Bots

http://dpebots.com/principal.html

Últimos meritos del equipo:

3º en AESSBOT velocistas (2012)

2º en AESSBOT sumo (2012)

3º en Cosmocaixa Cosmobot Velocistas (2012)

1º en Cosmocaixa Cosmobot Sumo (2012)

Robots del equipo:

- Panzer (sumo)

- Batista (sumo)

- Max (sumo)

- Pepito 3º (velocista)

- Liebre (velocista)

- Veloli (velocista)

- ULTRA-JMV (sumo)

- Estorbot (sumo)

- Max (sumo)


ArCAT

http://www.ackstorm.es/

Equipo patrocinado por AckStorm

Últimos meritos del equipo:

1º en AESSBOT velocistas (2012)

Robots del equipo:

- Pegasus (sumo)

- Tamcar (sumo)

- Utsonomiya (velocista)

- R555 (velocista)


RL-Racing

http://dani.foroselectronica.es/

RL-Racing equipo madrileño de Daniel Alvarez y Alberto Campo

Últimos meritos del equipo:

1 en Cosmocaixa Cosmobot Velocistas (2012)

Robots del equipo:

- Xoco (velocista)

- Piolin (velocista)

- Silvestre (velocista)



Robotica Miranda

http://roboticamiranda.cepalencia.es/

Robótica Miranda es el nombre de un equipo de jóvenes que tiene como afición diseñar, construir y programar robots. Decidimos llamarlo así por dos simples razones: Robótica porque nos gusta trabajar en este campo, y Miranda porque el equipo se formó en el que fue I.E.S. Camino de La Miranda, o lo que hoy se llama Centro Específico de Formación Profesional de Palencia

Robots del equipo:

- Bufo (sumo)

- Rino (sumo)

- BullBot (sumo)


ESIBOT

http://www.esibot.net/

Equipo formado por un conjunto de estudiantes de ingeniería de la Escuela Técnica Superior de Ingenieros de Sevilla.

Robots del equipo:

- SuperESIBOT (sumo)


Equipo Čapek

Equipo perteneciente al Grupo de Robótica de la Universidad de Deusto Participantes: Jonathan Ruiz de Garibay Ignacio Ortiz

Últimos meritos del equipo:

Robots del equipo:

- Sabueso (rastreador)

- Fireblade (rastreador)


EiviBot

Robots de la categoría sumo

Robots del equipo:

- Boc (sumo)

- Replegador (sumo)

- Summum (sumo)


sábado, 10 de marzo de 2012

Taller de robótica en la F11




Ayer estuve en el taller de robótica de Reset(clase F11)y estuve probando algunas cosas.

La primera fue desarrollar la oruga de Obijuan. Como todavía no tengo la impresora disponible hice los módulos con plantillas y la Dremel.

Estas son las fotos del desarrollo. Las plantillas como siempre están colocadas en el Thingiverse:

La plancha de PVC a mecanizar


Colocando las plantillas

Plantillas ya hechas

Colocados los servos

Después de ponerles los servos, probé a ponerles un programa siempre:

#include

Servo myservo; // crea un objeto tipo servo para controlar el servo
Servo myservo2; // crea un objeto tipo servo para controlar el servo
int pos = 90; // variable para almacenar la posición del servo
int pos2 = 90;
Servo myservo3;
int pos3 = 90;// crea un objeto tipo servo para co// crea un objeto tipo servo para co// variable para almacenar la posición del servo
void setup()
{
myservo.attach(9); // liga el servo conectado en el pin 9 al objeto servo
myservo2.attach(6);
myservo2.attach(10); // liga el servo conectado en el pin 6 al objeto servo
}

void loop()
{
pos2=180/2;
for(pos = 0; pos < 180; pos += 1) // va de 0 a 180 grados { // en pasos de 1 grado myservo.write(pos); pos2 -= 1; myservo2.write(pos2/2); // dice al servo que se posicione en la posición indicada por la variable 'pos' delay(15); myservo.write(pos);// espera 15 ms para dar tiempo al servo a llegar a la nueva posición } pos2=90; for(pos = 180; pos>=1; pos-=1) // va de 180 a 0 grados
{
myservo.write(pos);
pos2 += 1;
myservo2.write(pos2/2); // dice al servo que se posicione en la posición indicada por la variable 'pos'
delay(15);
myservo3.write(pos);// espera 15 ms para dar tiempo al servo a llegar a la nueva posición
}
pos3=90;
for(pos = 180; pos>=1; pos-=1) // va de 180 a 0 grados
{
myservo.write(pos);
pos2 += 1;
myservo2.write(pos2/2); // dice al servo que se posicione en la posición indicada por la variable 'pos'
delay(15);
myservo3.write(pos);// espera 15 ms para dar tiempo al servo a llegar a la nueva posición
}

}


Tiene fallos de montaje, pero los corregiré cuando Obijuan suba las librerías de las orugas, ya que con dichas librerías si que podré simular el movimiento perfectamente.



Por otra parte estuve ayudando al control de servos continuos, que como ya tenia cierta experiencia, como puse en la entrada anterior. He hecho un programa muy simple para control de un servo continuo:

#include

Servo myservo; // create servo object to control a servo
// a maximum of eight servo objects can be created

int pos = 0; // variable to store the servo position

void setup()
{
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}


void loop()
{

pos=0;
myservo.write(pos);
delay(1000);
pos=180;
myservo.write(pos);
delay(1000);
pos=94;
myservo.write(pos);
delay(1000);

}

Vamos ahora con otro experimento, los Legos MindStorms. Mi experiencia fue muy buena y aunque yo jamas tuve Legos de chico, fue muy fácil de aprender a dominar su manejo. Dejo un video de un robot que hice, aunque espero en el futuro hacer una entrada sobre ello:


lunes, 5 de marzo de 2012

Entrega 1 de Cilindrín: Pruebas con sensores,servos y placa.


Ayer terminé de circuitear el Cilindrín, el cual se presentara como modelo de ejemplo en el Cybertech. Esta entrada formara parte de su documentación.

Prueba de sensores

Estuve probando los diferentes sensores y estos fueron los resultados:

Programa de prueba:

#define inPin 1
int value = 0; /
void setup()
{
Serial.begin(9600);
pinMode(inPin, INPUT);
}
void loop()
{
value = analogRead(inPin);
Serial.println(value);
delay (500);
}

Finales de carrera (End-Stops): Las pruebas con los sensores se hicieron con el esquema que viene en los talleres, pero debe ser al revés cuando es la entrada es digital.



LDRs: Mismo esquema que en el anterior pero cambiando el final de carrera por el LDR. Solo 200 puntos de diferencia en la entrada analógica ,lo que indica mucha sensibilidad.

Potenciómetro: Igual que LDRs, pero con total recorrido de puntos en la entrada para un potenciometro de 4K7.


Sensores de distancia y fotodetectores.

Esquema

En el sensor analogico el valor maximo es 650


El sensor digital presenta un led rojo.
Array optodetectores (digital)



Con componentes basicos: fotodiodo y fototransistor

El fototransistor pasa de no conducir a 20 k (haría falta un transistor para amplificar). Conectado directamente es 60 puntos de diferencia.
Funciona igual reflejando en superficies blancas
Para puentear , habría que amplificar con transistor. Mejor utilizar el integrado 4n37

Foto del montaje

Receptor ir preparado:

Parece que da el valor en digital.
Esquema

http://www.arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
Hay que realizar una modificacion para las versiones modernas (viene al principio de la pagina)
El que mejor va es el ejemplo irreceiverdump.

Controlo de servo continuo(trucado o no)

Los diferentes valores dan diferentes velocidades y sentidos de giro:
Pos=0, sentido antihorario
Pos=180, sentido horario
Siempre hay una posición que bloquea las ruedas, en nuestro caso es 94
No hemos podido alimentar la placa de potencia con el microcontrolador.
Ejemplo practico a modificar para placa de control:

int inpuA = 2; // define function INTPUT 1 (IC2)
int inpuB = 12; // define function INTPUT 2 (IC2)
int inpuC = 8; // define function INTPUT 3 (IC2)
int inpuD = 7; // define function INTPUT 4 (IC2)
int pwm1 = 11; // define function ENABLE A (IC2)
int pwm2 = 10; // define function ENABLE A (IC2)
void setup()
{
pinMode (inpuA, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuB, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuC, OUTPUT); // definir la pa􀁗illa como salida
pinMode (inpuD, OUTPUT); // definir la pa􀁗illa como salida
pinMode (pwm1, OUTPUT); // definir la pa􀁗illa como salida
pinMode (pwm2, OUTPUT); // definir la pa􀁗illa como salida
}
void loop()
{
int i,d ;
i=255; // definir el valor del PWM 0-255 (velocidad)
d=50; // definir el valor del PWM 0-255 (velocidad)
analogWrite(pwm1, i); // Salida del PWM para el ENABLE A (IC2)
digitalWrite (inpuA, HIGH); // Activa el INTPUT 1 (IC2)
digitalWrite (inpuB, LOW); // Desactiva el INTPUT 2 (IC2)
// Resultado del OUT1 = +
// Resultado del OUT2 = -
delay (1000);
analogWrite (pwm2, d); // Salida del PWM para el ENABLE B (IC2)
digitalWrite (inpuC, LOW); // Desactiva el INTPUT 3 (IC2)
digitalWrite (inpuD, HIGH); // Activa el INTPUT 4 (IC2)
delay (1000);
// Resultado del OUT3 = -
// Resultado del OUT4 = +
}


TABLA DE CONEXIONES

Documento adjunto. En el Dropbox del Proyecto

Una pregunta interesante seria:¿ Existe diferencia entre A1 y 1? Si ,son entradas diferentes.
Problema en el load: Para cargar los programas desconectar la alimentación de los servos.

Programa de prueba(Girar a la derecha)

#include

Servo myservod;
Servo myservoi;

const int buttonPin = 3; // the number of the pushbutton pin
int pos = 180; // variable to store the servo position
int pos2 = 0; // variable to store the servo position
int var=1 ;
void setup()
{
Serial.begin(9600);
myservod.attach(9); // attaches the servo on pin 9 to the servo object
myservoi.attach(6); // attaches the servo on pin 9 to the servo object
pinMode(buttonPin, INPUT);
}


void loop()
{

myservod.write(pos); // tell servo to go to position in variable 'pos'
myservoi.write(pos2); // tell servo to go to position in variable 'pos'
var = digitalRead(buttonPin);
delay(15);


if(var == LOW)
{
Serial.write(1);
myservod.write(pos); // tell servo to go to position in variable 'pos'
myservoi.write(pos);
delay(1000);
}
delay(1000);
}

Y el video:



domingo, 4 de marzo de 2012

Arduino: El documental.



Arduino The Documentary (2010) Spanish HD from gnd on Vimeo.
Para todo aquel que todavía no lo haya visto, un documental sobre como se desarrollo Arduino, siempre desde una perspectiva Open Source
Seguir @Exergy123