Archivo de la categoría ‘Arduino’

Control de movimiento por ondas.

Domingo, Enero 17th, 2010

Desde hace ya bastante tiempo, y puede que de esto haga más de dos años, tenia muchas ganas de probar nuevas formas de movimiento para los robots con patas. Después de un par de charlas por parte de Obijuan y viendo andar a su robot apodo cube  (un gusano) me surgieron aún mas ganas de probar los movimientos ondulatorios.

Hace poco que realizamos un nuevo hardware para Galatea basado en un ATMega168 y programable desde Arduino. A las ventajas de este nuevo hardware le aparecieron algunos problemas entre los que destacan: El poco tiempo que disponemos y la necesidad de ver resultados a corto plazo, sabiendo que reescribir todo el código de la antigua versión iba a ser una tarea poco sencilla. Visto desde este modo solo había una solución Innovar. Dejamos de lado ordenadores códigos de versiones y con solo un folio en blanco un un papel nos dispusimos a dibujar lo que queríamos, en forma de ondas. Después de unas cuantas horas de trabajo obtuvimos una cosa que caminaba, pero lo importante es eso ¡que caminaba! Han bastado un par de días para modificar las formas de ondas y los defases hasta obtener el siguiente resultado:

Espero que os guste!

Control de un motor pap bipolar con Arduino.

Jueves, Septiembre 17th, 2009

Anoche estuve hablando con Jovi sobre el control de un motor PAP Bipolar, en concreto del motor que mueve la óptica. Ya que tenia a mano un lector medio desmontado estuvimos viendo el sistema y analizando si cumpla con el propósito que finalmente tendrá. Esta mañana he tenido un pequeño rato libre y me he puesto a montar un ejemplo de control.

(more…)

SRF05 con Arduino.

Domingo, Marzo 8th, 2009

Después de unas cuantas de horas intentando usar la función pulseIn de Arduino para leer los sensores de distancia SRF05, lo he dejado por imposible y me he puesto a desarrollar mi propia función para la lectura. Esta de basa en la función micros(); (unsigned long):

unsigned int lectura()
{
unsigned long acu = 0;
unsigned long largo = 0;
unsigned long primero = 0;
unsigned long ultimo = 0;
for (int x = 0; x <2; x++)
{
// enviamos al sensor un pulso de 10uS
pinMode(pulso1, OUTPUT);
pinMode(eco1, OUTPUT);
digitalWrite(pulso1, HIGH);
delayMicroseconds(10);
digitalWrite(pulso1, LOW);

while(digitalRead(eco1) == 0); //Esperamos a que el SRF05 ponga la linea en alto para empezar a contar
primero = micros(); //anotamos el valor al poner la linea en alto
while(digitalRead(eco1) == 1); //Cuando pone la linea en bajo seguimos adelante
ultimo = micros(); //anotamos el valor al poner la linea en bajo
largo = ultimo - primero; // calculamos el valor de la distancia
acu += largo ; //acumulamos los valores
delay(50); //evitamos que se solapen los rebotes
}
// convertimos a centimetros la medida (1 cm por cada 58uS por dos medidas)
return( (unsigned int) (acu / 116) );
//(Salida para debug):
//Serial.print(”Delante = “);
//Serial.println(acu / 116);
}

Y ahora las posibles mejoras:

  • Timeout:

while(digitalRead(eco1) == 0);
while(digitalRead(eco1) == 1);

Se podría añadir una segunda condición por si el sensor esta desconectado no se quede bloqueado.

  • Desbordamiento:

largo = ultimo - primero; // calculamos el valor de la distancia
acu += largo ; //acumulamos los valores

No se tiene en cuenta que la función micros() se desborda cada 70 minutos. Se podría hacer una comparación para que segundo siempre sea mayor que primero.

  • Precisión:


return( (unsigned int) (acu / 116) );

Se podría añadir parametros o sobrecargas para definir el numero de muestras a tomar y si queremos precisión de milimetros.

Espero que sea de utilidad.


Valid XHTML 1.0 Transitional [Valid RSS] ¡CSS Válido!