domingo, 24 de febrero de 2008

Codigo fuente de la clase circuito

Adjunto a este post voy a poner el codigo fuente de la clase que he hecho para simular el circuito.

(nota: poner aqui el codigo del circuito)

YATTA!!! el robot se mueve desde JAVA!!!

Me "congratulaciona" comunicar a todo el personal (bueno, por ahora yo solo :p ) que por fin! he conseguido comunicarme con el robot mediante el puerto serie, utilizando el lenguaje JAVA.
Hay que destacar muchas cosas:
  1. Si bien para linux no hay problema, para windows hay que buscar por internet la libreria javax.comm version 2.0. Esta version nos facilita la comunicacion con el puerto serie (y el paralelo tambien)
  2. No es correcta la documentacion que viene, puesto que nos informa que hay que copiar unos archivos (la libreria) en unos directorios determinados, pero aun asi no funciona: lo he solucionado de la forma chapucera (copiado todo al directorio c:\windows\system32) y con eso, de momento, funciona.
  3. Una vez hechos los pasos 1 y 2, en nuestro programa, cuando conseguimos el objeto SerialPort se consigue con un cast, de otro objeto que nos permite abrir el puerto.
lo que mas ha dado quebraderos de cabeza (y es la cosa mas estupida) es que no configuraba bien el puerto, por lo que al transmitir, el circuito no podia entender nada. El siguiente codigo ha sido crucial:

// objeto que nos abre el puerto identificado con la cadena
CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM1");

// objeto que representa un puerto SERIE
serialPort = (SerialPort) portId.open("app", 2000);

// configuramos el puerto serie
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);

lo bueno de esta libreria es que, los puertos se identifican por la cadena de texto que utiliza el objeto CommPortIdentifier. Esto es, que podemos abrir /dev/ttyS0, o COM2, LPT1... :)

A ver si mañana tengo ganas, lo aplico todo esto a la clase Circuito, y podemos tener una "version operativa" :D

miércoles, 20 de febrero de 2008

volviendo al tema...

pues como que hace ya mas de dos meses que estoy sin escribir en el blog... hay que echarle la culpa a algo, asi que se la echamos a lo siguiente:

1.- el trabajo: de veras, quita ganas de hacer nada. Es llegar a casa y marcharme al curso, asi que no tengo tiempo de dedicarme al robot...
2.- la vagancia: derivado del punto 1

Tengo muchas cosas en mente, que no consigo llevar a efecto, asi que he decidido obligarme de nuevo al tema este.

y que mejor manera de obligarme, que hacer el proyecto del curso de programacion referido al robot...

sábado, 15 de diciembre de 2007

Futura migracion del blog

pues si, ya he encontrado un host barato barato (gratuito) con php, mysql, 150mb, blablabla... gratuito (blablabla) y poca publicidad.
Estoy empezando a migrar todo este proyecto, y puede que lleve un tiempo (aunque seguro que alguna entrada de C cae por el camino... jejeje)

Por que hacer una web de esto? sinceramente, porque como dije al principio del blog, mi orgullo se resiente cuando veo a gente que, sin conocimimentos de html, hacen blogs como churros y ... encima quedan bien!!!.

Aparte, porque inicialmente este blog era dirigido al proyecto de robotica, y ya he empezado a poner que si programacion, que si compresion de video, etc...


Mas informacion, en proximos dias...

lunes, 3 de diciembre de 2007

Que cosas!!! en los cursos se aprende!!!

No es que quiera convertir este blog de proyecto del robot en historias del curso... pero la verdad es que hacia mucho que no aprendia nada nuevo de C... y lo curioso es que esto es, como quien diria, de "Primaria de C"...
El caso es que, hoy he aprendido que en el switch de C se pueden tratar rangos!!!
Lo apunto aqui para no olvidarlo :D

int main(int argc, char *argv[])
{

int x;
switch(x){
case 1 ... 5: // bloque instrucciones y break
case 7 ... 10: // bloque instrucciones y break
case 11 ... 15: // bloque instrucciones y break
}

Vale, si, que seguro todo el mundo lo sabia... Se que en pascal funciona de la misma manera, pero a mi nunca me habia funcionado... hasta que me han dicho que tiene que haber un espacio entre el primer valor, los 3 puntos seguidos y el segundo valor!!!
Pues eso, algo nuevo hemos aprendido hoy... (valdrá para el proyecto del robot???)

domingo, 2 de diciembre de 2007

Preparandome para programar...

en C. Si si, en el curso vamos a empezar con C... no es que me llame mucho la atencion, pero eso puede "obligarme" a meterme con el tema del robot y empezar a programar la aplicacion que tengo en mente.
Asi que he decidido empezar a currar en ello, y para empezar, nada mejor que preparar el programa que controlara el circuito, dependiendo de las ordenes del robot. Aunque en un futuro deberia ser un objeto, voy a empezar a desarrollarlo como una funcion (para ir acorde con el curso)
Y me he encontrado con el siguiente problema: Suponiendo que el circuito del robot recibe por el puerto serie, pero a la vez puede indicarme una serie de valores (por ejemplo, que las entradas A, B, C, D y E estan activas), o un error al ejecutar una instruccion... ¿Como tengo que abrir el archivo /dev/ttyS0? tengo que abrirlo en modo E/S, pero... desde dos procesos distintos? vuelvo a utilizar fork()?
el programa se me plantea de la siguiente manera:

int circuito(...){
int pid;
...
...
pid=fork();
switch (pid){
case 0: lector(); break;
case -1: error(); break;
case default: escritor(); break;
}
}

int lector(...){
FILE *entrada;

entrada=fopen("/dev/ttyS0", "r");
/* control de errores y leer del archivo*/
}

int escritor(...){
FILE *salida;

salida = fopen("/dev/ttyS0", "w");
/*control de erroes y escribir instrucciones al circuito*/
}

La duda consiste en si, de alguna manera, la apertura del mismo archivo en dos modos distintos y de distinta manera, puede generar un "lio" como, por ejemplo, no permitir uno a otro abrir el circuito...

viernes, 23 de noviembre de 2007

YATTA!!! robot con fonera!!!

Eureka! el invento de utilizar directamente la conexion ttl da sus frutos...
Voy a exponer a continuacion los problemas que me he encontrado al intentar conectar todo el tinglado:
  • parece que la masa se toma del conector DB9 (el puerto serie), pero al desactivarlo para utilizar ttl, tenemos que darle la masa externamente. En mi caso pensaba que la masa ya estaba, y solo ponia 2 hilos, el Tx y el Rx... La solucion: cojer la masa de la fonera!!! (si es que...)
  • Hasta donde yo pensaba, Tx y Rx son envio y recepcion... Pero segun me han explicado Jaime y Dani (gracias, chicos) Tx es bidireccional, y Rx es el reloj... por lo que el circuito que comunica (en este caso, la fonera) tiene que dar esas conexiones directamente... En resumen, Tx de fonera conectado con Tx de circuito, y Rx de fonera conectado con Rx de circuito.
  • Una vez resuelto el tema del circuito, se me plantea el problema de comunicar ordenes... segun el manual, hay que acabar todas las ordenes con <cr>, que es el caracter ASCII 13... trabajando desde la linea de comandos de la fonera, hay que escribir:

    echo -e "#0 P100 S100 \N016" >/dev/ttyS0.

    El \N016 es el caracter 13 EN OCTAL!!! (el -e permite que se interpreten caracteres como \n, \c...)
 
Informacion de proyecto para el control de un robot mediante puerto serie desde una fonera. Jakala. Licencia GPL. oct-2007