Archivo de la categoría: Arduino

La importancia de definir bien las cosas.

En estas fechas estaba retocando y mejorando el código de Galatea ya que hemos fabricado 10 unidades del robot. Con todo lo que conlleva el "adornar" el código para que sea legible por cualquier usuario, uno de los pasos que hemos dado es "dividir" el código actual en pequeñas librerías reutilizables, comunicaciones, tipos de movimientos, adquisición de datos, reacciones, etc. Una de esas partes aunque no se pueda llamar librería es esencial, las etiquetas de cada pin con la función que realiza, esto representaba una lista de un 20 variables con sus nombres y su función o pin asignado. Dándole vueltas pensé en un primer momento que si cambiaba esas variables por definiciones dispondría de 20 bytes más de memoria para almacenar otras cosas o dejarla disponible a un usuario final. La sorpresa ha sido que aparte de esa mejora el código de programa ha empezado a adelgazar consideráblemente.

Sigue leyendo

Control de movimiento por ondas.

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.

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.
Sigue leyendo

SRF05 con Arduino.

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.