Atención

Como consecuencia de la incorporación de un segundo módulo ultrasonidos, el grupo G6C de motores ha cambiado. Ahora tiene asignados los puertos 12, 13 y 16. Los dos primeros no varían respecto a la situación inicial, en cambio, el último se utiliza en lugar del anterior puerto 14 y corresponde al codo del brazo derecho. El puerto 14 así como el 15, que constituyen el puerto Sonar 7 pasan a ser utilizados para ultrasonidos.

Documentación Disponible

Para acceder al programa deseado solo teneis que hacer click en el vínculo y en la página que os direcciona clickear en "Click here to start download". La memoria colgada es una versión provisional a falta de la definitiva.

miércoles, 25 de abril de 2007

Programa arrayC

Como ya se ha comentado en la entrada anterior, necesitamos tener un array en C que contenga las muestras de nuestra señal de voz digitalizada. Para poder generar dicho array se ha desarrollado un pequeño programa en java que proporcionándole un archivo de audio WAV con formato PCM es capaz de generar dicho array.

Para el desarrollo de este programa se ha tenido que tener en cuenta las especificaciones del formato WAV que se encuentran en la siguiente Web http://ccrma.stanford.edu/courses/422/projects/WaveFormat/ aunque la siguiente tabla las resume bastante bien.

















El programa se puede ejecutar de dos maneras distintas. Una consiste en modo texto, en la cual al ejecutar el programa se le pasa como parámetro el nombre del archivo WAV que queremos convertir, generando en ese mismo directorio un fichero con nombre array.c que contiene las muestras.













Otra forma de ejecutar el programa es en modo gráfico. De esta forma solo tendremos que seleccionar el fichero WAV que queremos convertir en el menú archivo->Abrir fichero *.wav. En la ventana nos aparecerá la información correspondiente al archivo y para generar el array tan solo habrá que pulsar el botón “¡¡Generar array!!”.









¡IMPORTANTE!


Como el audio que vamos a reproducir se trata de voz los archivos wav deberán de tener las siguientes características.

1 canal de audio (Mono)

8 bit/muestra

8000 Hz de frecuencia de muestreo

Formato PCM (Sin compresión)


Los archivos JAVA se pueden obtener de los siguientes enlaces:

Sin interfaz gráfica: http://docs.google.com/Doc?id=dgs9sf7s_0hmf293

Con interfaz gráfica: http://docs.google.com/Doc?id=dgs9sf7s_1dgj67s

Para la ejecución del programa con interfaz gráfica es necesario tener compilados en la misma carpeta las dos clases.


Para descargar el programa ya compilado: http://www.mediafire.com/?9zmymim0gfj

martes, 24 de abril de 2007

Haciendo hablar a Robonova

Tras la sesión de demostración de las practicas especiales que se llevó a cabo en semanas anteriores nos hemos dividido el trabajo para avanzar en dos direcciones. Por un lado se esta trabajando con los ultrasonidos (Ver entradas del blog publicadas por Eisen) y por otro lado se esta trabajando con el Coldfire para que el robot pueda hablar e ir comentando las cosas que va haciendo, como por ejemplo cuando mida una distancia con los ultrasonidos que diga el valor de la distancia a la que se encuentra del objeto.


Durante estos días se ha estado trabajando con el DAC (Convertidor digital-analógico) del Coldfire. Para poder reproducir audio con el Coldfire primero nos tenemos que generar un array en C que contenga las muestras de la señal y posteriormente ir recorriendo dicho array enviando las muestras al DAC, generando este una señal analógica que podremos escuchar si conectamos unos auriculares a la salida del DAC.

El siguiente código se encarga de recorrer el array “A” e ir enviando las muestras al DAC,


for(;i <>

DAC_dato(A[i]);

}


pero las manda a la máxima velocidad que permite, con lo cual tendremos que introducir un retardo para que la frecuencia de envió de las muestras del DAC corresponda con la frecuencia de muestreo de la señal (tipicamente en nuestro caso sera de 8000 Hz) para que se reproduzca correctamente, por ello el código quedara como sigue:


int i=0;

for(;i <>

DAC_dato(A[i]);

sleep(1); //Esperamos 1/8000 segundos

}


Se puede consultar el programa completo en C en la siguiente dirección: http://docs.google.com/Doc?id=dgs9sf7s_2gh37zr

Presentacion jueves 12

La presentación ha consistido en un pequeño ejemplo de control del robonova desde el coldfire. La forma de implementarlo ha consistido en utilizar el módulo radio tanto del robot como del coldfire para enviar instrucciones.
Las instrucciones mostradas consistían en un saludo, un paso hacia delante, otro hacia atrás, giros a ambos lados y la toma de medidas.
Esta última ha sido la instrucción más tediosa a la hora de implementarse, ya que exigía dos comandos, uno que indicase el deseo de realizar la medida, y otro que fijase el ultrasonido a utilizar. Posteriormente el coldfire imprimiría por pantalla la medida recibida. Para evitar o al menos detectar, los problemas de comunicación, se optó por la espera de la medida durante 4 segundos y de no ser recibida previo aviso se pasaría a la posición por defecto, en la que se puede realizar cualquiera de las instrucciones arriba definidas.
En los sucesivos días se ha cambiado la ubicación tanto de los módulos sonar, como del módulo radio del robot. Los sonar pasan a estar en los brazos, permitiendo realizar medidas omnidireccionales. Mientras que el modem pasa a estar en la espalda, intentando así corregir desequilibrios a la hora de caminar.
Los siguientes objetivos se centran en implementar la funcionalidad DAC del coldfire para que pueda reproducir voz así como en realizar un abanico de medidas gracias al cual el robot autónomamente pueda detectar donde está la pared más próxima.

domingo, 1 de abril de 2007

30 de Marzo

El trabajo de hoy ha consistido íntegramente en intentar solucionar el problema que ya nos apareció el último día con la comunicación Coldfire – Robonova. Como ya comentamos, el ultimo día conseguimos la comunicación contraria, es decir, transmitiendo datos desde Robonova conseguíamos recibirlos en el Coldfire y mostrarlos por pantalla pero no en sentido contrario. Tras asegurarnos con el osciloscopio que transmitíamos exactamente los mismos datos en ambos sentidos y que en uno si funcionaba y en el otro no, comprobamos que no estuviera dañado ningún modulo radio.

Después de probar que usando el modulo que tiene el robot en la brazo como transmisor del Coldfire y el que tiene el Coldfire como receptor para el robot seguía sin funcionar, cambiamos los dos módulos por otros dos distintos, pero aun así seguía sin funcionar.

Tras varias pruebas similares sin éxito, se empezó a sospechar que el problema podía estar en la alimentación de los módulos, así que se alimento el circuito que contiene al MAX-3232 con una fuente de alimentación distinta a la del modulo radio, logrando, esta vez si, la tan deseada transmisión desde el Coldfire al Robonova consiguiendo de esta forma una comunicación bidireccional entre el Robonova y el Coldfire.

Una vez identificado el problema, durante el próximo día procederemos a filtrar la alimentación del circuito MAX-3232 con los correspondientes condensadores para intentar conseguir alimentar con una única fuente de alimentación el modulo radio y el circuito del MAX-3232.

sábado, 31 de marzo de 2007

26 de Marzo - Software

Durante la jornada de hoy se han desarrollado dos programas, uno escrito en C para el envió de comandos por el puerto RS232 del Coldfire y otro en lenguaje BASIC para la recepción de dichos comandos por el Robonova.
El programa en C para el Coldfire se estructura en tres partes:
La primera se encarga de leer las teclas pulsadas del teclado matricial

//------------------------------------------------------
// char teclado(void)
//
// Descripción:
// Explora el teclado matricial y devuelve la tecla
// pulsada
//------------------------------------------------------
char teclado(void)
{

BYTE fila, columna, fila_mask;
static char teclas[4][4] = {{"123C"},
{"456D"},
{"789E"},
{"A0BF"}};
// Bucle de exploración del teclado
while(TRUE){

// Excitamos una columna
for(columna = NUM_COLS - 1; columna >= 0; columna--){
set_puertoS(EXCIT << style="color: rgb(255, 255, 153);"> // Se envía la excitación de columna
retardo(1150); // Esperamos respuesta de optoacopladores

// Exploramos las filas en busca de respuesta
for(fila = NUM_COLS - 1; fila >= 0; fila--){
fila_mask = EXCIT << style="color: rgb(255, 255, 153);">// Máscara para leer el bit de la fila actual
if(lee_puertoE() & fila_mask){ // Si encuentra tecla pulsada,
while(lee_puertoE() & fila_mask); // Esperamos a que se suelte
retardo(1150); // Retardo antirrebotes
return teclas[fila][columna]; // Devolvemos la tecla pulsada
}
}
// Siguiente columna
}
// Exploración finalizada sin encontrar una tecla pulsada
}
// Reiniciamos exploración
}


La segunda escribe por la pantalla LCD la acción que va a ejecutar el robot

// Situamos el cursor en la posición adecuada
if(teclasEscritas++ >= MAX_TECLAS){ // Si hemos llenado una línea,
if(primeraLinea){ // Si era la línea 1,
LCD_inst(LIN_2LCD); // cambiamos a la línea 2
}else{ // Si no,
LCD_inst(CLR_DISP); // Limpiamos el display
LCD_inst(LIN_1LCD); // y volvemos a la línea 1
}
// Actualizamos variables de estado
primeraLinea = !primeraLinea;
teclasEscritas = 1;
}
LCD_dato(tecla); // Escribimos en el display la tecla pulsada


Y la última se encarga de enviar la tecla pulsada por el puerto RS232


/* ------------------------------------------------------------------------------
Metodo que se encarga de enviar por el puerto serie los datos pasados como
parametro
------------------------------------------------------------------------------- */
void enviaSerie(char* mensaje){
while(*mensaje){ //Mientras haya datos que enviar
//Comprobamos estado del puerto
BYTE estado_tx = mbar_readByte(MCFSIM_USR1);
estado_tx = estado_tx & 0x04;
if(estado_tx != 0x04) continue;
mbar_writeByte(MCFSIM_UTB1,*mensaje++); //enviamos
retardo(RET_3MS);
}
mbar_writeByte(MCFSIM_UTB1,0x0D);

}

El funcionamiento del programa consiste en un bucle que esta a la espera de que se pulse alguna tecla, cuando esto sucede se imprime por la pantalla LCD el mensaje que corresponda con la acción que va a realizar el robot y envía la tecla pulsada por el puerto RS232 del Coldfire volviendo de nuevo a su estado inicial esperando una nueva pulsación. (El código fuente completo de este programa estará disponible en unos días en la sección de programas)
Por otro lado el programa que controla al Robonova esta a la espera de recibir algún comando por el puerto serie del robot, cuando esto sucede identifica la tecla que se ha enviado y dependiendo de esta se ejecuta una acción u otra.

'Definimos teclas
adelante="2"

derecha="6"
izquierda="4"
medida="5"

'Comprobamos datos recibidos y ejecutamos
Retry: ERX 9600,datos,Retry
IF datos=adelante THEN
GOSUB Caminar
END

IF datos=derecha THEN
GOSUB Giro_dch
END

IF datos=izquierda THEN
GOSUB Giro_izq
END

IF datos=izquierda THEN
GOSUB Adquisicion_ultrasonidos
GOSUB envia_medida

martes, 27 de marzo de 2007

26 de Marzo - Hardware

En esta sesión se ha trabajado en dos frentes simultáneamente.
Por un lado, se ha preparado el software que permita leer del teclado del coldfire y escribir en la pantalla LCD así como habilitar la comunicación por vía UART-2 para poder controlar el robot a distancia.

Por otro lado, se ha construído un circuito para adaptar la señal que proviene del módulo de radiofrecuencia al estándar RS-232 y así mismo adaptar la señal que se recibe desde el coldfire mediante el estándar RS-232 al módulo radiotransmisor.

Centrándonos en este último concepto, cabe destacar la utilización del circuito MAX 3232 como adaptador de señal. La configuración de este circuito integrado es la estándar, definida en su hoja de características como típica.



El flujo de datos en dirección módulo radio --> coldfire se ha conectado al puerto R1 (pines 13 para entrada y 12 para salida) mientras que el flujo coldfire --> módulo radio se ha conectado al puerto T1 (pines 11 para entrada y 14 para salida).
En cuanto a la conexión de la clavija hembra del interfaz RS-232, cabe mencionar la conexión cruzada. El terminal de la clavija "Tx" (pin 3) se ha conectado a recepción ((R-1) datos provenientes del módulo radio) y el terminal "Rx" (pin 2) se ha conectado a la transmisión ((T-1) datos provenientes del coldfire) .
Con esta configuración, el siguiente paso es probar el correcto funcionamiento en ambos sentidos.

  • Para el flujo Robot - Coldfire se ha utilizado el mismo programa que para probar el módulo de radio (ver día 23 de marzo) Permitiendo que el coldfire imprima por la pantalla del PC lo que recibe. Las pruebas en este sentido resultaron satisfactorias, aunque se detectó que envíos continuados y sin pausas de datos dan lugar a errores, no obstante, se espera profundizar sobre este tema en sucesivas sesiones.

  • Respecto al flujo Colfire - Robot, los resultados no son tan esperanzadores. Se elaboró un programa que, mediante el uso del teclado del Coldfire, permitiese enviar datos, concretamente el valor representado en la tecla, al módulo de radio para que el robot, una vez recibidos, ejecutase una orden concreta en función de lo que recibiese. El problema es que la señal llegaba distorsionada a nivel alto, no presentaba "1´s" estables, sino que parecía una sinusoide. Este tema, hasta el momento sin explicación, queda pendiente para analizar en próximas sesiones, ya que la falta de tiempo lo imposibilitó.

sábado, 24 de marzo de 2007

Día 23 de Marzo

Esta sesión ha sido dedicada en su mayor parte a preparar la comunicación inalámbrica entre robonova y el módulo coldfire. Gracias a ello, se podrá en un futuro controlar por radiofrecuencia el movimiento del robot. Para llegar a conseguir este objetivo, primeramente se ha realizado una prueba conectando el módulo emisor de radiofrecuencia al puerto de transimisión en serie del MR-3024 y adquiriendo la señal de salida del módulo receptor mediante el osciloscopio, para que este módulo funcione se debe alimentar con la fuente del puesto a valores de 5 voltios y masa. La rutina que se ha utilizado en el desarrollo de esta prueba contiene como lineas más relevantes:

Dim A as byte 'declaración de las variables que vamos a utilizar.
Dim B as byte
A = "a" 'inicializacón de las variables.
B = "b"
ETX 9600,A 'Transmisión por puerto en serie.
ETX 9600,B

Analizando el código anterior, se puede apreciar que la prueba simplemente consiste en enviar consecutivamente los caracteres ASCII "a" y "b" que en binario son: 01100001 y 01100010 respectivamente. El resultado de la recepción fue que existe un bit de arranque a "0" y un bit de parada a "1", además los datos comienzan a enviarse por el bit menos significativo y terminan por el más significativo, es decir, ocurre lo siguiente:

Símbolo --- Emisor ---- Receptor

a --------01100001 ----0100001101
b --------01100010---- 0010001101

Una vez probado el correcto funcionamiento del módulo, se ha fijado en el brazo izquierdo (esperamos mostrarlo próximamente en foto).

Por otro lado se ha trabajado en la familiarización con el control del módulo UART del coldfire gracias al tutorial de la práctica de GSM.

Como ya se ha dixo, el objetivo para próximos días es poder conectar el receptor de radiofrecuencia al coldfire por puerto serie y así poder tener una comunicacíon bidireccional con el robot. Esto aumentaría sensiblemente las posibilidades del robot. Para este propósito el próximo día se elaborará una placa conversora que permita la comunicación del módulo receptor que funciona entre 5 voltios y 0 con el coldfire cuyos valores son mayores. En proximas sesiones se profundizará sobre el tema.