Página principal

Arduino
Control de salidas mediante rs232
Librería SDL

xsetaseta@gmail.com

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