Mi primer motivo para este trabajo
era aprender la librería multiplataforma libSDL. Es una
librería que se hizo mayormente para juegos, pero se
puede emplear para otros muchos trabajos, y yo la he empleado
para gobernar las salidas de arduino mediante el interfaz serie.
En total se manejan 18 salidas digitales, en las cuales si se
quiere se puede manejar mediante relés o optoacopladores
tensiones de 220V, ver
http://www.seta43.netau.net/ar_ir.html
para mas detalles.
El programa de arduino consiste un que se lee constantemente el
puerto serie. Cuando se recibe una orden "1Dig13" el arduino
interpreta que tiene que poner a 5V la salida de arduino
Digital13. Si recibe la orden "0Dig13" el arduino pone la salida
Digital13 a 0V.
Para mandar las ordenes al arduino se puede utilizar la consola
del programador de arduino o cualquier otro programa de
comunicaciones como por ejemplo CuteCom o minicom en
Linux.
/*
SETA43
xsetaseta@gmail.com
31/05/2012
*/
char entrada[100];
//char VARI[100];
int contador;
boolean stringComplete = false;
void setup() {
// initialize serial:
Serial.begin(9600);
for(contador=3;contador<=19;contador++)
pinMode(contador, OUTPUT);
contador=0;
}
void loop() {
if (stringComplete)
{
if(!strcmp(entrada,"0An0"))digitalWrite(14, LOW);
if(!strcmp(entrada,"1An0"))digitalWrite(14, HIGH);
if(!strcmp(entrada,"0An1"))digitalWrite(15, LOW);
if(!strcmp(entrada,"1An1"))digitalWrite(15, HIGH);
if(!strcmp(entrada,"0An2"))digitalWrite(16, LOW);
if(!strcmp(entrada,"1An2"))digitalWrite(16, HIGH);
if(!strcmp(entrada,"0An3"))digitalWrite(17, LOW);
if(!strcmp(entrada,"1An3"))digitalWrite(17, HIGH);
if(!strcmp(entrada,"0An4"))digitalWrite(18, LOW);
if(!strcmp(entrada,"1An4"))digitalWrite(18, HIGH);
if(!strcmp(entrada,"0An5"))digitalWrite(19, LOW);
if(!strcmp(entrada,"1An5"))digitalWrite(19, HIGH);
if(!strcmp(entrada,"0Dig13"))digitalWrite(13, LOW);
if(!strcmp(entrada,"1Dig13"))digitalWrite(13, HIGH);
if(!strcmp(entrada,"0Dig12"))digitalWrite(12, LOW);
if(!strcmp(entrada,"1Dig12"))digitalWrite(12, HIGH);
if(!strcmp(entrada,"0Dig11"))digitalWrite(11, LOW);
if(!strcmp(entrada,"1Dig11"))digitalWrite(11, HIGH);
if(!strcmp(entrada,"0Dig10"))digitalWrite(10, LOW);
if(!strcmp(entrada,"1Dig10"))digitalWrite(10, HIGH);
if(!strcmp(entrada,"0Dig9"))digitalWrite(9, LOW);
if(!strcmp(entrada,"1Dig9"))digitalWrite(9, HIGH);
if(!strcmp(entrada,"0Dig8"))digitalWrite(8, LOW);
if(!strcmp(entrada,"1Dig8"))digitalWrite(8, HIGH);
if(!strcmp(entrada,"0Dig7"))digitalWrite(7, LOW);
if(!strcmp(entrada,"1Dig7"))digitalWrite(7, HIGH);
if(!strcmp(entrada,"0Dig6"))digitalWrite(6, LOW);
if(!strcmp(entrada,"1Dig6"))digitalWrite(6, HIGH);
if(!strcmp(entrada,"0Dig5"))digitalWrite(5, LOW);
if(!strcmp(entrada,"1Dig5"))digitalWrite(5, HIGH);
if(!strcmp(entrada,"0Dig4"))digitalWrite(4, LOW);
if(!strcmp(entrada,"1Dig4"))digitalWrite(4, HIGH);
if(!strcmp(entrada,"0Dig3"))digitalWrite(3, LOW);
if(!strcmp(entrada,"1Dig3"))digitalWrite(3, HIGH);
if(!strcmp(entrada,"0Dig2"))digitalWrite(2, LOW);
if(!strcmp(entrada,"1Dig2"))digitalWrite(2, HIGH);
/*
sprintf(VARI,"-E->%s<-",entrada);
Serial.print(VARI);
Serial.println("-Otra-");
*/
Serial.print("->");
Serial.println(entrada);
contador=0;
stringComplete = false;
}
}
void serialEvent()
{
while (Serial.available())
{
char inChar =
(char)Serial.read();
entrada[contador]=inChar;
if (inChar == '\n')
{
stringComplete = true;
entrada[contador]=0;
}
contador++;
}
}
|
Programa en el arduino.
Ahora nos toca hacer el programa en la parte del PC utilizando
la librería SDL.
Como lenguaje he utilizado el C, hubiese sido mas fácil
hacerlo en Visual Basic en Windows y en Gambas bajo Linux, pero
mi meta era hacerlo multiplataforma y utilizar el mismo
código para ambas plataformas.
La programación se ha realizado en Linux mediante el
Entorno Integrado de Desarrollo Anjuta, es fácil y muy
cómodo, existen multitud de tutoriales de como hacerlo.
Para aprender a utilizar la librería SDL he utilizado lo
siguiente:
http://www.libsdl.org/
http://www.lazyfoo.net/SDL_tutorials/index.php
http://petra.euitio.uniovi.es/~i1766818/TUTOR/TUTOR10.htm
http://www.losersjuegos.com.ar/referencia/libros/...
http://acuv.webs.upv.es/index.php?option=com_content&view=article&id=199:tutorial-sdl-hagamos-un-qbongq&catid=8:general&Itemid=12
Libros:
*Tutorial de libSDL para la programación de
videojuegos.
Antonio García Alba.
*SDL Library Documentation.
*SDL: Primeros pasos -Programación de Vídeo
Juegos- Fco. Javier Pérez Pacheco
He creado botones y luces mediante bitmap, creo que han quedado
bien.
Cuando pulsas el un boton en el programa, se manda una orde al
arduino mediante la conexión serie y a la vez se enciende
una especie de Led rojo. Si se pulsa otra vez el Led se apaga.
El programa funcionando.
Cuanto tuve terminado el programa bajo Linux, inicie la
programación en Windows.
He utilizado del entorno de compilación Dev-C++, es bueno
y gratis.
Para ponerlo a funcionar con la librería SDL he utilizado
el tutorial:
http://www.losersjuegos.com.ar/referencia/articulos/instalar_devcpp
es un tutorial muy bueno para configurarlo.
Tuve algunos problemas con las librerías que no las
encontraba, y las tuve que poner a mano.
En el programa he tenido que colocar directivas de
compilación
#ifdef para separar el
código de Linux del de Windows.
Ejemplo:
#define YesWindows 0
#if YesWindows
char MODEMDEVICEdefault[]= "COM3";
#else
char MODEMDEVICEdefault[]= "/dev/ttyUSB0";
#endif
|
Fichero del programa
El mayor problema que he tenido es la programación del
puerto serie, en Linux no me dió ningún problema.
En Windows me resetea la placa android al inicio del programa,
después funciona perfectamente, pero no he encontrado
ningún motivo aparente, a no ser el driver de convertidor
de serie->USB.
El programa admite el argumeto del puerto de comunicaciones. En
caso de no poner ningún argumento, asume en Linux
"/dev/ttyUSB0"
y en Windows
"COM3" .
Los dos circuitos android
funcionando.
En definitiva, la librería SDL me a gustado mucho y sirve
perfectamente como multiplataforma, con solo cambiar en mi caso
#define
YesWindows 0 por
#define
YesWindows 1 el programa se compila en ambas
plataformas.
Un saludo.
Juan Galaz